diff options
237 files changed, 6580 insertions, 3479 deletions
diff --git a/.gitignore b/.gitignore index 0fe212098c..469f22d11c 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 @@ -82,7 +82,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 +95,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..b56300a115 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 += \ @@ -79,7 +79,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) @@ -147,7 +147,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/backends/graphics/opengl/texture.cpp b/backends/graphics/opengl/texture.cpp index 917bf70534..8f17ed7eeb 100644 --- a/backends/graphics/opengl/texture.cpp +++ b/backends/graphics/opengl/texture.cpp @@ -287,7 +287,7 @@ void TextureCLUT8::allocate(uint width, uint height) { // We only need to reinitialize our CLUT8 surface when the output size // changed. - if (width == _clut8Data.w && width == _clut8Data.h) { + if (width == _clut8Data.w && height == _clut8Data.h) { return; } diff --git a/backends/platform/symbian/AdaptAllMMPs.pl b/backends/platform/symbian/AdaptAllMMPs.pl index ffc4e88aff..2f76acf012 100644 --- a/backends/platform/symbian/AdaptAllMMPs.pl +++ b/backends/platform/symbian/AdaptAllMMPs.pl @@ -44,6 +44,15 @@ chdir("../../../"); "mmp/scummvm_toltecs.mmp", "mmp/scummvm_pegasus.mmp", "mmp/scummvm_wintermute.mmp", + # New engines + "mmp/scummvm_avalanche.mmp", + "mmp/scummvm_dreamweb.mmp", + "mmp/scummvm_fullpipe.mmp", + "mmp/scummvm_mortevielle.mmp", + "mmp/scummvm_neverhood.mmp", + "mmp/scummvm_sword25.mmp", + "mmp/scummvm_testbed.mmp", + "mmp/scummvm_zvision.mmp", # Target Platform Project Files "S60/ScummVM_S60.mmp", "S60v3/ScummVM_S60v3.mmp", @@ -79,10 +88,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", "USE_MPEG2"); # 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,13 +139,13 @@ 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", "audio", \@section_empty, \@excludes_snd); -ParseModule("_base", "video", \@section_empty); +ParseModule("_base", "video", \@section_video); # chdir("engines/"); ParseModule("_scumm", "scumm", \@sections_scumm, \@excludes_scumm ); @@ -156,21 +169,30 @@ ParseModule("_drascula","drascula", \@section_empty); ParseModule("_made", "made", \@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("_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("_mortevielle" ,"mortevielle", \@section_empty); +ParseModule("_neverhood" ,"neverhood", \@section_empty); +ParseModule("_sword25" ,"sword25", \@section_empty); +ParseModule("_testbed" ,"testbed", \@section_empty); +ParseModule("_zvision" ,"zvision", \@section_empty); print " ======================================================================================= Done. Enjoy :P diff --git a/backends/platform/symbian/BuildPackageUpload_AllVersions.pl b/backends/platform/symbian/BuildPackageUpload_AllVersions.pl index 3062068852..560439f4e1 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,13 @@ $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_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..4ff485b3e3 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 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 + neverhood testbed avalanche zvision ); +#### 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 ); @WorkingEngines_2nd = qw( - agos sky gob kyra lure - agi tinsel sword1 sword2 - draci sci teenagent hugo toon - tsage cge toltecs tony pegasus + agi agos cge draci gob hopkins + hugo kyra lure mohawk pegasus sci + sky sword1 sword2 teenagent + tinsel tsage toltecs tony toon + dreamweb fullpipe mortevielle + neverhood testbed ); +#### sword25 @TestingEngines = qw( @@ -34,20 +43,32 @@ lol agos2 eob + cstime + myst + riven + saga2 + sci32 + groovie2 ); #disabled subengines lol saga2 personal nightmare + # see configure.engines %UseableFeatures = ( 'zlib' => 'zlib.lib', 'mad' => 'libmad.lib', 'tremor' => 'libtremor.lib', - 'flac' => 'libflac.lib' + 'flac' => 'libflacdec.lib', + 'freetype2' => 'freetype.lib', + 'faad' => 'libFAAD2.lib', + 'mpeg2' => 'libmpeg2.lib' ); + # 'mpeg2' => 'libmpeg2.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(mad,tremor,faad,flac,freetype2,mpeg2,zlib,); ################################################################################################################## ## @@ -64,7 +85,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 +99,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{'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,7 +116,7 @@ { ## 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 @@ -186,7 +208,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 +228,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 +245,42 @@ # now you can add $VariationSets only built on this PC below this line :) } - elsif ($ENV{'COMPUTERNAME'} eq "EMBEDDEV_VAIO1") ################################################################# + elsif ($ENV{'COMPUTERNAME'} eq "PC-FOREVER1111") ################################################################# { - $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 :) @@ -298,8 +324,8 @@ # the first one includes all SDKs & release-ready engines $VariationSets{'ALL'}{'all'} = "$DefaultFeatures @WorkingEngines @EnablableSubEngines"; -# $VariationSets{'ALL'}{'1St'} = "$DefaultFeatures @WorkingEngines_1st @EnablableSubEngines"; -# $VariationSets{'ALL'}{'2nd'} = "$DefaultFeatures @WorkingEngines_2nd @EnablableSubEngines"; + # $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..3c4fbb9d7d 100644 --- a/backends/platform/symbian/README +++ b/backends/platform/symbian/README @@ -2,7 +2,8 @@ ScummVM - ScummVM ported to EPOC/SymbianOS Copyright (C) 2008-2013 ScummVM Team - Copyright (C) 2003-2008 Lars 'AnotherGuest' Persson + Copyright (C) 2013-2013 Fedor Strizniou 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/S60v3/scummvm-CVS-SymbianS60v3.pkg b/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3.pkg index 4c6b1b05f8..a5920ae823 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"} @@ -58,18 +58,46 @@ "..\..\..\..\NEWS"-"!:\resource\apps\scummvm\NEWS" ; Common datafiles needed for some games -"..\..\..\..\dists\engine-data\kyra.dat"-"c:\data\scummvm\kyra.dat" -"..\..\..\..\dists\engine-data\sky.cpt"-"c:\data\scummvm\sky.cpt" +"..\..\..\..\dists\engine-data\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" +"..\..\..\..\gui\themes\fonts\Arial.bdf"-"c:\data\scummvm\Arial.bdf" +"..\..\..\..\gui\themes\fonts\Arial12.bdf"-"c:\data\scummvm\Arial12.bdf" +"..\..\..\..\gui\themes\fonts\ArialBold.bdf"-"c:\data\scummvm\ArialBold.bdf" +"..\..\..\..\gui\themes\fonts\clR6x12-iso-8859-1.bdf"-"c:\data\scummvm\clR6x12-iso-8859-1.bdf" +"..\..\..\..\gui\themes\fonts\clR6x12-iso-8859-2.bdf"-"c:\data\scummvm\clR6x12-iso-8859-2.bdf" +"..\..\..\..\gui\themes\fonts\clR6x12-iso-8859-5.bdf"-"c:\data\scummvm\clR6x12-iso-8859-5.bdf" +"..\..\..\..\gui\themes\fonts\clR6x12-iso-8859-7.bdf"-"c:\data\scummvm\clR6x12-iso-8859-7.bdf" +"..\..\..\..\gui\themes\fonts\clR6x12.bdf"-"c:\data\scummvm\clR6x12.bdf" +"..\..\..\..\gui\themes\fonts\courr12-iso-8859-1.bdf"-"c:\data\scummvm\courr12-iso-8859-1.bdf" +"..\..\..\..\gui\themes\fonts\fixed5x8-iso-8859-1.bdf"-"c:\data\scummvm\fixed5x8-iso-8859-1.bdf" +"..\..\..\..\gui\themes\fonts\fixed5x8-iso-8859-5.bdf"-"c:\data\scummvm\fixed5x8-iso-8859-5.bdf" +"..\..\..\..\gui\themes\fonts\fixed5x8-iso-8859-7.bdf"-"c:\data\scummvm\fixed5x8-iso-8859-7.bdf" +"..\..\..\..\gui\themes\fonts\fixed5x8.bdf"-"c:\data\scummvm\fixed5x8.bdf" +"..\..\..\..\gui\themes\fonts\FreeMonoBold.ttf"-"c:\data\scummvm\FreeMonoBold.ttf" +"..\..\..\..\gui\themes\fonts\FreeSans.ttf"-"c:\data\scummvm\FreeSans.ttf" +"..\..\..\..\gui\themes\fonts\FreeSansBold.ttf"-"c:\data\scummvm\FreeSansBold.ttf" +"..\..\..\..\gui\themes\fonts\helvB12-iso-8859-1.bdf"-"c:\data\scummvm\helvB12-iso-8859-1.bdf" +"..\..\..\..\gui\themes\fonts\helvB12-iso-8859-2.bdf"-"c:\data\scummvm\helvB12-iso-8859-2.bdf" +"..\..\..\..\gui\themes\fonts\helvB12-iso-8859-5.bdf"-"c:\data\scummvm\helvB12-iso-8859-5.bdf" +"..\..\..\..\gui\themes\fonts\helvB12.bdf"-"c:\data\scummvm\helvB12.bdf" +"..\..\..\..\gui\themes\fonts\helvBO12-iso-8859-1.bdf"-"c:\data\scummvm\helvBO12-iso-8859-1.bdf" +"..\..\..\..\gui\themes\fonts\helvBO12.bdf"-"c:\data\scummvm\helvBO12.bdf" +"..\..\..\..\gui\themes\fonts\helvR12-iso-8859-1.bdf"-"c:\data\scummvm\helvR12-iso-8859-1.bdf" +"..\..\..\..\gui\themes\fonts\helvR12.bdf"-"c:\data\scummvm\helvR12.bdf" +;"..\..\..\..\gui\themes\"-"c:\data\scummvm\" ; Config/log files: 'empty' will automagically be removed on uninstall ""-"c:\data\scummvm\scummvm.ini",FILENULL diff --git a/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3_split.pkg b/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3_split.pkg index d3fd0450fa..c71805fb9f 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,0 ;Supports Series 60 v 3.0 [0x101F7961], 0, 0, 0, {"Series60ProductID"} @@ -66,18 +66,45 @@ "..\..\..\..\NEWS"-"!:\resource\apps\scummvm\NEWS" ; Common datafiles needed for some games -"..\..\..\..\dists\engine-data\kyra.dat"-"c:\data\scummvm\kyra.dat" -"..\..\..\..\dists\engine-data\sky.cpt"-"c:\data\scummvm\sky.cpt" +"..\..\..\..\dists\engine-data\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" +"..\..\..\..\gui\themes\fonts\Arial.bdf"-"c:\data\scummvm\Arial.bdf" +"..\..\..\..\gui\themes\fonts\Arial12.bdf"-"c:\data\scummvm\Arial12.bdf" +"..\..\..\..\gui\themes\fonts\ArialBold.bdf"-"c:\data\scummvm\ArialBold.bdf" +"..\..\..\..\gui\themes\fonts\clR6x12-iso-8859-1.bdf"-"c:\data\scummvm\clR6x12-iso-8859-1.bdf" +"..\..\..\..\gui\themes\fonts\clR6x12-iso-8859-2.bdf"-"c:\data\scummvm\clR6x12-iso-8859-2.bdf" +"..\..\..\..\gui\themes\fonts\clR6x12-iso-8859-5.bdf"-"c:\data\scummvm\clR6x12-iso-8859-5.bdf" +"..\..\..\..\gui\themes\fonts\clR6x12-iso-8859-7.bdf"-"c:\data\scummvm\clR6x12-iso-8859-7.bdf" +"..\..\..\..\gui\themes\fonts\clR6x12.bdf"-"c:\data\scummvm\clR6x12.bdf" +"..\..\..\..\gui\themes\fonts\courr12-iso-8859-1.bdf"-"c:\data\scummvm\courr12-iso-8859-1.bdf" +"..\..\..\..\gui\themes\fonts\fixed5x8-iso-8859-1.bdf"-"c:\data\scummvm\fixed5x8-iso-8859-1.bdf" +"..\..\..\..\gui\themes\fonts\fixed5x8-iso-8859-5.bdf"-"c:\data\scummvm\fixed5x8-iso-8859-5.bdf" +"..\..\..\..\gui\themes\fonts\fixed5x8-iso-8859-7.bdf"-"c:\data\scummvm\fixed5x8-iso-8859-7.bdf" +"..\..\..\..\gui\themes\fonts\fixed5x8.bdf"-"c:\data\scummvm\fixed5x8.bdf" +"..\..\..\..\gui\themes\fonts\FreeMonoBold.ttf"-"c:\data\scummvm\FreeMonoBold.ttf" +"..\..\..\..\gui\themes\fonts\FreeSans.ttf"-"c:\data\scummvm\FreeSans.ttf" +"..\..\..\..\gui\themes\fonts\FreeSansBold.ttf"-"c:\data\scummvm\FreeSansBold.ttf" +"..\..\..\..\gui\themes\fonts\helvB12-iso-8859-1.bdf"-"c:\data\scummvm\helvB12-iso-8859-1.bdf" +"..\..\..\..\gui\themes\fonts\helvB12-iso-8859-2.bdf"-"c:\data\scummvm\helvB12-iso-8859-2.bdf" +"..\..\..\..\gui\themes\fonts\helvB12-iso-8859-5.bdf"-"c:\data\scummvm\helvB12-iso-8859-5.bdf" +"..\..\..\..\gui\themes\fonts\helvB12.bdf"-"c:\data\scummvm\helvB12.bdf" +"..\..\..\..\gui\themes\fonts\helvBO12-iso-8859-1.bdf"-"c:\data\scummvm\helvBO12-iso-8859-1.bdf" +"..\..\..\..\gui\themes\fonts\helvBO12.bdf"-"c:\data\scummvm\helvBO12.bdf" +"..\..\..\..\gui\themes\fonts\helvR12-iso-8859-1.bdf"-"c:\data\scummvm\helvR12-iso-8859-1.bdf" +"..\..\..\..\gui\themes\fonts\helvR12.bdf"-"c:\data\scummvm\helvR12.bdf" ; Config/log files: 'empty' will automagically be removed on uninstall ""-"c:\data\scummvm\scummvm.ini",FILENULL 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/mmp/scummvm_avalanche.mmp.in b/backends/platform/symbian/mmp/scummvm_avalanche.mmp.in new file mode 100644 index 0000000000..12f157f1e7 --- /dev/null +++ b/backends/platform/symbian/mmp/scummvm_avalanche.mmp.in @@ -0,0 +1,62 @@ +/* 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\ZLIB // before \epoc32\include because symbian already has older version +SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src diff --git a/backends/platform/symbian/mmp/scummvm_base.mmp.in b/backends/platform/symbian/mmp/scummvm_base.mmp.in index d6dfafd014..bf12bffb41 100644 --- a/backends/platform/symbian/mmp/scummvm_base.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_base.mmp.in @@ -50,15 +50,15 @@ 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\ESDL SYSTEMINCLUDE \epoc32\include\ZLIB // before \epoc32\include because symbian already has older version SYSTEMINCLUDE \epoc32\include\libc 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 @@ -115,6 +115,9 @@ SOURCEPATH ..\..\..\..\video //STOP_AUTO_OBJECTS_VIDEO_// // add a few files manually, since they are not parsed from modules.mk files +SOURCE bink_decoder.cpp +SOURCE codecs\mpeg.cpp + SOURCEPATH ..\..\..\.. SOURCE backends\events\default\default-events.cpp SOURCE backends\timer\default\default-timer.cpp 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..b6369b7d2b --- /dev/null +++ b/backends/platform/symbian/mmp/scummvm_dreamweb.mmp.in @@ -0,0 +1,62 @@ +/* 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\ZLIB // before \epoc32\include because symbian already has older version +SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src diff --git a/backends/platform/symbian/mmp/scummvm_fullpipe.mmp.in b/backends/platform/symbian/mmp/scummvm_fullpipe.mmp.in new file mode 100644 index 0000000000..4a8f69f709 --- /dev/null +++ b/backends/platform/symbian/mmp/scummvm_fullpipe.mmp.in @@ -0,0 +1,62 @@ +/* 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\ZLIB // before \epoc32\include because symbian already has older version +SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src diff --git a/backends/platform/symbian/mmp/scummvm_kyra.mmp.in b/backends/platform/symbian/mmp/scummvm_kyra.mmp.in index 5772bfaad0..124f7c0dc3 100644 --- a/backends/platform/symbian/mmp/scummvm_kyra.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_kyra.mmp.in @@ -59,6 +59,13 @@ 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 diff --git a/backends/platform/symbian/mmp/scummvm_mohawk.mmp.in b/backends/platform/symbian/mmp/scummvm_mohawk.mmp.in index 5f7bd4e144..3fe9af68f6 100644 --- a/backends/platform/symbian/mmp/scummvm_mohawk.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_mohawk.mmp.in @@ -53,6 +53,25 @@ 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 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..3969a3af9c --- /dev/null +++ b/backends/platform/symbian/mmp/scummvm_mortevielle.mmp.in @@ -0,0 +1,62 @@ +/* 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\ZLIB // before \epoc32\include because symbian already has older version +SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src diff --git a/backends/platform/symbian/mmp/scummvm_neverhood.mmp.in b/backends/platform/symbian/mmp/scummvm_neverhood.mmp.in new file mode 100644 index 0000000000..3a49093c43 --- /dev/null +++ b/backends/platform/symbian/mmp/scummvm_neverhood.mmp.in @@ -0,0 +1,61 @@ +/* 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\ZLIB // before \epoc32\include because symbian already has older version +SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src diff --git a/backends/platform/symbian/mmp/scummvm_sci.mmp.in b/backends/platform/symbian/mmp/scummvm_sci.mmp.in index 5749c66e10..333a6d43c2 100644 --- a/backends/platform/symbian/mmp/scummvm_sci.mmp.in +++ b/backends/platform/symbian/mmp/scummvm_sci.mmp.in @@ -53,6 +53,14 @@ 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 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..e14501e42d --- /dev/null +++ b/backends/platform/symbian/mmp/scummvm_sword25.mmp.in @@ -0,0 +1,63 @@ +/* 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\ZLIB // before \epoc32\include because symbian already has older version +SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src diff --git a/backends/platform/symbian/mmp/scummvm_testbed.mmp.in b/backends/platform/symbian/mmp/scummvm_testbed.mmp.in new file mode 100644 index 0000000000..ce6a18508d --- /dev/null +++ b/backends/platform/symbian/mmp/scummvm_testbed.mmp.in @@ -0,0 +1,62 @@ +/* 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\ZLIB // before \epoc32\include because symbian already has older version +SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src diff --git a/backends/platform/symbian/mmp/scummvm_zvision.mmp.in b/backends/platform/symbian/mmp/scummvm_zvision.mmp.in new file mode 100644 index 0000000000..3687b10fec --- /dev/null +++ b/backends/platform/symbian/mmp/scummvm_zvision.mmp.in @@ -0,0 +1,62 @@ +/* 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_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\ZLIB // before \epoc32\include because symbian already has older version +SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\src diff --git a/backends/platform/symbian/src/SymbianOS.cpp b/backends/platform/symbian/src/SymbianOS.cpp index b1bd976f9e..ead85a933e 100644 --- a/backends/platform/symbian/src/SymbianOS.cpp +++ b/backends/platform/symbian/src/SymbianOS.cpp @@ -197,3 +197,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/portdefs.h b/backends/platform/symbian/src/portdefs.h index 1f9128a54f..f69a90e009 100644 --- a/backends/platform/symbian/src/portdefs.h +++ b/backends/platform/symbian/src/portdefs.h @@ -60,6 +60,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/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/str.h b/common/str.h index 6b4475e1c4..ea2db1d1d6 100644 --- a/common/str.h +++ b/common/str.h @@ -234,6 +234,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/ustr.cpp b/common/ustr.cpp new file mode 100644 index 0000000000..fbc831cb56 --- /dev/null +++ b/common/ustr.cpp @@ -0,0 +1,329 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "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..ab9dac70de --- /dev/null +++ b/common/ustr.h @@ -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. + */ + +#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 @@ -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 @@ -4197,8 +4199,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 +4392,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/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..9d4b101360 100644 --- a/devtools/create_project/config.h +++ b/devtools/create_project/config.h @@ -27,6 +27,7 @@ #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) diff --git a/devtools/create_project/create_project.cpp b/devtools/create_project/create_project.cpp index e013377241..16b8e1d166 100644 --- a/devtools/create_project/create_project.cpp +++ b/devtools/create_project/create_project.cpp @@ -59,6 +59,7 @@ #include <sys/param.h> #include <sys/stat.h> #include <dirent.h> +#include <errno.h> #endif namespace { @@ -81,22 +82,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 +113,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 +657,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 +785,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 +822,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 +1113,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 +1153,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. @@ -1242,6 +1326,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 +1659,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..07ae20e7dc 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"; 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/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/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/icons.cpp b/engines/agos/icons.cpp index 6d4192da2a..5647fece7e 100644 --- a/engines/agos/icons.cpp +++ b/engines/agos/icons.cpp @@ -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/avalanche/animation.cpp b/engines/avalanche/animation.cpp index 927de07236..cef4088722 100644 --- a/engines/avalanche/animation.cpp +++ b/engines/avalanche/animation.cpp @@ -248,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); } @@ -792,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. @@ -824,12 +824,12 @@ void Animation::callSpecial(uint16 which) { 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(); 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); @@ -862,7 +862,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 @@ -885,9 +885,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; } } @@ -1247,7 +1247,7 @@ void Animation::animLink() { if (_mustExclaim) { _mustExclaim = false; - _vm->_dialogs->displayScrollChain('x', _sayWhat); + _vm->_dialogs->displayScrollChain('X', _sayWhat); } } diff --git a/engines/avalanche/animation.h b/engines/avalanche/animation.h index 3223615985..cda5f05bd0 100644 --- a/engines/avalanche/animation.h +++ b/engines/avalanche/animation.h @@ -157,7 +157,7 @@ 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); diff --git a/engines/avalanche/avalanche.cpp b/engines/avalanche/avalanche.cpp index beb6333daa..2bb927646e 100644 --- a/engines/avalanche/avalanche.cpp +++ b/engines/avalanche/avalanche.cpp @@ -42,7 +42,7 @@ AvalancheEngine::AvalancheEngine(OSystem *syst, const AvalancheGameDescription * _system->getTimeAndDate(time); _rnd->setSeed(time.tm_sec + time.tm_min + time.tm_hour); _showDebugLines = false; - + _clock = nullptr; _graphics = nullptr; _parser = nullptr; @@ -55,6 +55,7 @@ AvalancheEngine::AvalancheEngine(OSystem *syst, const AvalancheGameDescription * _menu = nullptr; _closing = nullptr; _sound = nullptr; + _nim = nullptr; _platform = gd->desc.platform; initVariables(); @@ -77,6 +78,7 @@ AvalancheEngine::~AvalancheEngine() { delete _menu; delete _closing; delete _sound; + delete _nim; for (int i = 0; i < 31; i++) { for (int j = 0; j < 2; j++) { @@ -163,7 +165,6 @@ void AvalancheEngine::initVariables() { _takenMushroom = false; _givenPenToAyles = false; _askedDogfoodAboutNim = false; - _ableToAddTimer = false; _spludwickAtHome = false; _passedCwytalotInHerts = false; _lastRoom = _lastRoomNotMap = kRoomDummy; @@ -183,6 +184,7 @@ Common::ErrorCode AvalancheEngine::initialize() { _menu = new Menu(this); _closing = new Closing(this); _sound = new SoundHandler(this); + _nim = new Nim(this); _graphics->init(); _dialogs->init(); @@ -211,6 +213,7 @@ 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); @@ -350,7 +353,7 @@ void AvalancheEngine::synchronize(Common::Serializer &sz) { sz.syncAsByte(_timer->_times[i]._action); sz.syncAsByte(_timer->_times[i]._reason); } - + } bool AvalancheEngine::canSaveGameStateCurrently() { // TODO: Refine these!!! @@ -418,7 +421,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; @@ -448,7 +451,7 @@ bool AvalancheEngine::loadGame(const int16 slot) { delete f; _isLoaded = true; - _ableToAddTimer = false; + _seeScroll = true; // This prevents display of the new sprites before the new picture is loaded. if (_holdTheDawn) { @@ -467,9 +470,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); diff --git a/engines/avalanche/avalanche.h b/engines/avalanche/avalanche.h index 2734155b7d..87eb3c2158 100644 --- a/engines/avalanche/avalanche.h +++ b/engines/avalanche/avalanche.h @@ -41,6 +41,7 @@ #include "avalanche/menu.h" #include "avalanche/closing.h" #include "avalanche/sound.h" +#include "avalanche/nim.h" #include "common/serializer.h" @@ -59,7 +60,7 @@ struct AvalancheGameDescription { ADGameDescription desc; }; -static const int kSavegameVersion = 1; +static const int kSavegameVersion = 2; enum Pitch { kPitchInvalid, @@ -84,6 +85,7 @@ public: Menu *_menu; Closing *_closing; SoundHandler *_sound; + Nim *_nim; OSystem *_system; @@ -264,10 +266,7 @@ public: 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 _soundFx; - // These two have very similar purpose, but it's crucial not to modify _isLoaded later than the actual loading - // or at the begginning of the game, and _ablteToAddTimer must be modified in addTimer(). bool _isLoaded; // Is it a loaded gamestate? - bool _ableToAddTimer; void callVerb(VerbCode id); void loadRoom(byte num); @@ -292,7 +291,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. diff --git a/engines/avalanche/avalot.cpp b/engines/avalanche/avalot.cpp index 87b2b7aef0..ec3f81e55d 100644 --- a/engines/avalanche/avalot.cpp +++ b/engines/avalanche/avalot.cpp @@ -143,7 +143,7 @@ void Clock::update() { 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!", + "midnight. Are you having an all-night Avvy session? Glad you like the game that much!", kControlNewLine, kControlNewLine); _vm->_dialogs->displayText(tmpStr); } @@ -184,7 +184,7 @@ void Clock::chime() { // Mute - skip the sound generation if ((_oldHour == 17717) || (!_vm->_soundFx)) return; - + byte hour = _hour % 12; if (hour == 0) hour = 12; @@ -194,12 +194,11 @@ void Clock::chime() { 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) + if (i != hour) _vm->_system->delayMillis(100); } } - void AvalancheEngine::handleKeyDown(Common::Event &event) { _sound->click(); @@ -301,7 +300,7 @@ void AvalancheEngine::setup() { fxToggle(); thinkAbout(kObjectMoney, kThing); - _dialogs->displayScrollChain('q', 83); // Info on the game, etc. + _dialogs->displayScrollChain('Q', 83); // Info on the game, etc. } } @@ -576,7 +575,6 @@ void AvalancheEngine::exitRoom(byte x) { _lastRoomNotMap = _room; } - /** * Only when entering a NEW town! Not returning to the last one, * but choosing another from the map. @@ -643,6 +641,8 @@ void AvalancheEngine::enterRoom(Room roomId, byte ped) { if ((_lastRoom == kRoomMap) && (_lastRoomNotMap != _room)) enterNewTown(); + _animation->updateSpeed(); + switch (roomId) { case kRoomYours: if (_avvyInBed) { @@ -809,12 +809,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: @@ -997,7 +997,7 @@ void AvalancheEngine::enterRoom(Room roomId, byte ped) { case kRoomDucks: _npcFacing = 1; // Duck. - break; + break; default: break; @@ -1062,7 +1062,7 @@ 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++; @@ -1309,9 +1309,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++) { @@ -1339,7 +1339,6 @@ void AvalancheEngine::drawDirection() { // It's data is loaded in load_digits(). CursorMan.showMouse(true); } - void AvalancheEngine::gameOver() { _userMovesAvvy = false; @@ -1378,7 +1377,7 @@ uint16 AvalancheEngine::bearing(byte 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); @@ -1389,7 +1388,7 @@ uint16 AvalancheEngine::bearing(byte whichPed) { } } -/** +/** * @remarks Originally called 'sprite_run' */ void AvalancheEngine::spriteRun() { @@ -1482,6 +1481,7 @@ void AvalancheEngine::resetVariables() { _startTime = getTimeInSeconds(); _parser->resetVariables(); + _nim->resetVariables(); _animation->resetVariables(); _sequence->resetVariables(); _background->resetVariables(); @@ -1531,7 +1531,6 @@ void AvalancheEngine::newGame() { _doingSpriteRun = false; _avvyInBed = true; - _ableToAddTimer = true; // Set to false in _vm->loadGame(). _isLoaded = false; enterRoom(kRoomYours, 1); @@ -1565,7 +1564,7 @@ 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" }; @@ -1747,10 +1746,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..f50ad28bc4 100644 --- a/engines/avalanche/avalot.h +++ b/engines/avalanche/avalot.h @@ -40,7 +40,7 @@ public: Clock(AvalancheEngine *vm); void update(); - + private: static const int kCenterX = 510; static const int kCenterY = 183; diff --git a/engines/avalanche/background.cpp b/engines/avalanche/background.cpp index 523b7a6826..5d168a20af 100644 --- a/engines/avalanche/background.cpp +++ b/engines/avalanche/background.cpp @@ -251,7 +251,7 @@ void Background::update() { 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: 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..e4b52116e4 100644 --- a/engines/avalanche/console.cpp +++ b/engines/avalanche/console.cpp @@ -50,5 +50,4 @@ bool AvalancheConsole::Cmd_MagicLines(int argc, const char **argv) { return false; } - } // End of namespace Avalanche diff --git a/engines/avalanche/detection.cpp b/engines/avalanche/detection.cpp index 048b0fe148..5f4f03a78b 100644 --- a/engines/avalanche/detection.cpp +++ b/engines/avalanche/detection.cpp @@ -129,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 4b6cacf569..271c0b8288 100644 --- a/engines/avalanche/dialogs.cpp +++ b/engines/avalanche/dialogs.cpp @@ -190,7 +190,6 @@ void Dialogs::scrollModeNormal() { break; } while (!((mrelease > 0) || (buttona1()) || (buttonb1()))); - if (mrelease == 0) { inkey(); if (aboutscroll) { @@ -375,7 +374,7 @@ void Dialogs::scrollModeMusic() { else store(kPitchHigher, played); } - + if (theyMatch(played)) { setReadyLight(0); _vm->_timer->addTimer(8, Timer::kProcJacquesWakesUp, Timer::kReasonJacquesWakingUp); @@ -502,7 +501,7 @@ void Dialogs::drawScroll(DialogFunctionType modeFunc) { _underScroll = (my + 3) * 2; // Multiplying because of the doubled screen height. ringBell(); - + _vm->_dropsOk = false; dodgem(); @@ -510,7 +509,7 @@ void Dialogs::drawScroll(DialogFunctionType modeFunc) { unDodgem(); _vm->_dropsOk = true; - + resetScrollDriver(); } @@ -597,7 +596,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) { @@ -636,7 +635,7 @@ 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) { @@ -717,7 +716,7 @@ void Dialogs::displayText(Common::String text) { 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. @@ -732,7 +731,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: @@ -763,7 +762,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); @@ -777,7 +776,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; @@ -830,7 +829,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! @@ -874,7 +873,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); @@ -906,7 +905,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; @@ -953,7 +952,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; } @@ -1007,7 +1006,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); @@ -1019,64 +1018,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; } } @@ -1084,7 +1083,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; } @@ -1109,12 +1108,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. diff --git a/engines/avalanche/enums.h b/engines/avalanche/enums.h index 604c62de84..2b5db67609 100644 --- a/engines/avalanche/enums.h +++ b/engines/avalanche/enums.h @@ -81,12 +81,12 @@ 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, + kCurUpArrow = 0, kCurScrewDriver = 1, kCurRightArrow = 2, kCurFletch = 3, kCurWait = 4, kCurHand = 5, kCurCrosshair = 6, kCurIBeam = 7 }; @@ -127,7 +127,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/graphics.cpp b/engines/avalanche/graphics.cpp index d7c32cb1fc..841512847f 100644 --- a/engines/avalanche/graphics.cpp +++ b/engines/avalanche/graphics.cpp @@ -36,15 +36,15 @@ 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) { @@ -127,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); @@ -573,7 +572,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; @@ -624,7 +623,7 @@ void GraphicManager::drawSign(Common::String fn, int16 xl, int16 yl, int16 y) { } } } - + drawPicture(_scrolls, sign, kScreenWidth / 2 - width / 2, y); file.close(); @@ -669,7 +668,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) { diff --git a/engines/avalanche/menu.cpp b/engines/avalanche/menu.cpp index 7c37b79bc8..c3fa709ee4 100644 --- a/engines/avalanche/menu.cpp +++ b/engines/avalanche/menu.cpp @@ -64,7 +64,7 @@ void HeadType::highlight() { // Force reload and redraw of cursor. _menu->_vm->_currentMouse = 177; - + } bool HeadType::parseAltTrigger(char key) { @@ -141,8 +141,8 @@ 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->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); _activeNow = false; diff --git a/engines/avalanche/module.mk b/engines/avalanche/module.mk index 9c1205df02..0f66bb8213 100644 --- a/engines/avalanche/module.mk +++ b/engines/avalanche/module.mk @@ -15,7 +15,8 @@ MODULE_OBJS = \ dialogs.o \ sequence.o \ sound.o \ - timer.o + timer.o \ + nim.o # This module can be built as a plugin ifeq ($(ENABLE_AVALANCHE), DYNAMIC_PLUGIN) diff --git a/engines/avalanche/nim.cpp b/engines/avalanche/nim.cpp new file mode 100644 index 0000000000..a2572f1fa5 --- /dev/null +++ b/engines/avalanche/nim.cpp @@ -0,0 +1,177 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public 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; + + _playedNim = 0; +} + +void Nim::resetVariables() { + _playedNim = 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->fadeOut(); + + _vm->_graphics->saveScreen(); + + CursorMan.showMouse(false); + setup(); + board(); + CursorMan.showMouse(true); + + do { + startMove(); + if (_dogfoodsTurn) + dogFood(); + else + takeSome(); + _stones[_row] -= _number; + showChanges(); + } while (_stonesLeft != 0); + + endOfGame(); // Winning sequence is A1, B3, B1, C1, C1, btw. + + _vm->fadeOut(); + CursorMan.showMouse(false); + + _vm->_graphics->restoreScreen(); + _vm->_graphics->removeBackup(); + + CursorMan.showMouse(true); + _vm->fadeIn(); + + 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 z) { + warning("STUB: Nim::chalk()"); +} + +void Nim::setup() { + warning("STUB: Nim::setup()"); +} + +void Nim::plotStone(byte x,byte y) { + warning("STUB: Nim::plotStone()"); +} + +void Nim::board() { + warning("STUB: Nim::board()"); +} + +void Nim::startMove() { + warning("STUB: Nim::startMove()"); +} + +void Nim::showChanges() { + warning("STUB: Nim::showChanges()"); +} + +void Nim::blip() { + warning("STUB: Nim::blip()"); +} + +void Nim::checkMouse() { + warning("STUB: Nim::checkMouse()"); +} + +void Nim::less() { + warning("STUB: Nim::less()"); +} + +void Nim::takeSome() { + warning("STUB: Nim::takeSome()"); +} + +void Nim::endOfGame() { + warning("STUB: Nim::endOfGame()"); +} + +void Nim::dogFood() { + warning("STUB: Nim::dogFood()"); +} + +bool Nim::find(byte x) { + warning("STUB: Nim::find()"); + return true; +} + +void Nim::findAp(byte start,byte stepsize) { + warning("STUB: Nim::findAp()"); +} + +} // End of namespace Avalanche diff --git a/engines/avalanche/nim.h b/engines/avalanche/nim.h new file mode 100644 index 0000000000..a76afcfe22 --- /dev/null +++ b/engines/avalanche/nim.h @@ -0,0 +1,76 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/* + * This code is based on 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 _stonePic[4][23][7]; // Picture of Nimstone. + byte _turns; + bool _dogfoodsTurn; + byte _stonesLeft; + bool _clicked; + byte _row; + byte _number; + bool _squeak; + int8 _mNum, _mRow; + byte _playedNim; // How many times you've played Nim. + + void chalk(int x,int y, Common::String z); + void setup(); + void plotStone(byte x,byte y); + void board(); + void startMove(); + void showChanges(); + void blip(); + void checkMouse(); + void less(); + void takeSome(); + void endOfGame(); + void dogFood(); + bool find(byte x); + void findAp(byte start,byte stepsize); +}; + +} // End of namespace Avalanche + +#endif // AVALANCHE_NIM_H diff --git a/engines/avalanche/parser.cpp b/engines/avalanche/parser.cpp index 6090dc967a..811e71ee1d 100644 --- a/engines/avalanche/parser.cpp +++ b/engines/avalanche/parser.cpp @@ -27,6 +27,7 @@ #include "avalanche/avalanche.h" #include "avalanche/parser.h" +#include "avalanche/nim.h" #include "gui/saveload.h" @@ -50,7 +51,7 @@ Parser::Parser(AvalancheEngine *vm) { _thing2 = 0; _sworeNum = 0; _alcoholLevel = 0; - _playedNim = 0; + _boughtOnion = false; } @@ -521,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(); @@ -624,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[] = "~`!@#$%^&*()_+-={}[]:\"|;'\\,./<>?"; @@ -732,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; @@ -748,8 +759,6 @@ void Parser::storeInterrogation(byte interrogation) { _vm->_timer->cardiffSurvey(); } - - void Parser::parse() { // First parsing - word identification if (!_thats.empty()) @@ -762,7 +771,6 @@ void Parser::parse() { _person = kPeoplePardon; clearWords(); - // A cheat mode attempt. if (_inputText[0] == '.') { cheatParse(_inputText); @@ -925,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); @@ -947,6 +955,9 @@ void Parser::parse() { } } +/** + * Examine a standard object-thing + */ void Parser::examineObject() { if (_thing != _vm->_thinks) _vm->thinkAbout(_thing, AvalancheEngine::kThing); @@ -956,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); } } @@ -1011,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); @@ -1140,7 +1151,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; @@ -1177,6 +1188,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; @@ -1214,42 +1228,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; @@ -1272,7 +1289,7 @@ void Parser::openDoor() { break; case kRoomSpludwicks: if (_thing == 61) { - _vm->_dialogs->displayScrollChain('q', 85); + _vm->_dialogs->displayScrollChain('Q', 85); return; } break; @@ -1290,7 +1307,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); @@ -1318,6 +1335,9 @@ void Parser::openDoor() { _vm->_dialogs->displayText("Door? What door?"); } +/** + * Called when you call kVerbCodeput. + */ void Parser::putProc() { if (!isHolding()) return; @@ -1346,7 +1366,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 @@ -1424,6 +1444,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() { @@ -1436,10 +1457,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); } @@ -1449,13 +1470,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(); @@ -1503,6 +1524,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: @@ -1510,9 +1534,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; @@ -1567,7 +1591,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) { @@ -1588,15 +1612,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: @@ -1609,10 +1633,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); } } @@ -1629,7 +1653,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! @@ -1643,7 +1667,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); } @@ -1668,7 +1692,6 @@ void Parser::doThat() { // "Slip" object _thing -= 49; - if ((_verb != kVerbCodeLoad) && (_verb != kVerbCodeSave) && (_verb != kVerbCodeQuit) && (_verb != kVerbCodeInfo) && (_verb != kVerbCodeHelp) && (_verb != kVerbCodeLarrypass) && (_verb != kVerbCodePhaon) && (_verb != kVerbCodeBoss) && (_verb != kVerbCodeCheat) && (_verb != kVerbCodeRestart) && (_verb != kVerbCodeDir) && (_verb != kVerbCodeScore) && (_verb != kVerbCodeHiscores) && (_verb != kVerbCodeSmartAlec)) { @@ -1690,7 +1713,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.\" " \ @@ -1782,7 +1805,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; @@ -1796,7 +1819,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(); @@ -1811,7 +1834,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(); @@ -1830,7 +1853,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); @@ -1860,7 +1883,7 @@ void Parser::doThat() { if (savegameId < 0) // dialog aborted, nothing to load return; - + _vm->loadGame(savegameId); } break; @@ -1964,45 +1987,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(); @@ -2081,13 +2066,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 @@ -2241,7 +2226,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. @@ -2317,7 +2302,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->_dnascore, kControlCenter, kControlNewLine, kControlNewLine, kControlNewLine, rank().c_str(), kControlNewLine, kControlNewLine, totalTime().c_str()); _vm->_dialogs->displayText(tmpStr); } @@ -2378,7 +2363,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; @@ -2479,7 +2464,6 @@ void Parser::resetVariables() { _wearing = kNothing; _sworeNum = 0; _alcoholLevel = 0; - _playedNim = 0; _boughtOnion = false; } @@ -2487,7 +2471,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 bdb5ab9bc1..20066329e5 100644 --- a/engines/avalanche/parser.h +++ b/engines/avalanche/parser.h @@ -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,9 +62,9 @@ public: byte _thing; People _person; bool _polite; - Common::String _inputText; // Original name: current + Common::String _inputText; Common::String _inputTextBackup; - byte _inputTextPos; // Original name: curpos + byte _inputTextPos; bool _quote; bool _cursorState; bool _weirdWord; @@ -87,8 +86,8 @@ 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); void resetVariables(); @@ -107,10 +106,9 @@ 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); @@ -120,14 +118,14 @@ private: 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,14 +133,14 @@ 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(); diff --git a/engines/avalanche/timer.cpp b/engines/avalanche/timer.cpp index 93889b76b7..40f2af529a 100644 --- a/engines/avalanche/timer.cpp +++ b/engines/avalanche/timer.cpp @@ -43,22 +43,20 @@ Timer::Timer(AvalancheEngine *vm) { * @remarks Originally called 'set_up_timer' */ void Timer::addTimer(int32 duration, byte action, byte reason) { - if (_vm->_ableToAddTimer) { - 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->_ableToAddTimer = true; - 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; } /** @@ -203,7 +201,7 @@ void Timer::updateTimer() { } } } - + _vm->_roomCycles++; // Cycles since you've been in this room. } @@ -226,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) @@ -269,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(); @@ -314,18 +312,18 @@ 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. @@ -369,7 +367,7 @@ void Timer::afterTheShootemup() { warning("STUB: Timer::after_the_shootemup()"); - _vm->_dialogs->displayScrollChain('q', 70); + _vm->_dialogs->displayScrollChain('Q', 70); } void Timer::jacquesWakesUp() { @@ -425,7 +423,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! @@ -478,14 +476,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; } @@ -580,7 +578,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]; @@ -599,7 +597,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; } @@ -630,12 +628,12 @@ void Timer::arkataShouts() { if (_vm->_teetotal) return; - _vm->_dialogs->displayScrollChain('q', 76); + _vm->_dialogs->displayScrollChain('Q', 76); addTimer(160, kProcArkataShouts, kReasonArkataShouts); } void Timer::winning() { - _vm->_dialogs->displayScrollChain('q', 79); + _vm->_dialogs->displayScrollChain('Q', 79); _vm->_pingo->winningPic(); warning("STUB: Timer::winning()"); 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/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/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/configure.engines b/engines/configure.engines deleted file mode 100644 index 195d0a3426..0000000000 --- a/engines/configure.engines +++ /dev/null @@ -1,58 +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 prince "The Prince & The Coward" no -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/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/draci/barchive.cpp b/engines/draci/barchive.cpp index 31dfe62dee..584367fdfb 100644 --- a/engines/draci/barchive.cpp +++ b/engines/draci/barchive.cpp @@ -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/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/game.cpp b/engines/draci/game.cpp index a5c8aa867f..009f1bb3d2 100644 --- a/engines/draci/game.cpp +++ b/engines/draci/game.cpp @@ -1410,7 +1410,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 diff --git a/engines/draci/script.cpp b/engines/draci/script.cpp index 8ff60033ed..504476869e 100644 --- a/engines/draci/script.cpp +++ b/engines/draci/script.cpp @@ -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 */ 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/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/engines.mk b/engines/engines.mk deleted file mode 100644 index ff43c5403c..0000000000 --- a/engines/engines.mk +++ /dev/null @@ -1,268 +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_MORTEVIELLE -DEFINES += -DENABLE_MORTEVIELLE=$(ENABLE_MORTEVIELLE) -MODULES += engines/mortevielle -endif - -ifdef ENABLE_NEVERHOOD -DEFINES += -DENABLE_NEVERHOOD=$(ENABLE_NEVERHOOD) -MODULES += engines/neverhood -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_PRINCE -DEFINES += -DENABLE_PRINCE=$(ENABLE_PRINCE) -MODULES += engines/prince -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 c7b526d2c1..c27f1082f5 100644 --- a/engines/fullpipe/behavior.cpp +++ b/engines/fullpipe/behavior.cpp @@ -185,6 +185,19 @@ bool BehaviorManager::setBehaviorEnabled(StaticANIObject *obj, int aniId, int qu 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; + } + } +} + void BehaviorInfo::clear() { _ani = 0; _staticsId = 0; diff --git a/engines/fullpipe/behavior.h b/engines/fullpipe/behavior.h index 4fd1454351..1ac0b5bbfe 100644 --- a/engines/fullpipe/behavior.h +++ b/engines/fullpipe/behavior.h @@ -79,6 +79,8 @@ class BehaviorManager : public CObject { void updateStaticAniBehavior(StaticANIObject *ani, int delay, BehaviorEntry *beh); bool setBehaviorEnabled(StaticANIObject *obj, int aniId, int quId, int flag); + + void setFlagByStaticAniObject(StaticANIObject *ani, int flag); }; } // 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/engines/fullpipe/constants.h b/engines/fullpipe/constants.h index 9d8f503857..2e15423055 100644 --- a/engines/fullpipe/constants.h +++ b/engines/fullpipe/constants.h @@ -25,9 +25,14 @@ namespace Fullpipe { +#define ANI_BIGBALL 4923 #define ANI_BOOT_1 4231 +#define ANI_BUTTON 598 +#define ANI_CLOCK 588 #define ANI_DOMINO_3 2732 +#define ANI_DADAYASHIK 306 #define ANI_EGGEATER 334 +#define ANI_HAND 601 #define ANI_IN1MAN 5110 #define ANI_INV_COIN 875 #define ANI_INV_EGGAPL 1564 @@ -36,8 +41,19 @@ namespace Fullpipe { #define ANI_INV_EGGDOM 1561 #define ANI_INV_EGGGLS 1573 #define ANI_INV_MAP 5321 +#define ANI_KOZAWKA 495 #define ANI_LIFTBUTTON 2751 +#define ANI_MAMASHA_4 660 #define ANI_MAN 322 +#define ANI_PLANK 501 +#define ANI_SC2_BOX 1020 +#define ANI_SC4_BOOT 1035 +#define ANI_SC4_COIN 690 +#define ANI_SPEAKER_4 3275 +#define ANI_SPRING 542 +#define MSG_CLICKBOTTLE 569 +#define MSG_CLICKBUTTON 609 +#define MSG_CLICKPLANK 549 #define MSG_CMN_WINARCADE 4778 #define MSG_DISABLESAVES 5201 #define MSG_ENABLESAVES 5202 @@ -47,27 +63,61 @@ namespace Fullpipe { #define MSG_INTR_GETUPMAN 5135 #define MSG_INTR_SWITCHTO1 5145 #define MSG_INTR_SWITCHTO2 5134 +#define MSG_KOZAWRESTART 546 #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_LOWERPLANK 540 #define MSG_MANSHADOWSOFF 5196 #define MSG_MANSHADOWSON 5197 +#define MSG_RAISEPLANK 547 #define MSG_RESTARTGAME 4767 #define MSG_SC1_SHOWOSK 1019 #define MSG_SC1_SHOWOSK2 468 #define MSG_SC1_UTRUBACLICK 1100 +#define MSG_SC2_HIDELADDER 1023 +#define MSG_SC2_LADDERCLICK 1101 +#define MSG_SC2_PUTMANUP 1026 +#define MSG_SC2_SHOWLADDER 1027 #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 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 PIC_SC4_LADDER 1438 +#define MSG_GOTOLADDER 618 +#define MSG_SHAKEBOTTLE 584 +#define MSG_SHOOTKOZAW 557 +#define MSG_SHOWCOIN 1033 +#define MSG_STARTHAND 612 +#define MSG_TAKEBOTTLE 614 +#define MSG_TAKEKOZAW 611 +#define MSG_TESTPLANK 538 +#define MSG_UPDATEBOTTLE 613 #define MV_EGTR_FATASK 5332 #define MV_IN1MAN_SLEEP 5111 +#define MV_KZW_JUMP 558 +#define MV_KZW_JUMPROTATE 561 +#define MV_BDG_OPEN 1379 +#define MV_BTN_CLICK 599 +#define MV_CLK_GO 589 +#define MV_HND_POINT 602 +#define MV_MAN_GOD 481 #define MV_MAN_GOLADDER 451 #define MV_MAN_GOLADDER2 2844 +#define MV_MAN_GOU 460 #define MV_MAN_LOOKUP 4773 #define MV_MAN_STARTLADDER 452 #define MV_MAN_STARTLADDER2 2842 @@ -76,6 +126,10 @@ namespace Fullpipe { #define MV_MAN_TOLADDER 448 #define MV_MAN_TOLADDER2 2841 #define MV_MAN_TURN_LU 486 +#define MV_PNK_WEIGHTLEFT 541 +#define MV_PNK_WEIGHTRIGHT 502 +#define MV_SC4_COIN_default 1029 +#define MV_SPK4_PLAY 3276 #define PIC_CMN_EVAL 3468 #define PIC_CSR_DEFAULT 4891 #define PIC_CSR_DEFAULT_INV 4892 @@ -118,8 +172,17 @@ namespace Fullpipe { #define PIC_SC1_LADDER 1091 #define PIC_SC1_OSK 1018 #define PIC_SC1_OSK2 2932 +#define PIC_SC2_DTRUBA 841 +#define PIC_SC2_LADDER 412 #define PIC_SC3_DOMIN 5182 #define PIC_SC3_LADDER 1102 +#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 PIC_SCD_SEL 734 #define QU_EGTR_MD2_SHOW 4698 #define QU_EGTR_MD1_SHOW 4697 @@ -128,8 +191,10 @@ namespace Fullpipe { #define QU_INTR_FINISH 5138 #define QU_INTR_GETUPMAN 5136 #define QU_INTR_STARTINTRO 5133 +#define QU_PNK_CLICK 550 #define QU_SC3_ENTERLIFT 2779 #define QU_SC3_EXITLIFT 2808 +#define QU_SC4_MANFROMBOTTLE 2851 #define SC_1 301 #define SC_10 653 #define SC_11 654 @@ -182,13 +247,19 @@ namespace Fullpipe { #define SC_MAP 5222 #define SC_TEST 903 #define SC_TITLES 5166 +#define SND_4_010 3125 +#define SND_4_012 3127 +#define SND_4_033 4990 #define SND_CMN_031 3516 #define SND_CMN_070 5199 #define SND_INTR_019 5220 +#define ST_CLK_CLOSED 590 +#define ST_DYAS_LIES 318 #define ST_EGTR_MID1 2863 #define ST_EGTR_MID2 2869 #define ST_EGTR_SLIM 336 #define ST_IN1MAN_SLEEP 5112 +#define ST_KZW_EMPTY 498 #define ST_LBN_0N 2832 #define ST_LBN_0P 2833 #define ST_LBN_1N 2753 @@ -211,6 +282,7 @@ namespace Fullpipe { #define ST_LBN_9P 2778 #define ST_MAN_EMPTY 476 #define ST_MAN_RIGHT 325 +#define ST_MAN_SIT 1164 #define TrubaDown 697 #define TrubaLeft 474 #define TrubaRight 696 diff --git a/engines/fullpipe/floaters.cpp b/engines/fullpipe/floaters.cpp new file mode 100644 index 0000000000..384bfa2150 --- /dev/null +++ b/engines/fullpipe/floaters.cpp @@ -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. + * + */ + +#include "fullpipe/fullpipe.h" +#include "fullpipe/floaters.h" + +namespace Fullpipe { + +void Floaters::init(GameVar *var) { + warning("STUB: Floaters::init()"); +} + +void Floaters::genFlies(Scene *sc, int x, int y, int a5, int a6) { + warning("STUB: Floaters::genFlies()"); +} + +void Floaters::update() { + warning("STUB: Floaters::update()"); +} + +void Floaters::stopAll() { + warning("STUB: Floaters::stopAll()"); +} + + +} // End of namespace Fullpipe diff --git a/engines/fullpipe/floaters.h b/engines/fullpipe/floaters.h new file mode 100644 index 0000000000..a4d64dd79d --- /dev/null +++ b/engines/fullpipe/floaters.h @@ -0,0 +1,67 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef FULLPIPE_FLOATERS_H +#define FULLPIPE_FLOATERS_H + +namespace Fullpipe { + +class StaticANIObject; +class Scene; + +struct FloaterArray1 { + int val1; + int val2; +}; + +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; +}; + +class Floaters { +public: + //HRGN hRgn; + Common::Array<FloaterArray1 *> _array1; + Common::Array<FloaterArray2 *> _array2; + + void init(GameVar *var); + void genFlies(Scene *sc, int x, int y, int a5, int a6); + 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 2f49a41c17..7dedaf3109 100644 --- a/engines/fullpipe/fullpipe.cpp +++ b/engines/fullpipe/fullpipe.cpp @@ -34,6 +34,7 @@ #include "fullpipe/modal.h" #include "fullpipe/input.h" #include "fullpipe/scenes.h" +#include "fullpipe/floaters.h" namespace Fullpipe { @@ -96,6 +97,7 @@ FullpipeEngine::FullpipeEngine(OSystem *syst, const ADGameDescription *gameDesc) _currentScene = 0; _scene2 = 0; _movTable = 0; + _floaters = 0; _globalMessageQueueList = 0; _messageHandlers = 0; @@ -161,6 +163,8 @@ void FullpipeEngine::initialize() { _sceneRect.top = 0; _sceneRect.right = 799; _sceneRect.bottom = 599; + + _floaters = new Floaters; } Common::Error FullpipeEngine::run() { diff --git a/engines/fullpipe/fullpipe.h b/engines/fullpipe/fullpipe.h index 2cd0f87d32..63dde5042b 100644 --- a/engines/fullpipe/fullpipe.h +++ b/engines/fullpipe/fullpipe.h @@ -52,6 +52,7 @@ class Inventory2; struct CursorInfo; struct EntranceInfo; class ExCommand; +class Floaters; class GameProject; class GameObject; class GlobalMessageQueueList; @@ -163,6 +164,8 @@ public: MovTable *_movTable; + Floaters *_floaters; + void initMap(); void updateMapPiece(int mapId, int update); void updateScreen(); @@ -227,10 +230,12 @@ public: void openHelp(); void openMainMenu(); + void initArcadeKeys(const char *varname); void winArcade(); void getAllInventory(); int lift_getButtonIdP(int objid); + void lift_setButton(const char *name, int state); void lift_sub5(Scene *sc, int qu1, int qu2); void lift_exitSeq(ExCommand *ex); void lift_closedoorSeq(); diff --git a/engines/fullpipe/init.cpp b/engines/fullpipe/init.cpp index fb60a4cc57..49bf72ac91 100644 --- a/engines/fullpipe/init.cpp +++ b/engines/fullpipe/init.cpp @@ -56,7 +56,7 @@ void FullpipeEngine::initObjectStates() { 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)); @@ -70,7 +70,7 @@ void FullpipeEngine::initObjectStates() { 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)); @@ -83,11 +83,11 @@ 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_LowerPipe_21, getObjectEnumState(sO_LowerPipe_21, sO_IsClosed)); setObjectState(sO_StarsDown_24, getObjectEnumState(sO_StarsDown_24, sO_OpenedShe)); 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)); @@ -97,8 +97,8 @@ void FullpipeEngine::initObjectStates() { setObjectState(sO_Plank_25, getObjectEnumState(sO_Plank_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_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)); diff --git a/engines/fullpipe/interaction.cpp b/engines/fullpipe/interaction.cpp index 80cbce946b..b513d2b8ee 100644 --- a/engines/fullpipe/interaction.cpp +++ b/engines/fullpipe/interaction.cpp @@ -394,6 +394,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; diff --git a/engines/fullpipe/interaction.h b/engines/fullpipe/interaction.h index f968cca8ee..456b35458b 100644 --- a/engines/fullpipe/interaction.h +++ b/engines/fullpipe/interaction.h @@ -79,6 +79,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/lift.cpp b/engines/fullpipe/lift.cpp index 0e38c4f948..1d6d986977 100644 --- a/engines/fullpipe/lift.cpp +++ b/engines/fullpipe/lift.cpp @@ -22,6 +22,8 @@ #include "fullpipe/fullpipe.h" +#include "fullpipe/objects.h" +#include "fullpipe/objectnames.h" #include "fullpipe/constants.h" namespace Fullpipe { @@ -64,6 +66,13 @@ int FullpipeEngine::lift_getButtonIdP(int objid) { } } +void FullpipeEngine::lift_setButton(const char *name, int state) { + GameVar *var = g_fullpipe->getGameLoaderGameVar()->getSubVarByName("OBJSTATES")->getSubVarByName(sO_LiftButtons); + + if (var) + var->setSubVarAsInt(name, state); +} + void FullpipeEngine::lift_sub5(Scene *sc, int qu1, int qu2) { warning("STUB: FullpipeEngine::lift_sub5()"); } diff --git a/engines/fullpipe/messagehandlers.cpp b/engines/fullpipe/messagehandlers.cpp new file mode 100644 index 0000000000..fc57109f07 --- /dev/null +++ b/engines/fullpipe/messagehandlers.cpp @@ -0,0 +1,743 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * 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() { + warning("STUB: global_messageHandler_KickStucco()"); +} + +void global_messageHandler_KickMetal() { + warning("STUB: global_messageHandler_KickMetal()"); +} + +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; + } + + 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; + } + } + } 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 (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_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode); + if (ani) + ani->_priority = cmd->_field_14; + 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 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 + + //debug_msg(_messageNum); + + if (!g_fullpipe->_soundEnabled || cmd->_messageNum != 33 || g_fullpipe->_currSoundListCount <= 0) + return res; + + 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(); + } + } + } + + 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_fullpipe->_inputDisabled) + cmd->_messageKind = 0; + break; + default: + break; + } + } + + 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; + } +} + +int global_messageHandler4(ExCommand *cmd) { + StaticANIObject *ani = 0; + + switch (cmd->_messageKind) { + case 18: { + MessageQueue *mq = new MessageQueue(g_fullpipe->_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_fullpipe->_currentScene) + break; + + ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode); + if (!ani) + break; + + ani->trySetMessageQueue(cmd->_messageNum, cmd->_parId); + break; + + case 1: { + if (!g_fullpipe->_currentScene) + break; + + ani = g_fullpipe->_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_fullpipe->_currentScene) + break; + + ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode); + if (!ani) + break; + + ani->startAnimEx(cmd->_messageNum, cmd->_parId, -1, -1); + break; + + case 20: { + if (!g_fullpipe->_currentScene) + break; + + ani = g_fullpipe->_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 >> 3, flags); + } else { + ani->startAnimSteps(cmd->_messageNum, cmd->_parId, cmd->_x, cmd->_y, cmd2->_points, cmd2->_pointsSize >> 3, flags); + } + break; + } + case 21: + if (!g_fullpipe->_currentScene) + break; + + ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode); + if (!ani) + break; + + 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; + break; + + case 4: + g_fullpipe->_currentScene->_x = cmd->_messageNum - cmd->_messageNum % g_fullpipe->_scrollSpeed; + 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); + + if (!mq2 || !mq2->getExCommandByIndex(0) || !mq) + break; + + 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; + + ani->_flags |= 4; + ani->changeStatics2(cmd->_messageNum); + break; + + case 6: + if (!g_fullpipe->_currentScene) + break; + + ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode); + if (!ani) + break; + + 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); + + 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_fullpipe->_currentScene) + break; + + ani = g_fullpipe->_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_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; + + if (cmd->_field_24) { + g_fullpipe->_currentScene->_messageQueueId = cmd->_parId; + } + } else { + g_fullpipe->_sceneRect.moveTo(offX, offY); + + g_fullpipe->_currentScene->_x = 0; + g_fullpipe->_currentScene->_y = 0; + + g_fullpipe->_currentScene->updateScrolling2(); + } + break; + } + case 34: + if (!g_fullpipe->_currentScene) + break; + + ani = g_fullpipe->_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_fullpipe->_currentScene->getStaticANIObject1ById(g_fullpipe->_gameLoader->_field_FA, -1); + + if (!getSc2MctlCompoundBySceneId(g_fullpipe->_currentScene->_sceneId)) + return 0; + + if (getSc2MctlCompoundBySceneId(g_fullpipe->_currentScene->_sceneId)->_objtype != kObjTypeMovGraph || !ani) + return 0; + + MovGraph *gr = (MovGraph *)getSc2MctlCompoundBySceneId(g_fullpipe->_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/module.mk b/engines/fullpipe/module.mk index 380f582c08..88e3ac5d02 100644 --- a/engines/fullpipe/module.mk +++ b/engines/fullpipe/module.mk @@ -3,6 +3,7 @@ MODULE := engines/fullpipe MODULE_OBJS = \ behavior.o \ detection.o \ + floaters.o \ fullpipe.o \ gameloader.o \ gfx.o \ @@ -11,6 +12,7 @@ MODULE_OBJS = \ interaction.o \ inventory.o \ lift.o \ + messagehandlers.o \ messages.o \ modal.o \ motion.o \ @@ -20,7 +22,13 @@ MODULE_OBJS = \ sound.o \ stateloader.o \ statics.o \ - utils.o + utils.o \ + scenes/scene01.o \ + scenes/scene02.o \ + scenes/scene03.o \ + scenes/scene04.o \ + scenes/sceneDbg.o \ + scenes/sceneIntro.o # This module can be built as a plugin ifeq ($(ENABLE_FULLPIPE), DYNAMIC_PLUGIN) diff --git a/engines/fullpipe/objectnames.h b/engines/fullpipe/objectnames.h index 015df727e9..241e31b165 100644 --- a/engines/fullpipe/objectnames.h +++ b/engines/fullpipe/objectnames.h @@ -90,7 +90,7 @@ 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" // "Зеркальная к" diff --git a/engines/fullpipe/scenes.cpp b/engines/fullpipe/scenes.cpp index c266a819ed..6771fe8ec8 100644 --- a/engines/fullpipe/scenes.cpp +++ b/engines/fullpipe/scenes.cpp @@ -23,44 +23,19 @@ #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 scene03_setEaterState(); -int scene03_updateCursor(); -void scene03_initScene(Scene *sc); -int sceneHandler03(ExCommand *cmd); - -void sceneDbgMenu_initScene(Scene *sc); -int sceneHandlerDbgMenu(ExCommand *cmd); - Vars::Vars() { sceneIntro_aniin1man = 0; sceneIntro_needSleep = true; @@ -76,9 +51,52 @@ 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_sceneClickX = 0; + scene04_sceneClickY = 0; + + scene04_var01 = 0; + scene04_var02 = 0; + scene04_var04 = 0; + scene04_var05 = 0; + scene04_var06 = 0; + scene04_var07 = 0; + scene04_var08 = 0; + scene04_var09 = 0; + scene04_var10 = 0; + scene04_var11 = 0; + scene04_var12 = 0; + scene04_var13 = 0; + scene04_var14 = 0; + scene04_var15 = 0; + scene04_var16 = 0; + scene04_var17 = 0; + scene04_var18 = 0; + scene04_var19 = 0; + scene04_var20 = 0; + scene04_var24 = 0; + selector = 0; } @@ -207,7 +225,6 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) { _updateCursorCallback = defaultUpdateCursor; break; -#if 0 case SC_2: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_2"); scene->preloadMovements(sceneVar); @@ -218,7 +235,6 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) { addMessageHandler(sceneHandler02, 2); _updateCursorCallback = defaultUpdateCursor; break; -#endif case SC_3: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_3"); @@ -232,7 +248,6 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) { _updateCursorCallback = scene03_updateCursor; break; -#if 0 case SC_4: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_4"); scene->preloadMovements(sceneVar); @@ -244,6 +259,7 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) { _updateCursorCallback = scene04_updateCursor; break; +#if 0 case SC_5: sceneVar = _gameLoader->_gameVar->getSubVarByName("SC_5"); scene->preloadMovements(sceneVar); @@ -679,1207 +695,14 @@ bool FullpipeEngine::sceneSwitcher(EntranceInfo *entrance) { 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()"); -} - -void global_messageHandler_KickMetal() { - warning("STUB: global_messageHandler_KickMetal()"); -} - -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; - } - - 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; - } - } - } 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 (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_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode); - if (ani) - ani->_priority = cmd->_field_14; - 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 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 - - //debug_msg(_messageNum); - - if (!g_fullpipe->_soundEnabled || cmd->_messageNum != 33 || g_fullpipe->_currSoundListCount <= 0) - return res; - - 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(); - } - } - } - - 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_fullpipe->_inputDisabled) - cmd->_messageKind = 0; - break; - default: - break; - } - } - - 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; - } -} - -int global_messageHandler4(ExCommand *cmd) { - StaticANIObject *ani = 0; - - switch (cmd->_messageKind) { - case 18: { - MessageQueue *mq = new MessageQueue(g_fullpipe->_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_fullpipe->_currentScene) - break; - - ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode); - if (!ani) - break; - - ani->trySetMessageQueue(cmd->_messageNum, cmd->_parId); - break; - - case 1: { - if (!g_fullpipe->_currentScene) - break; - - ani = g_fullpipe->_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_fullpipe->_currentScene) - break; - - ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode); - if (!ani) - break; - - ani->startAnimEx(cmd->_messageNum, cmd->_parId, -1, -1); - break; - - case 20: { - if (!g_fullpipe->_currentScene) - break; - - ani = g_fullpipe->_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 >> 3, flags); - } else { - ani->startAnimSteps(cmd->_messageNum, cmd->_parId, cmd->_x, cmd->_y, cmd2->_points, cmd2->_pointsSize >> 3, flags); - } - break; - } - case 21: - if (!g_fullpipe->_currentScene) - break; - - ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode); - if (!ani) - break; - - 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; - break; - - case 4: - g_fullpipe->_currentScene->_x = cmd->_messageNum - cmd->_messageNum % g_fullpipe->_scrollSpeed; - 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); - - if (!mq2 || !mq2->getExCommandByIndex(0) || !mq) - break; - - 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; - - ani->_flags |= 4; - ani->changeStatics2(cmd->_messageNum); - break; - - case 6: - if (!g_fullpipe->_currentScene) - break; - - ani = g_fullpipe->_currentScene->getStaticANIObject1ById(cmd->_parentId, cmd->_keyCode); - if (!ani) - break; - - 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); - - 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_fullpipe->_currentScene) - break; - - ani = g_fullpipe->_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_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; - - if (cmd->_field_24) { - g_fullpipe->_currentScene->_messageQueueId = cmd->_parId; - } - } else { - g_fullpipe->_sceneRect.moveTo(offX, offY); - - g_fullpipe->_currentScene->_x = 0; - g_fullpipe->_currentScene->_y = 0; - - g_fullpipe->_currentScene->updateScrolling2(); - } - break; - } - case 34: - if (!g_fullpipe->_currentScene) - break; - - ani = g_fullpipe->_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_fullpipe->_currentScene->getStaticANIObject1ById(g_fullpipe->_gameLoader->_field_FA, -1); - - if (!getSc2MctlCompoundBySceneId(g_fullpipe->_currentScene->_sceneId)) - return 0; - - if (getSc2MctlCompoundBySceneId(g_fullpipe->_currentScene->_sceneId)->_objtype != kObjTypeMovGraph || !ani) - return 0; - - MovGraph *gr = (MovGraph *)getSc2MctlCompoundBySceneId(g_fullpipe->_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; -} - int defaultUpdateCursor() { g_fullpipe->updateCursorCommon(); return g_fullpipe->_cursorId; } -int sceneIntro_updateCursor() { - g_fullpipe->_cursorId = 0; - - return 0; -} - -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 sceneIntro_initScene(Scene *sc) { - g_fullpipe->_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_fullpipe->_recordEvents || g_fullpipe->_inputArFlag) - g_vars->sceneIntro_skipIntro = false; - - g_fullpipe->_modalObject = new ModalIntro; -} - -void sceneHandlerIntro_part1() { - g_fullpipe->_currentScene = g_fullpipe->accessScene(SC_INTRO1); - chainQueue(QU_INTR_FINISH, 0); -} - -void sceneHandlerIntro_part2() { - g_fullpipe->_currentScene = g_fullpipe->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_fullpipe->startSceneTrack(); - - return 0; -} - -void scene01_fixEntrance() { - GameVar *var = g_fullpipe->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_fullpipe->getObjectState(sO_EggCracker) == g_fullpipe->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; - } - - setElevatorButton(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_fullpipe->_aniMan, g_fullpipe->_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_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; - } - - 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(); - - return res; -} - -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_fullpipe->_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); - - setElevatorButton(sO_Level2, ST_LBN_2N); - - g_fullpipe->lift_sub5(sc, QU_SC3_ENTERLIFT, QU_SC3_EXITLIFT); -} - -void scene03_setEaterState() { - if (g_fullpipe->getObjectState(sO_EggGulperGaveCoin) == g_fullpipe->getObjectEnumState(sO_EggGulperGaveCoin, sO_Yes)) { - g_fullpipe->_behaviorManager->setBehaviorEnabled(g_vars->scene03_eggeater, ST_EGTR_SLIM, QU_EGTR_SLIMSHOW, 0); - g_fullpipe->_behaviorManager->setBehaviorEnabled(g_vars->scene03_eggeater, ST_EGTR_MID1, QU_EGTR_MD1_SHOW, 0); - g_fullpipe->_behaviorManager->setBehaviorEnabled(g_vars->scene03_eggeater, ST_EGTR_MID2, QU_EGTR_MD2_SHOW, 0); - } -} - -int scene03_updateCursor() { - g_fullpipe->updateCursorCommon(); - - if (g_fullpipe->_cursorId == PIC_CSR_DEFAULT && g_fullpipe->_objectIdAtCursor == PIC_SC3_DOMIN && g_vars->scene03_domino) { - if (g_vars->scene03_domino->_flags & 4) - g_fullpipe->_cursorId = PIC_CSR_ITN; - } - - return g_fullpipe->_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_fullpipe->setObjectState(sO_EggGulperGaveCoin, g_fullpipe->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_fullpipe->_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_fullpipe->_aniMan, g_fullpipe->_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_fullpipe->_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_fullpipe->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_fullpipe->lift_exitSeq(ex); - break; - - case MSG_LIFT_CLOSEDOOR: - g_fullpipe->lift_closedoorSeq(); - break; - - case MSG_SC3_ONTAKECOIN: - sceneHandler03_eaterFat(); - break; - - case MSG_LIFT_STARTEXITQUEUE: - g_fullpipe->lift_startExitQueue(); - break; - - case MSG_SC3_RELEASEEGG: - sceneHandler03_releaseEgg(); - break; - - case MSG_LIFT_CLICKBUTTON: - g_fullpipe->lift_animation3(); - 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_fullpipe->lift_goAnimation(); - break; - - case MSG_SC3_UTRUBACLICK: - sceneHandler03_goLadder(); - break; - - case MSG_SC3_TESTFAT: - sceneHandler03_giveCoin(ex); - break; - - case 64: - g_fullpipe->lift_sub05(ex); - break; - - case 93: - { - StaticANIObject *ani = g_fullpipe->_currentScene->getStaticANIObjectAtPos(ex->_sceneClickX, ex->_sceneClickY); - if (ani && ani->_id == ANI_LIFTBUTTON) { - g_fullpipe->lift_sub1(ani); - ex->_messageKind = 0; - - return 0; - } - - if (g_fullpipe->_currentScene->getPictureObjectIdAtPos(ex->_sceneClickX, ex->_sceneClickY) == PIC_SC3_DOMIN) { - if (g_vars->scene03_domino) - if (g_vars->scene03_domino->_flags & 4) - if (g_fullpipe->_aniMan->isIdle()) - if (!(g_fullpipe->_aniMan->_flags & 0x100) && g_fullpipe->_msgObjectId2 != g_vars->scene03_domino->_id) { - handleObjectInteraction(g_fullpipe->_aniMan, g_vars->scene03_domino, ex->_keyCode); - ex->_messageKind = 0; - - return 0; - } - } - - break; - } - - case 97: - { - int res = 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; - - 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(); - - return res; - } - } - - return 0; -} - -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; - } - g_fullpipe->setCursor(g_fullpipe->_cursorId); - - return 0; +void FullpipeEngine::initArcadeKeys(const char *varname) { + warning("STUB: FullpipeEngine::initArcadeKeys(\"%s\")", varname); } } // End of namespace Fullpipe diff --git a/engines/fullpipe/scenes.h b/engines/fullpipe/scenes.h index 9d1dbd5e55..277beb0083 100644 --- a/engines/fullpipe/scenes.h +++ b/engines/fullpipe/scenes.h @@ -27,6 +27,31 @@ namespace Fullpipe { class StaticANIObject; +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 sceneDbgMenu_initScene(Scene *sc); +int sceneHandlerDbgMenu(ExCommand *cmd); + class Vars { public: Vars(); @@ -45,9 +70,59 @@ public: PictureObject *scene01_picSc01Osk; PictureObject *scene01_picSc01Osk2; + 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::Array<StaticANIObject *> scene04_kozyawkiObjList; + Common::Array<GameObject *> scene04_bottleObjList; + Common::Array<StaticANIObject *> scene04_kozyawkiAni; + + int scene04_ladder; + bool scene04_coinPut; + bool scene04_soundPlaying; + int scene04_dynamicPhaseIndex; + int scene04_sceneClickX; + int scene04_sceneClickY; + int scene04_dudePosX; + int scene04_dudePosY; + + int scene04_var01; + int scene04_var02; + int scene04_var04; + StaticANIObject *scene04_var05; + int scene04_var06; + int scene04_var07; + int scene04_var08; + int scene04_var09; + int scene04_var10; + int scene04_var11; + int scene04_var12; + int scene04_var13; + int scene04_var14; + int scene04_var15; + int scene04_var16; + int scene04_var17; + int scene04_var18; + int scene04_var19; + int scene04_var20; + StaticANIObject *scene04_var24; + PictureObject *selector; }; diff --git a/engines/fullpipe/scenes/scene01.cpp b/engines/fullpipe/scenes/scene01.cpp new file mode 100644 index 0000000000..4181bbffe3 --- /dev/null +++ b/engines/fullpipe/scenes/scene01.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 "fullpipe/fullpipe.h" + +#include "fullpipe/objectnames.h" +#include "fullpipe/constants.h" + +#include "fullpipe/gameloader.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_fullpipe->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_fullpipe->getObjectState(sO_EggCracker) == g_fullpipe->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_fullpipe->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_fullpipe->_aniMan, g_fullpipe->_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_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; + } + + 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(); + + 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..dd01af4c4b --- /dev/null +++ b/engines/fullpipe/scenes/scene02.cpp @@ -0,0 +1,137 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * 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/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_fullpipe->getObjectState(sO_GuvTheDrawer) == g_fullpipe->getObjectEnumState(sO_GuvTheDrawer, sO_Sleeping)) { + Scene *s = g_fullpipe->_currentScene; + + g_fullpipe->_currentScene = sc; + g_vars->scene02_guvTheDrawer->changeStatics2(ST_DYAS_LIES); + g_fullpipe->_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_fullpipe->_rnd->getRandomNumber(32767) + 150; + } + + g_fullpipe->_floaters->init(g_fullpipe->_gameLoader->_gameVar->getSubVarByName("SC_2")); +} + +void sceneHandler02_ladderClick() { + handleObjectInteraction(g_fullpipe->_aniMan2, g_fullpipe->_currentScene->getPictureObjectById(PIC_SC2_DTRUBA, 0), 0); +} + +void sceneHandler02_showLadder() { + g_fullpipe->_currentScene->getPictureObjectById(PIC_SC2_LADDER, 0)->_flags |= 4; +} + +void sceneHandler02_hideLadder() { + g_fullpipe->_currentScene->getPictureObjectById(PIC_SC2_LADDER, 0)->_flags &= 0xfffb; + g_fullpipe->_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_fullpipe->_aniMan2->_priority = 0; + return 0; + + case MSG_SC2_HIDELADDER: + sceneHandler02_hideLadder(); + return 0; + + case 33: + 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; + + 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; + } + + if (g_vars->scene02_boxOpen) { + if (g_vars->scene02_boxDelay >= 1) { + --g_vars->scene02_boxDelay; + } else if (g_fullpipe->_floaters->_array2.size() >= 1) { + if (g_fullpipe->_floaters->_array2[0]->val5 == -50) { + g_fullpipe->_floaters->stopAll(); + g_vars->scene02_boxOpen = false; + g_vars->scene02_boxDelay = 100 * g_fullpipe->_rnd->getRandomNumber(32767) + 150; + } else { + g_fullpipe->_floaters->_array2[0]->val3 = -50; + } + } else { + g_fullpipe->_floaters->genFlies(g_fullpipe->_currentScene, g_fullpipe->_rnd->getRandomNumber(700) + 100, -50, 0, 0); + g_vars->scene02_boxDelay = 500 * g_fullpipe->_rnd->getRandomNumber(32767) + 1000; + } + } + + g_fullpipe->_floaters->update(); + g_fullpipe->_behaviorManager->updateBehaviors(); + + g_fullpipe->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..e9f8a240e8 --- /dev/null +++ b/engines/fullpipe/scenes/scene03.cpp @@ -0,0 +1,294 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * 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/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_fullpipe->_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_fullpipe->lift_setButton(sO_Level2, ST_LBN_2N); + + g_fullpipe->lift_sub5(sc, QU_SC3_ENTERLIFT, QU_SC3_EXITLIFT); +} + +void scene03_setEaterState() { + if (g_fullpipe->getObjectState(sO_EggGulperGaveCoin) == g_fullpipe->getObjectEnumState(sO_EggGulperGaveCoin, sO_Yes)) { + g_fullpipe->_behaviorManager->setBehaviorEnabled(g_vars->scene03_eggeater, ST_EGTR_SLIM, QU_EGTR_SLIMSHOW, 0); + g_fullpipe->_behaviorManager->setBehaviorEnabled(g_vars->scene03_eggeater, ST_EGTR_MID1, QU_EGTR_MD1_SHOW, 0); + g_fullpipe->_behaviorManager->setBehaviorEnabled(g_vars->scene03_eggeater, ST_EGTR_MID2, QU_EGTR_MD2_SHOW, 0); + } +} + +int scene03_updateCursor() { + g_fullpipe->updateCursorCommon(); + + if (g_fullpipe->_cursorId == PIC_CSR_DEFAULT && g_fullpipe->_objectIdAtCursor == PIC_SC3_DOMIN && g_vars->scene03_domino) { + if (g_vars->scene03_domino->_flags & 4) + g_fullpipe->_cursorId = PIC_CSR_ITN; + } + + return g_fullpipe->_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_fullpipe->setObjectState(sO_EggGulperGaveCoin, g_fullpipe->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_fullpipe->_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_fullpipe->_aniMan, g_fullpipe->_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_fullpipe->_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_fullpipe->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_fullpipe->lift_exitSeq(ex); + break; + + case MSG_LIFT_CLOSEDOOR: + g_fullpipe->lift_closedoorSeq(); + break; + + case MSG_SC3_ONTAKECOIN: + sceneHandler03_eaterFat(); + break; + + case MSG_LIFT_STARTEXITQUEUE: + g_fullpipe->lift_startExitQueue(); + break; + + case MSG_SC3_RELEASEEGG: + sceneHandler03_releaseEgg(); + break; + + case MSG_LIFT_CLICKBUTTON: + g_fullpipe->lift_animation3(); + 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_fullpipe->lift_goAnimation(); + break; + + case MSG_SC3_UTRUBACLICK: + sceneHandler03_goLadder(); + break; + + case MSG_SC3_TESTFAT: + sceneHandler03_giveCoin(ex); + break; + + case 64: + g_fullpipe->lift_sub05(ex); + break; + + case 93: + { + StaticANIObject *ani = g_fullpipe->_currentScene->getStaticANIObjectAtPos(ex->_sceneClickX, ex->_sceneClickY); + if (ani && ani->_id == ANI_LIFTBUTTON) { + g_fullpipe->lift_sub1(ani); + ex->_messageKind = 0; + + return 0; + } + + if (g_fullpipe->_currentScene->getPictureObjectIdAtPos(ex->_sceneClickX, ex->_sceneClickY) == PIC_SC3_DOMIN) { + if (g_vars->scene03_domino) + if (g_vars->scene03_domino->_flags & 4) + if (g_fullpipe->_aniMan->isIdle()) + if (!(g_fullpipe->_aniMan->_flags & 0x100) && g_fullpipe->_msgObjectId2 != g_vars->scene03_domino->_id) { + handleObjectInteraction(g_fullpipe->_aniMan, g_vars->scene03_domino, ex->_keyCode); + ex->_messageKind = 0; + + return 0; + } + } + + break; + } + + case 97: + { + int res = 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; + + 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(); + + 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..dab2131e04 --- /dev/null +++ b/engines/fullpipe/scenes/scene04.cpp @@ -0,0 +1,681 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * 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/scenes.h" +#include "fullpipe/messages.h" +#include "fullpipe/statics.h" +#include "fullpipe/scene.h" +#include "fullpipe/interaction.h" +#include "fullpipe/gameloader.h" +#include "fullpipe/behavior.h" + +namespace Fullpipe { + +void scene04_callback(int *param) { + warning("STUB: scene04_callback"); +} + +void scene04_initScene(Scene *sc) { + g_vars->scene04_var01 = 0; + 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_fullpipe->getObjectState(sO_Jar_4) == g_fullpipe->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_var18 = 0; + g_vars->scene04_var19 = 0; + } 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_var18 = 1; + g_vars->scene04_var19 = 1; + } + + g_vars->scene04_var02 = 0; + g_vars->scene04_soundPlaying = 0; + g_vars->scene04_var04 = 0; + g_vars->scene04_var05 = 0; + g_vars->scene04_var06 = 2; + g_vars->scene04_dynamicPhaseIndex = 0; + + g_vars->scene04_kozyawkiAni.clear(); + + g_fullpipe->setObjectState(sO_LowerPipe, g_fullpipe->getObjectEnumState(sO_LowerPipe, sO_IsClosed)); + + g_vars->scene04_var07 = 0; + g_vars->scene04_var08 = 0; + g_vars->scene04_coinPut = 0; + g_vars->scene04_var09 = 0; + g_vars->scene04_var10 = 0; + g_vars->scene04_var11 = 0; + g_vars->scene04_var12 = 0; + g_vars->scene04_var13 = 1; + g_vars->scene04_var14 = 0; + g_vars->scene04_var15 = 1; + + if (g_fullpipe->getObjectState(sO_BigMumsy) != g_fullpipe->getObjectEnumState(sO_BigMumsy, sO_Gone)) + g_vars->scene04_mamasha->hide(); + + g_vars->scene04_speaker = sc->getStaticANIObject1ById(ANI_SPEAKER_4, -1); + g_vars->scene04_speaker->_callback2 = scene04_callback; + g_vars->scene04_speaker->startAnim(MV_SPK4_PLAY, 0, -1); + + g_vars->scene04_var16 = 0; + g_vars->scene04_var17 = 0; + + g_fullpipe->initArcadeKeys("SC_4"); +} + +bool sceneHandler04_friesAreWalking() { + warning("STUB: sceneHandler04_friesAreWalking()"); + + return false; +} + +int scene04_updateCursor() { + g_fullpipe->updateCursorCommon(); + + if (g_fullpipe->_objectIdAtCursor == PIC_SC4_LRTRUBA) { + if (!g_vars->scene04_var19) { + g_fullpipe->_cursorId = PIC_CSR_DEFAULT; + + return g_fullpipe->_cursorId; + } + } else if (g_fullpipe->_objectIdAtCursor == ANI_PLANK || g_fullpipe->_objectIdAtCursor == PIC_SC4_PLANK) { + if (g_fullpipe->_objectIdAtCursor == ANI_PLANK && g_fullpipe->_cursorId != PIC_CSR_ITN) + return g_fullpipe->_cursorId; + + if (g_fullpipe->_objectIdAtCursor == ANI_PLANK || (g_fullpipe->_objectIdAtCursor == PIC_SC4_PLANK && g_fullpipe->_cursorId == PIC_CSR_DEFAULT)) { + if (sceneHandler04_friesAreWalking()) { + g_fullpipe->_cursorId = PIC_CSR_ARCADE1; + return g_fullpipe->_cursorId; + } + if (g_vars->scene04_soundPlaying) { + g_fullpipe->_cursorId = PIC_CSR_DEFAULT; + return g_fullpipe->_cursorId; + } + } + } + + if (g_fullpipe->_objectIdAtCursor == PIC_CSR_ITN && g_fullpipe->_objectIdAtCursor == PIC_SC4_DOWNTRUBA) + g_fullpipe->_cursorId = PIC_CSR_GOD; + + return g_fullpipe->_cursorId; +} + +void sceneHandlers_sub01(ExCommand *ex) { + warning("sceneHandlers_sub01()"); +} + +void sceneHandler04_checkBigBallClick() { + StaticANIObject *ball = g_fullpipe->_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_var13 = 1; +} + +void sceneHandler04_clickBottle() { + if (!g_vars->scene04_var02) + g_vars->scene04_var20 += 5; +} + +void sceneHandler04_clickButton() { + StaticANIObject *but = g_fullpipe->_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_var02) { + but->startAnim(MV_BTN_CLICK, 0, -1); + g_vars->scene04_hand->startAnim(MV_HND_POINT, 0, -1); + } + } + } +} + +void sceneHandler04_clickLadder() { + warning("sceneHandler04_clickLadder()"); +} + +void sceneHandler04_sub13() { + warning("sceneHandler04_sub13()"); +} + +void sceneHandler04_clickPlank() { + if (sceneHandler04_friesAreWalking()) + sceneHandler04_sub13(); + else if (g_vars->scene04_var01) + g_fullpipe->playSound(SND_4_033, 0); + else if (!g_vars->scene04_soundPlaying) + chainQueue(QU_PNK_CLICK, 0); +} + +void sceneHandler04_dropBottle() { + warning("sceneHandler04_dropBottle()"); +} + +void sceneHandler04_gotoLadder(int par) { + warning("sceneHandler04_gotoLadder()"); +} + +void sceneHandler04_lowerPlank() { + g_vars->scene04_plank->startAnim(MV_PNK_WEIGHTRIGHT, 0, -1); +} + +void sceneHandler04_manFromBottle() { + warning("sceneHandler04_manFromBottle()"); +} + +void sceneHandler04_manToBottle() { + g_vars->scene04_bottleObjList.push_back(g_fullpipe->_aniMan); + g_vars->scene04_var20 = 5; + g_vars->scene04_var06 += 9; + g_fullpipe->_aniMan2 = g_fullpipe->_aniMan; + g_vars->scene04_var10 = 1; +} + +void sceneHandler04_raisePlank() { + g_vars->scene04_plank->startAnim(MV_PNK_WEIGHTLEFT, 0, -1); +} + +void sceneHandler04_shootKozyawka() { + warning("sceneHandler04_shootKozyawka()"); +} + +void sceneHandler04_showCoin() { + StaticANIObject *ani = g_fullpipe->_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() { + warning("sceneHandler04_stopSound()"); +} + +void sceneHandler04_sub1(ExCommand *ex) { + g_fullpipe->_aniMan->changeStatics2(ST_MAN_SIT); + + MessageQueue *mq = new MessageQueue(g_fullpipe->_currentScene->getMessageQueueById(QU_SC4_MANFROMBOTTLE), 0, 0); + + if (ex) { + ExCommand *newex = new ExCommand(ex); + + mq->_exCommands.push_back(newex); + } + + mq->_flags |= 1; + mq->chain(0); + + g_vars->scene04_var10 = 0; + g_fullpipe->_behaviorManager->setFlagByStaticAniObject(g_fullpipe->_aniMan, 1); +} + +void sceneHandler04_sub3() { + warning("sceneHandler04_sub3()"); +} + +void sceneHandler04_sub4() { + warning("sceneHandler04_sub4()"); +} + +void sceneHandler04_sub5() { + warning("sceneHandler04_sub5()"); +} + +void sceneHandler04_sub6() { + warning("sceneHandler04_sub6()"); +} + +void sceneHandler04_sub7() { + warning("sceneHandler04_sub7()"); +} + +void sceneHandler04_sub8(ExCommand *ex) { + warning("sceneHandler04_sub8()"); +} + +void sceneHandler04_sub9(StaticANIObject *ani) { + warning("sceneHandler04_sub9()"); +} + +void sceneHandler04_sub15() { + warning("sceneHandler04_sub15()"); +} + +void sceneHandler04_sub17() { + warning("sceneHandler04_sub17()"); +} + +void sceneHandler04_takeBottle() { + warning("sceneHandler04_takeBottle()"); +} + +void sceneHandler04_takeKozyawka() { + warning("sceneHandler04_takeKozyawka()"); +} + +void sceneHandler04_testPlank(ExCommand *ex) { + warning("sceneHandler04_testPlank()"); +} + +void sceneHandler04_bottleUpdateObjects(int off) { + warning("sceneHandler04_bottleUpdateObjects()"); +} + +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() { + warning("sceneHandler04_winArcade()"); +} + +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_var02) + ++g_vars->scene04_var20; + break; + + case MSG_STARTHAND: + g_vars->scene04_var09 = 1; + g_vars->scene04_coinPut = 0; + + if (g_vars->scene04_var10) + sceneHandler04_sub1(0); + + sceneHandler04_sub15(); + 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_var05) { + g_vars->scene04_kozyawkiObjList.push_back(g_vars->scene04_var05); + g_vars->scene04_var05->hide(); + g_vars->scene04_var05 = 0; + } + if (g_vars->scene04_soundPlaying) + sceneHandler04_sub3(); + + break; + + case MSG_LOWERPLANK: + sceneHandler04_lowerPlank(); + break; + + case MSG_TESTPLANK: + sceneHandler04_testPlank(ex); + break; + + case 33: + { + g_vars->scene04_dudePosX = g_fullpipe->_aniMan->_ox; + g_vars->scene04_dudePosY = g_fullpipe->_aniMan->_oy; + + int res = 0; + + if (g_fullpipe->_aniMan2) { + if (g_fullpipe->_aniMan->_ox < g_fullpipe->_sceneRect.left + 200) { + g_fullpipe->_currentScene->_x = g_fullpipe->_aniMan->_ox - g_fullpipe->_sceneRect.left - 300; + g_fullpipe->_aniMan->_ox = g_vars->scene04_dudePosX; + } + if (g_fullpipe->_aniMan->_ox > g_fullpipe->_sceneRect.right - 200) { + g_fullpipe->_currentScene->_x = g_fullpipe->_aniMan->_ox - g_fullpipe->_sceneRect.right + 300; + } + + res = 1; + + if (g_vars->scene04_soundPlaying) { + if (g_fullpipe->_aniMan->_movement) { + if (g_fullpipe->_aniMan->_movement->_id == MV_MAN_TOLADDER) { + g_fullpipe->_aniMan2 = 0; + + if (g_fullpipe->_sceneRect.left > 380) + g_fullpipe->_currentScene->_x = 380 - g_fullpipe->_sceneRect.left; + } + } + } + } else { + if (g_fullpipe->_aniMan->_movement && g_fullpipe->_aniMan->_movement->_id == MV_MAN_GOD) + g_fullpipe->_aniMan2 = g_fullpipe->_aniMan; + } + + sceneHandler04_sub4(); + + if (g_vars->scene04_var07 && !g_vars->scene04_var09) + sceneHandler04_sub5(); + + if (g_vars->scene04_var12) + sceneHandler04_sub6(); + + if (g_vars->scene04_var08) + sceneHandler04_clickLadder(); + + if (g_vars->scene04_var10 && g_vars->scene04_hand->_movement) + sceneHandler04_sub1(0); + + if (g_vars->scene04_coinPut && g_vars->scene04_var18 && !g_vars->scene04_var09 && !g_vars->scene04_soundPlaying) + sceneHandler04_sub7(); + + if (g_vars->scene04_var01) { + if (!g_vars->scene04_soundPlaying) { + g_fullpipe->startSceneTrack(); + + g_fullpipe->_behaviorManager->updateBehaviors(); + return res; + } + + g_vars->scene04_var14++; + + if (g_vars->scene04_var14 > 600) + sceneHandler04_sub17(); + } + + if (g_vars->scene04_soundPlaying) { + g_fullpipe->_behaviorManager->updateBehaviors(); + + return res; + } + + g_fullpipe->startSceneTrack(); + + g_fullpipe->_behaviorManager->updateBehaviors(); + + return res; + } + + case 29: + { + int picid = g_fullpipe->_currentScene->getPictureObjectIdAtPos(ex->_sceneClickX, ex->_sceneClickY); + + if (g_vars->scene04_var10) { + sceneHandler04_sub1(ex); + + break; + } + + if (picid == PIC_SC4_LADDER) { + if (!g_vars->scene04_var04) { + 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_fullpipe->_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_var01) { + sceneHandler04_sub8(ex); + } else if (!ani || !canInteractAny(g_fullpipe->_aniMan, ani, ex->_keyCode)) { + PictureObject *pic = g_fullpipe->_currentScene->getPictureObjectById(picid, 0); + + if (!pic || !canInteractAny(g_fullpipe->_aniMan, pic,ex->_keyCode)) { + if ((g_fullpipe->_sceneRect.right - ex->_sceneClickX < 47 && g_fullpipe->_sceneRect.right < g_fullpipe->_sceneWidth - 1) + || (ex->_sceneClickX - g_fullpipe->_sceneRect.left < 47 && g_fullpipe->_sceneRect.left > 0)) + sceneHandlers_sub01(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_var09 = 0; + g_vars->scene04_var19 = 1; + break; + + case MSG_SC4_DROPBOTTLE: + sceneHandler04_dropBottle(); + break; + + case MSG_SC4_COINOUT: + g_vars->scene04_clock->changeStatics2(ST_CLK_CLOSED); + g_vars->scene04_coinPut = 0; + sceneHandler04_stopSound(); + + if (g_vars->scene04_kozyawkiAni.size() && !g_vars->scene04_var02) { + g_vars->scene04_var09 = 1; + + if (g_vars->scene04_var10) + sceneHandler04_sub1(0); + + sceneHandler04_sub15(); + } + + break; + + case MSG_SC4_KOZAWFALL: + { + ExCommand *exnew; + + if (g_vars->scene04_var11) { + sceneHandler04_sub9(g_vars->scene04_var24); + + g_vars->scene04_var11 = 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 = 1; + 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..83f3b64ee5 --- /dev/null +++ b/engines/fullpipe/scenes/sceneDbg.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 "fullpipe/fullpipe.h" + +#include "fullpipe/constants.h" + +#include "fullpipe/gameloader.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_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; + } + g_fullpipe->setCursor(g_fullpipe->_cursorId); + + 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..d60f90faf7 --- /dev/null +++ b/engines/fullpipe/scenes/sceneIntro.cpp @@ -0,0 +1,109 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "fullpipe/fullpipe.h" + +#include "fullpipe/constants.h" +#include "fullpipe/gameloader.h" +#include "fullpipe/scenes.h" +#include "fullpipe/modal.h" +#include "fullpipe/statics.h" + +namespace Fullpipe { + +int sceneIntro_updateCursor() { + g_fullpipe->_cursorId = 0; + + return 0; +} + +void sceneIntro_initScene(Scene *sc) { + g_fullpipe->_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_fullpipe->_recordEvents || g_fullpipe->_inputArFlag) + g_vars->sceneIntro_skipIntro = false; + + g_fullpipe->_modalObject = new ModalIntro; +} + +void sceneHandlerIntro_part1() { + g_fullpipe->_currentScene = g_fullpipe->accessScene(SC_INTRO1); + chainQueue(QU_INTR_FINISH, 0); +} + +void sceneHandlerIntro_part2() { + g_fullpipe->_currentScene = g_fullpipe->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_fullpipe->startSceneTrack(); + + return 0; +} + +} // End of namespace Fullpipe diff --git a/engines/fullpipe/statics.cpp b/engines/fullpipe/statics.cpp index 445259c8f5..c86d5abd08 100644 --- a/engines/fullpipe/statics.cpp +++ b/engines/fullpipe/statics.cpp @@ -1162,8 +1162,8 @@ Movement::Movement() { _counter = 0; _counterMax = 83; - _field_24 = 0; - _field_28 = 0; + _somePoint.x = 0; + _somePoint.y = 0; } Movement::Movement(Movement *src, StaticANIObject *ani) { @@ -1185,8 +1185,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; @@ -1219,8 +1219,8 @@ Movement::Movement(Movement *src, int *oldIdxs, int newSize, StaticANIObject *an _currDynamicPhaseIndex = 0; _field_94 = 0; - _field_24 = 0; - _field_28 = 0; + _somePoint.x = 0; + _somePoint.y = 0; _field_50 = src->_field_50; _flipFlag = src->_flipFlag; diff --git a/engines/fullpipe/statics.h b/engines/fullpipe/statics.h index 49ebc8edf7..15de4ab3be 100644 --- a/engines/fullpipe/statics.h +++ b/engines/fullpipe/statics.h @@ -107,8 +107,7 @@ class StaticANIObject; class Movement : public GameObject { public: - int _field_24; - int _field_28; + Common::Point _somePoint; int _lastFrameSpecialFlag; int _flipFlag; int _updateFlag1; 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/groovie/configure.engine b/engines/groovie/configure.engine new file mode 100644 index 0000000000..84e95a70df --- /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" diff --git a/engines/groovie/font.cpp b/engines/groovie/font.cpp index d29c22dd02..a55d8fad95 100644 --- a/engines/groovie/font.cpp +++ b/engines/groovie/font.cpp @@ -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..49cf4b7b06 100644 --- a/engines/groovie/font.h +++ b/engines/groovie/font.h @@ -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/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/events.cpp b/engines/hopkins/events.cpp index 51c66c4f92..d0c1dcea4d 100644 --- a/engines/hopkins/events.cpp +++ b/engines/hopkins/events.cpp @@ -271,7 +271,7 @@ void EventsManager::pollEvents() { _mouseButton = 0; return; default: - break; + break; } } diff --git a/engines/hopkins/graphics.cpp b/engines/hopkins/graphics.cpp index de9f043763..05b8296b86 100644 --- a/engines/hopkins/graphics.cpp +++ b/engines/hopkins/graphics.cpp @@ -1359,7 +1359,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 diff --git a/engines/hopkins/talk.cpp b/engines/hopkins/talk.cpp index 1bb6701fc8..d218dd27b5 100644 --- a/engines/hopkins/talk.cpp +++ b/engines/hopkins/talk.cpp @@ -266,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); 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/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/resource.cpp b/engines/kyra/resource.cpp index c350c81742..7a1abe8dd9 100644 --- a/engines/kyra/resource.cpp +++ b/engines/kyra/resource.cpp @@ -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/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/entities/entity.h b/engines/lastexpress/entities/entity.h index 5aa7c1be5a..f3b57e7464 100644 --- a/engines/lastexpress/entities/entity.h +++ b/engines/lastexpress/entities/entity.h @@ -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); diff --git a/engines/lastexpress/entities/servers0.cpp b/engines/lastexpress/entities/servers0.cpp index 73e0d34722..6323ef0ca8 100644 --- a/engines/lastexpress/entities/servers0.cpp +++ b/engines/lastexpress/entities/servers0.cpp @@ -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/verges.cpp b/engines/lastexpress/entities/verges.cpp index d9ddb0a4d1..68c0813013 100644 --- a/engines/lastexpress/entities/verges.cpp +++ b/engines/lastexpress/entities/verges.cpp @@ -105,7 +105,7 @@ IMPLEMENT_FUNCTION(3, Verges, callbackActionOnDirection) case kActionExitCompartment: callbackAction(); - break; + break; case kActionExcuseMeCath: if (!params->param1) { diff --git a/engines/lastexpress/game/entities.h b/engines/lastexpress/game/entities.h index 81aed627aa..cacbc408c9 100644 --- a/engines/lastexpress/game/entities.h +++ b/engines/lastexpress/game/entities.h @@ -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/logic.cpp b/engines/lastexpress/game/logic.cpp index 09104d1bf9..d24fb9b598 100644 --- a/engines/lastexpress/game/logic.cpp +++ b/engines/lastexpress/game/logic.cpp @@ -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 */ diff --git a/engines/lastexpress/game/logic.h b/engines/lastexpress/game/logic.h index efb8f1e1a3..b2d08cb06f 100644 --- a/engines/lastexpress/game/logic.h +++ b/engines/lastexpress/game/logic.h @@ -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..2fcdde12b9 100644 --- a/engines/lastexpress/game/object.cpp +++ b/engines/lastexpress/game/object.cpp @@ -69,11 +69,12 @@ 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_location != location && (original_location == kObjectLocation2 || location == 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) { diff --git a/engines/lastexpress/game/savegame.h b/engines/lastexpress/game/savegame.h index 361957227e..257c005e4a 100644 --- a/engines/lastexpress/game/savegame.h +++ b/engines/lastexpress/game/savegame.h @@ -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/state.h b/engines/lastexpress/game/state.h index 944f6d47b1..83d528d346 100644 --- a/engines/lastexpress/game/state.h +++ b/engines/lastexpress/game/state.h @@ -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/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/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/detection.cpp b/engines/made/detection.cpp index e8b755cb40..c2c866ff34 100644 --- a/engines/made/detection.cpp +++ b/engines/made/detection.cpp @@ -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/screenfx.cpp b/engines/made/screenfx.cpp index d069308a4b..b89b3af802 100644 --- a/engines/made/screenfx.cpp +++ b/engines/made/screenfx.cpp @@ -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/sound.cpp b/engines/made/sound.cpp index f73c580560..176f8688bd 100644 --- a/engines/made/sound.cpp +++ b/engines/made/sound.cpp @@ -228,7 +228,7 @@ void decompressSound(byte *source, byte *dest, uint16 chunkSize, uint16 chunkCou break; default: - return; + return; } 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/mortevielle/configure.engine b/engines/mortevielle/configure.engine new file mode 100644 index 0000000000..14d6479e7a --- /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" no diff --git a/engines/neverhood/configure.engine b/engines/neverhood/configure.engine new file mode 100644 index 0000000000..0767a631f9 --- /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" no diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp index efd0699d58..e5486bbcf5 100644 --- a/engines/neverhood/detection.cpp +++ b/engines/neverhood/detection.cpp @@ -196,7 +196,7 @@ bool NeverhoodMetaEngine::hasFeature(MetaEngineFeature f) const { (f == kSupportsListSaves) || (f == kSupportsLoadingDuringStartup) || (f == kSupportsDeleteSave) || - (f == kSavesSupportMetaInfo) || + (f == kSavesSupportMetaInfo) || (f == kSavesSupportThumbnail) || (f == kSavesSupportCreationDate) || (f == kSavesSupportPlayTime); diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 50c7c503d3..699df2ae7d 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -216,7 +216,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() { 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/exec.h b/engines/parallaction/exec.h index b966d677cd..5968954ba0 100644 --- a/engines/parallaction/exec.h +++ b/engines/parallaction/exec.h @@ -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/gui_ns.cpp b/engines/parallaction/gui_ns.cpp index ea3c394684..ae32a416e3 100644 --- a/engines/parallaction/gui_ns.cpp +++ b/engines/parallaction/gui_ns.cpp @@ -415,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.h b/engines/parallaction/input.h index a815469ec3..a303eb96c8 100644 --- a/engines/parallaction/input.h +++ b/engines/parallaction/input.h @@ -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/objects.h b/engines/parallaction/objects.h index 81761b2c6b..89e8134431 100644 --- a/engines/parallaction/objects.h +++ b/engines/parallaction/objects.h @@ -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.h b/engines/parallaction/parallaction.h index 2dbb0227d6..203a0168ea 100644 --- a/engines/parallaction/parallaction.h +++ b/engines/parallaction/parallaction.h @@ -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/parser.h b/engines/parallaction/parser.h index e55df686e0..622e507aad 100644 --- a/engines/parallaction/parser.h +++ b/engines/parallaction/parser.h @@ -297,7 +297,7 @@ 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(); diff --git a/engines/parallaction/sound.h b/engines/parallaction/sound.h index e12e50e278..e8dde78ddc 100644 --- a/engines/parallaction/sound.h +++ b/engines/parallaction/sound.h @@ -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/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/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 939c756581..0000000000 --- a/engines/plugins_table.h +++ /dev/null @@ -1,133 +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(PRINCE) -LINK_PLUGIN(PRINCE) -#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/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/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/saga.h b/engines/saga/saga.h index 01cab21f5d..645e1c30d0 100644 --- a/engines/saga/saga.h +++ b/engines/saga/saga.h @@ -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/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/detection_tables.h b/engines/sci/detection_tables.h index 5ad49acf5c..05af2ff78c 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -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, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, 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, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, 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, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, 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, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, 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,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "a4b73d5d2b55bdb6e44345e99c8fbdd0", 4804}, {"resource.000", 0, "d908dbef56816ac6c60dd145fdeafb2b", 3536046}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, 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 // SCI interpreter version 1.000.510 @@ -476,7 +478,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 +489,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 +500,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 +512,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 +523,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 +531,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 +539,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 +547,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 +555,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 +571,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 +579,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 +589,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 +598,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 +607,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 +617,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 +630,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 +640,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 +648,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 +663,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 +671,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 +679,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 +688,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 +696,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 +704,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 +712,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 +720,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 +728,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 +736,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 +744,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 +752,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 +760,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 +768,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 +776,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 +785,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 +793,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 +801,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 +819,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 +837,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 +849,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 +861,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, GUIO4(GUIO_NOSPEECH, 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 +871,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 +879,14 @@ 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) }, #if 0 // TODO: unknown if these files are corrupt // Hoyle 1 - English Amiga (from www.back2roots.org) @@ -894,7 +896,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 +906,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 +914,7 @@ 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 Amiga (from www.back2roots.org) // Executable scanning reports "1.002.032" @@ -921,7 +923,7 @@ 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, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, // Hoyle 2 - English Macintosh // Executable scanning reports "x.yyy.zzz" @@ -929,7 +931,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "1af1d3aa3cf564f93477c9f87e53f495", 1728}, {"resource.001", 0, "b73b8131669d69d41a326415e4519138", 482882}, {NULL, 0, NULL, 0}}, - Common::EN_ANY, Common::kPlatformMacintosh, 0, 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) }, #if 0 // TODO: unknown if these files are corrupt // Hoyle 3 - English Amiga (from www.back2roots.org) @@ -940,7 +942,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 +952,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 +962,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 +973,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 +981,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 +997,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 +1005,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 +1013,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 +1022,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, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, 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, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, 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 +1038,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 +1046,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 +1062,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 +1070,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 +1079,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 +1091,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 +1099,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 +1110,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 +1124,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 +1137,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 +1145,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 +1156,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 +1168,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 +1182,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 +1196,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 +1210,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 +1223,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 +1239,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 +1255,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 +1271,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 +1281,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 +1293,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 +1308,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 +1326,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 +1341,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 +1357,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, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, 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 +1369,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, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, 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 +1384,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, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, 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 +1396,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, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, 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 +1411,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 +1426,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 +1442,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 +1457,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 +1475,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 +1490,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 +1498,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 +1516,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 +1526,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 +1535,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 +1544,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 +1553,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 +1563,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 +1571,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 +1580,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 +1589,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 +1597,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 +1608,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 +1616,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 +1624,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 +1632,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 +1640,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 +1648,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 +1656,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 +1664,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 +1672,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 +1688,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 +1700,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 +1708,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 +1719,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 +1733,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,7 +1742,7 @@ 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 // Executable scanning reports "2.000.274" @@ -1749,7 +1751,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"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 - English DOS CD (from "The Roberta Williams Antology"/1996) // Executable scanning reports "1.001.072", VERSION file reports "1.1" (from jvprat) @@ -1758,7 +1760,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 +1768,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 +1777,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 +1786,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 +1797,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, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, 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 +1815,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 +1826,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 +1836,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 +1845,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 +1853,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 +1866,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 +1877,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 +1885,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 +1897,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 +1906,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 +1919,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 +1934,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 +1944,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 +1954,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 +1968,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 +1982,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 +1996,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 +2007,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 +2017,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 +2026,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 +2038,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 +2050,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 +2064,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 +2079,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 +2095,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 +2103,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 +2118,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 +2132,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 +2147,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 +2163,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 +2179,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 +2187,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 +2202,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, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, // Larry 5 EGA // Supplied by omer_mor in bug report #3049771 @@ -2211,7 +2213,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, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, // Larry 6 - English DOS (from spookypeanut) // SCI interpreter version 1.001.113 @@ -2219,7 +2221,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 +2229,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 +2237,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 +2245,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 +2253,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 +2261,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 +2298,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 +2306,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 +2314,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 +2322,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 +2331,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 +2339,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 +2347,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 +2355,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 +2363,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 +2372,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 +2381,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 +2391,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 +2401,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 +2412,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 +2423,7 @@ 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 v1.000 - English DOS (supplied by markcoolio in bug report #2723791) // Executable scanning reports "1.000.145" @@ -2433,7 +2435,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 +2446,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 +2456,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 +2464,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 +2477,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 +2485,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 +2494,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 +2502,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 +2523,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 +2531,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 +2540,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 +2561,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 +2569,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 +2580,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 +2613,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 +2623,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 +2634,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 +2642,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 +2650,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 +2658,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 +2666,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 +2677,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 +2685,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 +2698,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 +2708,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 +2718,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 +2727,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 +2737,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 +2750,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 +2764,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 +2777,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 +2787,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 +2800,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 +2820,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, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, 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 +2828,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 +2837,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 +2845,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 +2853,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 +2861,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 +2869,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 +2877,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 +2885,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 +2900,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 +2913,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 +2924,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 +2935,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 +2949,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 +2964,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 +2979,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 +2994,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 +3002,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 +3012,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 +3022,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 +3036,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 +3048,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 +3056,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 +3064,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 +3072,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 +3088,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 +3100,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 +3115,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 +3127,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 +3142,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 +3157,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 +3165,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 +3173,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 +3181,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 +3189,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 +3197,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 +3205,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 +3214,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 +3223,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 +3232,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 +3240,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 +3249,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 +3257,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 +3265,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 +3273,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 +3281,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 +3294,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 +3305,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 +3324,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 +3333,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 +3348,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 +3366,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 +3374,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 +3387,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 +3395,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 +3404,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 +3424,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 +3437,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 +3448,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 +3456,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 +3470,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 +3483,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, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, 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 +3494,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 +3515,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 +3525,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 +3535,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 +3547,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 +3556,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 +3570,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 +3580,7 @@ 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, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_FB01_MIDI) }, // Space Quest 4 - English Amiga // Executable scanning reports "1.004.024" @@ -3593,7 +3595,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 +3609,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 +3618,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 +3627,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 +3641,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 +3654,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 +3666,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 +3679,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, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, 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 +3693,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 +3706,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 +3716,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 +3726,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 +3734,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 +3744,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 +3752,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 +3766,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 +3778,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 +3792,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 +3807,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 +3820,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 +3829,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 +3838,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 +3847,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 +3855,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 +3863,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 +3871,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 +3880,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 +3889,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 +3897,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 +3905,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 +3913,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 +3921,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 +3930,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 +3938,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 +3946,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 +3955,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 +3963,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 +3972,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 +3980,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 +3988,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 +3996,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,7 +4004,7 @@ 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) }, #endif // ENABLE_SCI32 // SCI Fanmade Games diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 8d55790ad2..12746e17d6 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -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..69c3a6d0c9 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -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/kfile.cpp b/engines/sci/engine/kfile.cpp index c6635f2f27..b940eca6f5 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -718,7 +718,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; diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index c60b50a964..6955225fe5 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -465,7 +465,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; diff --git a/engines/sci/engine/script.h b/engines/sci/engine/script.h index 56a9004226..6a27dc7f64 100644 --- a/engines/sci/engine/script.h +++ b/engines/sci/engine/script.h @@ -100,6 +100,7 @@ public: void patcherProcessScript(uint16 scriptNr, byte *scriptData, const uint32 scriptSize); void patcherInitSignature(SciScriptPatcherEntry *patchTable, bool isMacSci11); + void patcherEnablePatch(SciScriptPatcherEntry *patchTable, const char *searchDescription); int32 patcherFindSignature(const SciScriptPatcherEntry *patchEntry, const byte *scriptData, const uint32 scriptSize, bool isMacSci11); void patcherApplyPatch(const SciScriptPatcherEntry *patchEntry, byte *scriptData, const uint32 scriptSize, int32 signatureOffset, bool isMacSci11); diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index 4a829c2457..6293fb42ae 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -104,6 +104,7 @@ namespace Sci { #define PATCH_VALUELIMIT 4096 struct SciScriptPatcherEntry { + bool active; uint16 scriptNr; const char *description; int16 applyCount; @@ -113,7 +114,7 @@ struct SciScriptPatcherEntry { const uint16 *patchData; }; -#define SCI_SIGNATUREENTRY_TERMINATOR { 0, NULL, 0, 0, 0, NULL, NULL } +#define SCI_SIGNATUREENTRY_TERMINATOR { false, 0, NULL, 0, 0, 0, NULL, NULL } struct SciScriptPatcherSelector { const char *name; @@ -137,6 +138,9 @@ SciScriptPatcherSelector selectorTable[] = { { "put", -1, }, // Police Quest 1 VGA { "solvePuzzle", -1, }, // Quest For Glory 3 { "timesShownID", -1, }, // Space Quest 1 VGA + { "startText", -1, }, // King's Quest 6 CD / Laura Bow 2 CD for audio+text support + { "startAudio", -1, }, // King's Quest 6 CD / Laura Bow 2 CD for audio+text support + { "modNum", -1, }, // King's Quest 6 CD / Laura Bow 2 CD for audio+text support { NULL, -1 } }; @@ -156,7 +160,10 @@ enum ScriptPatcherSelectors { SELECTOR_localize, SELECTOR_put, SELECTOR_solvePuzzle, - SELECTOR_timesShownID + SELECTOR_timesShownID, + SELECTOR_startText, + SELECTOR_startAudio, + SELECTOR_modNum }; // =========================================================================== @@ -178,7 +185,7 @@ enum ScriptPatcherSelectors { // // We fix the script by patching in a jump to the proper code inside fawaz::doit. // Responsible method: fawaz::handleEvent -// Fixes bug #3614969 +// Fixes bug: #6402 const uint16 camelotSignaturePeepingTom[] = { 0x72, SIG_MAGICDWORD, SIG_UINT16 + 0x7e, 0x07, // lofsa fawaz <-- start of proper initializion code 0xa1, 0xb9, // sag b9h @@ -202,9 +209,9 @@ const uint16 camelotPatchPeepingTom[] = { PATCH_END }; -// script, description, signature patch +// script, description, signature patch SciScriptPatcherEntry camelotSignatures[] = { - { 62, "fix peepingTom Sierra bug", 1, 0, 0, camelotSignaturePeepingTom, camelotPatchPeepingTom }, + { true, 62, "fix peepingTom Sierra bug", 1, 0, 0, camelotSignaturePeepingTom, camelotPatchPeepingTom }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -216,7 +223,7 @@ SciScriptPatcherEntry camelotSignatures[] = { // This also happens in sierra sci // Applies to at least: PC-CD // Responsible method: stayAndHelp::changeState -// Fixes bug: #3038387 +// Fixes bug: #5107 const uint16 ecoquest1SignatureStayAndHelp[] = { 0x3f, 0x01, // link 01 0x87, 0x01, // lap param[1] @@ -271,9 +278,9 @@ const uint16 ecoquest1PatchStayAndHelp[] = { PATCH_END }; -// script, description, signature patch +// script, description, signature patch SciScriptPatcherEntry ecoquest1Signatures[] = { - { 660, "CD: bad messagebox and freeze", 1, 0, 0, ecoquest1SignatureStayAndHelp, ecoquest1PatchStayAndHelp }, + { true, 660, "CD: bad messagebox and freeze", 1, 0, 0, ecoquest1SignatureStayAndHelp, ecoquest1PatchStayAndHelp }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -282,7 +289,8 @@ SciScriptPatcherEntry 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 +// anymore. We have to patch the code because of that. +// Fixes bug: #4993 const uint16 ecoquest2SignatureEcorder[] = { 0x31, 0x22, // bnt [next state] 0x39, 0x0a, // pushi 0a @@ -334,10 +342,11 @@ const uint16 ecoquest2PatchEcorder[] = { }; // =========================================================================== -// 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. +// Fixes bug: #6467 const uint16 ecoquest2SignatureEcorderTutorial[] = { 0x30, SIG_UINT16 + 0x23, 0x00, // bnt [next state] 0x39, 0x0a, // pushi 0a @@ -394,10 +403,10 @@ const uint16 ecoquest2PatchEcorderTutorial[] = { PATCH_END }; -// script, description, signature patch +// script, description, signature patch SciScriptPatcherEntry ecoquest2Signatures[] = { - { 50, "initial text not removed on ecorder", 1, 0, 0, ecoquest2SignatureEcorder, ecoquest2PatchEcorder }, - { 333, "initial text not removed on ecorder tutorial",1, 0, 0, ecoquest2SignatureEcorderTutorial, ecoquest2PatchEcorderTutorial }, + { true, 50, "initial text not removed on ecorder", 1, 0, 0, ecoquest2SignatureEcorder, ecoquest2PatchEcorder }, + { true, 333, "initial text not removed on ecorder tutorial",1, 0, 0, ecoquest2SignatureEcorderTutorial, ecoquest2PatchEcorderTutorial }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -406,7 +415,7 @@ SciScriptPatcherEntry 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. +// Fixes bug: #5120 const uint16 fanmadeSignatureInfiniteLoop[] = { 0x38, SIG_UINT16 + 0x4c, 0x00, // pushi 004c 0x39, 0x00, // pushi 00 @@ -424,9 +433,9 @@ const uint16 fanmadePatchInfiniteLoop[] = { PATCH_END }; -// script, description, signature patch +// script, description, signature patch SciScriptPatcherEntry fanmadeSignatures[] = { - { 999, "infinite loop on typo", 1, 0, 0, fanmadeSignatureInfiniteLoop, fanmadePatchInfiniteLoop }, + { true, 999, "infinite loop on typo", 1, 0, 0, fanmadeSignatureInfiniteLoop, fanmadePatchInfiniteLoop }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -545,12 +554,12 @@ const uint16 freddypharkasPatchMacInventory[] = { PATCH_END }; -// script, description, signature patch +// script, description, signature patch SciScriptPatcherEntry freddypharkasSignatures[] = { - { 0, "CD: score early disposal", 1, 0, 0, freddypharkasSignatureScoreDisposal, freddypharkasPatchScoreDisposal }, - { 15, "Mac: broken inventory", 1, 0, 0, freddypharkasSignatureMacInventory, freddypharkasPatchMacInventory }, - { 235, "CD: canister pickup hang", 3, 0, 0, freddypharkasSignatureCanisterHang, freddypharkasPatchCanisterHang }, - { 320, "ladder event issue", 2, 0, 0, freddypharkasSignatureLadderEvent, freddypharkasPatchLadderEvent }, + { true, 0, "CD: score early disposal", 1, 0, 0, freddypharkasSignatureScoreDisposal, freddypharkasPatchScoreDisposal }, + { true, 15, "Mac: broken inventory", 1, 0, 0, freddypharkasSignatureMacInventory, freddypharkasPatchMacInventory }, + { true, 235, "CD: canister pickup hang", 3, 0, 0, freddypharkasSignatureCanisterHang, freddypharkasPatchCanisterHang }, + { true, 320, "ladder event issue", 2, 0, 0, freddypharkasSignatureLadderEvent, freddypharkasPatchLadderEvent }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -686,12 +695,12 @@ const uint16 gk1PatchInterrogationBug[] = { PATCH_END }; -// script, description, signature patch +// script, description, signature patch SciScriptPatcherEntry gk1Signatures[] = { - { 51, "interrogation bug", 1, 0, 0, gk1SignatureInterrogationBug, gk1PatchInterrogationBug }, - { 212, "day 5 phone freeze", 1, 0, 0, gk1SignatureDay5PhoneFreeze, gk1PatchDay5PhoneFreeze }, - { 230, "day 6 police beignet timer issue", 1, 0, 0, gk1SignatureDay6PoliceBeignet, gk1PatchDay6PoliceBeignet }, - { 230, "day 6 police sleep timer issue", 1, 0, 0, gk1SignatureDay6PoliceSleep, gk1PatchDay6PoliceSleep }, + { true, 51, "interrogation bug", 1, 0, 0, gk1SignatureInterrogationBug, gk1PatchInterrogationBug }, + { true, 212, "day 5 phone freeze", 1, 0, 0, gk1SignatureDay5PhoneFreeze, gk1PatchDay5PhoneFreeze }, + { true, 230, "day 6 police beignet timer issue", 1, 0, 0, gk1SignatureDay6PoliceBeignet, gk1PatchDay6PoliceBeignet }, + { true, 230, "day 6 police sleep timer issue", 1, 0, 0, gk1SignatureDay6PoliceSleep, gk1PatchDay6PoliceSleep }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -753,12 +762,14 @@ 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 +// +// Fixes bug: #4964 const uint16 kq5SignatureWitchCageInit[] = { SIG_UINT16 + 0x00, 0x00, // top SIG_UINT16 + 0x00, 0x00, // left @@ -808,17 +819,11 @@ const uint16 kq5PatchWinGMSignals[] = { PATCH_END }; -// script, description, signature patch +// script, description, signature patch SciScriptPatcherEntry kq5Signatures[] = { - { 0, "CD: harpy volume change", 1, 0, 0, kq5SignatureCdHarpyVolume, kq5PatchCdHarpyVolume }, - { 200, "CD: witch cage init", 1, 0, 0, kq5SignatureWitchCageInit, kq5PatchWitchCageInit }, - SCI_SIGNATUREENTRY_TERMINATOR -}; - -SciScriptPatcherEntry kq5WinGMSignatures[] = { - { 0, "CD: harpy volume change", 1, 0, 0, kq5SignatureCdHarpyVolume, kq5PatchCdHarpyVolume }, - { 200, "CD: witch cage init", 1, 0, 0, kq5SignatureWitchCageInit, kq5PatchWitchCageInit }, - { 124, "Win: GM Music signal checks", 4, 0, 0, kq5SignatureWinGMSignals, kq5PatchWinGMSignals }, + { true, 0, "CD: harpy volume change", 1, 0, 0, kq5SignatureCdHarpyVolume, kq5PatchCdHarpyVolume }, + { true, 200, "CD: witch cage init", 1, 0, 0, kq5SignatureWitchCageInit, kq5PatchWitchCageInit }, + { false, 124, "Win: GM Music signal checks", 4, 0, 0, kq5SignatureWinGMSignals, kq5PatchWinGMSignals }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -830,7 +835,8 @@ SciScriptPatcherEntry 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. +// game speech can work while the baby cry sound is heard. +// Fixes bug: #4955 const uint16 kq6SignatureDuplicateBabyCry[] = { SIG_MAGICDWORD, 0x83, 0x00, // lal 00 @@ -853,7 +859,7 @@ const uint16 kq6PatchDuplicateBabyCry[] = { // 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: #3293954 +// Fixes bug: #5681 const uint16 kq6SignatureInventoryStackFix[] = { 0x67, 0x30, // pTos state 0x34, SIG_UINT16 + 0x00, 0x20, // ldi 2000 @@ -916,10 +922,116 @@ const uint16 kq6PatchInventoryStackFix[] = { PATCH_END }; -// script, description, signature patch +// 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. +// Patched method: Messager::sayNext / lb2Messager::sayNext (always use text branch) +const uint16 kq6laurabow2CDSignatureAudioTextSupport1[] = { + 0x89, 0x5a, // lsg global[5a] + 0x35, 0x02, // ldi 02 + 0x12, // and + SIG_MAGICDWORD, + 0x31, 0x13, // bnt [audio call] + 0x38, SIG_SELECTOR16 + SELECTOR_modNum, // pushi modNum + SIG_END +}; + +const uint16 kq6laurabow2CDPatchAudioTextSupport1[] = { + PATCH_ADDTOOFFSET +5, + 0x33, 0x13, // jmp [audio call] + PATCH_END +}; + +// Patched method: Messager::sayNext / lb2Messager::sayNext (allocate audio memory) +const uint16 kq6laurabow2CDSignatureAudioTextSupport2[] = { + 0x7a, // push2 + 0x78, // push1 + 0x39, 0x0c, // pushi 0c + 0x43, SIG_MAGICDWORD, 0x72, 0x04, // kMemory + 0xa5, 0xc9, // sat global[c9] + SIG_END +}; + +const uint16 kq6laurabow2CDPatchAudioTextSupport2[] = { + PATCH_ADDTOOFFSET +7, + 0xa1, 98, // sag global[98d] + PATCH_END +}; + +// Patched method: Messager::sayNext / lb2Messager::sayNext (release audio memory) +const uint16 kq6laurabow2CDSignatureAudioTextSupport3[] = { + 0x7a, // push2 + 0x39, 0x03, // pushi 03 + SIG_MAGICDWORD, + 0x8d, 0xc9, // lst temp[c9] + 0x43, 0x72, 0x04, // kMemory + SIG_END +}; + +const uint16 kq6laurabow2CDPatchAudioTextSupport3[] = { + PATCH_ADDTOOFFSET +3, + 0x89, 98, // lsg global[98d] + PATCH_END +}; + +// Patched method: Narrator::say (use audio memory) +const uint16 kq6laurabow2CDSignatureAudioTextSupport4[] = { + 0x89, 0x5a, // lsg global[5a] + 0x35, 0x01, // ldi 01 + 0x12, // and + 0x31, 0x08, // bnt [skip code] + 0x38, SIG_SELECTOR16 + SELECTOR_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 + SELECTOR_startAudio, // pushi startAudio + 0x78, // push1 + 0x8f, 0x01, // lsp param[1] + 0x54, 0x06, // self 06 + SIG_END +}; + +const uint16 kq6laurabow2CDPatchAudioTextSupport4[] = { + PATCH_ADDTOOFFSET +5, + 0x18, // not (never jump here) + 0x18, // not (never jump here) + PATCH_ADDTOOFFSET +19, + 0x89, 98, // lsp global[98d] + PATCH_END +}; + +// Patched method: Talker::display/Narrator::say (remove reset saved mouse cursor code) +// code would screw over mouse cursor +const uint16 kq6laurabow2CDSignatureAudioTextSupport5[] = { + SIG_MAGICDWORD, + 0x35, 0x00, // ldi 00 + 0x65, 0x82, // aTop saveCursor + SIG_END +}; + +const uint16 kq6laurabow2CDPatchAudioTextSupport5[] = { + 0x18, 0x18, 0x18, 0x18, // waste bytes, do nothing + PATCH_END +}; + +// script, description, signature patch SciScriptPatcherEntry kq6Signatures[] = { - { 481, "duplicate baby cry", 1, 0, 0, kq6SignatureDuplicateBabyCry, kq6PatchDuplicateBabyCry }, - { 907, "inventory stack fix", 1, 0, 0, kq6SignatureInventoryStackFix, kq6PatchInventoryStackFix }, + { true, 481, "duplicate baby cry", 1, 0, 0, kq6SignatureDuplicateBabyCry, kq6PatchDuplicateBabyCry }, + { true, 907, "inventory stack fix", 1, 0, 0, kq6SignatureInventoryStackFix, kq6PatchInventoryStackFix }, + // King's Quest 6 and Laura Bow 2 share basic patches for audio + text support + // *** King's Quest 6 audio + text support - CURRENTLY DISABLED *** + // TODO: fix window placement (currently part of the text windows go off-screen) + // TODO: fix hi-res portraits mode graphic glitches + { false, 924, "CD: audio + text support 1", 1, 0, 0, kq6laurabow2CDSignatureAudioTextSupport1, kq6laurabow2CDPatchAudioTextSupport1 }, + { false, 924, "CD: audio + text support 2", 1, 0, 0, kq6laurabow2CDSignatureAudioTextSupport2, kq6laurabow2CDPatchAudioTextSupport2 }, + { false, 924, "CD: audio + text support 3", 1, 0, 0, kq6laurabow2CDSignatureAudioTextSupport3, kq6laurabow2CDPatchAudioTextSupport3 }, + { false, 928, "CD: audio + text support 4", 1, 0, 0, kq6laurabow2CDSignatureAudioTextSupport4, kq6laurabow2CDPatchAudioTextSupport4 }, + { false, 928, "CD: audio + text support 5", 2, 0, 0, kq6laurabow2CDSignatureAudioTextSupport5, kq6laurabow2CDPatchAudioTextSupport5 }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -935,7 +1047,7 @@ SciScriptPatcherEntry kq6Signatures[] = { // the same as the English version. // Applies to at least: German floppy // Responsible method: unknown -// Fixes bug: #3048054 +// Fixes bug: #5264 const uint16 longbowSignatureShowHandCode[] = { 0x78, // push1 0x78, // push1 @@ -963,9 +1075,9 @@ const uint16 longbowPatchShowHandCode[] = { PATCH_END }; -// script, description, signature patch +// script, description, signature patch SciScriptPatcherEntry longbowSignatures[] = { - { 210, "hand code crash", 5, 0, 0, longbowSignatureShowHandCode, longbowPatchShowHandCode }, + { true, 210, "hand code crash", 5, 0, 0, longbowSignatureShowHandCode, longbowPatchShowHandCode }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -985,7 +1097,7 @@ SciScriptPatcherEntry longbowSignatures[] = { // 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 +// Fixes bug: #6346 const uint16 larry2SignatureWearParachutePoints[] = { 0x35, 0x01, // ldi 01 0xa1, SIG_MAGICDWORD, 0x8e, // sag 8e @@ -1005,9 +1117,9 @@ const uint16 larry2PatchWearParachutePoints[] = { PATCH_END }; -// script, description, signature patch +// script, description, signature patch SciScriptPatcherEntry larry2Signatures[] = { - { 63, "plane: no points for wearing plane", 1, 0, 0, larry2SignatureWearParachutePoints, larry2PatchWearParachutePoints }, + { true, 63, "plane: no points for wearing plane", 1, 0, 0, larry2SignatureWearParachutePoints, larry2PatchWearParachutePoints }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -1034,9 +1146,9 @@ const uint16 larry5PatchGermanEndingPattiTalker[] = { PATCH_END }; -// script, description, signature patch +// script, description, signature patch SciScriptPatcherEntry larry5Signatures[] = { - { 380, "German-only: Enlarge Patti Textbox", 1, 0, 0, larry5SignatureGermanEndingPattiTalker, larry5PatchGermanEndingPattiTalker }, + { true, 380, "German-only: Enlarge Patti Textbox", 1, 0, 0, larry5SignatureGermanEndingPattiTalker, larry5PatchGermanEndingPattiTalker }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -1085,42 +1197,140 @@ const uint16 larry6PatchDeathDialog[] = { PATCH_END }; -// script, description, signature patch +// script, description, signature patch SciScriptPatcherEntry larry6Signatures[] = { - { 82, "death dialog memory corruption", 1, 0, 0, larry6SignatureDeathDialog, larry6PatchDeathDialog }, + { true, 82, "death dialog memory corruption", 1, 0, 0, larry6SignatureDeathDialog, larry6PatchDeathDialog }, SCI_SIGNATUREENTRY_TERMINATOR }; // =========================================================================== -// rm560::doit was supposed to close the painting, when Heimlich enters the -// room. The code is buggy. It actually closes the painting, when heimlich -// is not in the room. We fix that. -// Applies to at least: English floppy +// 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 -const uint16 laurabow2SignaturePaintingClosing[] = { - 0x4a, 0x04, // send 04 - read aHeimlich::room +// Fixes bug: #6460 +const uint16 laurabow2CDSignaturePaintingClosing[] = { + 0x39, 0x04, // pushi 04 (cel) + 0x76, // push0 SIG_MAGICDWORD, + 0x7a, // push2 + 0x38, SIG_UINT16 + 0x31, 0x02, // 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 + 0x83, 0x02, // 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[11d] -> current room + 0x81, 0x0b, // lag global[b] (current room) 0x1c, // ne? - 0x31, 0x0e, // bnt [don't close] + 0x31, 0x0e, // bnt [exit] 0x35, 0x00, // ldi 00 - 0xa3, 0x00, // sal local[0] - 0x38, SIG_UINT16 + 0x92, 0x00, // pushi 0092 - 0x78, // push1 - 0x72, // lofsa sDumpSafe + 0xa3, 0x00, // sal local[0] -> reset safePic signal SIG_END }; -const uint16 laurabow2PatchPaintingClosing[] = { - PATCH_ADDTOOFFSET +6, - 0x2f, 0x0e, // bt [don't close] +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 + 0x31, 0x02, // 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 + 0x83, 0x02, // 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 }; -// script, description, signature patch +// 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 +const uint16 laurabow2CDSignatureFixProblematicIconBar[] = { + SIG_MAGICDWORD, + 0x38, SIG_UINT16 + 0xf1, 0x00, // 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 +}; + +const uint16 laurabow2CDPatchFixProblematicIconBar[] = { + 0x35, 0x00, // ldi 00 + 0xa1, 0x74, // sag 74h + 0x35, 0x00, // ldi 00 (waste bytes) + 0x35, 0x00, // ldi 00 + PATCH_END +}; + + +// script, description, signature patch SciScriptPatcherEntry laurabow2Signatures[] = { - { 560, "painting closing immediately", 1, 0, 0, laurabow2SignaturePaintingClosing, laurabow2PatchPaintingClosing }, + { true, 560, "CD: painting closing immediately", 1, 0, 0, laurabow2CDSignaturePaintingClosing, laurabow2CDPatchPaintingClosing }, + { true, 0, "CD: fix problematic icon bar", 1, 0, 0, laurabow2CDSignatureFixProblematicIconBar, laurabow2CDPatchFixProblematicIconBar }, + // King's Quest 6 and Laura Bow 2 share basic patches for audio + text support + { false, 924, "CD: audio + text support 1", 1, 0, 0, kq6laurabow2CDSignatureAudioTextSupport1, kq6laurabow2CDPatchAudioTextSupport1 }, + { false, 924, "CD: audio + text support 2", 1, 0, 0, kq6laurabow2CDSignatureAudioTextSupport2, kq6laurabow2CDPatchAudioTextSupport2 }, + { false, 924, "CD: audio + text support 3", 1, 0, 0, kq6laurabow2CDSignatureAudioTextSupport3, kq6laurabow2CDPatchAudioTextSupport3 }, + { false, 928, "CD: audio + text support 4", 1, 0, 0, kq6laurabow2CDSignatureAudioTextSupport4, kq6laurabow2CDPatchAudioTextSupport4 }, + { false, 928, "CD: audio + text support 5", 2, 0, 0, kq6laurabow2CDSignatureAudioTextSupport5, kq6laurabow2CDPatchAudioTextSupport5 }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -1158,11 +1368,11 @@ const uint16 mothergoose256PatchSaveLimit[] = { PATCH_END }; -// script, description, signature patch +// script, description, signature patch SciScriptPatcherEntry mothergoose256Signatures[] = { - { 0, "replay save issue", 1, 0, 0, mothergoose256SignatureReplay, mothergoose256PatchReplay }, - { 0, "save limit dialog (SCI1.1)", 1, 0, 0, mothergoose256SignatureSaveLimit, mothergoose256PatchSaveLimit }, - { 994, "save limit dialog (SCI1)", 1, 0, 0, mothergoose256SignatureSaveLimit, mothergoose256PatchSaveLimit }, + { true, 0, "replay save issue", 1, 0, 0, mothergoose256SignatureReplay, mothergoose256PatchReplay }, + { true, 0, "save limit dialog (SCI1.1)", 1, 0, 0, mothergoose256SignatureSaveLimit, mothergoose256PatchSaveLimit }, + { true, 994, "save limit dialog (SCI1)", 1, 0, 0, mothergoose256SignatureSaveLimit, mothergoose256PatchSaveLimit }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -1178,7 +1388,7 @@ SciScriptPatcherEntry mothergoose256Signatures[] = { // 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 +// Fixes bug: #5705 / #6400 const uint16 pq1vgaSignaturePutGunInLockerBug[] = { 0x35, 0x00, // ldi 00 0x1a, // eq? @@ -1223,9 +1433,9 @@ const uint16 pq1vgaPatchPutGunInLockerBug[] = { PATCH_END }; -// script, description, signature patch +// script, description, signature patch SciScriptPatcherEntry pq1vgaSignatures[] = { - { 341, "put gun in locker bug", 1, 0, 0, pq1vgaSignaturePutGunInLockerBug, pq1vgaPatchPutGunInLockerBug }, + { true, 341, "put gun in locker bug", 1, 0, 0, pq1vgaSignaturePutGunInLockerBug, pq1vgaPatchPutGunInLockerBug }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -1287,7 +1497,7 @@ 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 uint16 qfg1vgaSignatureTempSpace[] = { @@ -1323,7 +1533,7 @@ 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. +// Fixes bug: #6180 const uint16 qfg1vgaSignatureMoveToCrusher[] = { SIG_MAGICDWORD, 0x51, 0x1f, // class Motion @@ -1342,7 +1552,8 @@ const uint16 qfg1vgaPatchMoveToCrusher[] = { // 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. +// location where Ego is moved from 111, 111 to 114, 114. +// Fixes bug: #6248 const uint16 qfg1vgaSignatureMoveToCastleGate[] = { SIG_MAGICDWORD, 0x51, 0x1f, // class MoveTo @@ -1364,7 +1575,7 @@ const uint16 qfg1vgaPatchMoveToCastleGate[] = { // The code treats both monster types the same. // Applies to at least: English floppy // Responsible method: smallMonster::doVerb -// Fixes bug #3604943. +// Fixes bug #6249 const uint16 qfg1vgaSignatureCheetaurDescription[] = { SIG_MAGICDWORD, 0x34, SIG_UINT16 + 0xb8, 0x01, // ldi 01b8 @@ -1396,7 +1607,7 @@ const uint16 qfg1vgaPatchCheetaurDescription[] = { // 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 +// Fixes bug #6181 const uint16 qfg1vgaSignatureFunnyRoomFix[] = { 0x65, 0x14, // aTop 14 (state) 0x36, // push @@ -1420,16 +1631,16 @@ const uint16 qfg1vgaPatchFunnyRoomFix[] = { PATCH_END }; -// script, description, signature patch +// script, description, signature patch SciScriptPatcherEntry qfg1vgaSignatures[] = { - { 215, "fight event issue", 1, 0, 0, qfg1vgaSignatureFightEvents, qfg1vgaPatchFightEvents }, - { 216, "weapon master event issue", 1, 0, 0, qfg1vgaSignatureFightEvents, qfg1vgaPatchFightEvents }, - { 814, "window text temp space", 1, 0, 0, qfg1vgaSignatureTempSpace, qfg1vgaPatchTempSpace }, - { 814, "dialog header offset", 3, 0, 0, qfg1vgaSignatureDialogHeader, qfg1vgaPatchDialogHeader }, - { 331, "moving to crusher", 1, 0, 0, qfg1vgaSignatureMoveToCrusher, qfg1vgaPatchMoveToCrusher }, - { 41, "moving to castle gate", 1, 0, 0, qfg1vgaSignatureMoveToCastleGate, qfg1vgaPatchMoveToCastleGate }, - { 210, "cheetaur description fixed", 1, 0, 0, qfg1vgaSignatureCheetaurDescription, qfg1vgaPatchCheetaurDescription }, - { 96, "funny room script bug fixed", 1, 0, 0, qfg1vgaSignatureFunnyRoomFix, qfg1vgaPatchFunnyRoomFix }, + { true, 215, "fight event issue", 1, 0, 0, qfg1vgaSignatureFightEvents, qfg1vgaPatchFightEvents }, + { true, 216, "weapon master event issue", 1, 0, 0, qfg1vgaSignatureFightEvents, qfg1vgaPatchFightEvents }, + { true, 814, "window text temp space", 1, 0, 0, qfg1vgaSignatureTempSpace, qfg1vgaPatchTempSpace }, + { true, 814, "dialog header offset", 3, 0, 0, qfg1vgaSignatureDialogHeader, qfg1vgaPatchDialogHeader }, + { true, 331, "moving to crusher", 1, 0, 0, qfg1vgaSignatureMoveToCrusher, qfg1vgaPatchMoveToCrusher }, + { true, 41, "moving to castle gate", 1, 0, 0, qfg1vgaSignatureMoveToCastleGate, qfg1vgaPatchMoveToCastleGate }, + { true, 210, "cheetaur description fixed", 1, 0, 0, qfg1vgaSignatureCheetaurDescription, qfg1vgaPatchCheetaurDescription }, + { true, 96, "funny room script bug fixed", 1, 0, 0, qfg1vgaSignatureFunnyRoomFix, qfg1vgaPatchFunnyRoomFix }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -1445,8 +1656,8 @@ SciScriptPatcherEntry 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. +// crashes because of these constant quick object reallocations. +// Fixes bug: #5096 const uint16 qfg2SignatureImportDialog[] = { 0x63, SIG_MAGICDWORD, 0x20, // pToa text 0x30, SIG_UINT16 + 0x0b, 0x00, // bnt [next state] @@ -1465,9 +1676,9 @@ const uint16 qfg2PatchImportDialog[] = { PATCH_END }; -// script, description, signature patch +// script, description, signature patch SciScriptPatcherEntry qfg2Signatures[] = { - { 944, "import dialog continuous calls", 1, 0, 0, qfg2SignatureImportDialog, qfg2PatchImportDialog }, + { true, 944, "import dialog continuous calls", 1, 0, 0, qfg2SignatureImportDialog, qfg2PatchImportDialog }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -1494,7 +1705,7 @@ const uint16 qfg3PatchImportDialog[] = { // =========================================================================== -// 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 @@ -1508,6 +1719,7 @@ const uint16 qfg3PatchImportDialog[] = { // behaviour. // Applies to at least: English, German, Italian, French, Spanish Floppy // Responsible method: unknown +// Fixes bug: #5172 const uint16 qfg3SignatureWooDialog[] = { SIG_MAGICDWORD, 0x67, 0x12, // pTos 12 (query) @@ -1535,10 +1747,10 @@ const uint16 qfg3PatchWooDialog[] = { PATCH_END }; -// script, description, signature patch +// script, description, signature patch SciScriptPatcherEntry qfg3Signatures[] = { - { 944, "import dialog continuous calls", 1, 0, 0, qfg3SignatureImportDialog, qfg3PatchImportDialog }, - { 440, "dialog crash when asking about Woo", 1, 0, 0, qfg3SignatureWooDialog, qfg3PatchWooDialog }, + { true, 944, "import dialog continuous calls", 1, 0, 0, qfg3SignatureImportDialog, qfg3PatchImportDialog }, + { true, 440, "dialog crash when asking about Woo", 1, 0, 0, qfg3SignatureWooDialog, qfg3PatchWooDialog }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -1548,7 +1760,8 @@ SciScriptPatcherEntry 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) +// but I think just patching it out is cleaner. +// Fixes bug: #5093 const uint16 sq4FloppySignatureEndlessFlight[] = { 0x39, 0x04, // pushi 04 (selector x) SIG_MAGICDWORD, @@ -1590,7 +1803,7 @@ const uint16 sq4CdPatchTextOptionsButton[] = { // 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. +// Fixes bug: #6068 const uint16 sq4CdSignatureBabbleIcon[] = { SIG_MAGICDWORD, 0x89, 0x5a, // lsg 5a @@ -1655,12 +1868,12 @@ const uint16 sq4CdPatchTextOptions[] = { PATCH_END }; -// script, description, signature patch +// script, description, signature patch SciScriptPatcherEntry sq4Signatures[] = { - { 298, "Floppy: endless flight", 1, 0, 0, sq4FloppySignatureEndlessFlight, sq4FloppyPatchEndlessFlight }, - { 818, "CD: Speech and subtitles option", 1, 0, 0, sq4CdSignatureTextOptions, sq4CdPatchTextOptions }, - { 0, "CD: Babble icon speech and subtitles fix", 1, 0, 0, sq4CdSignatureBabbleIcon, sq4CdPatchBabbleIcon }, - { 818, "CD: Speech and subtitles option button", 1, 0, 0, sq4CdSignatureTextOptionsButton, sq4CdPatchTextOptionsButton }, + { true, 298, "Floppy: endless flight", 1, 0, 0, sq4FloppySignatureEndlessFlight, sq4FloppyPatchEndlessFlight }, + { true, 818, "CD: Speech and subtitles option", 1, 0, 0, sq4CdSignatureTextOptions, sq4CdPatchTextOptions }, + { true, 0, "CD: Babble icon speech and subtitles fix", 1, 0, 0, sq4CdSignatureBabbleIcon, sq4CdPatchBabbleIcon }, + { true, 818, "CD: Speech and subtitles option button", 1, 0, 0, sq4CdSignatureTextOptionsButton, sq4CdPatchTextOptionsButton }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -1732,10 +1945,10 @@ const uint16 sq1vgaPatchEgoShowsCard[] = { }; -// script, description, signature patch +// script, description, signature patch SciScriptPatcherEntry sq1vgaSignatures[] = { - { 45, "Ulence Flats: timepod graphic glitch", 1, 0, 0, sq1vgaSignatureUlenceFlatsTimepodGfxGlitch, sq1vgaPatchUlenceFlatsTimepodGfxGlitch }, - { 58, "Sarien armory droid zapping ego first time", 1, 0, 0, sq1vgaSignatureEgoShowsCard, sq1vgaPatchEgoShowsCard }, + { true, 45, "Ulence Flats: timepod graphic glitch", 1, 0, 0, sq1vgaSignatureUlenceFlatsTimepodGfxGlitch, sq1vgaPatchUlenceFlatsTimepodGfxGlitch }, + { true, 58, "Sarien armory droid zapping ego first time", 1, 0, 0, sq1vgaSignatureEgoShowsCard, sq1vgaPatchEgoShowsCard }, SCI_SIGNATUREENTRY_TERMINATOR}; // =========================================================================== @@ -1759,7 +1972,7 @@ SciScriptPatcherEntry sq1vgaSignatures[] = { // 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 +// Fixes bug: #6457 const uint16 sq5SignatureToolboxFix[] = { 0x31, 0x13, // bnt [check for state 1] SIG_MAGICDWORD, @@ -1790,9 +2003,9 @@ const uint16 sq5PatchToolboxFix[] = { PATCH_END }; -// script, description, signature patch +// script, description, signature patch SciScriptPatcherEntry sq5Signatures[] = { - { 226, "toolbox fix", 1, 0, 0, sq5SignatureToolboxFix, sq5PatchToolboxFix }, + { true, 226, "toolbox fix", 1, 0, 0, sq5SignatureToolboxFix, sq5PatchToolboxFix }, SCI_SIGNATUREENTRY_TERMINATOR }; @@ -2123,10 +2336,31 @@ void Script::patcherInitSignature(SciScriptPatcherEntry *patchTable, bool isMacS } } +// This method enables certain patches +// It's used for patches, which are not meant to get applied all the time +void Script::patcherEnablePatch(SciScriptPatcherEntry *patchTable, const char *searchDescription) { + SciScriptPatcherEntry *curEntry = patchTable; + int searchDescriptionLen = strlen( searchDescription ); + int matchCount = 0; + + while (curEntry->signatureData) { + if (strncmp(curEntry->description, searchDescription, searchDescriptionLen) == 0) { + // match found, enable patch + curEntry->active = true; + matchCount++; + } + curEntry++; + } + + if (!matchCount) + error("Script-Patcher: no patch found to enable"); +} + void Script::patcherProcessScript(uint16 scriptNr, byte *scriptData, const uint32 scriptSize) { SciScriptPatcherEntry *signatureTable = NULL; + const Sci::SciGameId gameId = g_sci->getGameId(); - switch (g_sci->getGameId()) { + switch (gameId) { case GID_CAMELOT: signatureTable = camelotSignatures; break; @@ -2146,11 +2380,7 @@ void Script::patcherProcessScript(uint16 scriptNr, byte *scriptData, const uint3 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; @@ -2202,12 +2432,34 @@ void Script::patcherProcessScript(uint16 scriptNr, byte *scriptData, const uint3 bool isMacSci11 = (g_sci->getPlatform() == Common::kPlatformMacintosh && getSciVersion() >= SCI_VERSION_1_1); if (!signatureTable->magicDWord) { + // 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) patcherInitSignature(signatureTable, isMacSci11); + + // Do additional game-specific initialization + switch (gameId) { + case GID_KQ5: + if (g_sci->_features->useAltWinGMSound()) { + // See the explanation in the kq5SignatureWinGMSignals comment + patcherEnablePatch(signatureTable, "Win: GM Music signal checks"); + } + break; + case GID_LAURABOW2: + if (g_sci->speechAndSubtitlesEnabled()) { + // Enables Audio + subtitles patches for Laura Bow 2, when "Text and Speech: Both" is selected + patcherEnablePatch(signatureTable, "CD: audio + text support"); + } + break; + default: + break; + } } while (signatureTable->signatureData) { - if (scriptNr == signatureTable->scriptNr) { + if ( (scriptNr == signatureTable->scriptNr) && (signatureTable->active) ) { int32 foundOffset = 0; int16 applyCount = signatureTable->applyCount; do { diff --git a/engines/sci/engine/seg_manager.h b/engines/sci/engine/seg_manager.h index 074d3f6b0a..0667b75651 100644 --- a/engines/sci/engine/seg_manager.h +++ b/engines/sci/engine/seg_manager.h @@ -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); diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 6c92f07272..6fdff1ce91 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -110,6 +110,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { 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, 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) @@ -117,6 +118,7 @@ const SciWorkaroundEntry uninitializedReadWorkarounds[] = { { GID_LAURABOW2, -1, 21, 0, "dropCluesCode", "doit", -1, 1, { WORKAROUND_FAKE, 0x7fff } }, // when asking some questions (e.g. the reporter about the burglary, or the policeman about Ziggy). Must be big, as the game scripts perform lt on it and start deleting journal entries - bugs #3035068, #3036274 { GID_LAURABOW2, -1, 90, 1, "MuseumActor", "init", -1, 6, { WORKAROUND_FAKE, 0 } }, // Random actors in museum (bug #3041257) { GID_LAURABOW2, 240, 240, 0, "sSteveAnimates", "changeState", -1, 0, { WORKAROUND_FAKE, 0 } }, // Steve Dorian's idle animation at the docks - bug #3036291 + { GID_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 #3046200 { GID_LONGBOW, -1, 213, 0, "clear", "handleEvent", -1, 0, { WORKAROUND_FAKE, 0 } }, // When giving an answer using the druid hand sign code in any room { GID_LONGBOW, -1, 213, 0, "letter", "handleEvent", 0xa8, 1, { WORKAROUND_FAKE, 0 } }, // When using the druid hand sign code in any room - bug #3036601 diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 4baf39c67f..6fa51754a4 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -498,7 +498,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 diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index e24a5f1429..065565d8de 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -225,6 +225,7 @@ Common::Error SciEngine::run() { _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 @@ -882,6 +883,16 @@ void SciEngine::syncSoundSettings() { } } +// used by Script Patcher. Used to find out, if Laura Bow 2 needs patching for Speech+Subtitles - or not +bool SciEngine::speechAndSubtitlesEnabled() { + bool subtitlesOn = ConfMan.getBool("subtitles"); + bool speechOn = !ConfMan.getBool("speech_mute"); + + if (subtitlesOn && speechOn) + return true; + return false; +} + void SciEngine::syncIngameAudioOptions() { // Sync the in-game speech/subtitles settings for SCI1.1 CD games if (isCD() && getSciVersion() == SCI_VERSION_1_1) { @@ -894,16 +905,19 @@ 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 + switch (_gameId) { + case GID_SQ4: + case GID_FREDDYPHARKAS: + case GID_ECOQUEST: + case GID_LSL6: // TODO: The following need script patches for simultaneous speech and subtitles - //|| getGameId() == GID_KQ6 - //|| getGameId() == GID_LAURABOW2 - ) { + // GID_KQ6 _gamestate->variables[VAR_GLOBAL][90] = make_reg(0, 3); // speech + subtitles - } else { + break; + case GID_LAURABOW2: + // Laura Bow 2 gets patched when speech and subtitles are enabled + // It then does both, when the user has "speech" selected. That's why we select speech here + default: // Game does not support speech and subtitles, set it to speech _gamestate->variables[VAR_GLOBAL][90] = make_reg(0, 2); // speech } @@ -915,18 +929,38 @@ 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) { - if (_gamestate->variables[VAR_GLOBAL][90] == make_reg(0, 1)) { + uint16 ingameSetting = _gamestate->variables[VAR_GLOBAL][90].getOffset(); + bool subtitlesOn = ConfMan.getBool("subtitles"); + bool speechOn = !ConfMan.getBool("speech_mute"); + + switch (ingameSetting) { + case 1: // subtitles ConfMan.setBool("subtitles", true); ConfMan.setBool("speech_mute", true); - } else if (_gamestate->variables[VAR_GLOBAL][90] == make_reg(0, 2)) { + break; + case 2: // speech + switch (_gameId) { + case GID_LAURABOW2: + // We don't sync "speech" for Laura Bow 2 in case the user choose "both" in the setting + // Because "speech" (2) within SCI means "speech + subtitles" for Laura Bow 2 + if (subtitlesOn && speechOn) + return; + break; + default: + break; + } ConfMan.setBool("subtitles", false); ConfMan.setBool("speech_mute", false); - } else if (_gamestate->variables[VAR_GLOBAL][90] == make_reg(0, 3)) { + break; + case 3: // speech + subtitles ConfMan.setBool("subtitles", true); ConfMan.setBool("speech_mute", false); + break; + default: + break; } } } diff --git a/engines/sci/sci.h b/engines/sci/sci.h index a487336f54..c91606fbc9 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -245,12 +245,13 @@ 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(); diff --git a/engines/sci/sound/soundcmd.cpp b/engines/sci/sound/soundcmd.cpp index e36c5705ab..aa2a309f4d 100644 --- a/engines/sci/sound/soundcmd.cpp +++ b/engines/sci/sound/soundcmd.cpp @@ -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/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/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/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/music.cpp b/engines/sword1/music.cpp index c34630aceb..f31faffd5e 100644 --- a/engines/sword1/music.cpp +++ b/engines/sword1/music.cpp @@ -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..4207019c13 100644 --- a/engines/sword1/music.h +++ b/engines/sword1/music.h @@ -44,7 +44,7 @@ public: MusicHandle() : _fading(0), _audioSource(NULL) {} virtual int readBuffer(int16 *buffer, const int numSamples); bool play(const Common::String &filename, bool loop); - bool playPSX(uint16 id); + bool playPSX(uint16 id, bool loop); void stop(); void fadeUp(); void fadeDown(); diff --git a/engines/sword1/sound.cpp b/engines/sword1/sound.cpp index 268da74508..643657c71f 100644 --- a/engines/sword1/sound.cpp +++ b/engines/sword1/sound.cpp @@ -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/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/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/gfx/image/art.cpp b/engines/sword25/gfx/image/art.cpp index 9c4b9fe8bd..e2eeaca33f 100644 --- a/engines/sword25/gfx/image/art.cpp +++ b/engines/sword25/gfx/image/art.cpp @@ -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/renderobjectmanager.cpp b/engines/sword25/gfx/renderobjectmanager.cpp index 57c8ec318f..bc7dd02636 100644 --- a/engines/sword25/gfx/renderobjectmanager.cpp +++ b/engines/sword25/gfx/renderobjectmanager.cpp @@ -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/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/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/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/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/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/music.cpp b/engines/tinsel/music.cpp index 3144ea7f94..bf7257f876 100644 --- a/engines/tinsel/music.cpp +++ b/engines/tinsel/music.cpp @@ -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/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/render.cpp b/engines/toltecs/render.cpp index 4c41e6ce00..ae458d40a3 100644 --- a/engines/toltecs/render.cpp +++ b/engines/toltecs/render.cpp @@ -156,7 +156,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; diff --git a/engines/toltecs/saveload.cpp b/engines/toltecs/saveload.cpp index 6c195a34c2..4edcc601b8 100644 --- a/engines/toltecs/saveload.cpp +++ b/engines/toltecs/saveload.cpp @@ -183,7 +183,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..dd418be71f 100644 --- a/engines/toltecs/screen.cpp +++ b/engines/toltecs/screen.cpp @@ -599,7 +599,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 +634,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/script.cpp b/engines/toltecs/script.cpp index 476c3a4fcf..83c4ef15fe 100644 --- a/engines/toltecs/script.cpp +++ b/engines/toltecs/script.cpp @@ -65,7 +65,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 +184,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 +852,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/toltecs.cpp b/engines/toltecs/toltecs.cpp index 188facd63c..8bd824cfee 100644 --- a/engines/toltecs/toltecs.cpp +++ b/engines/toltecs/toltecs.cpp @@ -235,7 +235,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 +250,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 +574,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/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/mpal/mpal.cpp b/engines/tony/mpal/mpal.cpp index 7010c238b5..5f2452dcfe 100644 --- a/engines/tony/mpal/mpal.cpp +++ b/engines/tony/mpal/mpal.cpp @@ -1935,7 +1935,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/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/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/tsage/blue_force/blueforce_logic.cpp b/engines/tsage/blue_force/blueforce_logic.cpp index 5674773177..be5fb4c7b7 100644 --- a/engines/tsage/blue_force/blueforce_logic.cpp +++ b/engines/tsage/blue_force/blueforce_logic.cpp @@ -648,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; @@ -658,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() { @@ -705,7 +706,6 @@ SceneExt::SceneExt(): Scene() { _stripManager._onBegin = SceneExt::startStrip; _stripManager._onEnd = SceneExt::endStrip; - _field372 = _field37A = 0; _savedPlayerEnabled = false; _savedUiEnabled = false; _savedCanWalk = false; @@ -748,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) { @@ -757,6 +758,7 @@ void SceneExt::dispatch() { _field37A = 0; } } + */ Scene::dispatch(); } @@ -764,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; } @@ -833,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) { @@ -848,7 +847,6 @@ void SceneExt::startStrip() { void SceneExt::endStrip() { SceneExt *scene = (SceneExt *)BF_GLOBALS._sceneManager._scene; - scene->_field372 = 0; if (scene->_savedPlayerEnabled) { BF_GLOBALS._player.enableControl(); @@ -867,23 +865,23 @@ 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; + _hasFader = false; _palette._field412 = 1; 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(); @@ -897,7 +895,7 @@ void PalettedScene::remove() { } PaletteFader *PalettedScene::addFader(const byte *arrBufferRGB, int step, Action *action) { - _field794 = 1; + _hasFader = true; return BF_GLOBALS._scenePalette.addFader(arrBufferRGB, 1, step, action); } diff --git a/engines/tsage/blue_force/blueforce_logic.h b/engines/tsage/blue_force/blueforce_logic.h index 59bc2b7a51..c6c6dc6315 100644 --- a/engines/tsage/blue_force/blueforce_logic.h +++ b/engines/tsage/blue_force/blueforce_logic.h @@ -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() < 11) { + 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_scenes3.cpp b/engines/tsage/blue_force/blueforce_scenes3.cpp index 5dd795cb39..feaf789392 100644 --- a/engines/tsage/blue_force/blueforce_scenes3.cpp +++ b/engines/tsage/blue_force/blueforce_scenes3.cpp @@ -1978,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; } @@ -2873,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) { @@ -2895,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; @@ -2925,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; @@ -3360,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(); @@ -3539,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); @@ -3619,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(); @@ -3718,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; @@ -3792,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: @@ -3801,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; @@ -3872,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); @@ -3889,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(); @@ -4014,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)) { @@ -4531,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); @@ -4656,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); @@ -4675,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(); @@ -4694,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); @@ -4720,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); @@ -4757,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 d9f0d32edc..894c3e5ffd 100644 --- a/engines/tsage/blue_force/blueforce_scenes3.h +++ b/engines/tsage/blue_force/blueforce_scenes3.h @@ -493,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_scenes5.cpp b/engines/tsage/blue_force/blueforce_scenes5.cpp index ebaa3e372e..101a39c4b7 100644 --- a/engines/tsage/blue_force/blueforce_scenes5.cpp +++ b/engines/tsage/blue_force/blueforce_scenes5.cpp @@ -1909,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(); @@ -2076,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(); @@ -2107,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 5337b6426b..71c7f3d8f1 100644 --- a/engines/tsage/blue_force/blueforce_scenes5.h +++ b/engines/tsage/blue_force/blueforce_scenes5.h @@ -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_scenes7.cpp b/engines/tsage/blue_force/blueforce_scenes7.cpp index 4cdd2f3f15..2f52c4df95 100644 --- a/engines/tsage/blue_force/blueforce_scenes7.cpp +++ b/engines/tsage/blue_force/blueforce_scenes7.cpp @@ -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_scenes8.cpp b/engines/tsage/blue_force/blueforce_scenes8.cpp index 867b6a9f6e..f78a332be9 100644 --- a/engines/tsage/blue_force/blueforce_scenes8.cpp +++ b/engines/tsage/blue_force/blueforce_scenes8.cpp @@ -1958,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() { @@ -2067,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; @@ -2085,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); @@ -2096,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; @@ -2467,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..b9e6ebd640 100644 --- a/engines/tsage/blue_force/blueforce_scenes8.h +++ b/engines/tsage/blue_force/blueforce_scenes8.h @@ -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/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 2298d28e0d..f7c1dd24e6 100644 --- a/engines/tsage/converse.cpp +++ b/engines/tsage/converse.cpp @@ -451,6 +451,13 @@ int ConversationChoiceDialog::execute(const Common::StringArray &choiceList) { draw(); g_globals->_events.showCursor(); + // 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 +509,7 @@ int ConversationChoiceDialog::execute(const Common::StringArray &choiceList) { // Remove the dialog remove(); + GLOBALS._gfxManagers.remove(&gfxManager); return _selectedIndex; } diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index 040dbc8c25..88f2c85ffd 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -1153,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; @@ -1538,7 +1545,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.syncAsSint16LE(useless); + } + s.syncAsByte(_redColor); s.syncAsByte(_greenColor); s.syncAsByte(_blueColor); @@ -2103,7 +2114,7 @@ SceneObject::SceneObject() : SceneHotspot() { _shade = _oldShade = 0; _linkedActor = NULL; - _field8A = Common::Point(0, 0); + _actorDestPos = Common::Point(0, 0); _angle = 0; _xs = 0; _xe = 0; @@ -2497,8 +2508,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); @@ -2707,6 +2718,17 @@ 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(); @@ -2727,6 +2749,7 @@ GfxSurface SceneObject::getFrame() { void SceneObject::reposition() { GfxSurface frame = getFrame(); + _bounds.resize(frame, _position.x, _position.y - _yDiff, _percent); _xs = _bounds.left; _xe = _bounds.right; diff --git a/engines/tsage/core.h b/engines/tsage/core.h index 05f6f4b3a0..3286ee1448 100644 --- a/engines/tsage/core.h +++ b/engines/tsage/core.h @@ -515,7 +515,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 { @@ -548,7 +549,7 @@ public: EventHandler *_mover; Common::Point _moveDiff; int _moveRate; - Common::Point _field8A; + Common::Point _actorDestPos; Action *_endAction; uint32 _regionBitList; diff --git a/engines/tsage/events.cpp b/engines/tsage/events.cpp index d2d8464763..6baa654214 100644 --- a/engines/tsage/events.cpp +++ b/engines/tsage/events.cpp @@ -71,7 +71,7 @@ bool EventsClass::pollEvent() { break; default: - break; + break; } return true; diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp index 595c43a0bf..fa3ed33302 100644 --- a/engines/tsage/graphics.cpp +++ b/engines/tsage/graphics.cpp @@ -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 @@ -1232,8 +1245,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); diff --git a/engines/tsage/graphics.h b/engines/tsage/graphics.h index 858731a1ac..47961dd02a 100644 --- a/engines/tsage/graphics.h +++ b/engines/tsage/graphics.h @@ -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; @@ -89,6 +91,7 @@ public: Common::Point _centroid; int _transColor; Rect _clipRect; + byte _flags; public: GfxSurface(); GfxSurface(const GfxSurface &s); diff --git a/engines/tsage/ringworld/ringworld_scenes1.h b/engines/tsage/ringworld/ringworld_scenes1.h index 5dd882af93..d52d4fb6ec 100644 --- a/engines/tsage/ringworld/ringworld_scenes1.h +++ b/engines/tsage/ringworld/ringworld_scenes1.h @@ -315,8 +315,6 @@ public: Action1 _action1; Action2 _action2; Action3 _action3; - // CHECKME: Object1 looks useless - Object1 _object1; LeftFlyCycle _leftFlyCycle; CenterFlyCycle _centerFlyCycle; RightFlyCycle _rightFlyCycle; @@ -324,10 +322,7 @@ public: SpeakerSText _speakerSText; SpeakerQText _speakerQText; DisplayHotspot _background; - - //CHECKME: Useless Hotspot, never initialized DisplayHotspot _item1; - //CHECKME: Useless Hotspot, never initialized DisplayHotspot _entrance; DisplayHotspot _bulwark; DisplayHotspot _tree; diff --git a/engines/tsage/ringworld/ringworld_scenes10.cpp b/engines/tsage/ringworld/ringworld_scenes10.cpp index f9a8e7996a..eac181e350 100644 --- a/engines/tsage/ringworld/ringworld_scenes10.cpp +++ b/engines/tsage/ringworld/ringworld_scenes10.cpp @@ -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/ringworld2/ringworld2_dialogs.cpp b/engines/tsage/ringworld2/ringworld2_dialogs.cpp index 12147f7ee5..a0675bc292 100644 --- a/engines/tsage/ringworld2/ringworld2_dialogs.cpp +++ b/engines/tsage/ringworld2/ringworld2_dialogs.cpp @@ -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,17 +179,18 @@ 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; } /*--------------------------------------------------------------------------*/ diff --git a/engines/tsage/ringworld2/ringworld2_dialogs.h b/engines/tsage/ringworld2/ringworld2_dialogs.h index 02a1aed81c..0c19ae4371 100644 --- a/engines/tsage/ringworld2/ringworld2_dialogs.h +++ b/engines/tsage/ringworld2/ringworld2_dialogs.h @@ -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 { diff --git a/engines/tsage/ringworld2/ringworld2_logic.cpp b/engines/tsage/ringworld2/ringworld2_logic.cpp index 57d8afb57f..3f1cecc301 100644 --- a/engines/tsage/ringworld2/ringworld2_logic.cpp +++ b/engines/tsage/ringworld2/ringworld2_logic.cpp @@ -290,7 +290,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 @@ -371,12 +371,13 @@ void SceneExt::postInit(SceneObjectList *OwnerList) { _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)) || (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 { @@ -400,19 +401,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(); } @@ -1237,8 +1225,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(); } /*--------------------------------------------------------------------------*/ @@ -1502,7 +1495,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() { @@ -1518,7 +1511,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) { @@ -1861,6 +1856,10 @@ bool AnimationPlayer::load(int animId, Action *endAction) { _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 { diff --git a/engines/tsage/ringworld2/ringworld2_logic.h b/engines/tsage/ringworld2/ringworld2_logic.h index 41ddb277de..c9695c921d 100644 --- a/engines/tsage/ringworld2/ringworld2_logic.h +++ b/engines/tsage/ringworld2/ringworld2_logic.h @@ -307,7 +307,6 @@ public: int _frameCount; int _resCount; int _mapImagePitch; - int _unused; public: MazeUI(); virtual ~MazeUI(); diff --git a/engines/tsage/ringworld2/ringworld2_scenes0.cpp b/engines/tsage/ringworld2/ringworld2_scenes0.cpp index f483b1e47c..2592bde19a 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes0.cpp +++ b/engines/tsage/ringworld2/ringworld2_scenes0.cpp @@ -712,7 +712,7 @@ void Scene125::signal() { R2_GLOBALS._player._canWalk = false; break; case 10: - switch (_consoleMode) { + switch (_consoleMode) { case 12: _sceneMode = 129; diff --git a/engines/tsage/ringworld2/ringworld2_scenes1.cpp b/engines/tsage/ringworld2/ringworld2_scenes1.cpp index eaa60cadd7..ef4136a343 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes1.cpp +++ b/engines/tsage/ringworld2/ringworld2_scenes1.cpp @@ -146,9 +146,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; @@ -463,9 +463,8 @@ void Scene1000::dispatch() { if (_sceneMode == 52) _animationPlayer._endAction = this; - } else { + } else _animationPlayer.dispatch(); - } } Scene::dispatch(); @@ -723,9 +722,8 @@ bool Scene1100::Trooper::startAction(CursorType action, Event &event) { 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 @@ -745,15 +743,13 @@ bool Scene1100::Trooper::startAction(CursorType action, Event &event) { // 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); @@ -783,16 +779,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; - } 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; - } SceneExt::postInit(); @@ -1218,9 +1212,9 @@ void Scene1100::signal() { else _stripManager.start(322, this); } - } else { + } else _stripManager.start3(_nextStripNum, this, _stripManager._lookupList); - } + break; case 54: if (_stripManager._exitMode == 1) { @@ -1574,7 +1568,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: @@ -1796,7 +1790,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; } @@ -1958,9 +1952,8 @@ void Scene1200::process(Event &event) { return; break; } - } else { + } else return; - } } void Scene1200::dispatch() { @@ -6442,7 +6435,7 @@ void Scene1337::subD02CA() { _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._actorDestPos = _arrunkObj1337[2]._arr1[di]._object1._actorDestPos; _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; @@ -13350,7 +13343,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); @@ -13551,6 +13545,7 @@ void Scene1945::signal() { setAction(&_sequenceManager1, this, _sceneMode, &R2_GLOBALS._player, &_gunpowder, NULL); return; } + _sceneMode = 0; break; case 1947: if (_nextSceneMode1 == 1943) { @@ -13770,6 +13765,7 @@ bool Scene1950::Gem::startAction(CursorType action, Event &event) { /*--------------------------------------------------------------------------*/ Scene1950::Vampire::Vampire() { + _deadPosition = Common::Point(0, 0); _deltaX = 0; _deltaY = 0; _vampireMode = 0; @@ -14964,16 +14960,19 @@ void Scene1950::enterArea() { 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) { + 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; @@ -15311,9 +15310,9 @@ void Scene1950::signal() { case 1964: // No break on purpose case 1965: - if (!R2_GLOBALS.getFlag(37)) { + 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: @@ -15337,7 +15336,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); } diff --git a/engines/tsage/ringworld2/ringworld2_scenes3.cpp b/engines/tsage/ringworld2/ringworld2_scenes3.cpp index eab3178368..732add03ec 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes3.cpp +++ b/engines/tsage/ringworld2/ringworld2_scenes3.cpp @@ -492,7 +492,7 @@ bool Scene3150::ToiletFlush::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, LIST_END); @@ -629,7 +629,7 @@ 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 = EFFECT_SHADED2; @@ -1719,7 +1719,7 @@ void Scene3350::signal() { break; case 3351: _sceneMode = 3352; - setAction(&_sequenceManager, this, 3352, &_seeker, &R2_GLOBALS._player, + setAction(&_sequenceManager, this, 3352, &_seatedPeople, &R2_GLOBALS._player, &_miranda, &_seeker, &_webbster, NULL); break; case 3352: @@ -1996,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) { @@ -2191,6 +2191,14 @@ void Scene3375::signal() { _companion2._shade = 4; _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: @@ -2813,7 +2821,7 @@ void Scene3400::remove() { void Scene3400::signal() { switch (_sceneMode) { case 3305: { - // Removed (useless ?) call to sub_1D227 + // First part of discussion _tealSpeaker._object1.hide(); _teal.show(); _teal.setStrip(1); @@ -2825,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); @@ -2835,15 +2844,16 @@ 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: + // A tasp! if (!_soundFaded) { R2_GLOBALS._sound2.fadeOut2(NULL); _soundFaded = true; @@ -2853,7 +2863,7 @@ void Scene3400::signal() { } break; case 3308: - // Removed (useless ?) call to sub_1D227 + // Characters teleport one after the other _companion1.setStrip(2); R2_GLOBALS._player.setStrip(6); _companion2.setStrip(6); @@ -2866,7 +2876,7 @@ void Scene3400::signal() { setAction(&_sequenceManager, this, 3403, &_companion1, &_webbster, &_manholeCover, NULL); break; case 3309: - // Removed (useless ?) call to sub_1D227 + // Miranda teleports away _teal.setStrip(1); _sceneMode = 3405; if (R2_GLOBALS._player._characterIndex == R2_MIRANDA) @@ -2875,7 +2885,7 @@ void Scene3400::signal() { setAction(&_sequenceManager, this, 3405, &_companion2, &_manholeCover, NULL); break; case 3310: - // Removed (useless ?) call to sub_1D227 + // Quinn teleports away _teal.setStrip(1); _sceneMode = 3406; if (R2_GLOBALS._player._characterIndex == R2_QUINN) @@ -2886,7 +2896,7 @@ void Scene3400::signal() { setAction(&_sequenceManager, this, 3406, &_companion2, &_manholeCover, NULL); break; case 3311: - // Removed (useless ?) call to sub_1D227 + // Teal teleports away _tealSpeaker._object1.hide(); _teal.show(); _teal.setStrip(1); @@ -2894,8 +2904,9 @@ void Scene3400::signal() { 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); @@ -2915,37 +2926,44 @@ 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 * *--------------------------------------------------------------------------*/ @@ -3191,10 +3209,9 @@ void Scene3500::Action1::signal() { 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 = (_direction * 2 + scene->_mazeDirection); if (var_8 > 7) var_8 = 1; @@ -4238,7 +4255,7 @@ void Scene3500::dispatch() { } if (_mazeChangeAmount != 0) { - R2_GLOBALS._player._uiEnabled = false; + R2_GLOBALS._player._uiEnabled = false; if (_mazeChangeAmount != _speed) _aSound1.play(276); } else { @@ -4328,7 +4345,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: @@ -4547,7 +4564,7 @@ void Scene3600::postInit(SceneObjectList *OwnerList) { 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); @@ -4623,7 +4640,7 @@ void Scene3600::remove() { void Scene3600::signal() { switch (_sceneMode) { case 3320: - // Removed (useless ?) call to sub_1D227 + // Move to the console R2_GLOBALS._walkRegions.disableRegion(14); R2_GLOBALS._scrollFollower = &_seeker; _tealSpeaker._object1.hide(); @@ -4639,7 +4656,7 @@ void Scene3600::signal() { &_miranda, &_webbster, &_teal, NULL); break; case 3321: - // Removed (useless ?) call to sub_1D227 + // Teal activates console R2_GLOBALS._scrollFollower = &R2_GLOBALS._player; _tealSpeaker.stopSpeaking(); _teal.show(); @@ -4650,7 +4667,7 @@ void Scene3600::signal() { &_quinn, &_seeker, &_miranda, &_webbster, NULL); break; case 3322: - // Removed (useless ?) call to sub_1D227 + // Teal walks toward the teleport pod, the goule protector appears _quinnSpeaker.stopSpeaking(); _quinnSpeaker._displayMode = 1; _tealSpeaker.stopSpeaking(); @@ -4660,10 +4677,11 @@ void Scene3600::signal() { setAction(&_sequenceManager1, this, _sceneMode, &_teal, &_protector, &_steppingDisk, NULL); break; case 3323: + // Goule protector eats Teal guts then moves + if (!_tealDead) _tealDead = true; else { - // Removed (useless ?) call to sub_1D227 _protectorSpeaker.stopSpeaking(); _protector.show(); _protector.setup(3258, 6, 1); @@ -4702,6 +4720,7 @@ void Scene3600::signal() { _sceneMode = 3623; break; case 3450: + // Speech of Teal and Quinn R2_GLOBALS._sound1.stop(); _protector3400.hide(); _door3400.hide(); @@ -4724,7 +4743,7 @@ void Scene3600::signal() { _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)); @@ -4766,6 +4785,7 @@ void Scene3600::signal() { R2_GLOBALS._sound2.play(329); break; case 3600: + // First speech by Teal _sceneMode = 3320; _stripManager.start(3320, this); break; @@ -4774,6 +4794,7 @@ 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); _tealSpeaker._displayMode = 1; @@ -4781,6 +4802,7 @@ void Scene3600::signal() { _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); @@ -4818,6 +4840,7 @@ void Scene3600::signal() { 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, &_teal, &_protector, &_steppingDisk, NULL); @@ -4947,6 +4970,7 @@ void Scene3600::dispatch() { void Scene3700::postInit(SceneObjectList *OwnerList) { loadScene(3700); R2_GLOBALS._uiElements._active = false; + R2_GLOBALS._uiElements._visible = false; SceneExt::postInit(); R2_GLOBALS._interfaceY = SCREEN_HEIGHT; @@ -4993,7 +5017,6 @@ void Scene3700::signal() { case 3328: // No break on purpose case 3329: - // Removed (useless ?) call to sub_1D227 _sceneMode = 3701; setAction(&_sequenceManager, this, 3701, &_seeker, &_miranda, &_webbster, NULL); break; diff --git a/engines/tsage/ringworld2/ringworld2_scenes3.h b/engines/tsage/ringworld2/ringworld2_scenes3.h index b282900c3a..398d09a01e 100644 --- a/engines/tsage/ringworld2/ringworld2_scenes3.h +++ b/engines/tsage/ringworld2/ringworld2_scenes3.h @@ -550,7 +550,7 @@ public: SceneActor _teal; SceneActor _door; SceneActor _manholeCover; - SceneActor _actor8; + SceneActor _sapphire; SequenceManager _sequenceManager; bool _soundFaded; @@ -566,7 +566,7 @@ class Scene3500 : public SceneExt { public: int _direction; bool _field20; - int _field22; + int _field22; // CHECKME: Useless field bool _field24; Action1(); diff --git a/engines/tsage/saveload.h b/engines/tsage/saveload.h index 0d0457981f..32da6ee7f4 100644 --- a/engines/tsage/saveload.h +++ b/engines/tsage/saveload.h @@ -33,7 +33,7 @@ namespace TsAGE { typedef void (*SaveNotifierFn)(bool postFlag); -#define TSAGE_SAVEGAME_VERSION 11 +#define TSAGE_SAVEGAME_VERSION 12 class SavedObject; diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index c8ad8c1281..6633d15c26 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -2670,7 +2670,9 @@ 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; @@ -2732,8 +2734,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; @@ -3051,8 +3051,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; diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 3f039ff9e9..fefe8ad101 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -63,8 +63,6 @@ public: struct GroupData { uint32 _groupMask; - byte _v1; - byte _v2; const byte *_pData; }; 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/wintermute/base/base_file_manager.cpp b/engines/wintermute/base/base_file_manager.cpp index ae4c891c03..286f83defe 100644 --- a/engines/wintermute/base/base_file_manager.cpp +++ b/engines/wintermute/base/base_file_manager.cpp @@ -178,10 +178,10 @@ bool BaseFileManager::initPaths() { 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); } } } @@ -198,56 +198,66 @@ bool BaseFileManager::registerPackages() { // 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 (fileIt->getName() == "xlanguage_pt.dcp") { + 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" || fileIt->getParent().getName() == "languages")) { - Common::String parentName = fileIt->getParent().getName(); - Common::String dcpName = fileIt->getName(); + if (_language != Common::UNK_LANG && (parentName == "language" || parentName == "languages")) { // English - if (_language == Common::EN_ANY && (fileIt->getName() != "english.dcp" && fileIt->getName() != "xlanguage_en.dcp")) { + if (_language == Common::EN_ANY && (fileName != "english.dcp" && fileName != "xlanguage_en.dcp")) { continue; // Chinese - } else if (_language == Common::ZH_CNA && (fileIt->getName() != "chinese.dcp" && fileIt->getName() != "xlanguage_nz.dcp")) { + } else if (_language == Common::ZH_CNA && (fileName != "chinese.dcp" && fileName != "xlanguage_nz.dcp")) { continue; // Czech - } else if (_language == Common::CZ_CZE && (fileIt->getName() != "czech.dcp" && fileIt->getName() != "xlanguage_cz.dcp")) { + } else if (_language == Common::CZ_CZE && (fileName != "czech.dcp" && fileName != "xlanguage_cz.dcp")) { continue; // French - } else if (_language == Common::FR_FRA && (fileIt->getName() != "french.dcp" && fileIt->getName() != "xlanguage_fr.dcp")) { + } else if (_language == Common::FR_FRA && (fileName != "french.dcp" && fileName != "xlanguage_fr.dcp")) { continue; // German - } else if (_language == Common::DE_DEU && (fileIt->getName() != "german.dcp" && fileIt->getName() != "xlanguage_de.dcp")) { + } else if (_language == Common::DE_DEU && (fileName != "german.dcp" && fileName != "xlanguage_de.dcp")) { continue; // Italian - } else if (_language == Common::IT_ITA && (fileIt->getName() != "italian.dcp" && fileIt->getName() != "xlanguage_it.dcp")) { + } else if (_language == Common::IT_ITA && (fileName != "italian.dcp" && fileName != "xlanguage_it.dcp")) { continue; // Polish - } else if (_language == Common::PL_POL && (fileIt->getName() != "polish.dcp" && fileIt->getName() != "xlanguage_po.dcp")) { + } else if (_language == Common::PL_POL && (fileName != "polish.dcp" && fileName != "xlanguage_po.dcp")) { continue; // Portuguese - } else if (_language == Common::PT_BRA && (fileIt->getName() != "portuguese.dcp" && fileIt->getName() != "xlanguage_pt.dcp")) { + } else if (_language == Common::PT_BRA && (fileName != "portuguese.dcp" && fileName != "xlanguage_pt.dcp")) { continue; // Russian - } else if (_language == Common::RU_RUS && (fileIt->getName() != "russian.dcp" && fileIt->getName() != "xlanguage_ru.dcp")) { + } 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)); } } @@ -281,8 +291,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/font/base_font_truetype.cpp b/engines/wintermute/base/font/base_font_truetype.cpp index d6f09141c9..b879e789e3 100644 --- a/engines/wintermute/base/font/base_font_truetype.cpp +++ b/engines/wintermute/base/font/base_font_truetype.cpp @@ -121,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 @@ -155,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 @@ -248,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) { @@ -267,7 +267,8 @@ 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 @@ -276,7 +277,7 @@ BaseSurface *BaseFontTT::renderTextToTexture(const WideString &text, int width, surface->create((uint16)width, (uint16)(_lineHeight * lines.size()), Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0)); } 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); @@ -647,9 +648,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 7a96cdf1b7..edb41a155f 100644 --- a/engines/wintermute/base/font/base_font_truetype.h +++ b/engines/wintermute/base/font/base_font_truetype.h @@ -56,9 +56,8 @@ private: bool _marked; uint32 _lastUsed; - BaseCachedTTFontText() { + BaseCachedTTFontText() : _text() { //_text = L""; - _text = ""; _width = _maxHeight = _maxLength = -1; _align = TAL_LEFT; _surface = nullptr; diff --git a/engines/wintermute/base/scriptables/script_ext_string.cpp b/engines/wintermute/base/scriptables/script_ext_string.cpp index b6d284442d..65bec03bc1 100644 --- a/engines/wintermute/base/scriptables/script_ext_string.cpp +++ b/engines/wintermute/base/scriptables/script_ext_string.cpp @@ -298,21 +298,13 @@ 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'; + uint32 ch = 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; } } diff --git a/engines/wintermute/configure.engine b/engines/wintermute/configure.engine new file mode 100644 index 0000000000..673549b46b --- /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" no "" "" "jpeg png zlib vorbis 16bit" diff --git a/engines/wintermute/dctypes.h b/engines/wintermute/dctypes.h index b40322147f..4371ee4889 100644 --- a/engines/wintermute/dctypes.h +++ b/engines/wintermute/dctypes.h @@ -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/utils/string_util.cpp b/engines/wintermute/utils/string_util.cpp index d5d6c7f702..702dd04c27 100644 --- a/engines/wintermute/utils/string_util.cpp +++ b/engines/wintermute/utils/string_util.cpp @@ -48,201 +48,96 @@ bool StringUtil::compareNoCase(const AnsiString &str1, const AnsiString &str2) { return (str1lc == str2lc); }*/ -Common::String StringUtil::substituteUtf8Characters(Common::String &str) { - uint strSize = str.size(); - Common::String punctuation("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"); - - if (isAscii(str)) - return str; - - for (uint32 i = 0; i < strSize; i++) { - if (!Common::isAlnum(str[i]) && str[i] != ' ' && !punctuation.contains(str[i])) { - // Replace some UTF-8 characters with (almost) equivalent ANSII ones - if ((byte)str[i] == 0xc2 && i + 1 < str.size() && (byte)str[i + 1] == 0xa9) { - // UTF-8 copyright character, substitute with 'c' - str.deleteChar(i); - str.setChar('c', i); - strSize--; - } - } - } - - return str; -} - -bool StringUtil::isAscii(const Common::String &str) { - Common::String punctuation("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"); - - for (uint32 i = 0; i < str.size(); i++) { - if (!Common::isAlnum(str[i]) && str[i] != ' ' && !punctuation.contains(str[i])) - return false; - } - - return true; -} - ////////////////////////////////////////////////////////////////////////// WideString StringUtil::utf8ToWide(const Utf8String &Utf8Str) { - // WORKAROUND: Since wide strings aren't supported yet, we make this function - // work at least with ASCII strings. This should cover all English versions. - Common::String asciiString = Utf8Str; - asciiString = substituteUtf8Characters(asciiString); - if (isAscii(asciiString)) { - // No special (UTF-8) characters found, just return the string - return asciiString; - } else { - warning("String contains special (UTF-8) characters: '%s'", Utf8Str.c_str()); - } - - error("StringUtil::Utf8ToWide - WideString not supported yet for UTF-8 characters"); - - /* 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; + size_t wideSize = Utf8Str.size(); - UTF16 *TargetStart = reinterpret_cast<UTF16 *>(WideStringNative); - UTF16 *TargetEnd = TargetStart + WideSize + 1; + uint32 *wideStringNative = new uint32[wideSize + 1]; - ConversionResult res = ConvertUTF8toUTF16(&SourceStart, SourceEnd, &TargetStart, TargetEnd, strictConversion); - if (res != conversionOK) { - delete[] WideStringNative; - return L""; - } - *TargetStart = 0; - WideString ResultString(WideStringNative); - delete[] WideStringNative; + const UTF8 *sourceStart = reinterpret_cast<const UTF8 *>(Utf8Str.c_str()); + const UTF8 *sourceEnd = sourceStart + wideSize; - return ResultString; - } else if (sizeof(wchar_t) == 4) { - wchar_t *WideStringNative = new wchar_t[WideSize + 1]; + UTF32 *targetStart = reinterpret_cast<UTF32 *>(wideStringNative); + UTF32 *targetEnd = targetStart + wideSize; - 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 ""; + 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) { - // WORKAROUND: Since UTF-8 strings aren't supported yet, we make this function - // work at least with ASCII strings. This should cover all English versions. - Common::String asciiString = WideStr; - asciiString = substituteUtf8Characters(asciiString); - if (isAscii(asciiString)) { - // No special (UTF-8) characters found, just return the string - return asciiString; - } else { - warning("String contains special (UTF-8) characters: '%s'", WideStr.c_str()); - } + size_t wideSize = WideStr.size(); - error("StringUtil::wideToUtf8 - WideString not supported yet for UTF-8 characters"); - - /* size_t WideSize = WideStr.length(); + size_t utf8Size = 4 * wideSize + 1; + char *utf8StringNative = new char[utf8Size]; - if (sizeof(wchar_t) == 2) { - size_t utf8Size = 3 * WideSize + 1; - char *utf8StringNative = new char[Utf8Size]; + const UTF32 *sourceStart = reinterpret_cast<const UTF32 *>(WideStr.c_str()); + const UTF32 *sourceEnd = sourceStart + wideSize; - 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; - 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 ""; + 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; } ////////////////////////////////////////////////////////////////////////// @@ -256,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) { @@ -282,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 05931beb79..14c40fcb2b 100644 --- a/engines/wintermute/utils/string_util.h +++ b/engines/wintermute/utils/string_util.h @@ -37,8 +37,6 @@ class StringUtil { public: static bool compareNoCase(const AnsiString &str1, const AnsiString &str2); //static bool compareNoCase(const WideString &str1, const WideString &str2); - static bool isAscii(const Common::String &str); - static Common::String substituteUtf8Characters(Common::String &str); static WideString utf8ToWide(const Utf8String &Utf8Str); static Utf8String wideToUtf8(const WideString &WideStr); static WideString ansiToWide(const AnsiString &str); @@ -51,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/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/graphics/font.cpp b/graphics/font.cpp index a852274b06..e9f139c478 100644 --- a/graphics/font.cpp +++ b/graphics/font.cpp @@ -26,93 +26,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 +59,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 +92,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 +113,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 +152,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 +172,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..77b7623a85 100644 --- a/graphics/font.h +++ b/graphics/font.h @@ -23,6 +23,7 @@ #define GRAPHICS_FONT_H #include "common/str.h" +#include "common/ustr.h" namespace Common { template<class T> class Array; @@ -70,7 +71,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 +80,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 +97,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 +123,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/fonts/bdf.cpp b/graphics/fonts/bdf.cpp index e523a36ad5..7b2290cc3a 100644 --- a/graphics/fonts/bdf.cpp +++ b/graphics/fonts/bdf.cpp @@ -51,7 +51,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 +85,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 +95,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..842e54f851 100644 --- a/graphics/fonts/bdf.h +++ b/graphics/fonts/bdf.h @@ -61,14 +61,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..be3cd94efa 100644 --- a/graphics/fonts/ttf.cpp +++ b/graphics/fonts/ttf.cpp @@ -107,11 +107,11 @@ public: 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,13 +126,14 @@ 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; - - FT_UInt _glyphSlots[256]; + bool cacheGlyph(Glyph &glyph, uint32 chr) const; + typedef Common::HashMap<uint32, Glyph> GlyphCache; + mutable GlyphCache _glyphs; + bool _allowLateCaching; + void assureCached(uint32 chr) const; bool _monochrome; bool _hasKerning; @@ -140,7 +141,7 @@ private: 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(), _monochrome(false), _hasKerning(false) { } TTFFont::~TTFFont() { @@ -212,19 +213,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 +251,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 +260,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 +330,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,11 +403,13 @@ 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. @@ -456,12 +485,24 @@ 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; } +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, bool monochrome, const uint32 *mapping) { TTFFont *font = new TTFFont(); diff --git a/graphics/fonts/winfont.cpp b/graphics/fonts/winfont.cpp index 3bad92236d..c0ebab19ba 100644 --- a/graphics/fonts/winfont.cpp +++ b/graphics/fonts/winfont.cpp @@ -200,7 +200,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 +208,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 +324,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..2c7ba07b41 100644 --- a/graphics/fonts/winfont.h +++ b/graphics/fonts/winfont.h @@ -62,8 +62,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 +72,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/gui/widgets/editable.cpp b/gui/widgets/editable.cpp index 667850d6cc..6f550b5642 100644 --- a/gui/widgets/editable.cpp +++ b/gui/widgets/editable.cpp @@ -261,23 +261,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..63a1942311 100644 --- a/gui/widgets/editable.h +++ b/gui/widgets/editable.h @@ -78,6 +78,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..c54ca573ba 100644 --- a/gui/widgets/edittext.cpp +++ b/gui/widgets/edittext.cpp @@ -101,7 +101,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/list.cpp b/gui/widgets/list.cpp index 8ecb31311f..8b8eb31db9 100644 --- a/gui/widgets/list.cpp +++ b/gui/widgets/list.cpp @@ -541,7 +541,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; @@ -318,15 +318,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/video/avi_decoder.cpp b/video/avi_decoder.cpp index aee2d88988..36fe83fa19 100644 --- a/video/avi_decoder.cpp +++ b/video/avi_decoder.cpp @@ -69,6 +69,7 @@ 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') +#define ID_STRN MKTAG('s','t','r','n') // Codec tags #define ID_RLE MKTAG('R','L','E',' ') @@ -109,6 +110,7 @@ void AVIDecoder::initCommon() { _decodedHeader = false; _foundMovieList = false; _movieListStart = 0; + _movieListEnd = 0; _fileStream = 0; memset(&_header, 0, sizeof(_header)); } @@ -155,19 +157,11 @@ bool AVIDecoder::parseNextChunk() { case ID_JUNK: // Alignment bytes, should be ignored case ID_ISFT: // Metadata, safe to ignore case ID_DISP: // Metadata, should be safe to ignore + case ID_STRN: // Metadata, 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 +187,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 @@ -353,17 +348,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 @@ -621,6 +626,59 @@ 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(); +} + AVIDecoder::AVIVideoTrack::AVIVideoTrack(int frameCount, const AVIStreamHeader &streamHeader, const BitmapInfoHeader &bitmapInfoHeader, byte *initialPalette) : _frameCount(frameCount), _vidsHeader(streamHeader), _bmInfo(bitmapInfoHeader), _initialPalette(initialPalette) { _videoCodec = createCodec(); @@ -723,6 +781,10 @@ Codec *AVIDecoder::AVIVideoTrack::createCodec() { return 0; } +void AVIDecoder::AVIVideoTrack::forceTrackEnd() { + _curFrame = _frameCount - 1; +} + AVIDecoder::AVIAudioTrack::AVIAudioTrack(const AVIStreamHeader &streamHeader, const PCMWaveFormat &waveFormat, Audio::Mixer::SoundType soundType) : _audsHeader(streamHeader), _wvInfo(waveFormat), _soundType(soundType) { _audStream = createAudioStream(); diff --git a/video/avi_decoder.h b/video/avi_decoder.h index 3bf443a95b..882cce30de 100644 --- a/video/avi_decoder.h +++ b/video/avi_decoder.h @@ -166,6 +166,7 @@ protected: ~AVIVideoTrack(); void decodeFrame(Common::SeekableReadStream *stream); + void forceTrackEnd(); uint16 getWidth() const { return _bmInfo.width; } uint16 getHeight() const { return _bmInfo.height; } @@ -230,13 +231,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; @@ -248,6 +251,7 @@ protected: void handleStreamHeader(uint32 size); uint16 getStreamType(uint32 tag) const { return tag & 0xFFFF; } byte getStreamIndex(uint32 tag) const; + void forceVideoEnd(); public: virtual AVIAudioTrack *createAudioTrack(AVIStreamHeader sHeader, PCMWaveFormat wvInfo); diff --git a/video/codecs/mpeg.h b/video/codecs/mpeg.h index 0082844537..3560f4b8b7 100644 --- a/video/codecs/mpeg.h +++ b/video/codecs/mpeg.h @@ -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; |