diff options
123 files changed, 7955 insertions, 8466 deletions
@@ -245,7 +245,8 @@ site and view the compatibility chart. Backyard Baseball [baseball] Backyard Soccer [soccer] - Blue's ABC Time [BluesABCTime] + Blue's 123 Time Activities [Blues123Time] + Blue's ABC Time Activities [BluesABCTime] Blue's Birthday Adventure [BluesBirthday] SPY Fox 3: Operation Ozone [spyozon] diff --git a/backends/platform/ds/arm7/Makefile b/backends/platform/ds/arm7/Makefile index e6a190b1ce..55db7f8cad 100644 --- a/backends/platform/ds/arm7/Makefile +++ b/backends/platform/ds/arm7/Makefile @@ -68,7 +68,8 @@ endif # list of directories containing libraries, this must be the top level containing # include and lib #--------------------------------------------------------------------------------- -LIBDIRS := /home/neil/devkitpror21/libnds home/neil/devkitpror21/libnds/nds +#LIBDIRS := /home/neil/devkitpror21/libnds home/neil/devkitpror21/libnds/nds +LIBDIRS := $(DEVKITPRO)/libnds #--------------------------------------------------------------------------------- @@ -127,6 +128,10 @@ clean: @echo clean ...$(TARGET) @rm -fr $(BUILD) *.bin +#--------------------------------------------------------------------------------- +semiclean: + @echo semiclean ...$(TARGET) + #--------------------------------------------------------------------------------- else diff --git a/backends/platform/ds/arm7/source/main.cpp b/backends/platform/ds/arm7/source/main.cpp index 0e31204ef7..bee39f1efe 100644 --- a/backends/platform/ds/arm7/source/main.cpp +++ b/backends/platform/ds/arm7/source/main.cpp @@ -36,7 +36,7 @@ #include <arm7/clock.h> #include <stdlib.h> #include <string.h> -#include <registers_alt.h> +//#include <registers_alt.h> // not needed in current libnds #include <NDS/scummvm_ipc.h> ////////////////////////////////////////////////////////////////////// #ifdef USE_DEBUGGER @@ -261,6 +261,9 @@ uint16 powerManagerWrite(uint32 command, u32 data, bool enable) { REG_SPICNT = SPI_ENABLE | SPI_BAUD_1MHz; REG_SPIDATA = enable? (result | data): (result & ~data); SerialWaitBusy(); + + // FIXME: This function should either return something, or have a comment + // explaining why it is valid for it to not return something. :-) } /* diff --git a/backends/platform/ds/arm9/buildkeyboard.bat b/backends/platform/ds/arm9/buildkeyboard.bat index 2078381ccb..ae3398d24d 100644 --- a/backends/platform/ds/arm9/buildkeyboard.bat +++ b/backends/platform/ds/arm9/buildkeyboard.bat @@ -2,7 +2,3 @@ cd data ..\tools\gfx2gba -c16 -t8 -M -pkeyboard_pal.raw ..\keyboard.bmp del keyboard.map pause -cd data -..\tools\gfx2gba -c16 -t8 -M -pkeyboard_pal.raw ..\keyboard.bmp -del keyboard.map -pause
\ No newline at end of file diff --git a/backends/platform/ds/arm9/lib/readme.txt b/backends/platform/ds/arm9/lib/readme.txt index f6e7f4c511..2469e38cd0 100644 --- a/backends/platform/ds/arm9/lib/readme.txt +++ b/backends/platform/ds/arm9/lib/readme.txt @@ -1,2 +1 @@ If building with MAD enabled, put libmad.a in here. -If building with MAD enabled, put libmad.a in here.
\ No newline at end of file diff --git a/backends/platform/ds/arm9/makefile b/backends/platform/ds/arm9/makefile index aefd8c091e..1a4d61113e 100644 --- a/backends/platform/ds/arm9/makefile +++ b/backends/platform/ds/arm9/makefile @@ -1,47 +1,39 @@ -#DYNAMIC_MODULES = 1 -#libndsdir = $(DEVKITPRO)/libnds -libndsdir = /home/neil/devkitpror21/libnds - -# Select the build you want by uncommenting one of the following lines: - - - -ifeq ($(SCUMM_BUILD),a) - DS_BUILD_A = 1 -endif - -ifeq ($(SCUMM_BUILD),b) - DS_BUILD_B = 1 -endif - -ifeq ($(SCUMM_BUILD),c) - DS_BUILD_C = 1 -endif - -ifeq ($(SCUMM_BUILD),d) - DS_BUILD_D = 1 -endif +srcdir ?= . +DEPDIR := .deps -ifeq ($(SCUMM_BUILD),e) - DS_BUILD_E = 1 -endif +#DYNAMIC_MODULES = 1 +libndsdir = $(DEVKITPRO)/libnds +#libndsdir = /home/neil/devkitpror21/libnds -ifeq ($(SCUMM_BUILD),f) - DS_BUILD_F = 1 -endif +# Select the build by setting SCUMM_BUILD to a,b,c,d,e,f or g. +# Anything else gets build a. ifeq ($(SCUMM_BUILD),g) DS_BUILD_G = 1 +else + ifeq ($(SCUMM_BUILD),f) + DS_BUILD_F = 1 + else + ifeq ($(SCUMM_BUILD),e) + DS_BUILD_E = 1 + else + ifeq ($(SCUMM_BUILD),d) + DS_BUILD_D = 1 + else + ifeq ($(SCUMM_BUILD),c) + DS_BUILD_C = 1 + else + ifeq ($(SCUMM_BUILD),b) + DS_BUILD_B = 1 + else + DS_BUILD_A = 1 + endif + endif + endif + endif + endif endif -DS_BUILD_A = 1 -#DS_BUILD_B = 1 -#DS_BUILD_C = 1 -#DS_BUILD_D = 1 -#DS_BUILD_E = 1 -#DS_BUILD_F = 1 -#DS_BUILD_G = 1 - # To do: # - FAT cache? @@ -79,6 +71,9 @@ VPATH = $(srcdir) # Command to build libmad is: # ./configure --host=arm-elf --enable-speed --enable-sso -enable-fpm=arm CFLAGS='-specs=ds_arm9.specs -mthumb-interwork' +# +# I actually had to use +# ./configure --host=arm-elf --enable-speed --enable-sso -enable-fpm=arm CFLAGS='-specs=ds_arm9.specs -mthumb-interwork' LDFLAGS='C:/Progra~1/devkitpro/libnds/lib/libnds9.a' --disable-shared --disable-debugging USE_ARM_SOUND_ASM = 1 ARM = 1 @@ -164,7 +159,7 @@ ifdef USE_PROFILER DEFINES += -DUSE_PROFILER endif -CXXFLAGS= $(CFLAGS) -Wno-non-virtual-dtor -Wno-non-virtual-dtor \ +CXXFLAGS= $(CFLAGS) -Wno-non-virtual-dtor -Wno-unknown-pragmas -Wno-reorder \ -fno-exceptions -fno-rtti -mthumb-interwork # -mthumb @@ -187,9 +182,9 @@ endif LDFLAGS = -specs=ds_arm9.specs -mthumb-interwork -Wl,--wrap,time -mno-fpu -Wl,-Map,map.txt -INCLUDES= -I./ -I$(portdir)/$(BUILD) -I$(srcdir) -I$(srcdir)/common -I$(portdir)/source -I$(portdir)/source/compressor -I$(portdir)/source/fat \ - -I$(srcdir)/backends/fs -I$(srcdir)/backends/fs/ds -I$(portdir)/data -I$(libndsdir)/include -I$(portdir)/../commoninclude\ - -I$(srcdir)/scumm -I$(libndsdir)/include -I$(libndsdir)/include/nds -I$(srcdir)/engines -I$(portdir)/source/mad\ +INCLUDES= -I./ -I$(portdir)/$(BUILD) -I$(srcdir) -I$(srcdir)/common -I$(portdir)/source -I$(portdir)/source/fat \ + -I$(portdir)/data -I$(libndsdir)/include -I$(portdir)/../commoninclude\ + -I$(libndsdir)/include -I$(libndsdir)/include/nds -I$(srcdir)/engines -I$(portdir)/source/mad\ -I$(portdir)/source/libcartreset -include $(srcdir)/common/scummsys.h @@ -273,9 +268,7 @@ OPT_SIZE := -Os #-mthumb -fno-gcse -fno-schedule-insns2 - -OBJS := $(DATA_OBJS) $(LIBCARTRESET_OBJS) $(PORT_OBJS) $(COMPRESSOR_OBJS) $(FAT_OBJS) - +OBJS := $(DATA_OBJS) $(LIBCARTRESET_OBJS) $(PORT_OBJS) $(COMPRESSOR_OBJS) $(FAT_OBJS) @@ -287,6 +280,9 @@ ndsall: include $(srcdir)/Makefile.common +semiclean: + $(RM) $(portdir)/source/dsoptions.o $(portdir)/source/dsmain.o $(FAT_OBJS) $(DATA_OBJS) $(portdir)/source/wordcompletion.o + clean: $(RM) $(OBJS) $(EXECUTABLE) rm -fr $(BUILD) @@ -365,8 +361,7 @@ else # echo !!!!!!!! $(OPTFLAG) $(MKDIR) $(*D)/$(DEPDIR) - $(CXX) -Wp,-MMD,"$(*D)/$(DEPDIR)/$(*F).d",-MQ,"$@",-MP $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $*.o - $(CXX) -MMD -MF "$(*D)/$(DEPDIR)/$(*F).d" $(if $(findstring $(notdir $<), $(OPTLIST)), $(OPT_SPEED), $(OPT_SIZE)) $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $*.o + $(CXX) -Wp,-MMD,"$(*D)/$(DEPDIR)/$(*F).d",-MQ,"$@",-MP $(if $(findstring $(notdir $<), $(OPTLIST)), $(OPT_SPEED), $(OPT_SIZE)) $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $*.o endif diff --git a/backends/platform/ds/arm9/source/cdaudio.cpp b/backends/platform/ds/arm9/source/cdaudio.cpp index 9569a820f2..56ac4e8c09 100644 --- a/backends/platform/ds/arm9/source/cdaudio.cpp +++ b/backends/platform/ds/arm9/source/cdaudio.cpp @@ -21,8 +21,8 @@ */ #include "cdaudio.h" -#include "ds-fs.h" -#include "config-manager.h" +#include "backends/fs/ds/ds-fs.h" +#include "common/config-manager.h" #include "dsmain.h" #include "NDS/scummvm_ipc.h" #include "console2.h" diff --git a/backends/platform/ds/arm9/source/compressor/lz.h b/backends/platform/ds/arm9/source/compressor/lz.h index dc10210742..e7ea1567ca 100644 --- a/backends/platform/ds/arm9/source/compressor/lz.h +++ b/backends/platform/ds/arm9/source/compressor/lz.h @@ -48,53 +48,3 @@ void LZ_Uncompress( unsigned char *in, unsigned char *out, #endif /* _lz_h_ */ -/************************************************************************* -* Name: lz.h -* Author: Marcus Geelnard -* Description: LZ77 coder/decoder interface. -* Reentrant: Yes -* $Id$ -*------------------------------------------------------------------------- -* Copyright (c) 2003-2004 Marcus Geelnard -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would -* be appreciated but is not required. -* -* 2. Altered source versions must be plainly marked as such, and must not -* be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any source -* distribution. -* -* Marcus Geelnard -* marcus.geelnard at home.se -*************************************************************************/ - -#ifndef _lz_h_ -#define _lz_h_ - - - -/************************************************************************* -* Function prototypes -*************************************************************************/ - -int LZ_Compress( unsigned char *in, unsigned char *out, - unsigned int insize ); -int LZ_CompressFast( unsigned char *in, unsigned char *out, - unsigned int insize, unsigned int *work ); -void LZ_Uncompress( unsigned char *in, unsigned char *out, - unsigned int insize ); - - -#endif /* _lz_h_ */ diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp index efa60015fb..a130509e36 100644 --- a/backends/platform/ds/arm9/source/dsmain.cpp +++ b/backends/platform/ds/arm9/source/dsmain.cpp @@ -71,12 +71,11 @@ #include <stdlib.h> #include "dsmain.h" #include "string.h" -#include "system.h" #include "osystem_ds.h" #include "icons_raw.h" -#include "gba_nds_fat.h" -#include "disc_io.h" -#include "config-manager.h" +#include "fat/gba_nds_fat.h" +#include "fat/disc_io.h" +#include "common/config-manager.h" #include "engines/scumm/scumm.h" #include "keyboard_raw.h" #include "keyboard_pal_raw.h" @@ -89,14 +88,13 @@ #include "user_debugger.h" #endif #include "ramsave.h" -#include "disc_io.h" #include "blitters.h" #include "cartreset_nolibfat.h" #include "keys.h" #ifdef USE_PROFILER #include "profiler/cyg-profile.h" #endif -#include "ds-fs.h" +#include "backends/fs/ds/ds-fs.h" namespace DS { @@ -360,14 +358,14 @@ void initSprites() { sprites[i].attribute[0] = ATTR0_DISABLED; sprites[i].attribute[1] = 0; sprites[i].attribute[2] = 0; - sprites[i].attribute[3] = 0; + sprites[i].filler = 0; } for (int i = 0; i < 128; i++) { spritesMain[i].attribute[0] = ATTR0_DISABLED; spritesMain[i].attribute[1] = 0; spritesMain[i].attribute[2] = 0; - spritesMain[i].attribute[3] = 0; + spritesMain[i].filler = 0; } updateOAM(); @@ -749,7 +747,7 @@ void displayMode16Bit() { if (displayModeIs8Bit) { - static int test = 0; +// static int test = 0; // consolePrintf("saving buffer... %d\n", test++); saveGameBackBuffer(); for (int r = 0; r < 32 * 32; r++) { @@ -1612,7 +1610,7 @@ void updateStatus() { // spritesMain[0].attribute[0] = ATTR0_DISABLED; // spritesMain[0].attribute[1] = 0; // spritesMain[0].attribute[2] = 0; -// spritesMain[0].attribute[3] = 0; +// spritesMain[0].filler = 0; setIconMain(0, 0, 0, 0, 0, false); } @@ -2431,7 +2429,7 @@ u8 fastRamData[FAST_RAM_SIZE] ITCM_DATA; void* fastRamAlloc(int size) { // return malloc(size); - void* result = fastRamPointer; + void* result = (void *) fastRamPointer; fastRamPointer += size; if(fastRamPointer > fastRamData + FAST_RAM_SIZE) { consolePrintf("FastRam (ITCM) allocation failed!\n"); @@ -2825,33 +2823,25 @@ int main(void) //printf("'%s'", Common::ConfigManager::kApplicationDomain.c_str()); #if defined(DS_BUILD_A) - char* argv[2] = {"/scummvmds", "--config=scummvm.ini"}; + const char *argv[] = {"/scummvmds"}; #elif defined(DS_BUILD_B) - char* argv[2] = {"/scummvmds", "--config=scummvmb.ini"}; + const char *argv[] = {"/scummvmds", "--config=scummvmb.ini"}; #elif defined(DS_BUILD_C) - char* argv[2] = {"/scummvmds", "--config=scummvmc.ini"}; + const char *argv[] = {"/scummvmds", "--config=scummvmc.ini"}; #elif defined(DS_BUILD_D) - char* argv[3] = {"/scummvmds", "--config=scummvmd.ini"}; + const char *argv[] = {"/scummvmds", "--config=scummvmd.ini"}; #elif defined(DS_BUILD_E) - char* argv[3] = {"/scummvmds", "--config=scummvme.ini"}; + const char *argv[] = {"/scummvmds", "--config=scummvme.ini"}; #elif defined(DS_BUILD_F) - char* argv[3] = {"/scummvmds", "--config=scummvmf.ini"}; + const char *argv[] = {"/scummvmds", "--config=scummvmf.ini"}; #elif defined(DS_BUILD_G) - char* argv[3] = {"/scummvmds", "--config=scummvmg.ini"}; + const char *argv[] = {"/scummvmds", "--config=scummvmg.ini"}; #endif -#ifdef DS_NON_SCUMM_BUILD - - while (1) { - scummvm_main(2, (char **) &argv); - powerOff(); - } -#else while (1) { - scummvm_main(1, (char **) &argv); + scummvm_main(ARRAYSIZE(argv), (char **) &argv); powerOff(); } -#endif return 0; } diff --git a/backends/platform/ds/arm9/source/fat/disc_io.h b/backends/platform/ds/arm9/source/fat/disc_io.h index 05d4c020bd..2d3da1fc6f 100644 --- a/backends/platform/ds/arm9/source/fat/disc_io.h +++ b/backends/platform/ds/arm9/source/fat/disc_io.h @@ -53,7 +53,7 @@ //---------------------------------------------------------------------- #if defined _CF_USE_DMA && defined _CF_ALLOW_UNALIGNED - #error You can't use both DMA and unaligned memory + #error You can not use both DMA and unaligned memory #endif // When compiling for NDS, make sure NDS is defined diff --git a/backends/platform/ds/arm9/source/fat/io_efa2.h b/backends/platform/ds/arm9/source/fat/io_efa2.h index 27c4e9beb8..840c6b83ac 100644 --- a/backends/platform/ds/arm9/source/fat/io_efa2.h +++ b/backends/platform/ds/arm9/source/fat/io_efa2.h @@ -26,31 +26,3 @@ extern LPIO_INTERFACE EFA2_GetInterface(void); #endif // define IO_EFA2_H -/* - io_efa2.h by CyteX - - Based on io_mpfc.h by chishm (Michael Chisholm) - - Hardware Routines for reading the NAND flash located on - EFA2 flash carts - - This software is completely free. No warranty is provided. - If you use it, please give me credit and email me about your - project at cytex <at> gmx <dot> de and do not forget to also - drop chishm <at> hotmail <dot> com a line - - See gba_nds_fat.txt for help and license details. -*/ - -#ifndef IO_EFA2_H -#define IO_EFA2_H - -// 'EFA2' -#define DEVICE_TYPE_EFA2 0x32414645 - -#include "disc_io.h" - -// export interface -extern LPIO_INTERFACE EFA2_GetInterface(void); - -#endif // define IO_EFA2_H diff --git a/backends/platform/ds/arm9/source/gbampsave.cpp b/backends/platform/ds/arm9/source/gbampsave.cpp index ca4e617e29..9c8af81a6e 100644 --- a/backends/platform/ds/arm9/source/gbampsave.cpp +++ b/backends/platform/ds/arm9/source/gbampsave.cpp @@ -21,9 +21,9 @@ */ #include "gbampsave.h" -#include "gba_nds_fat.h" -#include "ds-fs.h" -#include "config-manager.h" +#include "fat/gba_nds_fat.h" +#include "backends/fs/ds/ds-fs.h" +#include "common/config-manager.h" ///////////////////////// // GBAMP Save File diff --git a/backends/platform/ds/arm9/source/gbampsave.h b/backends/platform/ds/arm9/source/gbampsave.h index e9188b5312..d0cbc68bfd 100644 --- a/backends/platform/ds/arm9/source/gbampsave.h +++ b/backends/platform/ds/arm9/source/gbampsave.h @@ -23,8 +23,8 @@ #ifndef _GBAMPSAVE_H_ #define _GBAMPSAVE_H_ -#include "system.h" -#include "ds-fs.h" +#include "common/system.h" +#include "backends/fs/ds/ds-fs.h" #define SAVE_BUFFER_SIZE 100000 diff --git a/backends/platform/ds/arm9/source/mad/readme.txt b/backends/platform/ds/arm9/source/mad/readme.txt index 09a2ec07df..c911ab9271 100644 --- a/backends/platform/ds/arm9/source/mad/readme.txt +++ b/backends/platform/ds/arm9/source/mad/readme.txt @@ -1,2 +1 @@ Put mad.h here if you are compiling with Madlib support enabled. -Put mad.h here if you are compiling with Madlib support enabled.
\ No newline at end of file diff --git a/backends/platform/ds/arm9/source/osystem_ds.cpp b/backends/platform/ds/arm9/source/osystem_ds.cpp index 1d8d39dcab..6e6b457115 100644 --- a/backends/platform/ds/arm9/source/osystem_ds.cpp +++ b/backends/platform/ds/arm9/source/osystem_ds.cpp @@ -22,7 +22,6 @@ #include "common/scummsys.h" #include "common/system.h" -#include "system.h" #include "common/util.h" #include "common/rect.h" @@ -32,12 +31,12 @@ #include "nds.h" #include "dsmain.h" #include "nds/registers_alt.h" -#include "config-manager.h" +#include "common/config-manager.h" #include "common/str.h" #include "cdaudio.h" #include "graphics/surface.h" #include "touchkeyboard.h" -#include "ds-fs-factory.h" +#include "backends/fs/ds/ds-fs-factory.h" OSystem_DS* OSystem_DS::_instance = NULL; diff --git a/backends/platform/ds/arm9/source/ramsave.cpp b/backends/platform/ds/arm9/source/ramsave.cpp index f8e005647e..be355ce76f 100644 --- a/backends/platform/ds/arm9/source/ramsave.cpp +++ b/backends/platform/ds/arm9/source/ramsave.cpp @@ -20,7 +20,6 @@ * */ // Save in order 1,2,3,4,larger 2,5 -#include "system.h" #include "ramsave.h" #include "nds.h" #include "compressor/lz.h" diff --git a/backends/platform/ds/arm9/source/ramsave.h b/backends/platform/ds/arm9/source/ramsave.h index 6add649f56..f919da18db 100644 --- a/backends/platform/ds/arm9/source/ramsave.h +++ b/backends/platform/ds/arm9/source/ramsave.h @@ -23,8 +23,8 @@ #ifndef _RAMSAVE_H_ #define _RAMSAVE_H_ -#include "system.h" -#include "savefile.h" +#include "common/system.h" +#include "common/savefile.h" // SaveFileManager class diff --git a/backends/platform/ds/arm9/source/wordcompletion.h b/backends/platform/ds/arm9/source/wordcompletion.h index 39be8511bf..980277d6bb 100644 --- a/backends/platform/ds/arm9/source/wordcompletion.h +++ b/backends/platform/ds/arm9/source/wordcompletion.h @@ -1,10 +1,7 @@ - - - namespace DS { extern bool findWordCompletions(char* input); extern void addAutoCompleteLine(char* line); extern void sortAutoCompleteWordList(); -}
\ No newline at end of file +} diff --git a/backends/platform/ds/makefile b/backends/platform/ds/makefile index 9c88932a7f..3fb19e939c 100644 --- a/backends/platform/ds/makefile +++ b/backends/platform/ds/makefile @@ -15,6 +15,24 @@ all: @for i in $(SUBDIRS); do if test -d $$i; then make -C $$i; fi; done; clean: @for i in $(SUBDIRS); do if test -d $$i; then make -C $$i clean; fi; done; +semiclean: + @for i in $(SUBDIRS); do if test -d $$i; then make -C $$i semiclean; fi; done; export: @for i in $(SUBDIRS); do if test -d $$i; then make -C $$i export; fi; done; + +allbuilds: + make semiclean + make all SCUMM_BUILD=a + make semiclean + make all SCUMM_BUILD=b + make semiclean + make all SCUMM_BUILD=c + make semiclean + make all SCUMM_BUILD=d + make semiclean + make all SCUMM_BUILD=e + make semiclean + make all SCUMM_BUILD=f + make semiclean + make all SCUMM_BUILD=g diff --git a/base/plugins.h b/base/plugins.h index 2eaa290ed7..aef95a6650 100644 --- a/base/plugins.h +++ b/base/plugins.h @@ -81,6 +81,12 @@ extern int pluginTypeVersions[PLUGIN_TYPE_MAX]; #define STATIC_PLUGIN 1 #define DYNAMIC_PLUGIN 2 +// Note: The spaces around ENABLE_##ID have been added on purpose for +// MSVC. For some reason, MSVC tries to add the parenthesis after +// ENABLE_##ID to the check, thus making it false all the time. +// Please do NOT remove them, otherwise no engine plugins will be +// registered under MSVC + #define PLUGIN_ENABLED_STATIC(ID) \ (defined( ENABLE_##ID ) && !PLUGIN_ENABLED_DYNAMIC(ID)) diff --git a/common/advancedDetector.cpp b/common/advancedDetector.cpp index 79289072df..8999a60942 100644 --- a/common/advancedDetector.cpp +++ b/common/advancedDetector.cpp @@ -428,7 +428,13 @@ static ADGameDescList detectGame(const FSList *fslist, const Common::ADParams &p if (curFilesMatched > maxFilesMatched) { debug(2, " ... new best match, removing all previous candidates"); maxFilesMatched = curFilesMatched; - matched.clear(); + + for (uint j = 0; j < matched.size();) { + if (matched[j]->flags & ADGF_KEEPMATCH) + ++j; + else + matched.remove_at(j); + } matched.push_back(g); } else if (curFilesMatched == maxFilesMatched) { matched.push_back(g); diff --git a/common/advancedDetector.h b/common/advancedDetector.h index bec03d5585..48b9e213d7 100644 --- a/common/advancedDetector.h +++ b/common/advancedDetector.h @@ -46,6 +46,8 @@ struct ADGameFileDescription { enum ADGameFlags { ADGF_NO_FLAGS = 0, + ADGF_KEEPMATCH = (1 << 27), // this entry is kept even when there are matched + // entries with more files ADGF_DROPLANGUAGE = (1 << 28), // don't add language to gameid ADGF_CD = (1 << 29), // add "-cd" to gameid ADGF_DEMO = (1 << 30) // add "-demo" to gameid diff --git a/common/module.mk b/common/module.mk index a7c0f4eb90..c3f2a38c3f 100644 --- a/common/module.mk +++ b/common/module.mk @@ -14,6 +14,7 @@ MODULE_OBJS := \ stream.o \ util.o \ system.o \ + unarj.o \ unzip.o \ zlib.o diff --git a/common/unarj.cpp b/common/unarj.cpp new file mode 100644 index 0000000000..942e659caa --- /dev/null +++ b/common/unarj.cpp @@ -0,0 +1,698 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +// Heavily based on Unarj 2.65 + +/* UNARJ.C, UNARJ, R JUNG, 06/05/02 + * Main Extractor routine + * Copyright (c) 1991-2002 by ARJ Software, Inc. All rights reserved. + * + * This code may be freely used in programs that are NOT ARJ archivers + * (both compress and extract ARJ archives). + * + * If you wish to distribute a modified version of this program, you + * MUST indicate that it is a modified version both in the program and + * source code. + * + * We are holding the copyright on the source code, so please do not + * delete our name from the program files or from the documentation. + * + * We wish to give credit to Haruhiko Okumura for providing the + * basic ideas for ARJ and UNARJ in his program AR. Please note + * that UNARJ is significantly different from AR from an archive + * structural point of view. + * + */ + +#include "common/scummsys.h" +#include "common/util.h" +#include "common/unarj.h" + +namespace Common { + +static uint32 CRCtable[256]; + +static void InitCRC(void) { + const uint32 poly = 0xEDB88320; + int i, j; + uint32 n; + + for (i = 0; i < 256; i++) { + n = i; + for (j = 0; j < 8; j++) + n = (n & 1) ? ((n >> 1) ^ poly) : (n >> 1); + CRCtable[i] = n; + } +} + +static uint32 GetCRC(byte *data, int len) { + uint32 CRC = 0xFFFFFFFF; + int i; + for (i = 0; i < len; i++) + CRC = (CRC >> 8) ^ CRCtable[(CRC ^ data[i]) & 0xFF]; + return CRC ^ 0xFFFFFFFF; +} + +ArjFile::ArjFile() { + InitCRC(); + _isOpen = false; + _fallBack = false; +} + +ArjFile::~ArjFile() { + close(); + + for (uint i = 0; i < _headers.size(); i++) + delete _headers[i]; + + _headers.clear(); + _fileMap.clear(); + _archMap.clear(); +} + +void ArjFile::registerArchive(const String &filename) { + int32 first_hdr_pos; + ArjHeader *header; + + if (!_currArchive.open(filename)) + return; + + first_hdr_pos = findHeader(); + + if (first_hdr_pos < 0) { + warning("ArjFile::registerArchive(): Could not find a valid header"); + return; + } + + _currArchive.seek(first_hdr_pos, SEEK_SET); + if (readHeader() == NULL) + return; + + while ((header = readHeader()) != NULL) { + _headers.push_back(header); + + _currArchive.seek(header->compSize, SEEK_CUR); + + _fileMap[header->filename] = _headers.size() - 1; + _archMap[header->filename] = filename; + } + + _currArchive.close(); + + debug(0, "ArjFile::registerArchive(%s): Located %d files", filename.c_str(), _headers.size()); +} + +int32 ArjFile::findHeader(void) { + long arcpos, lastpos; + int c; + byte header[HEADERSIZE_MAX]; + uint32 crc; + uint16 headersize; + + arcpos = _currArchive.pos(); + _currArchive.seek(0L, SEEK_END); + lastpos = _currArchive.pos() - 2; + if (lastpos > MAXSFX) + lastpos = MAXSFX; + + for ( ; arcpos < lastpos; arcpos++) { + _currArchive.seek(arcpos, SEEK_SET); + c = _currArchive.readByte(); + while (arcpos < lastpos) { + if (c != HEADER_ID_LO) // low order first + c = _currArchive.readByte(); + else if ((c = _currArchive.readByte()) == HEADER_ID_HI) + break; + arcpos++; + } + if (arcpos >= lastpos) + break; + if ((headersize = _currArchive.readUint16LE()) <= HEADERSIZE_MAX) { + _currArchive.read(header, headersize); + crc = GetCRC(header, headersize); + if (crc == _currArchive.readUint32LE()) { + _currArchive.seek(arcpos, SEEK_SET); + return arcpos; + } + } + } + return -1; // could not find a valid header +} + +ArjHeader *ArjFile::readHeader() { + ArjHeader header; + ArjHeader *head; + byte headData[HEADERSIZE_MAX]; + + header.id = _currArchive.readUint16LE(); + if (header.id != HEADER_ID) { + warning("ArjFile::readHeader(): Bad header ID (%x)", header.id); + + return NULL; + } + + header.headerSize = _currArchive.readUint16LE(); + if (header.headerSize == 0) + return NULL; // end of archive + if (header.headerSize > HEADERSIZE_MAX) { + warning("ArjFile::readHeader(): Bad header"); + + return NULL; + } + + int rSize = _currArchive.read(headData, header.headerSize); + + MemoryReadStream readS(headData, rSize); + + header.headerCrc = _currArchive.readUint32LE(); + if (GetCRC(headData, header.headerSize) != header.headerCrc) { + warning("ArjFile::readHeader(): Bad header CRC"); + return NULL; + } + + header.firstHdrSize = readS.readByte(); + header.nbr = readS.readByte(); + header.xNbr = readS.readByte(); + header.hostOs = readS.readByte(); + header.flags = readS.readByte(); + header.method = readS.readByte(); + header.fileType = readS.readByte(); + (void)readS.readByte(); + header.timeStamp = readS.readUint32LE(); + header.compSize = readS.readSint32LE(); + header.origSize = readS.readSint32LE(); + header.fileCRC = readS.readUint32LE(); + header.entryPos = readS.readUint16LE(); + header.fileMode = readS.readUint16LE(); + header.hostData = readS.readUint16LE(); + + if (header.origSize < 0 || header.compSize < 0) { + warning("ArjFile::readHeader(): Wrong file size"); + return NULL; + } + + strncpy(header.filename, (const char *)&headData[header.firstHdrSize], FNAME_MAX); + + strncpy(header.comment, (const char *)&headData[header.firstHdrSize + strlen(header.filename) + 1], COMMENT_MAX); + + /* if extheadersize == 0 then no CRC */ + /* otherwise read extheader data and read 4 bytes for CRC */ + + while ((header.extHeaderSize = _currArchive.readUint16LE()) != 0) + _currArchive.seek((long)(header.extHeaderSize + 4), SEEK_CUR); + + header.pos = _currArchive.pos(); + + head = new ArjHeader(header); + + return head; +} + + +bool ArjFile::open(const Common::String &filename, AccessMode mode) { + if (_isOpen) + error("Attempt to open another instance of archive"); + + _isOpen = false; + + if (_fallBack) { + _currArchive.open(filename); + if (_currArchive.isOpen()) { + _isOpen = true; + _uncompressed = &_currArchive; + return true; + } + } + + if (!_fileMap.contains(filename)) + return false; + + _isOpen = true; + + ArjHeader *hdr = _headers[_fileMap[filename]]; + + _compsize = hdr->compSize; + _origsize = hdr->origSize; + + _uncompressedData = (byte *)malloc(_origsize); + _outstream = new MemoryWriteStream(_uncompressedData, _origsize); + + _currArchive.open(_archMap[filename]); + _currArchive.seek(hdr->pos, SEEK_SET); + + if (hdr->method == 0) { // store + _currArchive.read(_uncompressedData, _origsize); + } else { + _compressedData = (byte *)malloc(_compsize); + _currArchive.read(_compressedData, _compsize); + + _compressed = new MemoryReadStream(_compressedData, _compsize); + + if (hdr->method == 1 || hdr->method == 2 || hdr->method == 3) + decode(); + else if (hdr->method == 4) + decode_f(); + + delete _compressed; + free(_compressedData); + } + + _currArchive.close(); + delete _outstream; + _outstream = NULL; + + _uncompressed = new MemoryReadStream(_uncompressedData, _origsize); + + return true; +} + +void ArjFile::close() { + _isOpen = false; + + if (_fallBack) { + _currArchive.close(); + return; + } else { + delete _uncompressed; + } + + _uncompressed = NULL; + + free(_uncompressedData); + _uncompressedData = NULL; +} + +uint32 ArjFile::read(void *dataPtr, uint32 dataSize) { + return _uncompressed->read(dataPtr, dataSize); +} + +bool ArjFile::eos() { + return _uncompressed->eos(); +} + +uint32 ArjFile::pos() { + return _uncompressed->pos(); +} + +uint32 ArjFile::size() { + return _uncompressed->size(); +} + +void ArjFile::seek(int32 offset, int whence) { + _uncompressed->seek(offset, whence); +} + +void ArjFile::init_getbits() { + _bitbuf = 0; + _subbitbuf = 0; + _bitcount = 0; + fillbuf(2 * CHAR_BIT); +} + +void ArjFile::fillbuf(int n) { // Shift bitbuf n bits left, read n bits + _bitbuf = (_bitbuf << n) & 0xFFFF; /* lose the first n bits */ + while (n > _bitcount) { + _bitbuf |= _subbitbuf << (n -= _bitcount); + if (_compsize != 0) { + _compsize--; + _subbitbuf = _compressed->readByte(); + } else + _subbitbuf = 0; + _bitcount = CHAR_BIT; + } + _bitbuf |= _subbitbuf >> (_bitcount -= n); +} + +uint16 ArjFile::getbits(int n) { + uint16 x; + + x = _bitbuf >> (2 * CHAR_BIT - n); + fillbuf(n); + return x; +} + + + +/* Huffman decode routines */ + +void ArjFile::make_table(int nchar, byte *bitlen, int tablebits, uint16 *table, int tablesize) { + uint16 count[17], weight[17], start[18], *p; + uint i, k, len, ch, jutbits, avail, nextcode, mask; + + for (i = 1; i <= 16; i++) + count[i] = 0; + for (i = 0; (int)i < nchar; i++) + count[bitlen[i]]++; + + start[1] = 0; + for (i = 1; i <= 16; i++) + start[i + 1] = start[i] + (count[i] << (16 - i)); + if (start[17] != (uint16) (1 << 16)) + error("ArjFile::make_table(): bad file data"); + + jutbits = 16 - tablebits; + for (i = 1; (int)i <= tablebits; i++) { + start[i] >>= jutbits; + weight[i] = 1 << (tablebits - i); + } + while (i <= 16) { + weight[i] = 1 << (16 - i); + i++; + } + + i = start[tablebits + 1] >> jutbits; + if (i != (uint16) (1 << 16)) { + k = 1 << tablebits; + while (i != k) + table[i++] = 0; + } + + avail = nchar; + mask = 1 << (15 - tablebits); + for (ch = 0; (int)ch < nchar; ch++) { + if ((len = bitlen[ch]) == 0) + continue; + k = start[len]; + nextcode = k + weight[len]; + if ((int)len <= tablebits) { + if (nextcode > (uint)tablesize) + error("ArjFile::make_table(): bad file data"); + for (i = start[len]; i < nextcode; i++) + table[i] = ch; + } else { + p = &table[k >> jutbits]; + i = len - tablebits; + while (i != 0) { + if (*p == 0) { + _right[avail] = _left[avail] = 0; + *p = avail++; + } + if (k & mask) + p = &_right[*p]; + else + p = &_left[*p]; + k <<= 1; + i--; + } + *p = ch; + } + start[len] = nextcode; + } +} + +void ArjFile::read_pt_len(int nn, int nbit, int i_special) { + int i, n; + int16 c; + uint16 mask; + + n = getbits(nbit); + if (n == 0) { + c = getbits(nbit); + for (i = 0; i < nn; i++) + _pt_len[i] = 0; + for (i = 0; i < 256; i++) + _pt_table[i] = c; + } else { + i = 0; + while (i < n) { + c = _bitbuf >> (13); + if (c == 7) { + mask = 1 << (12); + while (mask & _bitbuf) { + mask >>= 1; + c++; + } + } + fillbuf((c < 7) ? 3 : (int)(c - 3)); + _pt_len[i++] = (byte)c; + if (i == i_special) { + c = getbits(2); + while (--c >= 0) + _pt_len[i++] = 0; + } + } + while (i < nn) + _pt_len[i++] = 0; + make_table(nn, _pt_len, 8, _pt_table, PTABLESIZE); // replaced sizeof + } +} + +void ArjFile::read_c_len() { + int16 i, c, n; + uint16 mask; + + n = getbits(CBIT); + if (n == 0) { + c = getbits(CBIT); + for (i = 0; i < NC; i++) + _c_len[i] = 0; + for (i = 0; i < CTABLESIZE; i++) + _c_table[i] = c; + } else { + i = 0; + while (i < n) { + c = _pt_table[_bitbuf >> (8)]; + if (c >= NT) { + mask = 1 << (7); + do { + if (_bitbuf & mask) + c = _right[c]; + else + c = _left[c]; + mask >>= 1; + } while (c >= NT); + } + fillbuf((int)(_pt_len[c])); + if (c <= 2) { + if (c == 0) + c = 1; + else if (c == 1) + c = getbits(4) + 3; + else + c = getbits(CBIT) + 20; + while (--c >= 0) + _c_len[i++] = 0; + } + else + _c_len[i++] = (byte)(c - 2); + } + while (i < NC) + _c_len[i++] = 0; + make_table(NC, _c_len, 12, _c_table, CTABLESIZE); // replaced sizeof + } +} + +uint16 ArjFile::decode_c() { + uint16 j, mask; + + if (_blocksize == 0) { + _blocksize = getbits(16); + read_pt_len(NT, TBIT, 3); + read_c_len(); + read_pt_len(NP, PBIT, -1); + } + _blocksize--; + j = _c_table[_bitbuf >> 4]; + if (j >= NC) { + mask = 1 << (3); + do { + if (_bitbuf & mask) + j = _right[j]; + else + j = _left[j]; + mask >>= 1; + } while (j >= NC); + } + fillbuf((int)(_c_len[j])); + return j; +} + +uint16 ArjFile::decode_p() { + uint16 j, mask; + + j = _pt_table[_bitbuf >> (8)]; + if (j >= NP) { + mask = 1 << (7); + do { + if (_bitbuf & mask) + j = _right[j]; + else + j = _left[j]; + mask >>= 1; + } while (j >= NP); + } + fillbuf((int)(_pt_len[j])); + if (j != 0) { + j--; + j = (1 << j) + getbits((int)j); + } + return j; +} + +void ArjFile::decode_start() { + _blocksize = 0; + init_getbits(); +} + +void ArjFile::decode() { + int16 i; + int16 j; + int16 c; + int16 r; + int32 count; + + decode_start(); + count = 0; + r = 0; + + while (count < _origsize) { + if ((c = decode_c()) <= ARJ_UCHAR_MAX) { + _text[r] = (byte) c; + count++; + if (++r >= DDICSIZ) { + r = 0; + _outstream->write(_text, DDICSIZ); + } + } else { + j = c - (ARJ_UCHAR_MAX + 1 - THRESHOLD); + count += j; + i = decode_p(); + if ((i = r - i - 1) < 0) + i += DDICSIZ; + if (r > i && r < DDICSIZ - MAXMATCH - 1) { + while (--j >= 0) + _text[r++] = _text[i++]; + } else { + while (--j >= 0) { + _text[r] = _text[i]; + if (++r >= DDICSIZ) { + r = 0; + _outstream->write(_text, DDICSIZ); + } + if (++i >= DDICSIZ) + i = 0; + } + } + } + } + if (r != 0) + _outstream->write(_text, r); +} + +/* Macros */ + +#define BFIL {_getbuf|=_bitbuf>>_getlen;fillbuf(CODE_BIT-_getlen);_getlen=CODE_BIT;} +#define GETBIT(c) {if(_getlen<=0)BFIL c=(_getbuf&0x8000)!=0;_getbuf<<=1;_getlen--;} +#define BPUL(l) {_getbuf<<=l;_getlen-=l;} +#define GETBITS(c,l) {if(_getlen<l)BFIL c=(uint16)_getbuf>>(CODE_BIT-l);BPUL(l)} + +int16 ArjFile::decode_ptr() { + int16 c = 0; + int16 width; + int16 plus; + int16 pwr; + + plus = 0; + pwr = 1 << (STRTP); + for (width = (STRTP); width < (STOPP); width++) { + GETBIT(c); + if (c == 0) + break; + plus += pwr; + pwr <<= 1; + } + if (width != 0) + GETBITS(c, width); + c += plus; + return c; +} + +int16 ArjFile::decode_len() { + int16 c = 0; + int16 width; + int16 plus; + int16 pwr; + + plus = 0; + pwr = 1 << (STRTL); + for (width = (STRTL); width < (STOPL); width++) { + GETBIT(c); + if (c == 0) + break; + plus += pwr; + pwr <<= 1; + } + if (width != 0) + GETBITS(c, width); + c += plus; + return c; +} + +void ArjFile::decode_f() { + int16 i; + int16 j; + int16 c; + int16 r; + int16 pos1; + int32 count; + + init_getbits(); + _getlen = _getbuf = 0; + count = 0; + r = 0; + + while (count < _origsize) { + c = decode_len(); + if (c == 0) { + GETBITS(c, CHAR_BIT); + _text[r] = (byte)c; + count++; + if (++r >= DDICSIZ) { + r = 0; + _outstream->write(_text, DDICSIZ); + } + } else { + j = c - 1 + THRESHOLD; + count += j; + pos1 = decode_ptr(); + if ((i = r - pos1 - 1) < 0) + i += DDICSIZ; + while (j-- > 0) { + _text[r] = _text[i]; + if (++r >= DDICSIZ) { + r = 0; + _outstream->write(_text, DDICSIZ); + } + if (++i >= DDICSIZ) + i = 0; + } + } + } + if (r != 0) + _outstream->write(_text, r); +} + + +} // End of namespace Common diff --git a/common/unarj.h b/common/unarj.h new file mode 100644 index 0000000000..b015999671 --- /dev/null +++ b/common/unarj.h @@ -0,0 +1,185 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef COMMON_UNARJ_H +#define COMMON_UNARJ_H + +#include "common/file.h" +#include "common/hash-str.h" + +namespace Common { + +#define HEADER_ID 0xEA60 +#define HEADER_ID_HI 0xEA +#define HEADER_ID_LO 0x60 +#define FIRST_HDR_SIZE 30 +#define FIRST_HDR_SIZE_V 34 +#define COMMENT_MAX 2048 +#define FNAME_MAX 512 +#define HEADERSIZE_MAX (FIRST_HDR_SIZE + 10 + FNAME_MAX + COMMENT_MAX) +#define CRC_MASK 0xFFFFFFFFL +#define MAXSFX 25000L + +#define CODE_BIT 16 +#define CHAR_BIT 8 +#define ARJ_UCHAR_MAX 255 // UCHAR_MAX is defined in limits.h in MSVC +#define THRESHOLD 3 +#define DDICSIZ 26624 +#define MAXDICBIT 16 +#define MATCHBIT 8 +#define MAXMATCH 256 +#define NC (ARJ_UCHAR_MAX + MAXMATCH + 2 - THRESHOLD) +#define NP (MAXDICBIT + 1) +#define CBIT 9 +#define NT (CODE_BIT + 3) +#define PBIT 5 +#define TBIT 5 + +#if NT > NP +#define NPT NT +#else +#define NPT NP +#endif + +#define CTABLESIZE 4096 +#define PTABLESIZE 256 + +#define STRTP 9 +#define STOPP 13 + +#define STRTL 0 +#define STOPL 7 + +struct ArjHeader { + int32 pos; + uint16 id; + uint16 headerSize; + // + byte firstHdrSize; + byte nbr; + byte xNbr; + byte hostOs; + byte flags; + byte method; + byte fileType; + byte pad; + uint32 timeStamp; + int32 compSize; + int32 origSize; + uint32 fileCRC; + uint16 entryPos; + uint16 fileMode; + uint16 hostData; + char filename[FNAME_MAX]; + char comment[COMMENT_MAX]; + uint16 extHeaderSize; + + uint32 headerCrc; +}; + +typedef HashMap<String, int, IgnoreCase_Hash, IgnoreCase_EqualTo> ArjFilesMap; + +class ArjFile : public File { +public: + ArjFile(); + ~ArjFile(); + + void enableFallback(bool val) { _fallBack = val; } + + void registerArchive(const String &filename); + + bool open(const Common::String &filename, AccessMode mode = kFileReadMode); + void close(); + + uint32 read(void *dataPtr, uint32 dataSize); + bool eos(); + uint32 pos(); + uint32 size(); + void seek(int32 offset, int whence = SEEK_SET); + bool isOpen() { return _isOpen; } + +private: + bool _fallBack; + + File _currArchive; + Array<ArjHeader *> _headers; + ArjFilesMap _fileMap; + StringMap _archMap; + ReadStream *_stream; + byte *_uncompressedData; + byte *_compressedData; + MemoryWriteStream *_outstream; + MemoryReadStream *_compressed; + SeekableReadStream *_uncompressed; + + bool _isOpen; + + int32 findHeader(void); + ArjHeader *readHeader(); + + void decode(); + void decode_f(); + + uint16 _bitbuf; + int32 _compsize; + int32 _origsize; + byte _subbitbuf; + int _bitcount; + + void init_getbits(); + void fillbuf(int n); + uint16 getbits(int n); + + + void make_table(int nchar, byte *bitlen, int tablebits, uint16 *table, int tablesize); + void read_pt_len(int nn, int nbit, int i_special); + void read_c_len(void); + uint16 decode_c(void); + uint16 decode_p(void); + void decode_start(void); + int16 decode_ptr(void); + int16 decode_len(void); + +private: + byte _text[DDICSIZ]; + + int16 _getlen; + int16 _getbuf; + + uint16 _left[2 * NC - 1]; + uint16 _right[2 * NC - 1]; + byte _c_len[NC]; + byte _pt_len[NPT]; + + uint16 _c_table[CTABLESIZE]; + uint16 _pt_table[PTABLESIZE]; + uint16 _blocksize; + + +}; + +} // End of namespace Common + +#endif @@ -1307,7 +1307,7 @@ PLUGIN_PREFIX := PLUGIN_SUFFIX := .dll PLUGIN_EXTRA_DEPS = $(EXECUTABLE) CXXFLAGS += -DDYNAMIC_MODULES -PLUGIN_LDFLAGS := -shared ./libscummvm.a +PLUGIN_LDFLAGS := -Wl,--enable-auto-import -shared ./libscummvm.a PRE_OBJS_FLAGS := -Wl,--whole-archive POST_OBJS_FLAGS := -Wl,--export-all-symbols -Wl,--no-whole-archive -Wl,--out-implib,./libscummvm.a ' diff --git a/dists/msvc7/drascula.vcproj b/dists/msvc7/drascula.vcproj index 8a55a1856b..3bf3cf94ea 100644 --- a/dists/msvc7/drascula.vcproj +++ b/dists/msvc7/drascula.vcproj @@ -112,10 +112,10 @@ RelativePath="..\..\engines\drascula\rooms.cpp"> </File> <File - RelativePath="..\..\engines\drascula\talk.cpp"> + RelativePath="..\..\engines\drascula\staticdata.h"> </File> <File - RelativePath="..\..\engines\drascula\texts.cpp"> + RelativePath="..\..\engines\drascula\talk.cpp"> </File> </Files> <Globals> diff --git a/dists/msvc7/gob.vcproj b/dists/msvc7/gob.vcproj index 9f38585b8e..bb7eac35e0 100644 --- a/dists/msvc7/gob.vcproj +++ b/dists/msvc7/gob.vcproj @@ -346,6 +346,12 @@ RelativePath="..\..\engines\gob\util.h"> </File> <File + RelativePath="..\..\engines\gob\variables.cpp"> + </File> + <File + RelativePath="..\..\engines\gob\variables.h"> + </File> + <File RelativePath="..\..\engines\gob\video.cpp"> </File> <File diff --git a/dists/msvc7/scummvm.vcproj b/dists/msvc7/scummvm.vcproj index aedfbe80f4..89cb1ff697 100644 --- a/dists/msvc7/scummvm.vcproj +++ b/dists/msvc7/scummvm.vcproj @@ -50,6 +50,8 @@ <Tool Name="VCMIDLTool"/> <Tool + Name="VCWebDeploymentTool"/> + <Tool Name="VCPostBuildEventTool"/> <Tool Name="VCPreBuildEventTool"/> @@ -105,6 +107,8 @@ <Tool Name="VCMIDLTool"/> <Tool + Name="VCWebDeploymentTool"/> + <Tool Name="VCPostBuildEventTool"/> <Tool Name="VCPreBuildEventTool"/> @@ -291,6 +295,12 @@ RelativePath="..\..\common\timer.h"> </File> <File + RelativePath="..\..\common\unarj.cpp"> + </File> + <File + RelativePath="..\..\common\unarj.h"> + </File> + <File RelativePath="..\..\common\unzip.cpp"> </File> <File diff --git a/dists/msvc71/drascula.vcproj b/dists/msvc71/drascula.vcproj index 0d27422515..10a7a52185 100644 --- a/dists/msvc71/drascula.vcproj +++ b/dists/msvc71/drascula.vcproj @@ -126,10 +126,10 @@ RelativePath="..\..\engines\drascula\rooms.cpp"> </File> <File - RelativePath="..\..\engines\drascula\talk.cpp"> + RelativePath="..\..\engines\drascula\staticdata.h"> </File> <File - RelativePath="..\..\engines\drascula\texts.cpp"> + RelativePath="..\..\engines\drascula\talk.cpp"> </File> </Files> <Globals> diff --git a/dists/msvc71/gob.vcproj b/dists/msvc71/gob.vcproj index cdd6c4dc75..3d6408cdf5 100644 --- a/dists/msvc71/gob.vcproj +++ b/dists/msvc71/gob.vcproj @@ -360,6 +360,12 @@ RelativePath="..\..\engines\gob\util.h"> </File> <File + RelativePath="..\..\engines\gob\variables.cpp"> + </File> + <File + RelativePath="..\..\engines\gob\variables.h"> + </File> + <File RelativePath="..\..\engines\gob\video.cpp"> </File> <File diff --git a/dists/msvc71/scummvm.vcproj b/dists/msvc71/scummvm.vcproj index 7b7b5b72c8..08102bd9b2 100644 --- a/dists/msvc71/scummvm.vcproj +++ b/dists/msvc71/scummvm.vcproj @@ -50,6 +50,8 @@ <Tool Name="VCMIDLTool"/> <Tool + Name="VCWebDeploymentTool"/> + <Tool Name="VCPostBuildEventTool"/> <Tool Name="VCPreBuildEventTool"/> @@ -111,6 +113,8 @@ <Tool Name="VCMIDLTool"/> <Tool + Name="VCWebDeploymentTool"/> + <Tool Name="VCPostBuildEventTool"/> <Tool Name="VCPreBuildEventTool"/> @@ -305,6 +309,12 @@ RelativePath="..\..\common\timer.h"> </File> <File + RelativePath="..\..\common\unarj.cpp"> + </File> + <File + RelativePath="..\..\common\unarj.h"> + </File> + <File RelativePath="..\..\common\unzip.cpp"> </File> <File diff --git a/dists/msvc8/drascula.vcproj b/dists/msvc8/drascula.vcproj index 7cf6065a4f..830eb8afe1 100644 --- a/dists/msvc8/drascula.vcproj +++ b/dists/msvc8/drascula.vcproj @@ -181,11 +181,11 @@ > </File> <File - RelativePath="..\..\engines\drascula\talk.cpp" + RelativePath="..\..\engines\drascula\staticdata.h" > </File> <File - RelativePath="..\..\engines\drascula\texts.cpp" + RelativePath="..\..\engines\drascula\talk.cpp" > </File> </Files> diff --git a/dists/msvc8/gob.vcproj b/dists/msvc8/gob.vcproj index 62f7756c8a..c178caf8be 100644 --- a/dists/msvc8/gob.vcproj +++ b/dists/msvc8/gob.vcproj @@ -493,6 +493,14 @@ > </File> <File + RelativePath="..\..\engines\gob\variables.cpp" + > + </File> + <File + RelativePath="..\..\engines\gob\variables.h" + > + </File> + <File RelativePath="..\..\engines\gob\video.cpp" > </File> diff --git a/dists/msvc8/scummvm.vcproj b/dists/msvc8/scummvm.vcproj index a5cd6a9169..3dcaf09f83 100644 --- a/dists/msvc8/scummvm.vcproj +++ b/dists/msvc8/scummvm.vcproj @@ -97,6 +97,9 @@ Name="VCAppVerifierTool" /> <Tool + Name="VCWebDeploymentTool" + /> + <Tool Name="VCPostBuildEventTool" /> </Configuration> @@ -186,6 +189,9 @@ Name="VCAppVerifierTool" /> <Tool + Name="VCWebDeploymentTool" + /> + <Tool Name="VCPostBuildEventTool" /> </Configuration> @@ -425,6 +431,14 @@ > </File> <File + RelativePath="..\..\common\unarj.cpp" + > + </File> + <File + RelativePath="..\..\common\unarj.h" + > + </File> + <File RelativePath="..\..\common\unzip.cpp" > </File> diff --git a/dists/msvc9/drascula.vcproj b/dists/msvc9/drascula.vcproj index 9eb8d5af9a..3bcda49e5d 100644 --- a/dists/msvc9/drascula.vcproj +++ b/dists/msvc9/drascula.vcproj @@ -182,11 +182,11 @@ > </File> <File - RelativePath="..\..\engines\drascula\talk.cpp" + RelativePath="..\..\engines\drascula\staticdata.h" > </File> <File - RelativePath="..\..\engines\drascula\texts.cpp" + RelativePath="..\..\engines\drascula\talk.cpp" > </File> </Files> diff --git a/dists/msvc9/gob.vcproj b/dists/msvc9/gob.vcproj index 60cb8ddbc3..e6c55519b0 100644 --- a/dists/msvc9/gob.vcproj +++ b/dists/msvc9/gob.vcproj @@ -494,6 +494,14 @@ > </File> <File + RelativePath="..\..\engines\gob\variables.cpp" + > + </File> + <File + RelativePath="..\..\engines\gob\variables.h" + > + </File> + <File RelativePath="..\..\engines\gob\video.cpp" > </File> diff --git a/dists/msvc9/scummvm.vcproj b/dists/msvc9/scummvm.vcproj index d5904961a7..daf6ae6c99 100644 --- a/dists/msvc9/scummvm.vcproj +++ b/dists/msvc9/scummvm.vcproj @@ -100,6 +100,9 @@ Name="VCAppVerifierTool" /> <Tool + Name="VCWebDeploymentTool" + /> + <Tool Name="VCPostBuildEventTool" /> </Configuration> @@ -191,6 +194,9 @@ Name="VCAppVerifierTool" /> <Tool + Name="VCWebDeploymentTool" + /> + <Tool Name="VCPostBuildEventTool" /> </Configuration> @@ -430,6 +436,14 @@ > </File> <File + RelativePath="..\..\common\unarj.cpp" + > + </File> + <File + RelativePath="..\..\common\unarj.h" + > + </File> + <File RelativePath="..\..\common\unzip.cpp" > </File> diff --git a/engines/cine/anim.cpp b/engines/cine/anim.cpp index 73837308ca..055eb733c3 100644 --- a/engines/cine/anim.cpp +++ b/engines/cine/anim.cpp @@ -730,7 +730,7 @@ void loadResource(const char *resourceName) { } else if (strstr(resourceName, ".SEQ")) { loadSeq(resourceName, -1); return; - } else if (strstr(resourceName, "ECHEC")) { + } else if (strstr(resourceName, "ECHEC")) { // Echec (French) means failure exitEngine = 1; return; } diff --git a/engines/cine/gfx.cpp b/engines/cine/gfx.cpp index e20dd46c53..aa457fe4f9 100644 --- a/engines/cine/gfx.cpp +++ b/engines/cine/gfx.cpp @@ -795,6 +795,14 @@ void FWRenderer::drawInputBox(const char *info, const char *input, int cursor, i /*! \brief Fade to black */ void FWRenderer::fadeToBlack() { + // FIXME: _activeLowPal is invalid when starting Operation Stealth + // Adding this sanity check fixes a crash when the game + // starts, but I'm not sure if this is the best place to check it + if (!_activeLowPal) { + warning("_activeLowPal is invalid"); + return; + } + assert(_activeLowPal); for (int i = 0; i < 8; i++) { diff --git a/engines/cine/object.cpp b/engines/cine/object.cpp index 89d6b99592..7666f05352 100644 --- a/engines/cine/object.cpp +++ b/engines/cine/object.cpp @@ -185,37 +185,37 @@ void addObjectParam(byte objIdx, byte paramIdx, int16 newValue) { } void modifyObjectParam(byte objIdx, byte paramIdx, int16 newValue) { - paramIdx--; - - assert(paramIdx <= 5); + // Operation Stealth checks object index range, Future Wars doesn't. + if (g_cine->getGameType() == Cine::GType_OS && objIdx >= NUM_MAX_OBJECT) + return; switch (paramIdx) { - case 0: + case 1: objectTable[objIdx].x = newValue; break; - case 1: + case 2: objectTable[objIdx].y = newValue; break; - case 2: + case 3: objectTable[objIdx].mask = newValue; + // TODO: Check this part against disassembly if (removeOverlay(objIdx, 0)) { addOverlay(objIdx, 0); } break; - case 3: + case 4: objectTable[objIdx].frame = newValue; break; - case 4: - // is it really in Future Wars? it breaks the newspaper machine - // on the airport in Operation Stealth - if (newValue == -1 && g_cine->getGameType() != Cine::GType_OS) { + case 5: + // TODO: Test if this really breaks the newspaper machine on the airport in Operation Stealth. + if (g_cine->getGameType() == Cine::GType_FW && newValue == -1) { objectTable[objIdx].costume = globalVars[0]; } else { objectTable[objIdx].costume = newValue; } break; - case 5: + case 6: objectTable[objIdx].part = newValue; break; } diff --git a/engines/cine/script.h b/engines/cine/script.h index 23bb179ee5..eeac0e8809 100644 --- a/engines/cine/script.h +++ b/engines/cine/script.h @@ -155,8 +155,8 @@ protected: int o1_getObjectParam(); int o1_addObjectParam(); int o1_subObjectParam(); - int o1_add2ObjectParam(); - int o1_sub2ObjectParam(); + int o1_mulObjectParam(); + int o1_divObjectParam(); int o1_compareObjectParam(); int o1_setupObject(); int o1_checkCollision(); diff --git a/engines/cine/script_fw.cpp b/engines/cine/script_fw.cpp index 4f6749517e..845120c99e 100644 --- a/engines/cine/script_fw.cpp +++ b/engines/cine/script_fw.cpp @@ -49,8 +49,8 @@ const Opcode FWScript::_opcodeTable[] = { { &FWScript::o1_addObjectParam, "bbw" }, { &FWScript::o1_subObjectParam, "bbw" }, /* 04 */ - { &FWScript::o1_add2ObjectParam, "bbw" }, - { &FWScript::o1_sub2ObjectParam, "bbw" }, + { &FWScript::o1_mulObjectParam, "bbw" }, + { &FWScript::o1_divObjectParam, "bbw" }, { &FWScript::o1_compareObjectParam, "bbw" }, { &FWScript::o1_setupObject, "bwwww" }, /* 08 */ @@ -803,23 +803,32 @@ int FWScript::o1_subObjectParam() { return 0; } -/*! \todo Implement this instruction - */ -int FWScript::o1_add2ObjectParam() { - uint16 a = getNextByte(); - uint16 b = getNextByte(); - uint16 c = getNextWord(); - warning("STUB: o1_add2ObjectParam(%x, %x, %x)", a, b, c); +int FWScript::o1_mulObjectParam() { + byte objIdx = getNextByte(); + byte paramIdx = getNextByte(); + int16 newValue = getNextWord(); + + debugC(5, kCineDebugScript, "Line: %d: mulObjectParam(objIdx:%d,paramIdx:%d,newValue:%d)", _line, objIdx, paramIdx, newValue); + + // FIXME? In PC versions of Future Wars and Operation Stealth the multiplication is done unsigned. + // (16b x 16b -> 32b, taking only 16 LSBs). The question is, does it really matter? + int16 currentValue = getObjectParam(objIdx, paramIdx); + modifyObjectParam(objIdx, paramIdx, currentValue * newValue); return 0; } -/*! \todo Implement this instruction - */ -int FWScript::o1_sub2ObjectParam() { - uint16 a = getNextByte(); - uint16 b = getNextByte(); - uint16 c = getNextWord(); - warning("STUB: o1_sub2ObjectParam(%x, %x, %x)", a, b, c); +int FWScript::o1_divObjectParam() { + byte objIdx = getNextByte(); + byte paramIdx = getNextByte(); + int16 newValue = getNextWord(); + + debugC(5, kCineDebugScript, "Line: %d: divObjectParam(objIdx:%d,paramIdx:%d,newValue:%d)", _line, objIdx, paramIdx, newValue); + + // In PC versions of Future Wars and Operation Stealth the division is done signed. + // Dividend is first sign extended from 16 bits to 32 bits and then divided by the + // 16 bit divider using signed division. Only 16 LSBs of the quotient are saved. + int16 currentValue = getObjectParam(objIdx, paramIdx); + modifyObjectParam(objIdx, paramIdx, currentValue / newValue); return 0; } @@ -1600,7 +1609,8 @@ int FWScript::o1_stopSample() { return 0; } -/*! \todo Implement this instruction +/*! \todo Implement this instruction's Amiga part (PC part already done) + * In PC versions of Future Wars and Operation Stealth this instruction does nothing else but read the parameters. */ int FWScript::o1_op71() { byte a = getNextByte(); @@ -1609,7 +1619,8 @@ int FWScript::o1_op71() { return 0; } -/*! \todo Implement this instruction +/*! \todo Implement this instruction's Amiga part (PC part already done) + * In PC versions of Future Wars and Operation Stealth this instruction does nothing else but read the parameters. */ int FWScript::o1_op72() { uint16 a = getNextWord(); @@ -1619,7 +1630,8 @@ int FWScript::o1_op72() { return 0; } -/*! \todo Implement this instruction +/*! \todo Implement this instruction's Amiga part (PC part already done) + * In PC versions of Future Wars and Operation Stealth this instruction does nothing else but read the parameters. */ int FWScript::o1_op73() { // I believe this opcode is identical to o1_op72(). In fact, Operation @@ -1627,7 +1639,7 @@ int FWScript::o1_op73() { uint16 a = getNextWord(); byte b = getNextByte(); uint16 c = getNextWord(); - warning("STUB: o1_op72(%x, %x, %x)", a, b, c); + warning("STUB: o1_op73(%x, %x, %x)", a, b, c); return 0; } diff --git a/engines/cine/script_os.cpp b/engines/cine/script_os.cpp index 7c88e3ffe3..319fca5d3c 100644 --- a/engines/cine/script_os.cpp +++ b/engines/cine/script_os.cpp @@ -45,8 +45,8 @@ const Opcode OSScript::_opcodeTable[] = { { &FWScript::o1_addObjectParam, "bbw" }, { &FWScript::o1_subObjectParam, "bbw" }, /* 04 */ - { &FWScript::o1_add2ObjectParam, "bbw" }, - { &FWScript::o1_sub2ObjectParam, "bbw" }, + { &FWScript::o1_mulObjectParam, "bbw" }, + { &FWScript::o1_divObjectParam, "bbw" }, { &FWScript::o1_compareObjectParam, "bbw" }, { &FWScript::o1_setupObject, "bwwww" }, /* 08 */ diff --git a/engines/drascula/animation.cpp b/engines/drascula/animation.cpp index a2cd43eac2..018b6e2a04 100644 --- a/engines/drascula/animation.cpp +++ b/engines/drascula/animation.cpp @@ -27,123 +27,139 @@ namespace Drascula { -static const int interf_x[] ={ 1, 65, 129, 193, 1, 65, 129 }; -static const int interf_y[] ={ 51, 51, 51, 51, 83, 83, 83 }; +void DrasculaEngine::updateAnim(int y, int destX, int destY, int width, int height, int count, byte* src, int delayVal) { + int x = 0; + + for (int n = 0; n < count; n++){ + x++; + copyBackground(x, y, destX, destY, width, height, src, screenSurface); + updateScreen(destX, destY, destX, destY, width, height, screenSurface); + x += width; + pause(delayVal); + } +} + +void DrasculaEngine::updateAnim2(int y, int px, int py, int width, int height, int count, byte* src) { + int x = 0; + + for (int n = 0; n < count; n++) { + x++; + copyBackground(px, py, px, py, width, height, drawSurface1, screenSurface); + copyRect(x, y, px, py, width, height, src, screenSurface); + updateScreen(px, py, px, py, width, height, screenSurface); + x = x + width; + pause(3); + } +} void DrasculaEngine::animation_1_1() { int l, l2, p; - int pos_pixel[6]; + int pixelPos[6]; while (term_int == 0) { playMusic(29); fliplay("logoddm.bin", 9); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; delay(600); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; clearRoom(); delay(340); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; playMusic(26); delay(500); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; fliplay("logoalc.bin", 8); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; clearRoom(); - loadPic("cielo.alg"); - decompressPic(dir_zona_pantalla, 256); + loadPic("cielo.alg", screenSurface, COMPLETE_PAL); black(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - FundeDelNegro(2); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + updateScreen(); + fadeFromBlack(2); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; delay(900); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - color_abc(RED); - centra_texto(_textmisc[_lang][1], 160, 100); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + color_abc(kColorRed); + centerText(_textmisc[_lang][1], 160, 100); + updateScreen(); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; delay(1000); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; delay(1200); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; fliplay("scrollb.bin", 9); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; clearRoom(); - playSound("s5.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + playSound(5); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - if (anima("scr2.bin", 17)) + if (animate("scr2.bin", 17)) break; - stopSound_corte(); - if (anima("scr3.bin", 17)) + stopSound(); + if (animate("scr3.bin", 17)) break; - loadPic("cielo2.alg"); - decompressPic(dir_zona_pantalla, 256); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + loadPic("cielo2.alg", screenSurface, COMPLETE_PAL); + updateScreen(); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - FundeAlNegro(1); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + fadeToBlack(1); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; clearRoom(); - loadPic("96.alg"); - decompressPic(dir_hare_frente, COMPLETE_PAL); - loadPic("103.alg"); - decompressPic(dir_dibujo1, HALF_PAL); - loadPic("104.alg"); - decompressPic(dir_dibujo3, 1); - loadPic("aux104.alg"); - decompressPic(dir_dibujo2, 1); + loadPic("96.alg", frontSurface, COMPLETE_PAL); + loadPic("103.alg", drawSurface1, HALF_PAL); + loadPic("104.alg", drawSurface3, 1); + loadPic("aux104.alg", drawSurface2, 1); playMusic(4); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; delay(400); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; for (l2 = 0; l2 < 3; l2++) for (l = 0; l < 7; l++) { - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - copyBackground(interf_x[l], interf_y[l], 156, 45, 63, 31, dir_dibujo2, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - if (getscan() == Common::KEYCODE_ESCAPE) { + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + copyBackground(interf_x[l], interf_y[l], 156, 45, 63, 31, drawSurface2, screenSurface); + updateScreen(); + if (getScan() == Common::KEYCODE_ESCAPE) { term_int = 1; break; } pause(3); } - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; l2 = 0; p = 0; - pos_pixel[3] = 45; - pos_pixel[4] = 63; - pos_pixel[5] = 31; + pixelPos[3] = 45; + pixelPos[4] = 63; + pixelPos[5] = 31; for (l = 0; l < 180; l++) { - copyBackground(0, 0, 320 - l, 0, l, 200, dir_dibujo3, dir_zona_pantalla); - copyBackground(l, 0, 0, 0, 320 - l, 200, dir_dibujo1, dir_zona_pantalla); + copyBackground(0, 0, 320 - l, 0, l, 200, drawSurface3, screenSurface); + copyBackground(l, 0, 0, 0, 320 - l, 200, drawSurface1, screenSurface); - pos_pixel[0] = interf_x[l2]; - pos_pixel[1] = interf_y[l2]; - pos_pixel[2] = 156 - l; + pixelPos[0] = interf_x[l2]; + pixelPos[1] = interf_y[l2]; + pixelPos[2] = 156 - l; - copyRectClip(pos_pixel, dir_dibujo2, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyRectClip(pixelPos, drawSurface2, screenSurface); + updateScreen(); p++; if (p == 6) { p = 0; @@ -151,216 +167,207 @@ void DrasculaEngine::animation_1_1() { } if (l2 == 7) l2 = 0; - if (getscan() == Common::KEYCODE_ESCAPE) { + if (getScan() == Common::KEYCODE_ESCAPE) { term_int = 1; break; } } - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - copyBackground(0, 0, 0, 0, 320, 200, dir_zona_pantalla, dir_dibujo1); + copyBackground(0, 0, 0, 0, 320, 200, screenSurface, drawSurface1); - talk_dr_grande(_textd[_lang][1], "D1.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + talk_dr_grande(1); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; clearRoom(); - loadPic("100.alg"); - decompressPic(dir_dibujo1, HALF_PAL); - loadPic("auxigor.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("auxdr.alg"); - decompressPic(dir_hare_fondo, 1); + loadPic("100.alg", drawSurface1, HALF_PAL); + loadPic("auxigor.alg", frontSurface, 1); + loadPic("auxdr.alg", backSurface, 1); sentido_dr = 0; x_dr = 129; y_dr = 95; sentido_igor = 1; - x_igor = 66; - y_igor = 97; + igorX = 66; + igorY = 97; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - pon_igor(); - pon_dr(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - talk_igor_dch(_texti[_lang][8], "I8.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + placeIgor(); + placeDrascula(); + updateScreen(); + talk_igor(8, kIgorDch); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - pon_igor(); - pon_dr(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - talk_dr_izq(_textd[_lang][2], "d2.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + placeIgor(); + placeDrascula(); + updateScreen(); + talk_drascula(2); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - talk_dr_izq(_textd[_lang][3], "d3.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + talk_drascula(3); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - if (anima("lib.bin", 16)) + if (animate("lib.bin", 16)) break; - if (anima("lib2.bin", 16)) + if (animate("lib2.bin", 16)) break; clearRoom(); - color_solo = RED; - loadPic("plan1.alg"); - decompressPic(dir_zona_pantalla, HALF_PAL); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + color_solo = kColorRed; + loadPic("plan1.alg", screenSurface, HALF_PAL); + updateScreen(); pause(10); talk_solo(_textd[_lang][4],"d4.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - loadPic("plan1.alg"); - decompressPic(dir_zona_pantalla, HALF_PAL); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + loadPic("plan1.alg", screenSurface, HALF_PAL); + updateScreen(); talk_solo(_textd[_lang][5], "d5.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - if (anima("lib2.bin", 16)) + if (animate("lib2.bin", 16)) break; clearRoom(); - loadPic("plan2.alg"); - decompressPic(dir_zona_pantalla, HALF_PAL); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + loadPic("plan2.alg", screenSurface, HALF_PAL); + updateScreen(); pause(20); talk_solo(_textd[_lang][6], "d6.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - if (anima("lib2.bin", 16)) + if (animate("lib2.bin", 16)) break; clearRoom(); - loadPic("plan3.alg"); - decompressPic(dir_zona_pantalla, HALF_PAL); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + loadPic("plan3.alg", screenSurface, HALF_PAL); + updateScreen(); pause(20); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; talk_solo(_textd[_lang][7], "d7.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - loadPic("plan3.alg"); - decompressPic(dir_zona_pantalla, HALF_PAL); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + loadPic("plan3.alg", screenSurface, HALF_PAL); + updateScreen(); talk_solo(_textd[_lang][8], "d8.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; clearRoom(); - loadPic("100.alg"); - decompressPic(dir_dibujo1, HALF_PAL); + loadPic("100.alg", drawSurface1, HALF_PAL); MusicFadeout(); stopMusic(); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - talk_igor_dch(_texti[_lang][9], "I9.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + talk_igor(9, kIgorDch); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - talk_dr_izq(_textd[_lang][9], "d9.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + talk_drascula(9); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - talk_igor_dch(_texti[_lang][10], "I10.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + talk_igor(10, kIgorDch); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; playMusic(11); - talk_dr_izq(_textd[_lang][10], "d10.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + talk_drascula(10); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - if (anima("rayo1.bin", 16)) + if (animate("rayo1.bin", 16)) break; - playSound("s5.als"); - if (anima("rayo2.bin", 15)) + playSound(5); + if (animate("rayo2.bin", 15)) break; - if (anima("frel2.bin", 16)) + if (animate("frel2.bin", 16)) break; - if (anima("frel.bin", 16)) + if (animate("frel.bin", 16)) break; - if (anima("frel.bin", 16)) + if (animate("frel.bin", 16)) break; - stopSound_corte(); + stopSound(); clearRoom(); black(); playMusic(23); - FundeDelNegro(0); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + fadeFromBlack(0); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; sentido_dr = 1; - talk_igor_dch(_texti[_lang][1], "I1.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + talk_igor(1, kIgorDch); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - talk_dr_dch(_textd[_lang][11], "d11.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + talk_drascula(11, 1); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; sentido_dr = 3; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - pon_igor(); - pon_dr(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + placeIgor(); + placeDrascula(); + updateScreen(); pause(1); sentido_dr = 0; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - pon_igor(); - pon_dr(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - talk_dr_izq(_textd[_lang][12], "d12.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + placeIgor(); + placeDrascula(); + updateScreen(); + talk_drascula(12); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; sentido_dr = 3; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - pon_igor(); - pon_dr(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + placeIgor(); + placeDrascula(); + updateScreen(); pause(1); sentido_dr = 1; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - pon_igor(); - pon_dr(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - talk_igor_dch(_texti[_lang][2], "I2.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + placeIgor(); + placeDrascula(); + updateScreen(); + talk_igor(2, kIgorDch); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; pause(13); - talk_dr_dch(_textd[_lang][13],"d13.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + talk_drascula(13, 1); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; sentido_dr = 3; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - pon_igor(); - pon_dr(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + placeIgor(); + placeDrascula(); + updateScreen(); pause(1); sentido_dr = 0; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - pon_igor(); - pon_dr(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - talk_dr_izq(_textd[_lang][14], "d14.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + placeIgor(); + placeDrascula(); + updateScreen(); + talk_drascula(14); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - talk_igor_dch(_texti[_lang][3], "I3.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + talk_igor(3, kIgorDch); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - talk_dr_izq(_textd[_lang][15], "d15.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + talk_drascula(15); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - talk_igor_dch(_texti[_lang][4], "I4.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + talk_igor(4, kIgorDch); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - talk_dr_izq(_textd[_lang][16], "d16.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + talk_drascula(16); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - talk_igor_dch(_texti[_lang][5], "I5.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + talk_igor(5, kIgorDch); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; sentido_igor = 3; - talk_dr_izq(_textd[_lang][17], "d17.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + talk_drascula(17); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; pause(18); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - talk_igor_frente(_texti[_lang][6], "I6.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + talk_igor(6, kIgorFront); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - FundeAlNegro(0); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + fadeToBlack(0); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; clearRoom(); @@ -370,67 +377,8 @@ void DrasculaEngine::animation_1_1() { term_int = 1; } clearRoom(); - loadPic("96.alg"); - decompressPic(dir_hare_frente, COMPLETE_PAL); - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); -} - -void DrasculaEngine::talk_dr_grande(const char *said, const char *filename) { - int x_talk[4] = {47, 93, 139, 185}; - int cara; - int l = 0; - int length = strlen(said); - - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - color_abc(RED); - - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); - } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); - } - -bucless: - - cara = _rnd->getRandomNumber(3); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - copyBackground(interf_x[l] + 24, interf_y[l], 0, 45, 39, 31, dir_dibujo2, dir_zona_pantalla); - copyBackground(x_talk[cara], 1, 171, 68, 45, 48, dir_dibujo2, dir_zona_pantalla); - l++; - if (l == 7) - l = 0; - - if (withVoices == 0) - centra_texto(said, 191, 69); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - pause(3); - - byte key = getscan(); - if (key == Common::KEYCODE_ESCAPE) - term_int = 1; - - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } + loadPic("96.alg", frontSurface, COMPLETE_PAL); + loadPic("99.alg", backSurface, 1); } void DrasculaEngine::animation_2_1() { @@ -442,79 +390,74 @@ void DrasculaEngine::animation_2_1() { term_int = 0; for (;;) { - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - if (anima("ag.bin", 14)) + if (animate("ag.bin", 14)) break; if (_lang == kSpanish) - dir_texto = dir_hare_frente; + textSurface = frontSurface; - loadPic("an11y13.alg"); - decompressPic(dir_hare_dch, 1); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + loadPic("an11y13.alg", extraSurface, 1); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - talk_tabernero(_textt[_lang][22], "T22.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + talk_bartender(22); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; if (_lang == kSpanish) - dir_texto = dir_hare_dch; + textSurface = extraSurface; - loadPic("97.alg"); - decompressPic(dir_hare_dch, 1); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + loadPic("97.alg", extraSurface, 1); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; pause(4); - playSound("s1.als"); - hipo(18); - stopSound(); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + playSound(1); + hiccup(18); + finishSound(); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; clearRoom(); stopMusic(); - corta_musica = 1; - memset(dir_zona_pantalla, 0, 64000); - color_solo = WHITE; + musicStopped = 1; + memset(screenSurface, 0, 64000); + color_solo = kColorWhite; pause(80); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; talk_solo(_textbj[_lang][1], "BJ1.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; clearRoom(); - loadPic("bj.alg"); - decompressPic(dir_zona_pantalla, HALF_PAL); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + loadPic("bj.alg", screenSurface, HALF_PAL); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; black(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - FundeDelNegro(1); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + updateScreen(); + fadeFromBlack(1); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - color_solo = YELLOW; + color_solo = kColorYellow; talk_solo(_text[_lang][214], "214.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; clearRoom(); - loadPic("16.alg"); - decompressPic(dir_dibujo1, HALF_PAL); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + loadPic("16.alg", drawSurface1, HALF_PAL); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - loadPic("auxbj.alg"); - decompressPic(dir_dibujo3, 1); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + loadPic("auxbj.alg", drawSurface3, 1); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; roomNumber = 16; - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; for (l = 0; l < 200; l++) factor_red[l] = 99; @@ -525,19 +468,18 @@ void DrasculaEngine::animation_2_1() { hare_y = 95; sentido_hare = 1; hare_se_ve = 1; - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - loadPic("97g.alg"); - decompressPic(dir_hare_dch, 1); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + loadPic("97g.alg", extraSurface, 1); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - if (anima("lev.bin", 15)) + if (animate("lev.bin", 15)) break; lleva_al_hare(100 + ancho_hare / 2, 99 + alto_hare); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; sentido_hare = 1; hare_x = 100; @@ -560,60 +502,57 @@ void DrasculaEngine::animation_2_1() { talk(221); talk_bj(10); talk(222); - if (anima("gaf.bin", 15)) + if (animate("gaf.bin", 15)) break; - if (anima("bjb.bin", 14)) + if (animate("bjb.bin", 14)) break; playMusic(9); - loadPic("97.alg"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) - break; - decompressPic(dir_hare_dch, 1); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + loadPic("97.alg", extraSurface, 1); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + updateScreen(); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; pause(120); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; talk_solo(_text[_lang][223], "223.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - color_solo = WHITE; + color_solo = kColorWhite; updateRoom(); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); pause(110); talk_solo(_textbj[_lang][11], "BJ11.als"); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; updateRoom(); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + updateScreen(); + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; pause(118); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; lleva_al_hare(132, 97 + alto_hare); pause(60); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; talk(224); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; talk_bj(12); lleva_al_hare(157, 98 + alto_hare); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; - if (anima("bes.bin", 16)) + if (animate("bes.bin", 16)) break; playMusic(11); - if (anima("rap.bin", 16)) + if (animate("rap.bin", 16)) break; sentido_hare = 3; // The room number was originally changed here to "no_bj.alg", @@ -625,111 +564,107 @@ void DrasculaEngine::animation_2_1() { // Also check animation_9_6(), where the same hack was used by // the original roomNumber = -1; - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; pause(8); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); talk(225); pause(76); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; sentido_hare = 1; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); talk(226); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); pause(30); - if ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)) + if ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)) break; talk(227); - FundeAlNegro(0); + fadeToBlack(0); break; } } void DrasculaEngine::animation_3_1() { if (_lang == kSpanish) - dir_texto = dir_hare_frente; - - loadPic("an11y13.alg"); - decompressPic(dir_hare_dch, 1); - - talk(_text[_lang][192], "192.als"); - talk_tabernero(_textt[_lang][1], "t1.als"); - talk(_text[_lang][193], "193.als"); - talk_tabernero(_textt[_lang][2], "t2.als"); - talk(_text[_lang][194], "194.als"); - talk_tabernero(_textt[_lang][3], "t3.als"); - talk(_text[_lang][195], "195.als"); - talk_tabernero(_textt[_lang][4], "t4.als"); - talk(_text[_lang][196], "196.als"); - talk_tabernero(_textt[_lang][5], "t5.als"); - talk_tabernero(_textt[_lang][6], "t6.als"); - talk(_text[_lang][197], "197.als"); - talk_tabernero(_textt[_lang][7], "t7.als"); - talk(_text[_lang][198], "198.als"); - talk_tabernero(_textt[_lang][8], "t8.als"); - talk(_text[_lang][199], "199.als"); - talk_tabernero(_textt[_lang][9], "t9.als"); - talk(_text[_lang][200], "200.als"); - talk(_text[_lang][201], "201.als"); - talk(_text[_lang][202], "202.als"); + textSurface = frontSurface; + + loadPic("an11y13.alg", extraSurface, 1); + + talk(192); + talk_bartender(1); + talk(193); + talk_bartender(2); + talk(194); + talk_bartender(3); + talk(195); + talk_bartender(4); + talk(196); + talk_bartender(5); + talk_bartender(6); + talk(197); + talk_bartender(7); + talk(198); + talk_bartender(8); + talk(199); + talk_bartender(9); + talk(200); + talk(201); + talk(202); flags[0] = 1; if (_lang == kSpanish) - dir_texto = dir_hare_dch; + textSurface = extraSurface; - loadPic("97.alg"); - decompressPic(dir_hare_dch, 1); + loadPic("97.alg", extraSurface, 1); } void DrasculaEngine::animation_4_1() { if (_lang == kSpanish) - dir_texto = dir_hare_frente; + textSurface = frontSurface; - loadPic("an12.alg"); - decompressPic(dir_hare_dch, 1); + loadPic("an12.alg", extraSurface, 1); - talk(_text[_lang][205],"205.als"); + talk(205); updateRefresh_pre(); - copyBackground(1, 139, 228, 112, 47, 60, dir_hare_dch, dir_zona_pantalla); - updateScreen(228,112, 228,112, 47,60, dir_zona_pantalla); + copyBackground(1, 139, 228, 112, 47, 60, extraSurface, screenSurface); + updateScreen(228,112, 228,112, 47,60, screenSurface); pause(3); updateRefresh_pre(); - copyBackground(49, 139, 228, 112, 47, 60, dir_hare_dch, dir_zona_pantalla); + copyBackground(49, 139, 228, 112, 47, 60, extraSurface, screenSurface); pon_hare(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); pause(3); stopMusic(); flags[11] = 1; - talk_pianista(_textp[_lang][1], "p1.als"); - talk(_text[_lang][206], "206.als"); - talk_pianista(_textp[_lang][2], "p2.als"); - talk(_text[_lang][207], "207.als"); - talk_pianista(_textp[_lang][3], "p3.als"); - talk(_text[_lang][208], "208.als"); - talk_pianista(_textp[_lang][4], "p4.als"); - talk(_text[_lang][209], "209.als"); + talk_pianist(1); + talk(206); + talk_pianist(2); + talk(207); + talk_pianist(3); + talk(208); + talk_pianist(4); + talk(209); if (_lang == kSpanish) - dir_texto = dir_hare_dch; + textSurface = extraSurface; flags[11] = 0; - loadPic("97.alg"); - decompressPic(dir_hare_dch, 1); + loadPic("97.alg", extraSurface, 1); } void DrasculaEngine::animation_1_2() { @@ -738,89 +673,38 @@ void DrasculaEngine::animation_1_2() { } void DrasculaEngine::animation_2_2() { - int n, x=0; - sentido_hare = 0; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); pon_hare(); updateRefresh(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - loadPic("an2_1.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("an2_2.alg"); - decompressPic(dir_hare_dch, 1); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - copyBackground(1, 1, 201, 87, 50, 52, dir_hare_frente, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - for (n = 0; n < 6; n++) { - x++; - copyBackground(x, 1, 201, 87, 50, 52, dir_hare_frente, dir_zona_pantalla); - updateScreen(201,87, 201,87, 50,52, dir_zona_pantalla); - x = x + 50; - pause(3); - } - - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(x, 55, 201, 87, 50, 52, dir_hare_frente, dir_zona_pantalla); - updateScreen(201, 87, 201, 87, 50, 52, dir_zona_pantalla); - x = x + 50; - pause(3); - } - - x = 0; + updateScreen(); + loadPic("an2_1.alg", frontSurface, 1); + loadPic("an2_2.alg", extraSurface, 1); - for (n = 0; n < 6; n++){ - x++; - copyBackground(x, 109, 201, 87, 50, 52, dir_hare_frente, dir_zona_pantalla); - updateScreen(201, 87, 201, 87, 50, 52, dir_zona_pantalla); - x = x + 50; - pause(3); - } - - x = 0; - playSound("s2.als"); - - for (n = 0; n < 6; n++) { - x++; - copyBackground(x, 1, 201, 87, 50, 52, dir_hare_dch, dir_zona_pantalla); - updateScreen(201,87, 201,87, 50,52, dir_zona_pantalla); - x = x + 50; - pause(3); - } + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + copyBackground(1, 1, 201, 87, 50, 52, frontSurface, screenSurface); + updateScreen(); - x = 0; + updateAnim(1, 201, 87, 50, 52, 6, frontSurface); + updateAnim(55, 201, 87, 50, 52, 6, frontSurface); + updateAnim(109, 201, 87, 50, 52, 6, frontSurface); - for (n = 0; n < 6; n++) { - x++; - copyBackground(x, 55, 201, 87, 50, 52, dir_hare_dch, dir_zona_pantalla); - updateScreen(201, 87, 201, 87, 50, 52, dir_zona_pantalla); - x = x + 50; - pause(3); - } - x = 0; + playSound(2); - for (n = 0; n < 2; n++) { - x++; - copyBackground(x, 109, 201, 87, 50, 52, dir_hare_dch, dir_zona_pantalla); - updateScreen(201, 87, 201, 87, 50, 52, dir_zona_pantalla); - x = x + 50; - pause(3); - } + updateAnim(1, 201, 87, 50, 52, 6, extraSurface); + updateAnim(55, 201, 87, 50, 52, 6, extraSurface); + updateAnim(109, 201, 87, 50, 52, 2, extraSurface); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + updateScreen(); - stopSound(); + finishSound(); pause (4); - playSound("s1.als"); + playSound(1); hipo_sin_nadie(12); - stopSound(); + finishSound(); } void DrasculaEngine::animation_3_2() { @@ -834,114 +718,102 @@ void DrasculaEngine::animation_4_2() { flags[9] = 1; pause(12); - talk(_textd[_lang][56], "d56.als"); + talk(56); pause(8); clearRoom(); - loadPic("ciego1.alg"); - decompressPic(dir_dibujo1, HALF_PAL); - loadPic("ciego2.alg"); - decompressPic(dir_dibujo3, 1); - loadPic("ciego3.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("ciego4.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("ciego5.alg"); - decompressPic(dir_hare_frente, 1); + loadPic("ciego1.alg", drawSurface1, HALF_PAL); // ciego = blind + loadPic("ciego2.alg", drawSurface3, 1); + loadPic("ciego3.alg", extraSurface, 1); + loadPic("ciego4.alg", backSurface, 1); + loadPic("ciego5.alg", frontSurface, 1); if (_lang == kSpanish) - dir_texto = dir_hare_frente; + textSurface = frontSurface; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + updateScreen(); pause(10); - talk_ciego(_textd[_lang][68], "d68.als", _textd1[_lang][68 - TEXTD_START]); + talk_blind(1); pause(5); talk_hacker(_textd[_lang][57], "d57.als"); pause(6); - talk_ciego(_textd[_lang][69],"d69.als", _textd1[_lang][69 - TEXTD_START]); + talk_blind(2); pause(4); talk_hacker(_textd[_lang][58],"d58.als"); - talk_ciego(_textd[_lang][70],"d70.als", _textd1[_lang][70 - TEXTD_START]); + talk_blind(3); delay(14); talk_hacker(_textd[_lang][59],"d59.als"); - talk_ciego(_textd[_lang][71],"d71.als", _textd1[_lang][71 - TEXTD_START]); + talk_blind(4); talk_hacker(_textd[_lang][60],"d60.als"); - talk_ciego(_textd[_lang][72],"d72.als", _textd1[_lang][72 - TEXTD_START]); + talk_blind(5); talk_hacker(_textd[_lang][61],"d61.als"); - talk_ciego(_textd[_lang][73],"d73.als", _textd1[_lang][73 - TEXTD_START]); + talk_blind(6); talk_hacker(_textd[_lang][62],"d62.als"); - talk_ciego(_textd[_lang][74],"d74.als", _textd1[_lang][74 - TEXTD_START]); + talk_blind(7); talk_hacker(_textd[_lang][63],"d63.als"); - talk_ciego(_textd[_lang][75],"d75.als", _textd1[_lang][75 - TEXTD_START]); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + talk_blind(8); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + updateScreen(); _system->delayMillis(1000); talk_hacker(_textd[_lang][64], "d64.als"); - talk_ciego(_textd[_lang][76], "d76.als", _textd1[_lang][76 - TEXTD_START]); + talk_blind(9); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + updateScreen(); pause(14); clearRoom(); playMusic(roomMusic); - loadPic("9.alg"); - decompressPic(dir_dibujo1, HALF_PAL); - loadPic("aux9.alg"); - decompressPic(dir_dibujo3, 1); - loadPic("96.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("97.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); + loadPic("9.alg", drawSurface1, HALF_PAL); + loadPic("aux9.alg", drawSurface3, 1); + loadPic("96.alg", frontSurface, 1); + loadPic("97.alg", extraSurface, 1); + loadPic("99.alg", backSurface, 1); withoutVerb(); if (_lang == kSpanish) - dir_texto = dir_hare_dch; + textSurface = extraSurface; flags[9] = 0; flags[4] = 1; } void DrasculaEngine::animation_8_2() { - talk_pianista(_textp[_lang][6], "P6.als"); - talk(_text[_lang][358], "358.als"); - talk_pianista(_textp[_lang][7], "P7.als"); - talk_pianista(_textp[_lang][8], "P8.als"); + talk_pianist(6); + talk(358); + talk_pianist(7); + talk_pianist(8); } void DrasculaEngine::animation_9_2() { - talk_pianista(_textp[_lang][9], "P9.als"); - talk_pianista(_textp[_lang][10], "P10.als"); - talk_pianista(_textp[_lang][11], "P11.als"); + talk_pianist(9); + talk_pianist(10); + talk_pianist(11); } void DrasculaEngine::animation_10_2() { - talk_pianista(_textp[_lang][12], "P12.als"); - talk(_text[_lang][361], "361.als"); + talk_pianist(12); + talk(361); pause(40); - talk_pianista(_textp[_lang][13], "P13.als"); - talk(_text[_lang][362], "362.als"); - talk_pianista(_textp[_lang][14], "P14.als"); - talk(_text[_lang][363], "363.als"); - talk_pianista(_textp[_lang][15], "P15.als"); - talk(_text[_lang][364], "364.als"); - talk_pianista(_textp[_lang][16], "P16.als"); + talk_pianist(13); + talk(362); + talk_pianist(14); + talk(363); + talk_pianist(15); + talk(364); + talk_pianist(16); } void DrasculaEngine::animation_14_2() { int n, pos_cabina[6]; int l = 0; - loadPic("an14_2.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("an14_1.alg"); + loadPic("an14_2.alg", backSurface, 1); pos_cabina[0] = 150; pos_cabina[1] = 6; @@ -951,43 +823,42 @@ void DrasculaEngine::animation_14_2() { pos_cabina[5] = 161; for (n = -160; n <= 0; n = n + 5 + l) { - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); updateRefresh_pre(); pon_hare(); pon_vb(); pos_cabina[3] = n; - copyRectClip(pos_cabina, dir_hare_fondo, dir_zona_pantalla); + copyRectClip(pos_cabina, backSurface, screenSurface); updateRefresh(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); l = l + 1; } flags[24] = 1; - decompressPic(dir_dibujo1, 1); + decompressPic(drawSurface1, 1); - playSound("s7.als"); - hipo(15); + playSound(7); + hiccup(15); - stopSound(); + finishSound(); - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); + loadPic("99.alg", backSurface, 1); } void DrasculaEngine::animation_15_2() { - talk_borracho(_textb[_lang][8], "B8.als"); + talk_drunk(8); pause(7); - talk_borracho(_textb[_lang][9], "B9.als"); - talk_borracho(_textb[_lang][10], "B10.als"); - talk_borracho(_textb[_lang][11], "B11.als"); + talk_drunk(9); + talk_drunk(10); + talk_drunk(11); } void DrasculaEngine::animation_16_2() { int l; - talk_borracho(_textb[_lang][12], "B12.als"); - talk(_text[_lang][371], "371.als"); + talk_drunk(12); + talk(371); clearRoom(); @@ -996,30 +867,29 @@ void DrasculaEngine::animation_16_2() { else playMusic(32); - int key = getscan(); + int key = getScan(); if (key != 0) goto asco; if (_lang != kSpanish) - color_abc(DARK_GREEN); + color_abc(kColorDarkGreen); - loadPic("his1.alg"); - decompressPic(dir_dibujo1, HALF_PAL); + loadPic("his1.alg", drawSurface1, HALF_PAL); if (_lang == kSpanish) black(); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); if (_lang != kSpanish) - centra_texto(_texthis[_lang][1], 180, 180); + centerText(_texthis[_lang][1], 180, 180); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); if (_lang == kSpanish) - FundeDelNegro(1); + fadeFromBlack(1); - key = getscan(); + key = getScan(); if (key != 0) goto asco; @@ -1028,25 +898,24 @@ void DrasculaEngine::animation_16_2() { else _system->delayMillis(4000); - key = getscan(); + key = getScan(); if (key != 0) goto asco; - FundeAlNegro(1); - key = getscan(); + fadeToBlack(1); + key = getScan(); if (key != 0) goto asco; clearRoom(); - loadPic("his2.alg"); - decompressPic(dir_dibujo1, HALF_PAL); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + loadPic("his2.alg", drawSurface1, HALF_PAL); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); if (_lang != kSpanish) - centra_texto(_texthis[_lang][2], 180, 180); + centerText(_texthis[_lang][2], 180, 180); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - key = getscan(); + updateScreen(); + key = getScan(); if (key != 0) goto asco; @@ -1055,25 +924,24 @@ void DrasculaEngine::animation_16_2() { else _system->delayMillis(4000); - key = getscan(); + key = getScan(); if (key != 0) goto asco; - FundeAlNegro(1); - key = getscan(); + fadeToBlack(1); + key = getScan(); if (key != 0) goto asco; clearRoom(); - loadPic("his3.alg"); - decompressPic(dir_dibujo1, HALF_PAL); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + loadPic("his3.alg", drawSurface1, HALF_PAL); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); if (_lang != kSpanish) - centra_texto(_texthis[_lang][3], 180, 180); + centerText(_texthis[_lang][3], 180, 180); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - key = getscan(); + updateScreen(); + key = getScan(); if (key != 0) goto asco; @@ -1082,25 +950,23 @@ void DrasculaEngine::animation_16_2() { else _system->delayMillis(4000); - key = getscan(); + key = getScan(); if (key != 0) goto asco; - FundeAlNegro(1); + fadeToBlack(1); clearRoom(); - loadPic("his4_1.alg"); - decompressPic(dir_dibujo1, HALF_PAL); - loadPic("his4_2.alg"); - decompressPic(dir_dibujo3, 1); + loadPic("his4_1.alg", drawSurface1, HALF_PAL); + loadPic("his4_2.alg", drawSurface3, 1); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo3, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface3, screenSurface); if (_lang != kSpanish) - centra_texto(_texthis[_lang][1], 180, 180); + centerText(_texthis[_lang][1], 180, 180); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - key = getscan(); + updateScreen(); + key = getScan(); if (key != 0) goto asco; @@ -1109,34 +975,32 @@ void DrasculaEngine::animation_16_2() { else _system->delayMillis(4000); - key = getscan(); + key = getScan(); if (key != 0) goto asco; for (l = 1; l < 200; l++) { - copyBackground(0, 0, 0, l, 320, 200 - l, dir_dibujo3, dir_zona_pantalla); - copyBackground(0, 200 - l, 0, 0, 320, l, dir_dibujo1, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - key = getscan(); + copyBackground(0, 0, 0, l, 320, 200 - l, drawSurface3, screenSurface); + copyBackground(0, 200 - l, 0, 0, 320, l, drawSurface1, screenSurface); + updateScreen(); + key = getScan(); if (key != 0) goto asco; } pause(5); - FundeAlNegro(2); + fadeToBlack(2); clearRoom(); asco: - loadPic(roomDisk); - decompressPic(dir_dibujo3, 1); + loadPic(roomDisk, drawSurface3, 1); char rm[20]; sprintf(rm, "%i.alg", roomNumber); - loadPic(rm); - decompressPic(dir_dibujo1, HALF_PAL); + loadPic(rm, drawSurface1, HALF_PAL); black(); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - FundeDelNegro(0); + updateScreen(); + fadeFromBlack(0); if (roomMusic != 0) playMusic(roomMusic); else @@ -1144,8 +1008,8 @@ asco: } void DrasculaEngine::animation_17_2() { - talk_borracho(_textb[_lang][13], "B13.als"); - talk_borracho(_textb[_lang][14], "B14.als"); + talk_drunk(13); + talk_drunk(14); flags[40] = 1; } @@ -1171,15 +1035,15 @@ void DrasculaEngine::animation_20_2() { flags[18] = 0; flags[14] = 1; openDoor(15, 1); - sal_de_la_habitacion(1); + exitRoom(1); animation_23_2(); - sal_de_la_habitacion(0); + exitRoom(0); flags[21] = 0; flags[24] = 0; sentido_vb = 1; vb_x = 120; - rompo_y_salgo = 1; + breakOut = 1; } } @@ -1188,8 +1052,7 @@ void DrasculaEngine::animation_21_2() { } void DrasculaEngine::animation_23_2() { - loadPic("an24.alg"); - decompressPic(dir_hare_frente, 1); + loadPic("an24.alg", frontSurface, 1); flags[21] = 1; @@ -1216,9 +1079,9 @@ void DrasculaEngine::animation_23_2() { talk_vb(18); if (flags[29] == 0) - animation_23_anexo(); + animation_23_joined(); else - animation_23_anexo2(); + animation_23_joined2(); sentido_vb = 2; animation_25_2(); @@ -1228,11 +1091,11 @@ void DrasculaEngine::animation_23_2() { talk_vb(19); if (flags[25] == 0) { talk_vb(20); - if (resta_objeto(7) == 0) + if (removeObject(7) == 0) flags[30] = 1; - if (resta_objeto(18) == 0) + if (removeObject(18) == 0) flags[31] = 1; - if (resta_objeto(19) == 0) + if (removeObject(19) == 0) flags[32] = 1; } talk_vb(21); @@ -1240,60 +1103,54 @@ void DrasculaEngine::animation_23_2() { animation_27_2(); flags[25] = 1; - rompo_y_salgo = 1; + breakOut = 1; } -void DrasculaEngine::animation_23_anexo() { +void DrasculaEngine::animation_23_joined() { int n, p_x = hare_x + 2, p_y = hare_y - 3; int x[] = {1, 38, 75, 112, 75, 112, 75, 112, 149, 112, 149, 112, 149, 186, 223, 260, 1, 38, 75, 112, 149, 112, 149, 112, 149, 112, 149, 186, 223, 260, 260, 260, 260, 223}; int y[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 1, 1, 1, 1}; - loadPic("an23.alg"); - decompressPic(dir_hare_fondo, 1); + loadPic("an23.alg", backSurface, 1); for (n = 0; n < 34; n++) { - copyRect(p_x, p_y, p_x, p_y, 36, 74, dir_dibujo1, dir_zona_pantalla); - copyRect(x[n], y[n], p_x, p_y, 36, 74, dir_hare_fondo, dir_zona_pantalla); + copyRect(p_x, p_y, p_x, p_y, 36, 74, drawSurface1, screenSurface); + copyRect(x[n], y[n], p_x, p_y, 36, 74, backSurface, screenSurface); updateRefresh(); - updateScreen(p_x, p_y, p_x, p_y, 36, 74, dir_zona_pantalla); + updateScreen(p_x, p_y, p_x, p_y, 36, 74, screenSurface); pause(5); } - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); + loadPic("99.alg", backSurface, 1); } -void DrasculaEngine::animation_23_anexo2() { +void DrasculaEngine::animation_23_joined2() { int n, p_x = hare_x + 4, p_y = hare_y; int x[] = {1, 35, 69, 103, 137, 171, 205, 239, 273, 1, 35, 69, 103, 137}; int y[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 73, 73, 73, 73, 73}; pause(50); - loadPic("an23_2.alg"); - decompressPic(dir_hare_fondo, 1); + loadPic("an23_2.alg", backSurface, 1); for (n = 0; n < 14; n++) { - copyRect(p_x, p_y, p_x, p_y, 33, 71, dir_dibujo1, dir_zona_pantalla); - copyRect(x[n], y[n], p_x, p_y, 33, 71, dir_hare_fondo, dir_zona_pantalla); + copyRect(p_x, p_y, p_x, p_y, 33, 71, drawSurface1, screenSurface); + copyRect(x[n], y[n], p_x, p_y, 33, 71, backSurface, screenSurface); updateRefresh(); - updateScreen(p_x,p_y, p_x,p_y, 33,71, dir_zona_pantalla); + updateScreen(p_x,p_y, p_x,p_y, 33,71, screenSurface); pause(5); } - loadPic("99.alg"); - decompressPic(dir_hare_fondo,1); + loadPic("99.alg", backSurface,1); } void DrasculaEngine::animation_25_2() { int n, pos_cabina[6]; - loadPic("an14_2.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("18.alg"); - decompressPic(dir_dibujo1, 1); + loadPic("an14_2.alg", backSurface, 1); + loadPic("18.alg", drawSurface1, 1); pos_cabina[0] = 150; pos_cabina[1] = 6; @@ -1304,10 +1161,10 @@ void DrasculaEngine::animation_25_2() { flags[24] = 0; - playSound("s6.als"); + playSound(6); for (n = 0; n >= -160; n = n - 8) { - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); updateRefresh_pre(); pon_hare(); @@ -1315,42 +1172,39 @@ void DrasculaEngine::animation_25_2() { pos_cabina[3] = n; - copyRectClip(pos_cabina, dir_hare_fondo, dir_zona_pantalla); + copyRectClip(pos_cabina, backSurface, screenSurface); updateRefresh(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); } - stopSound(); + finishSound(); - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); + loadPic("99.alg", backSurface, 1); } void DrasculaEngine::animation_27_2() { flags[22] = 1; withoutVerb(); - resta_objeto(23); - suma_objeto(11); + removeObject(23); + addObject(11); talk_vb(23); talk_vb(24); if (flags[30] == 1) - suma_objeto(7); + addObject(7); if (flags[31] == 1) - suma_objeto(18); + addObject(18); if (flags[32] == 1) - suma_objeto(19); + addObject(19); talk_vb(25); talk_vb(26); } void DrasculaEngine::animation_28_2() { - talk_vb(27); - talk_vb(28); - talk_vb(29); - talk_vb(30); + for(int i = 27; i <= 30; i++) + talk_vb(i); } void DrasculaEngine::animation_29_2() { @@ -1379,7 +1233,7 @@ void DrasculaEngine::animation_29_2() { if (flags[38] == 0) { talk(403); - rompo_y_salgo = 1; + breakOut = 1; } else talk(386); } @@ -1394,15 +1248,14 @@ void DrasculaEngine::animation_31_2() { lleva_vb(-50); pause(15); lleva_al_hare(159, 140); - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); + loadPic("99.alg", backSurface, 1); sentido_hare = 2; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); pause(78); sentido_hare = 0; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); pause(22); talk(406); lleva_vb(98); @@ -1424,90 +1277,54 @@ void DrasculaEngine::animation_31_2() { talk(410); talk_vb(56); - rompo_y_salgo = 1; + breakOut = 1; flags[38] = 0; flags[36] = 1; withoutVerb(); - resta_objeto(8); - resta_objeto(13); - resta_objeto(15); - resta_objeto(16); - resta_objeto(17); - suma_objeto(20); + removeObject(8); + removeObject(13); + removeObject(15); + removeObject(16); + removeObject(17); + addObject(20); } void DrasculaEngine::animation_35_2() { - int n, x = 0; - lleva_al_hare(96, 165); lleva_al_hare(79, 165); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - loadPic("an35_1.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("an35_2.alg"); - decompressPic(dir_hare_frente, 1); - - for (n = 0; n < 6; n++) { - x++; - copyBackground(x, 1, 70, 90, 46, 80, dir_hare_fondo, dir_zona_pantalla); - updateScreen(70,90, 70,90, 46,80,dir_zona_pantalla); - x = x + 46; - pause(3); - } - - x = 0; - for (n = 0; n < 6; n++) { - x++; - copyBackground(x, 82, 70, 90, 46, 80, dir_hare_fondo, dir_zona_pantalla); - updateScreen(70, 90, 70, 90, 46, 80, dir_zona_pantalla); - x = x + 46; - pause(3); - } + updateScreen(); - x = 0; - for (n = 0; n < 6; n++) { - x++; - copyBackground(x, 1, 70, 90, 46, 80, dir_hare_frente, dir_zona_pantalla); - updateScreen(70, 90, 70, 90, 46, 80, dir_zona_pantalla); + loadPic("an35_1.alg", backSurface, 1); + loadPic("an35_2.alg", frontSurface, 1); - x = x + 46; + updateAnim(1, 70, 90, 46, 80, 6, backSurface); + updateAnim(82, 70, 90, 46, 80, 6, backSurface); + updateAnim(1, 70, 90, 46, 80, 6, frontSurface); + updateAnim(82, 70, 90, 46, 80, 2, frontSurface); - pause(3); - } + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); - x = 0; - for (n = 0; n < 2; n++) { - x++; - copyBackground(x, 82, 70, 90, 46, 80, dir_hare_frente, dir_zona_pantalla); - updateScreen(70, 90, 70,90, 46, 80,dir_zona_pantalla); - x = x + 46; - pause(3); - } - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); pause(19); - playSound("s1.als"); + playSound(1); hipo_sin_nadie(18); - stopSound(); + finishSound(); pause(10); - FundeAlNegro(2); + fadeToBlack(2); } void DrasculaEngine::animation_1_3() { - talk(_text[_lang][413], "413.als"); + talk(413); grr(); pause(50); - talk(_text[_lang][414], "414.als"); + talk(414); } void DrasculaEngine::animation_2_3() { @@ -1518,247 +1335,61 @@ void DrasculaEngine::animation_2_3() { animation_4_3(); flags[1] = 1; updateRoom(); - updateScreen(120, 0, 120, 0, 200, 200, dir_zona_pantalla); + updateScreen(120, 0, 120, 0, 200, 200, screenSurface); animation_5_3(); flags[0] = 0; flags[1] = 1; - loadPic("96.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("97.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); + loadPic("96.alg", frontSurface, 1); + loadPic("97.alg", extraSurface, 1); + loadPic("99.alg", backSurface, 1); lleva_al_hare(332, 127); } void DrasculaEngine::animation_3_3() { - int n, x = 0; int px = hare_x - 20, py = hare_y - 1; - loadPic("an2y_1.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("an2y_2.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("an2y_3.alg"); - decompressPic(dir_hare_fondo, 1); - - for (n = 0; n < 4; n++) { - x++; - copyBackground(px, py, px, py, 71, 72, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 2, px, py, 71, 72, dir_hare_frente, dir_zona_pantalla); - updateScreen(px, py, px, py, 71, 72, dir_zona_pantalla); - x = x + 71; - pause(3); - } - - x = 0; - - for (n = 0; n < 4; n++) { - x++; - copyBackground(px, py, px, py, 71, 72, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 75, px, py, 71, 72, dir_hare_frente, dir_zona_pantalla); - updateScreen(px, py, px, py, 71, 72, dir_zona_pantalla); - x = x + 71; - pause(3); - } - - x = 0; - - for (n = 0; n < 4; n++) { - x++; - copyBackground(px, py, px, py, 71, 72, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 2, px, py, 71, 72, dir_hare_dch, dir_zona_pantalla); - updateScreen(px, py, px, py, 71, 72, dir_zona_pantalla); - x = x + 71; - pause(3); - } - - x = 0; - - for (n = 0; n < 4; n++) { - x++; - copyBackground(px, py, px, py, 71, 72, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 75, px, py, 71, 72, dir_hare_dch, dir_zona_pantalla); - updateScreen(px, py, px, py, 71, 72, dir_zona_pantalla); - x = x + 71; - pause(3); - } - - x = 0; - - for (n = 0; n < 4; n++) { - x++; - copyBackground(px, py, px, py, 71, 72, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 2, px, py, 71, 72, dir_hare_fondo, dir_zona_pantalla); - updateScreen(px, py, px, py, 71, 72, dir_zona_pantalla); - x = x + 71; - pause(3); - } - - x = 0; + loadPic("an2y_1.alg", frontSurface, 1); + loadPic("an2y_2.alg", extraSurface, 1); + loadPic("an2y_3.alg", backSurface, 1); - for (n = 0; n < 4; n++) { - x++; - copyBackground(px, py, px, py, 71, 72, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 75, px, py, 71, 72, dir_hare_fondo, dir_zona_pantalla); - updateScreen(px, py, px, py, 71, 72, dir_zona_pantalla); - x = x + 71; - pause(3); - } + updateAnim2(2, px, py, 71, 72, 4, frontSurface); + updateAnim2(75, px, py, 71, 72, 4, frontSurface); + updateAnim2(2, px, py, 71, 72, 4, extraSurface); + updateAnim2(75, px, py, 71, 72, 4, extraSurface); + updateAnim2(2, px, py, 71, 72, 4, backSurface); + updateAnim2(75, px, py, 71, 72, 4, backSurface); } void DrasculaEngine::animation_4_3() { - int n, x = 0; int px = 120, py = 63; - loadPic("any_1.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("any_2.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("any_3.alg"); - decompressPic(dir_hare_fondo, 1); - - for (n = 0; n < 4; n++){ - x++; - copyBackground(px, py, px, py, 77, 89, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 1, px, py, 77, 89, dir_hare_frente, dir_zona_pantalla); - updateScreen(px, py, px, py, 77, 89, dir_zona_pantalla); - x = x + 77; - pause(3); - } - - x = 0; - - for (n = 0; n < 4; n++) { - x++; - copyBackground(px, py, px, py, 77, 89, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 91, px, py, 77, 89, dir_hare_frente, dir_zona_pantalla); - updateScreen(px, py, px, py, 77, 89, dir_zona_pantalla); - x = x + 77; - pause(3); - } - - x = 0; - - for (n = 0; n < 4; n++) { - x++; - copyBackground(px, py, px, py, 77, 89, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 1, px, py, 77, 89, dir_hare_dch, dir_zona_pantalla); - updateScreen(px, py, px, py, 77, 89, dir_zona_pantalla); - x = x + 77; - pause(3); - } - - x = 0; - - for (n = 0; n < 4; n++) { - x++; - copyBackground(px, py, px, py, 77, 89, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 91, px, py, 77, 89, dir_hare_dch, dir_zona_pantalla); - updateScreen(px, py, px, py, 77, 89, dir_zona_pantalla); - x = x + 77; - pause(3); - } - - x = 0; + loadPic("any_1.alg", frontSurface, 1); + loadPic("any_2.alg", extraSurface, 1); + loadPic("any_3.alg", backSurface, 1); - for (n = 0; n < 4; n++) { - x++; - copyBackground(px, py, px, py, 77, 89, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 1, px, py, 77, 89, dir_hare_fondo, dir_zona_pantalla); - updateScreen(px, py, px, py, 77, 89, dir_zona_pantalla); - x = x + 77; - pause(3); - } - - x = 0; - - for (n = 0; n < 4; n++) { - x++; - copyBackground(px, py, px, py, 77, 89, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 91, px, py, 77, 89, dir_hare_fondo, dir_zona_pantalla); - updateScreen(px, py, px, py, 77, 89, dir_zona_pantalla); - x = x + 77; - pause(3); - } + updateAnim2(1, px, py, 77, 89, 4, frontSurface); + updateAnim2(91, px, py, 77, 89, 4, frontSurface); + updateAnim2(1, px, py, 77, 89, 4, extraSurface); + updateAnim2(91, px, py, 77, 89, 4, extraSurface); + updateAnim2(1, px, py, 77, 89, 4, backSurface); + updateAnim2(91, px, py, 77, 89, 4, backSurface); } void DrasculaEngine::animation_5_3() { - int n, x = 0; int px = hare_x - 20, py = hare_y - 1; - loadPic("an3y_1.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("an3y_2.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("an3y_3.alg"); - decompressPic(dir_hare_fondo, 1); - - for (n = 0; n < 4; n++) { - x++; - copyBackground(px, py, px, py, 71, 72, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 2, px, py, 71, 72, dir_hare_frente, dir_zona_pantalla); - updateScreen(px, py, px, py, 71, 72, dir_zona_pantalla); - x = x + 71; - pause(3); - } - - x = 0; - - for (n = 0; n < 4; n++) { - x++; - copyBackground(px, py, px, py, 71, 72, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 75, px, py, 71, 72, dir_hare_frente, dir_zona_pantalla); - updateScreen(px, py, px, py, 71, 72, dir_zona_pantalla); - x = x + 71; - pause(3); - } - - x = 0; - - for (n = 0; n < 4; n++) { - x++; - copyBackground(px, py, px, py, 71, 72, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 2, px, py, 71, 72, dir_hare_dch, dir_zona_pantalla); - updateScreen(px, py, px, py, 71, 72, dir_zona_pantalla); - x = x + 71; - pause(3); - } - - x = 0; - - for (n = 0; n < 4; n++) { - x++; - copyBackground(px, py, px, py, 71, 72, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 75, px, py, 71, 72, dir_hare_dch, dir_zona_pantalla); - updateScreen(px,py, px,py, 71,72, dir_zona_pantalla); - x = x + 71; - pause(3); - } - - x = 0; - - for (n = 0; n < 4; n++) { - x++; - copyBackground(px, py, px, py, 71, 72, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 2, px, py, 71, 72, dir_hare_fondo, dir_zona_pantalla); - updateScreen(px, py, px, py, 71, 72, dir_zona_pantalla); - x = x + 71; - pause(3); - } - - x = 0; + loadPic("an3y_1.alg", frontSurface, 1); + loadPic("an3y_2.alg", extraSurface, 1); + loadPic("an3y_3.alg", backSurface, 1); - for (n = 0; n < 4; n++) { - x++; - copyBackground(px, py, px, py, 71, 72, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 75, px, py, 71, 72, dir_hare_fondo, dir_zona_pantalla); - updateScreen(px, py, px, py, 71, 72, dir_zona_pantalla); - x = x + 71; - pause(3); - } + updateAnim2(2, px, py, 71, 72, 4, frontSurface); + updateAnim2(75, px, py, 71, 72, 4, frontSurface); + updateAnim2(2, px, py, 71, 72, 4, extraSurface); + updateAnim2(75, px, py, 71, 72, 4, extraSurface); + updateAnim2(2, px, py, 71, 72, 4, backSurface); + updateAnim2(75, px, py, 71, 72, 4, backSurface); } void DrasculaEngine::animation_6_3() { @@ -1766,103 +1397,96 @@ void DrasculaEngine::animation_6_3() { int yoda_x[] = { 3 ,82, 161, 240, 3, 82 }; int yoda_y[] = { 3, 3, 3, 3, 94, 94 }; - hare_se_mueve = 0; + characterMoved = 0; flags[3] = 1; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); flags[1] = 0; - loadPic("an4y.alg"); - decompressPic(dir_hare_frente, 1); + loadPic("an4y.alg", frontSurface, 1); for (frame = 0; frame < 6; frame++) { pause(3); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - copyRect(yoda_x[frame], yoda_y[frame], px, py, 78, 90, dir_hare_frente, dir_zona_pantalla); - updateScreen(px, py, px, py, 78, 90, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + copyRect(yoda_x[frame], yoda_y[frame], px, py, 78, 90, frontSurface, screenSurface); + updateScreen(px, py, px, py, 78, 90, screenSurface); } flags[2] = 1; - loadPic("96.alg"); - decompressPic(dir_hare_frente, 1); + loadPic("96.alg", frontSurface, 1); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); } void DrasculaEngine::animation_rayo() { - loadPic("anr_1.alg"); - decompressPic(dir_hare_frente, HALF_PAL); - loadPic("anr_2.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("anr_3.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("anr_4.alg"); - decompressPic(dir_dibujo1, 1); - loadPic("anr_5.alg"); - decompressPic(dir_dibujo3, 1); - - updateScreen(0, 0, 0, 0, 320, 200, dir_hare_frente); + loadPic("anr_1.alg", frontSurface, HALF_PAL); + loadPic("anr_2.alg", extraSurface, 1); + loadPic("anr_3.alg", backSurface, 1); + loadPic("anr_4.alg", drawSurface1, 1); + loadPic("anr_5.alg", drawSurface3, 1); + + updateScreen(0, 0, 0, 0, 320, 200, frontSurface); pause(50); - playSound("s5.als"); + playSound(5); - updateScreen(0, 0, 0, 0, 320, 200, dir_hare_dch); + updateScreen(0, 0, 0, 0, 320, 200, extraSurface); pause(3); - updateScreen(0, 0, 0, 0, 320, 200, dir_hare_fondo); + updateScreen(0, 0, 0, 0, 320, 200, backSurface); pause(3); - updateScreen(0, 0, 0, 0, 320, 200, dir_dibujo1); + updateScreen(0, 0, 0, 0, 320, 200, drawSurface1); pause(3); - updateScreen(0, 0, 0, 0, 320, 200, dir_hare_fondo); + updateScreen(0, 0, 0, 0, 320, 200, backSurface); pause(3); - updateScreen(0, 0, 0, 0, 320, 200, dir_dibujo3); + updateScreen(0, 0, 0, 0, 320, 200, drawSurface3); pause(3); - updateScreen(0, 0, 0, 0, 320, 200, dir_hare_frente); - stopSound(); + updateScreen(0, 0, 0, 0, 320, 200, frontSurface); + finishSound(); } void DrasculaEngine::animation_2_4() { - talk_igor_sentado(_texti[_lang][16], "I16.als"); - talk(_text[_lang][278], "278.als"); - talk_igor_sentado(_texti[_lang][17], "I17.als"); - talk(_text[_lang][279], "279.als"); - talk_igor_sentado(_texti[_lang][18], "I18.als"); + talk_igor(16, kIgorSeated); + talk(278); + talk_igor(17, kIgorSeated); + talk(279); + talk_igor(18, kIgorSeated); } void DrasculaEngine::animation_3_4() { - talk_igor_sentado(_texti[_lang][19], "I19.als"); - talk_igor_sentado(_texti[_lang][20], "I20.als"); - talk(_text[_lang][281], "281.als"); + talk_igor(19, kIgorSeated); + talk_igor(20, kIgorSeated); + talk(281); } void DrasculaEngine::animation_4_4() { - talk(_text[_lang][287], "287.als"); - talk_igor_sentado(_texti[_lang][21], "I21.als"); - talk(_text[_lang][284], "284.als"); - talk_igor_sentado(_texti[_lang][22], "I22.als"); - talk(_text[_lang][285], "285.als"); - talk_igor_sentado(_texti[_lang][23], "I23.als"); + talk(287); + talk_igor(21, kIgorSeated); + talk(284); + talk_igor(22, kIgorSeated); + talk(285); + talk_igor(23, kIgorSeated); } void DrasculaEngine::animation_7_4() { black(); - talk(_text[_lang][427], "427.als"); - FundeDelNegro(1); - resta_objeto(8); - resta_objeto(10); - resta_objeto(12); - resta_objeto(16); - suma_objeto(17); + talk(427); + fadeFromBlack(1); + removeObject(8); + removeObject(10); + removeObject(12); + removeObject(16); + addObject(17); flags[30] = 0; flags[29] = 0; } void DrasculaEngine::animation_1_5() { if (flags[0] == 0) { - talk(_text[_lang][430], "430.als"); + talk(430); talk_bj(16); talk_bj(17); talk_bj(18); @@ -1879,16 +1503,16 @@ void DrasculaEngine::animation_1_5() { talk(438); sitio_x = 120; sitio_y = 157; - anda_a_objeto = 1; + walkToObject = 1; sentido_final = 1; - empieza_andar(); + startWalking(); talk_bj(21); for (;;) { - if (hare_se_mueve == 0) + if (characterMoved == 0) break; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); } sentido_hare = 1; @@ -1897,7 +1521,7 @@ void DrasculaEngine::animation_1_5() { } sentido_hare = 1; - conversa("op_8.cal"); + converse("op_8.cal"); } void DrasculaEngine::animation_2_5() { @@ -1907,28 +1531,28 @@ void DrasculaEngine::animation_2_5() { void DrasculaEngine::animation_3_5() { talk_bj(23); pickObject(10); - rompo_y_salgo = 1; + breakOut = 1; } void DrasculaEngine::animation_4_5() { flags[7] = 1; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - talk(_text[_lang][228], "228.als"); - talk_lobo(_textl[_lang][1], "L1.als"); - talk_lobo(_textl[_lang][2], "L2.als"); + updateScreen(); + talk(228); + talk_wolf(1); + talk_wolf(2); pause(23); - talk(_text[_lang][229], "229.als"); - talk_lobo(_textl[_lang][3], "L3.als"); - talk_lobo(_textl[_lang][4], "L4.als"); - talk(_text[_lang][230], "230.als"); - talk_lobo(_textl[_lang][5], "L5.als"); - talk(_text[_lang][231], "231.als"); - talk_lobo(_textl[_lang][6], "L6.als"); - talk_lobo(_textl[_lang][7], "L7.als"); + talk(229); + talk_wolf(3); + talk_wolf(4); + talk(230); + talk_wolf(5); + talk(231); + talk_wolf(6); + talk_wolf(7); pause(33); - talk(_text[_lang][232], "232.als"); - talk_lobo(_textl[_lang][8], "L8.als"); + talk(232); + talk_wolf(8); } void DrasculaEngine::animation_5_5(){ @@ -1937,117 +1561,108 @@ void DrasculaEngine::animation_5_5(){ int hueso_x[] = {1, 99, 197, 1, 99, 197, 1, 99, 197}; int hueso_y[] = {1, 1, 1, 66, 66, 66, 131, 131, 131}; int vuela_x[] = {1, 63, 125, 187, 249}; - int pixel_x = hare_x - 53, pixel_y = hare_y - 9; + int pixelX = hare_x - 53, pixelY = hare_y - 9; withoutVerb(); - resta_objeto(8); + removeObject(8); lleva_al_hare(hare_x - 19, hare_y + alto_hare); sentido_hare = 1; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); - loadPic("3an5_1.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("3an5_2.alg"); - decompressPic(dir_hare_frente, 1); + loadPic("3an5_1.alg", backSurface, 1); + loadPic("3an5_2.alg", frontSurface, 1); for (frame = 0; frame < 9; frame++) { pause(3); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - copyRect(hueso_x[frame], hueso_y[frame], pixel_x, pixel_y, 97, 64, dir_hare_fondo, dir_zona_pantalla); - updateScreen(pixel_x, pixel_y, pixel_x,pixel_y, 97,64, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + copyRect(hueso_x[frame], hueso_y[frame], pixelX, pixelY, 97, 64, backSurface, screenSurface); + updateScreen(pixelX, pixelY, pixelX,pixelY, 97,64, screenSurface); } - copyBackground(52, 161, 198, 81, 26, 24, dir_dibujo3, dir_zona_pantalla); - updateScreen(198, 81, 198, 81, 26, 24, dir_zona_pantalla); + copyBackground(52, 161, 198, 81, 26, 24, drawSurface3, screenSurface); + updateScreen(198, 81, 198, 81, 26, 24, screenSurface); for (frame = 0; frame < 9; frame++) { pause(3); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - copyRect(hueso_x[frame], hueso_y[frame], pixel_x, pixel_y, 97, 64, dir_hare_frente, dir_zona_pantalla); - updateScreen(pixel_x, pixel_y, pixel_x,pixel_y, 97, 64, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + copyRect(hueso_x[frame], hueso_y[frame], pixelX, pixelY, 97, 64, frontSurface, screenSurface); + updateScreen(pixelX, pixelY, pixelX,pixelY, 97, 64, screenSurface); } flags[6] = 1; - updateData(); + updateVisible(); pause(12); - loadPic("96.alg"); - decompressPic(dir_hare_frente, 1); + loadPic("96.alg", frontSurface, 1); for (h = 0; h < (200 - 18); h++) - copyBackground(0, 53, 0, h, 320, 19, dir_hare_frente, dir_zona_pantalla); + copyBackground(0, 53, 0, h, 320, 19, frontSurface, screenSurface); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); - loadPic("101.alg"); - decompressPic(dir_dibujo1, HALF_PAL); - loadPic("3an5_3.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("3an5_4.alg"); - decompressPic(dir_hare_dch, 1); + loadPic("101.alg", drawSurface1, HALF_PAL); + loadPic("3an5_3.alg", backSurface, 1); + loadPic("3an5_4.alg", extraSurface, 1); - updateScreen(0, 0, 0, 0, 320, 200, dir_dibujo1); + updateScreen(0, 0, 0, 0, 320, 200, drawSurface1); pause(9); for (frame = 0; frame < 5; frame++) { pause(3); - copyBackground(vuela_x[frame], 1, 174, 79, 61, 109, dir_hare_fondo, dir_zona_pantalla); - updateScreen(174, 79, 174, 79, 61, 109, dir_zona_pantalla); + copyBackground(vuela_x[frame], 1, 174, 79, 61, 109, backSurface, screenSurface); + updateScreen(174, 79, 174, 79, 61, 109, screenSurface); } for (frame = 0; frame < 5; frame++) { pause(3); - copyBackground(vuela_x[frame], 1, 174, 79, 61, 109, dir_hare_dch, dir_zona_pantalla); - updateScreen(174, 79, 174, 79, 61, 109, dir_zona_pantalla); + copyBackground(vuela_x[frame], 1, 174, 79, 61, 109, extraSurface, screenSurface); + updateScreen(174, 79, 174, 79, 61, 109, screenSurface); } - updateScreen(0, 0, 0, 0, 320, 200, dir_dibujo1); + updateScreen(0, 0, 0, 0, 320, 200, drawSurface1); - playSound("s1.als"); - stopSound(); + playSound(1); + finishSound(); - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("97.alg"); - decompressPic(dir_hare_dch, 1); + loadPic("99.alg", backSurface, 1); + loadPic("97.alg", extraSurface, 1); clearRoom(); - loadPic("49.alg"); - decompressPic(dir_dibujo1, HALF_PAL); + loadPic("49.alg", drawSurface1, HALF_PAL); } void DrasculaEngine::animation_6_5() { - talk_lobo(_textl[_lang][9], "L9.als"); - talk(_text[_lang][234], "234.als"); + talk_wolf(9); + talk(234); } void DrasculaEngine::animation_7_5() { - talk_lobo(_textl[_lang][10], "L10.als"); - talk(_text[_lang][236], "236.als"); - talk_lobo(_textl[_lang][11], "L11.als"); - talk_lobo(_textl[_lang][12], "L12.als"); - talk_lobo(_textl[_lang][13], "L13.als"); + talk_wolf(10); + talk(236); + talk_wolf(11); + talk_wolf(12); + talk_wolf(13); pause(34); - talk_lobo(_textl[_lang][14], "L14.als"); + talk_wolf(14); } void DrasculaEngine::animation_8_5() { - talk_lobo(_textl[_lang][15], "L15.als"); - talk(_text[_lang][238], "238.als"); - talk_lobo(_textl[_lang][16], "L16.als"); + talk_wolf(15); + talk(238); + talk_wolf(16); } void DrasculaEngine::animation_9_5() { flags[4] = 1; - talk(_text[_lang][401], "401.als"); + talk(401); withoutVerb(); - resta_objeto(15); + removeObject(15); } void DrasculaEngine::animation_10_5() { flags[3] = 1; - talk(_text[_lang][401], "401.als"); + talk(401); withoutVerb(); - resta_objeto(12); + removeObject(12); } void DrasculaEngine::animation_11_5() { @@ -2056,96 +1671,95 @@ void DrasculaEngine::animation_11_5() { animation_12_5(); else { flags[9] = 0; - talk(_text[_lang][33], "33.als"); + talk(33); } } void DrasculaEngine::animation_12_5() { - DacPalette256 palFondo1; - DacPalette256 palFondo2; - DacPalette256 palFondo3; + DacPalette256 bgPalette1; + DacPalette256 bgPalette2; + DacPalette256 bgPalette3; int frame; - const int rayo_x[] = {1, 46, 91, 136, 181, 226, 271, 181}; + const int rayX[] = {1, 46, 91, 136, 181, 226, 271, 181}; const int frusky_x[] = {100, 139, 178, 217, 100, 178, 217, 139, 100, 139}; const int elfrusky_x[] = {1, 68, 135, 1, 68, 135, 1, 68, 135, 68, 1, 135, 68, 135, 68}; //const int humo_x[] = {1, 29, 57, 85, 113, 141, 169, 197, 225}; - int color, componente; + int color, component; char fundido; playMusic(26); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); pause(27); - anima("rayo1.bin", 23); - playSound("s5.als"); - anima("rayo2.bin", 17); + animate("rayo1.bin", 23); + playSound(5); + animate("rayo2.bin", 17); sentido_hare = 1; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); hare_oscuro(); for (color = 0; color < 255; color++) - for (componente = 0; componente < 3; componente++) { - palFondo1[color][componente] = gamePalette[color][componente]; - palFondo2[color][componente] = gamePalette[color][componente]; - palFondo3[color][componente] = gamePalette[color][componente]; + for (component = 0; component < 3; component++) { + bgPalette1[color][component] = gamePalette[color][component]; + bgPalette2[color][component] = gamePalette[color][component]; + bgPalette3[color][component] = gamePalette[color][component]; } for (fundido = 1; fundido >= 0; fundido--) { for (color = 0; color < 128; color++) - for (componente = 0; componente < 3; componente++) - palFondo1[color][componente] = LimitaVGA(palFondo1[color][componente] - 8 + fundido); + for (component = 0; component < 3; component++) + bgPalette1[color][component] = adjustToVGA(bgPalette1[color][component] - 8 + fundido); } for (fundido = 2; fundido >= 0; fundido--) { for (color = 0; color < 128; color++) - for (componente = 0; componente < 3; componente++) - palFondo2[color][componente] = LimitaVGA(palFondo2[color][componente] - 8 + fundido); + for (component = 0; component < 3; component++) + bgPalette2[color][component] = adjustToVGA(bgPalette2[color][component] - 8 + fundido); } for (fundido = 3; fundido >= 0; fundido--) { for (color = 0; color < 128; color++) - for (componente = 0; componente < 3; componente++) - palFondo3[color][componente] = LimitaVGA(palFondo3[color][componente] - 8 + fundido); + for (component = 0; component < 3; component++) + bgPalette3[color][component] = adjustToVGA(bgPalette3[color][component] - 8 + fundido); } - loadPic("3an11_1.alg"); - decompressPic(dir_hare_fondo, 1); + loadPic("3an11_1.alg", backSurface, 1); for (frame = 0; frame < 8; frame++) { if (frame == 2 || frame == 4 || frame == 8 || frame==10) - setPalette((byte *)&palFondo1); + setPalette((byte *)&bgPalette1); else if (frame == 1 || frame == 5 || frame == 7 || frame == 9) - setPalette((byte *)&palFondo2); + setPalette((byte *)&bgPalette2); else - setPalette((byte *)&palFondo3); + setPalette((byte *)&bgPalette3); pause(4); updateRoom(); - copyRect(rayo_x[frame], 1, 41, 0, 44, 44, dir_hare_fondo, dir_zona_pantalla); - copyRect(frusky_x[frame], 113, 205, 50, 38, 86, dir_dibujo3, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyRect(rayX[frame], 1, 41, 0, 44, 44, backSurface, screenSurface); + copyRect(frusky_x[frame], 113, 205, 50, 38, 86, drawSurface3, screenSurface); + updateScreen(); } - stopSound_corte(); + stopSound(); for (frame = 0; frame < 15; frame++) { if (frame == 2 || frame == 4 || frame == 7 || frame == 9) - setPalette((byte *)&palFondo1); + setPalette((byte *)&bgPalette1); else if (frame == 1 || frame == 5) setPalette((byte *)&gamePalette); else - setPalette((byte *)&palFondo2); + setPalette((byte *)&bgPalette2); pause(4); updateRoom(); - copyRect(elfrusky_x[frame], 47, 192, 39, 66, 106, dir_hare_fondo, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyRect(elfrusky_x[frame], 47, 192, 39, 66, 106, backSurface, screenSurface); + updateScreen(); } - anima("frel.bin", 16); + animate("frel.bin", 16); clearRoom(); hare_claro(); updatePalette(); @@ -2153,24 +1767,23 @@ void DrasculaEngine::animation_12_5() { flags[1] = 1; animation_13_5(); - playSound("s1.als"); - hipo(12); - stopSound(); + playSound(1); + hiccup(12); + finishSound(); - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); + loadPic("99.alg", backSurface, 1); lleva_al_hare(40, 169); lleva_al_hare(-14, 175); - rompo = 1; + doBreak = 1; previousMusic = roomMusic; hare_se_ve = 1; clearRoom(); sentido_hare = 1; - hare_se_mueve = 0; + characterMoved = 0; hare_x = -1; - obj_saliendo = 104; + objExit = 104; withoutVerb(); carga_escoba("57.ald"); } @@ -2182,8 +1795,7 @@ void DrasculaEngine::animation_13_5() { int frus_y[] = {1, 1, 1, 1, 1, 1, 1, 89}; int pos_frusky[6]; - loadPic("auxfr.alg"); - decompressPic(dir_hare_fondo, 1); + loadPic("auxfr.alg", backSurface, 1); pos_frusky[3] = 81; pos_frusky[4] = 44; @@ -2192,8 +1804,8 @@ void DrasculaEngine::animation_13_5() { pos_frusky[1] = 1; pos_frusky[2] = frank_x; updateRoom(); - copyRectClip(pos_frusky, dir_hare_fondo, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyRectClip(pos_frusky, backSurface, screenSurface); + updateScreen(); pause(15); playMusic(18); @@ -2203,8 +1815,8 @@ void DrasculaEngine::animation_13_5() { pos_frusky[0] = frus_x[frame]; pos_frusky[1] = frus_y[frame]; pos_frusky[2] = frank_x; - copyRectClip( pos_frusky, dir_hare_fondo, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyRectClip( pos_frusky, backSurface, screenSurface); + updateScreen(); frank_x = frank_x - 5; frame++; if (frank_x <= -45) @@ -2219,41 +1831,41 @@ void DrasculaEngine::animation_13_5() { void DrasculaEngine::animation_14_5() { flags[11] = 1; - playSound("s3.als"); + playSound(3); updateRoom(); - updateScreen(0, 0, 0,0 , 320, 200, dir_zona_pantalla); - stopSound(); + updateScreen(0, 0, 0,0 , 320, 200, screenSurface); + finishSound(); pause(17); sentido_hare = 3; - talk(_text[_lang][246],"246.als"); + talk(246); lleva_al_hare(89, 160); flags[10] = 1; - playSound("s7.als"); + playSound(7); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - stopSound(); + updateScreen(); + finishSound(); pause(14); sentido_hare = 3; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); talk_solo(_textd[_lang][18], "d18.als"); - FundeAlNegro(1); + fadeToBlack(1); } void DrasculaEngine::animation_15_5() { - talk_mus(_texte[_lang][4], "E4.als"); - talk_mus(_texte[_lang][5], "E5.als"); - talk_mus(_texte[_lang][6], "E6.als"); - talk(_text[_lang][291], "291.als"); - talk_mus(_texte[_lang][7], "E7.als"); + talk_mus(4); + talk_mus(5); + talk_mus(6); + talk(291); + talk_mus(7); } void DrasculaEngine::animation_16_5() { - talk_mus(_texte[_lang][8], "E8.als"); + talk_mus(8); } void DrasculaEngine::animation_17_5() { - talk_mus(_texte[_lang][9], "E9.als"); + talk_mus(9); } void DrasculaEngine::animation_1_6() { @@ -2266,87 +1878,82 @@ void DrasculaEngine::animation_1_6() { for (l = 0; l < 200; l++) factor_red[l] = 98; - loadPic("auxig2.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("auxdr.alg"); - decompressPic(dir_dibujo2, 1); - loadPic("car.alg"); - decompressPic(dir_hare_fondo, 1); - talk_dr_dch(_textd[_lang][19], "D19.als"); - talk(_text[_lang][247], "247.als"); - talk_dr_dch(_textd[_lang][20], "d20.als"); - talk_dr_dch(_textd[_lang][21], "d21.als"); - talk(_text[_lang][248], "248.als"); - talk_dr_dch(_textd[_lang][22], "d22.als"); - talk(_text[_lang][249], "249.als"); - talk_dr_dch(_textd[_lang][23], "d23.als"); - conversa("op_11.cal"); - talk_dr_dch(_textd[_lang][26], "d26.als"); - - anima("fum.bin", 15); - - talk_dr_dch(_textd[_lang][27], "d27.als"); - talk(_text[_lang][254], "254.als"); - talk_dr_dch(_textd[_lang][28], "d28.als"); - talk(_text[_lang][255], "255.als"); - talk_dr_dch(_textd[_lang][29], "d29.als"); - FundeAlNegro(1); + loadPic("auxig2.alg", frontSurface, 1); + loadPic("auxdr.alg", drawSurface2, 1); + loadPic("car.alg", backSurface, 1); + talk_drascula(19, 1); + talk(247); + talk_drascula(20, 1); + talk_drascula(21, 1); + talk(248); + talk_drascula(22, 1); + talk(249); + talk_drascula(23, 1); + converse("op_11.cal"); + talk_drascula(26, 1); + + animate("fum.bin", 15); + + talk_drascula(27, 1); + talk(254); + talk_drascula(28, 1); + talk(255); + talk_drascula(29, 1); + fadeToBlack(1); clearRoom(); - loadPic("time1.alg"); - decompressPic(dir_zona_pantalla, 1); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + loadPic("time1.alg", screenSurface, 1); + updateScreen(); delay(930); clearRoom(); black(); hare_se_ve = 0; flags[0] = 0; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - FundeDelNegro(1); - talk(_text[_lang][256], "256.als"); - talk_dr_dch(_textd[_lang][30], "d30.als"); - talk(_text[_lang][257], "257.als"); - FundeAlNegro(0); + updateScreen(); + fadeFromBlack(1); + talk(256); + talk_drascula(30, 1); + talk(257); + fadeToBlack(0); clearRoom(); - loadPic("time1.alg"); - decompressPic(dir_zona_pantalla,1); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + loadPic("time1.alg", screenSurface,1); + updateScreen(); delay(900); clearRoom(); black(); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - FundeDelNegro(1); - talk(_text[_lang][258], "258.als"); - talk_dr_dch(_textd[_lang][31], "d31.als"); + updateScreen(); + fadeFromBlack(1); + talk(258); + talk_drascula(31, 1); animation_5_6(); - talk_dr_dch(_textd[_lang][32], "d32.als"); - talk_igor_dch(_texti[_lang][11], "I11.als"); + talk_drascula(32, 1); + talk_igor(11, kIgorDch); sentido_igor = 3; - talk_dr_dch(_textd[_lang][33], "d33.als"); - talk_igor_frente(_texti[_lang][12], "I12.als"); - talk_dr_dch(_textd[_lang][34], "d34.als"); + talk_drascula(33, 1); + talk_igor(12, kIgorFront); + talk_drascula(34, 1); sentido_dr = 0; - talk_dr_izq(_textd[_lang][35], "d35.als"); + talk_drascula(35); if (_lang == kSpanish) - dir_texto = dir_hare_dch; + textSurface = extraSurface; clearRoom(); carga_escoba("102.ald"); - activa_pendulo(); + activatePendulum(); } void DrasculaEngine::animation_2_6() { - talk_dr_dch(_textd[_lang][24], "d24.als"); + talk_drascula(24, 1); } void DrasculaEngine::animation_3_6() { - talk_dr_dch(_textd[_lang][24], "d24.als"); + talk_drascula(24, 1); } void DrasculaEngine::animation_4_6() { - talk_dr_dch(_textd[_lang][25], "d25.als"); + talk_drascula(25, 1); } void DrasculaEngine::animation_5_6() { @@ -2359,17 +1966,17 @@ void DrasculaEngine::animation_5_6() { pos_pen[4] = 18; pos_pen[5] = 125; - anima("man.bin", 14); + animate("man.bin", 14); for (n = -125; n <= 0; n = n + 2) { - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); updateRefresh_pre(); pos_pen[3] = n; - copyRectClip(pos_pen, dir_dibujo3, dir_zona_pantalla); + copyRectClip(pos_pen, drawSurface3, screenSurface); updateRefresh(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); pause(2); } @@ -2377,26 +1984,22 @@ void DrasculaEngine::animation_5_6() { } void DrasculaEngine::animation_6_6() { - anima("rct.bin", 11); + animate("rct.bin", 11); clearRoom(); withoutVerb(); - resta_objeto(20); - loadPic("96.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("97.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("97.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); - rompo = 1; - obj_saliendo = 104; + removeObject(20); + loadPic("96.alg", frontSurface, 1); + loadPic("97.alg", frontSurface, 1); + loadPic("97.alg", extraSurface, 1); + loadPic("99.alg", backSurface, 1); + doBreak = 1; + objExit = 104; hare_x = -1; withoutVerb(); carga_escoba("58.ald"); hare_se_ve = 1; sentido_hare = 1; - anima("hbp.bin", 14); + animate("hbp.bin", 14); sentido_hare = 3; flags[0] = 1; @@ -2406,20 +2009,20 @@ void DrasculaEngine::animation_6_6() { void DrasculaEngine::animation_7_6() { flags[8] = 1; - updateData(); + updateVisible(); } void DrasculaEngine::animation_9_6() { int v_cd; - anima("fin.bin", 14); + animate("fin.bin", 14); playMusic(13); flags[5] = 1; - anima("drf.bin", 16); - FundeAlNegro(0); + animate("drf.bin", 16); + fadeToBlack(0); clearRoom(); hare_x = -1; - obj_saliendo = 108; + objExit = 108; carga_escoba("59.ald"); // The room number was originally changed here to "nada.alg", // which is a non-existant file. In reality, this was just a @@ -2429,24 +2032,22 @@ void DrasculaEngine::animation_9_6() { // Also check animation_2_1(), where the same hack was used // by the original roomNumber = -1; - loadPic("nota2.alg"); - decompressPic(dir_dibujo1, HALF_PAL); + loadPic("nota2.alg", drawSurface1, HALF_PAL); black(); sentido_hare = 1; hare_x -= 21; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - FundeDelNegro(0); + updateScreen(); + fadeFromBlack(0); pause(96); lleva_al_hare(116, 178); sentido_hare = 2; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); playMusic(9); clearRoom(); - loadPic("nota.alg"); - decompressPic(dir_dibujo1, COMPLETE_PAL); - color_abc(WHITE); + loadPic("nota.alg", drawSurface1, COMPLETE_PAL); + color_abc(kColorWhite); talk_solo(_textbj[_lang][24], "bj24.als"); talk_solo(_textbj[_lang][25], "bj25.als"); talk_solo(_textbj[_lang][26], "bj26.als"); @@ -2454,31 +2055,28 @@ void DrasculaEngine::animation_9_6() { talk_solo(_textbj[_lang][28], "bj28.als"); sentido_hare = 3; clearRoom(); - loadPic("96.alg"); - decompressPic(dir_hare_frente, COMPLETE_PAL); - loadPic("nota2.alg"); - decompressPic(dir_dibujo1, HALF_PAL); - talk(_text[_lang][296], "296.als"); - talk(_text[_lang][297], "297.als"); - talk(_text[_lang][298], "298.als"); + loadPic("96.alg", frontSurface, COMPLETE_PAL); + loadPic("nota2.alg", drawSurface1, HALF_PAL); + talk(296); + talk(297); + talk(298); sentido_hare = 1; - talk(_text[_lang][299], "299.als"); - talk(_text[_lang][300], "300.als"); + talk(299); + talk(300); updateRoom(); - copyBackground(0, 0, 0, 0, 320, 200, dir_zona_pantalla, dir_dibujo1); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - color_abc(LIGHT_GREEN); + copyBackground(0, 0, 0, 0, 320, 200, screenSurface, drawSurface1); + updateScreen(); + color_abc(kColorLightGreen); talk_solo("GOOOOOOOOOOOOOOOL", "s15.als"); - loadPic("nota2.alg"); - decompressPic(dir_dibujo1, 1); + loadPic("nota2.alg", drawSurface1, 1); sentido_hare = 0; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - talk(_text[_lang][301], "301.als"); + updateScreen(); + talk(301); v_cd = _mixer->getVolumeForSoundType(Audio::Mixer::kMusicSoundType) / 16; v_cd = v_cd + 4; playMusic(17); - FundeAlNegro(1); + fadeToBlack(1); clearRoom(); fliplay("qpc.bin", 1); MusicFadeout(); @@ -2491,243 +2089,221 @@ void DrasculaEngine::animation_9_6() { } void DrasculaEngine::animation_10_6() { - playSound ("s14.als"); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + playSound(14); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); updateRefresh_pre(); - copyBackground(164, 85, 155, 48, 113, 114, dir_dibujo3, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - stopSound(); - talk_taber2(_textt[_lang][23], "t23.als"); + copyBackground(164, 85, 155, 48, 113, 114, drawSurface3, screenSurface); + updateScreen(); + finishSound(); + talk_bartender(23, 1); flags[7] = 1; } void DrasculaEngine::animation_11_6() { - talk_taber2(_textt[_lang][10], "t10.als"); - talk(_text[_lang][268], "268.als"); - talk_taber2(_textt[_lang][11], "t11.als"); + talk_bartender(10, 1); + talk(268); + talk_bartender(11, 1); } void DrasculaEngine::animation_12_6() { - talk_taber2(_textt[_lang][12], "t12.als"); - talk(_text[_lang][270], "270.als"); - talk_taber2(_textt[_lang][13], "t13.als"); - talk_taber2(_textt[_lang][14], "t14.als"); + talk_bartender(12, 1); + talk(270); + talk_bartender(13, 1); + talk_bartender(14, 1); } void DrasculaEngine::animation_13_6() { - talk_taber2(_textt[_lang][15], "t15.als"); + talk_bartender(15, 1); } void DrasculaEngine::animation_14_6() { - talk_taber2(_textt[_lang][24], "t24.als"); - suma_objeto(21); + talk_bartender(24, 1); + addObject(21); flags[10] = 1; - rompo_y_salgo = 1; + breakOut = 1; } void DrasculaEngine::animation_15_6() { - talk_taber2(_textt[_lang][16], "t16.als"); + talk_bartender(16, 1); } void DrasculaEngine::animation_18_6() { flags[6] = 1; withoutVerb(); - resta_objeto(21); - anima("beb.bin", 10); + removeObject(21); + animate("beb.bin", 10); } void DrasculaEngine::animation_19_6() { - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - copyBackground(140, 23, 161, 69, 35, 80, dir_dibujo3, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + copyBackground(140, 23, 161, 69, 35, 80, drawSurface3, screenSurface); updateRefresh_pre(); pon_hare(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); pause(6); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - playSound("s4.als"); + updateScreen(); + playSound(4); pause(6); - stopSound(); + finishSound(); } void DrasculaEngine::animation_12_2() { if (_lang == kSpanish) - dir_texto = dir_hare_frente; + textSurface = frontSurface; - loadPic("an12.alg"); - decompressPic(dir_hare_dch, 1); + loadPic("an12.alg", extraSurface, 1); - talk(_text[_lang][356], "356.als"); + talk(356); updateRefresh_pre(); - copyBackground(1, 139, 228, 112, 47, 60, dir_hare_dch, dir_zona_pantalla); - updateScreen(228, 112, 228, 112, 47, 60, dir_zona_pantalla); + copyBackground(1, 139, 228, 112, 47, 60, extraSurface, screenSurface); + updateScreen(228, 112, 228, 112, 47, 60, screenSurface); pause(3); updateRefresh_pre(); - copyBackground(49, 139, 228, 112, 47, 60, dir_hare_dch, dir_zona_pantalla); + copyBackground(49, 139, 228, 112, 47, 60, extraSurface, screenSurface); pon_hare(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); pause(3); stopMusic(); flags[11] = 1; - talk_pianista(_textp[_lang][5], "P5.als"); - conversa("op_1.cal"); + talk_pianist(5); + converse("op_1.cal"); if (_lang == kSpanish) - dir_texto = dir_hare_dch; + textSurface = extraSurface; flags[11] = 0; - loadPic("974.alg"); - decompressPic(dir_hare_dch, 1); + loadPic("974.alg", extraSurface, 1); } void DrasculaEngine::animation_26_2() { - int n, x = 0; - if (_lang == kSpanish) - dir_texto = dir_hare_frente; + textSurface = frontSurface; - loadPic("an12.alg"); - decompressPic(dir_hare_dch, 1); + loadPic("an12.alg", extraSurface, 1); - talk(_text[_lang][392], "392.als"); + talk(392); updateRefresh_pre(); - copyBackground(1, 139, 228, 112, 47, 60, dir_hare_dch, dir_zona_pantalla); - updateScreen(228, 112, 228, 112, 47, 60, dir_zona_pantalla); + copyBackground(1, 139, 228, 112, 47, 60, extraSurface, screenSurface); + updateScreen(228, 112, 228, 112, 47, 60, screenSurface); pause(3); updateRefresh_pre(); - copyBackground(49, 139, 228, 112, 47, 60, dir_hare_dch, dir_zona_pantalla); + copyBackground(49, 139, 228, 112, 47, 60, extraSurface, screenSurface); pon_hare(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); pause(3); stopMusic(); flags[11] = 1; - talk_pianista(_textp[_lang][5], "P5.als"); - talk(_text[_lang][393], "393.als"); - talk_pianista(_textp[_lang][17], "P17.als"); - talk_pianista(_textp[_lang][18], "P18.als"); - talk_pianista(_textp[_lang][19], "P19.als"); + talk_pianist(5); + talk(393); + talk_pianist(17); + talk_pianist(18); + talk_pianist(19); - loadPic("an26.alg"); - decompressPic(dir_hare_dch, 1); - for (n = 0; n < 6; n++){ - x++; - copyBackground(x, 1, 225, 113, 50, 59, dir_hare_dch, dir_zona_pantalla); - updateScreen(225,113, 225,113, 50,59, dir_zona_pantalla); - x = x + 50; - pause(3); - } + loadPic("an26.alg", extraSurface, 1); + + updateAnim(1, 225, 113, 50, 59, 6, extraSurface); - x = 0; - for (n = 0; n < 6; n++) { + int x = 0; + for (int n = 0; n < 6; n++) { x++; - copyBackground(x, 61, 225, 113, 50, 59, dir_hare_dch, dir_zona_pantalla); - updateScreen(225, 113, 225, 113, 50, 59, dir_zona_pantalla); + copyBackground(x, 61, 225, 113, 50, 59, extraSurface, screenSurface); + updateScreen(225, 113, 225, 113, 50, 59, screenSurface); x = x + 50; if (n == 2) - playSound("s9.als"); + playSound(9); pause(3); } - stopSound_corte(); - x = 0; - for (n = 0; n < 6; n++) { - x++; - copyBackground(x, 121, 225, 113, 50, 59, dir_hare_dch, dir_zona_pantalla); - updateScreen(225, 113, 225, 113, 50, 59, dir_zona_pantalla); - x = x + 50; - pause(3); - } + stopSound(); + + updateAnim(121, 225, 113, 50, 59, 6, extraSurface); pickObject(11); - resta_objeto(12); + removeObject(12); if (_lang == kSpanish) - dir_texto = dir_hare_dch; + textSurface = extraSurface; flags[11] = 0; flags[39] = 1; - loadPic("974.alg"); - decompressPic(dir_hare_dch, 1); + loadPic("974.alg", extraSurface, 1); roomMusic = 16; } void DrasculaEngine::animation_11_2() { if (_lang == kSpanish) - dir_texto = dir_hare_frente; - - loadPic("an11y13.alg"); - decompressPic(dir_hare_dch, 1); - - talk(_text[_lang][352], "352.als"); - talk_tabernero(_textt[_lang][1], "T1.als"); - talk(_text[_lang][353], "353.als"); - talk_tabernero(_textt[_lang][17], "T17.als"); - talk(_text[_lang][354], "354.als"); - talk_tabernero(_textt[_lang][18], "T18.als"); - talk(_text[_lang][355], "355.als"); + textSurface = frontSurface; + + loadPic("an11y13.alg", extraSurface, 1); + + talk(352); + talk_bartender(1); + talk(353); + talk_bartender(17); + talk(354); + talk_bartender(18); + talk(355); pause(40); - talk_tabernero("No, nada", "d82.als"); + talk_bartender(82); if (_lang == kSpanish) - dir_texto = dir_hare_dch; + textSurface = extraSurface; - loadPic("974.alg"); - decompressPic(dir_hare_dch, 1); + loadPic("974.alg", extraSurface, 1); } void DrasculaEngine::animation_13_2() { - loadPic("an11y13.alg"); - decompressPic(dir_hare_frente, 1); + loadPic("an11y13.alg", frontSurface, 1); if (flags[41] == 0) { - talk(_text[_lang][103], "103.als"); - talk_borracho(_textb[_lang][4], "B4.als"); + talk(103); + talk_drunk(4); flags[12] = 1; - talk(_text[_lang][367], "367.als"); - talk_borracho(_textb[_lang][5], "B5.als"); + talk(367); + talk_drunk(5); flags[12] = 1; - talk(_text[_lang][368], "368.als"); - talk_borracho(_textb[_lang][6], "B6.als"); - talk_borracho(_textb[_lang][7], "B7.als"); + talk(368); + talk_drunk(6); + talk_drunk(7); flags[41] = 1; } - conversa("op_2.cal"); + converse("op_2.cal"); - loadPic("964.alg"); - decompressPic(dir_hare_frente, 1); + loadPic("964.alg", frontSurface, 1); } void DrasculaEngine::animation_18_2() { talk(378); talk_vbpuerta(4); - conversa("op_3.cal"); + converse("op_3.cal"); } void DrasculaEngine::animation_22_2() { - talk(_text[_lang][374],"374.als"); + talk(374); sentido_hare=2; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - playSound("s13.als"); - stopSound(); + updateScreen(); + playSound(13); + finishSound(); sentido_hare = 1; talk_vbpuerta(1); @@ -2749,8 +2325,7 @@ void DrasculaEngine::animation_24_2() { talk(356); - loadPic("an24.alg"); - decompressPic(dir_hare_frente, 1); + loadPic("an24.alg", frontSurface, 1); animation_32_2(); @@ -2759,11 +2334,11 @@ void DrasculaEngine::animation_24_2() { talk_vb(22); if (flags[22] == 0) - conversa("op_4.cal"); + converse("op_4.cal"); else - conversa("op_5.cal"); + converse("op_5.cal"); - sal_de_la_habitacion(0); + exitRoom(0); flags[21] = 0; flags[24] = 0; sentido_vb = 1; @@ -2771,482 +2346,161 @@ void DrasculaEngine::animation_24_2() { } void DrasculaEngine::animation_32_2() { - int n, x = 0; - - loadPic("an32_1.alg"); - decompressPic(dir_dibujo3, 1); - loadPic("an32_2.alg"); - decompressPic(dir_hare_fondo, 1); - - for (n = 0; n < 4; n++) { - x++; - copyBackground(x, 1, 113, 53, 65, 81, dir_dibujo3, dir_zona_pantalla); - updateScreen(113, 53, 113, 53, 65, 81, dir_zona_pantalla); - x = x + 65; - pause(4); - } + loadPic("an32_1.alg", drawSurface3, 1); + loadPic("an32_2.alg", backSurface, 1); - x = 0; - for (n = 0; n < 4; n++) { - x++; - copyBackground(x, 83, 113, 53, 65, 81, dir_dibujo3, dir_zona_pantalla); - updateScreen(113, 53, 113, 53, 65, 81, dir_zona_pantalla); - x = x + 65; - pause(4); - } - - x = 0; - for (n = 0; n < 4; n++) { - x++; - copyBackground(x, 1, 113, 53, 65, 81, dir_hare_fondo, dir_zona_pantalla); - updateScreen(113, 53, 113, 53, 65, 81, dir_zona_pantalla); - x = x + 65; - pause(4); - } + updateAnim(1, 113, 53, 65, 81, 4, drawSurface3, 4); + updateAnim(83, 113, 53, 65, 81, 4, drawSurface3, 4); + updateAnim(1, 113, 53, 65, 81, 4, backSurface, 4); - x = 0; - for (n = 0; n < 3; n++) { + int x = 0; + for (int n = 0; n < 3; n++) { x++; - copyBackground(x, 83, 113, 53, 65, 81, dir_hare_fondo, dir_zona_pantalla); - updateScreen(113, 53, 113, 53, 65, 81, dir_zona_pantalla); + copyBackground(x, 83, 113, 53, 65, 81, backSurface, screenSurface); + updateScreen(113, 53, 113, 53, 65, 81, screenSurface); x = x + 65; if (n < 2) pause(4); } - loadPic("aux18.alg"); - decompressPic(dir_dibujo3, 1); + loadPic("aux18.alg", drawSurface3, 1); } void DrasculaEngine::animation_34_2() { - int n, x = 0; - sentido_hare = 1; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); - loadPic("an34_1.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("an34_2.alg"); - decompressPic(dir_hare_dch, 1); + loadPic("an34_1.alg", backSurface, 1); + loadPic("an34_2.alg", extraSurface, 1); - for (n = 0; n < 3; n++) { - x++; - copyBackground(x, 1, 218, 79, 83, 75, dir_hare_fondo, dir_zona_pantalla); - updateScreen(218, 79, 218, 79, 83, 75, dir_zona_pantalla); - x = x + 83; - pause(3); - } + updateAnim(1, 218, 79, 83, 75, 3, backSurface); + updateAnim(77, 218, 79, 83, 75, 3, backSurface); - x = 0; + playSound(8); - for (n = 0; n < 3; n++) { - x++; - copyBackground(x, 77, 218, 79, 83, 75, dir_hare_fondo, dir_zona_pantalla); - updateScreen(218, 79, 218, 79, 83, 75, dir_zona_pantalla); - x = x + 83; - pause(3); - } + updateAnim(1, 218, 79, 83, 75, 3, extraSurface); - x = 0; - playSound("s8.als"); - - for (n = 0; n < 3; n++) { - x++; - copyBackground(x, 1, 218, 79, 83, 75, dir_hare_dch, dir_zona_pantalla); - updateScreen(218, 79, 218, 79, 83,75, dir_zona_pantalla); - x = x + 83; - pause(3); - } - stopSound(); + finishSound(); pause(30); - copyBackground(1, 77, 218, 79, 83, 75, dir_hare_dch, dir_zona_pantalla); - updateScreen(218, 79, 218, 79, 83, 75, dir_zona_pantalla); + copyBackground(1, 77, 218, 79, 83, 75, extraSurface, screenSurface); + updateScreen(218, 79, 218, 79, 83, 75, screenSurface); pause(3); - loadPic("994.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("974.alg"); - decompressPic(dir_hare_dch, 1); + loadPic("994.alg", backSurface, 1); + loadPic("974.alg", extraSurface, 1); } void DrasculaEngine::animation_36_2() { if (_lang == kSpanish) - dir_texto = dir_hare_frente; + textSurface = frontSurface; - loadPic("an11y13.alg"); - decompressPic(dir_hare_dch, 1); + loadPic("an11y13.alg", extraSurface, 1); - talk(_text[_lang][404], "404.als"); - talk_tabernero(_textt[_lang][19], "T19.als"); - talk_tabernero(_textt[_lang][20], "T20.als"); - talk_tabernero(_textt[_lang][21], "T21.als"); - talk(_text[_lang][355], "355.als"); + talk(404); + talk_bartender(19); + talk_bartender(20); + talk_bartender(21); + talk(355); pause(40); - talk_tabernero("No, nada", "d82.als"); + talk_bartender(82); if (_lang == kSpanish) - dir_texto = dir_hare_dch; + textSurface = extraSurface; - loadPic("974.alg"); - decompressPic(dir_hare_dch, 1); + loadPic("974.alg", extraSurface, 1); } void DrasculaEngine::animation_7_2() { - int n, x = 0; - - loadPic("an7_1.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("an7_2.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("an7_3.alg"); - decompressPic(dir_hare_frente, 1); + loadPic("an7_1.alg", backSurface, 1); + loadPic("an7_2.alg", extraSurface, 1); + loadPic("an7_3.alg", frontSurface, 1); if (flags[3] == 1) - copyBackground(258, 110, 85, 44, 23, 53, dir_dibujo3, dir_dibujo1); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - for (n = 0; n < 6; n++) { - x++; - copyBackground(80, 64, 80, 64, 51, 73, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 1, 80, 64, 51, 73, dir_hare_fondo, dir_zona_pantalla); - updateScreen(80, 64, 80, 64, 51, 73, dir_zona_pantalla); - x = x + 51; - pause(3); - } - - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(80, 64, 80, 64, 51, 73, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 75, 80, 64, 51, 73, dir_hare_fondo, dir_zona_pantalla); - updateScreen(80, 64, 80, 64, 51, 73, dir_zona_pantalla); - x = x + 51; - pause(3); - } - - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(80, 64, 80, 64, 51, 73, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 1, 80, 64, 51, 73, dir_hare_dch, dir_zona_pantalla); - updateScreen(80, 64, 80, 64, 51, 73, dir_zona_pantalla); - x = x + 51; - pause(3); - } - - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(80, 64, 80, 64, 51, 73, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 75, 80, 64, 51, 73, dir_hare_dch, dir_zona_pantalla); - updateScreen(80, 64, 80, 64, 51, 73, dir_zona_pantalla); - x = x + 51; - pause(3); - } + copyBackground(258, 110, 85, 44, 23, 53, drawSurface3, drawSurface1); - x = 0; + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); - for (n = 0; n < 6; n++) { - x++; - copyBackground(80, 64, 80, 64, 51, 73, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 1, 80, 64, 51, 73, dir_hare_frente, dir_zona_pantalla); - updateScreen(80, 64, 80, 64, 51, 73, dir_zona_pantalla); - x = x + 51; - pause(3); - } - loadPic("an7_4.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("an7_5.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("an7_6.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("an7_7.alg"); - decompressPic(dir_dibujo3, 1); - - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(80, 64, 80, 64, 51, 73, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 1, 80, 64, 51, 73, dir_hare_fondo, dir_zona_pantalla); - updateScreen(80, 64, 80, 64, 51, 73, dir_zona_pantalla); - x = x + 51; - pause(3); - } + updateScreen(); - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(80, 64, 80, 64, 51, 73, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 75, 80, 64, 51, 73, dir_hare_fondo, dir_zona_pantalla); - updateScreen(80, 64, 80, 64, 51, 73, dir_zona_pantalla); - x = x + 51; - pause(3); - } + updateAnim2(1, 80, 64, 51, 73, 6, backSurface); + updateAnim2(75, 80, 64, 51, 73, 6, backSurface); + updateAnim2(1, 80, 64, 51, 73, 6, extraSurface); + updateAnim2(75, 80, 64, 51, 73, 6, extraSurface); + updateAnim2(1, 80, 64, 51, 73, 6, frontSurface); - x = 0; + loadPic("an7_4.alg", backSurface, 1); + loadPic("an7_5.alg", extraSurface, 1); + loadPic("an7_6.alg", frontSurface, 1); + loadPic("an7_7.alg", drawSurface3, 1); - for (n = 0; n < 6; n++) { - x++; - copyBackground(80, 64, 80, 64, 51, 73, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 1, 80, 64, 51,73, dir_hare_dch, dir_zona_pantalla); - updateScreen(80, 64, 80, 64, 51, 73, dir_zona_pantalla); - x = x + 51; - pause(3); - } + updateAnim2(1, 80, 64, 51, 73, 6, backSurface); + updateAnim2(75, 80, 64, 51, 73, 6, backSurface); + updateAnim2(1, 80, 64, 51, 73, 6, extraSurface); + updateAnim2(75, 80, 64, 51, 73, 6, extraSurface); + updateAnim2(1, 80, 64, 51, 73, 6, frontSurface); + updateAnim2(75, 80, 64, 51, 73, 6, extraSurface); + updateAnim2(1, 80, 64, 51, 73, 6, frontSurface); + updateAnim2(75, 80, 64, 51, 73, 6, frontSurface); + updateAnim2(1, 80, 64, 51, 73, 6, drawSurface3); + updateAnim2(75, 80, 64, 51, 73, 2, drawSurface3); - x = 0; + loadPic("an7_8.alg", backSurface, 1); + loadPic("an7_9.alg", extraSurface, 1); - for (n = 0; n < 6; n++) { - x++; - copyBackground(80, 64, 80, 64, 51, 73, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 75, 80, 64, 51, 73, dir_hare_dch, dir_zona_pantalla); - updateScreen(80, 64, 80, 64, 51, 73, dir_zona_pantalla); - x = x + 51; - pause(3); - } + updateAnim2(1, 80, 64, 51, 73, 6, backSurface); + updateAnim2(75, 80, 64, 51, 73, 6, backSurface); + updateAnim2(1, 80, 64, 51, 73, 6, extraSurface); - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(80, 64, 80, 64, 51, 73, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 1, 80, 64, 51, 73, dir_hare_frente, dir_zona_pantalla); - updateScreen(80, 64, 80, 64, 51, 73, dir_zona_pantalla); - x = x + 51; - pause(3); - } - - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(80, 64, 80, 64, 51, 73, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 75, 80, 64, 51, 73, dir_hare_dch, dir_zona_pantalla); - updateScreen(80, 64, 80, 64, 51, 73, dir_zona_pantalla); - x = x + 51; - pause(3); - } - - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(80, 64, 80, 64, 51, 73, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 1, 80, 64, 51, 73, dir_hare_frente, dir_zona_pantalla); - updateScreen(80, 64, 80, 64, 51, 73, dir_zona_pantalla); - x = x + 51; - pause(3); - } - - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(80, 64, 80, 64, 51, 73, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 75, 80, 64, 51, 73, dir_hare_frente, dir_zona_pantalla); - updateScreen(80, 64, 80, 64, 51, 73, dir_zona_pantalla); - x = x + 51; - pause(3); - } - - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(80, 64, 80, 64, 51, 73, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 1, 80, 64, 51, 73, dir_dibujo3, dir_zona_pantalla); - updateScreen(80, 64, 80, 64, 51, 73, dir_zona_pantalla); - x = x + 51; - pause(3); - } - - x = 0; - - for (n = 0; n < 2; n++) { - x++; - copyBackground(80, 64, 80, 64, 51, 73, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 75, 80, 64, 51, 73, dir_dibujo3, dir_zona_pantalla); - updateScreen(80, 64, 80, 64, 51, 73, dir_zona_pantalla); - x = x + 51; - pause(3); - } - loadPic("an7_8.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("an7_9.alg"); - decompressPic(dir_hare_dch, 1); - - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(80, 64, 80, 64, 51, 73, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 1, 80, 64, 51, 73, dir_hare_fondo, dir_zona_pantalla); - updateScreen(80, 64, 80, 64, 51, 73, dir_zona_pantalla); - x = x + 51; - pause(3); - } - - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(80, 64, 80, 64, 51, 73, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 75, 80, 64, 51, 73, dir_hare_fondo, dir_zona_pantalla); - updateScreen(80, 64, 80, 64, 51, 73, dir_zona_pantalla); - x = x + 51; - pause(3); - } - - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(80, 64, 80, 64, 51, 73, dir_dibujo1, dir_zona_pantalla); - copyRect(x, 1, 80, 64, 51, 73, dir_hare_dch, dir_zona_pantalla); - updateScreen(80, 64, 80, 64, 51, 73, dir_zona_pantalla); - x = x + 51; - pause(3); - } - - - copyBackground(80, 64, 80, 64, 51, 73, dir_dibujo1, dir_zona_pantalla); - copyRect(1, 75, 80, 64, 51, 73, dir_hare_dch, dir_zona_pantalla); - updateScreen(80, 64, 80, 64, 51, 73, dir_zona_pantalla); + copyBackground(80, 64, 80, 64, 51, 73, drawSurface1, screenSurface); + copyRect(1, 75, 80, 64, 51, 73, extraSurface, screenSurface); + updateScreen(80, 64, 80, 64, 51, 73, screenSurface); flags[37] = 1; if (flags[7] == 1 && flags[26] == 1 && flags[34] == 1 && flags[35] == 1 && flags[37] == 1) flags[38] = 1; - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("97.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("96.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("aux3.alg"); - decompressPic(dir_dibujo3, 1); + loadPic("99.alg", backSurface, 1); + loadPic("97.alg", extraSurface, 1); + loadPic("96.alg", frontSurface, 1); + loadPic("aux3.alg", drawSurface3, 1); } void DrasculaEngine::animation_5_2() { - int n, x = 0; - sentido_hare = 0; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - loadPic("an5_1.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("an5_2.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("an5_3.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("an5_4.alg"); - decompressPic(dir_dibujo3, 1); - - copyBackground(1, 1, 213, 66, 53,84, dir_hare_fondo, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - for (n = 0; n < 6; n++) { - x++; - copyBackground(x, 1, 213, 66, 53, 84, dir_hare_fondo, dir_zona_pantalla); - updateScreen(213, 66, 213, 66, 53, 84,dir_zona_pantalla); - x = x + 52; - pause(3); - } - - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(x, 86, 213, 66, 53, 84, dir_hare_fondo, dir_zona_pantalla); - updateScreen(213, 66, 213, 66, 53, 84, dir_zona_pantalla); - x = x + 52; - pause(3); - } - - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(x, 1, 213, 66, 53, 84, dir_hare_dch, dir_zona_pantalla); - updateScreen(213, 66, 213, 66, 53, 84, dir_zona_pantalla); - x = x + 52; - pause(3); - } - - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(x, 1, 213, 66, 53, 84, dir_hare_dch, dir_zona_pantalla); - updateScreen(213, 66, 213, 66, 53, 84, dir_zona_pantalla); - x = x + 52; - pause(3); - } - - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(x, 86, 213, 66, 53, 84, dir_hare_dch, dir_zona_pantalla); - updateScreen(213, 66, 213, 66, 53, 84, dir_zona_pantalla); - x = x + 52; - pause(3); - } - - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(x, 1, 213, 66, 53, 84, dir_hare_frente, dir_zona_pantalla); - updateScreen(213, 66, 213, 66, 53, 84, dir_zona_pantalla); - x = x + 52; - pause(3); - } - - playSound("s1.als"); - - x = 0; - - for (n = 0; n < 6; n++) { - x++; - copyBackground(x, 86, 213, 66, 53, 84, dir_hare_frente, dir_zona_pantalla); - updateScreen(213, 66, 213, 66, 53, 84, dir_zona_pantalla); - x = x + 52; - pause(3); - } - stopSound_corte(); - - x = 0; + updateScreen(); + + loadPic("an5_1.alg", backSurface, 1); + loadPic("an5_2.alg", extraSurface, 1); + loadPic("an5_3.alg", frontSurface, 1); + loadPic("an5_4.alg", drawSurface3, 1); + + copyBackground(1, 1, 213, 66, 53,84, backSurface, screenSurface); + updateScreen(); + + // FIXME: the widths in these calls were 53 and 52 (by mistake, probably). + // I've set them to 53, but if any problems arise, we should try 52 as well + updateAnim(1, 213, 66, 53, 84, 6, backSurface); + updateAnim(86, 213, 66, 53, 84, 6, backSurface); + updateAnim(1, 213, 66, 53, 84, 6, extraSurface); + updateAnim(1, 213, 66, 53, 84, 6, extraSurface); + updateAnim(86, 213, 66, 53, 84, 6, extraSurface); + updateAnim(1, 213, 66, 53, 84, 6, frontSurface); + + playSound(1); + updateAnim(86, 213, 66, 53, 84, 6, frontSurface); + stopSound(); - for (n = 0; n < 6; n++) { - x++; - copyBackground(x, 1, 213, 66, 53, 84, dir_dibujo3, dir_zona_pantalla); - updateScreen(213, 66, 213, 66, 53, 84, dir_zona_pantalla); - x = x + 52; - pause(3); - } + updateAnim(1, 213, 66, 53, 84, 6, drawSurface3); - loadPic("994.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("974.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("964.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("aux5.alg"); - decompressPic(dir_dibujo3, 1); + loadPic("994.alg", backSurface, 1); + loadPic("974.alg", extraSurface, 1); + loadPic("964.alg", frontSurface, 1); + loadPic("aux5.alg", drawSurface3, 1); flags[8] = 1; hare_x = hare_x - 4; talk_sinc(_text[_lang][46], "46.als", "4442444244244"); @@ -3258,54 +2512,44 @@ void DrasculaEngine::animation_6_2() { flags[9] = 1; if (_lang == kSpanish) - dir_texto = dir_hare_frente; + textSurface = frontSurface; clearRoom(); - loadPic("ciego1.alg"); - decompressPic(dir_dibujo1, HALF_PAL); - loadPic("ciego2.alg"); - decompressPic(dir_dibujo3, 1); - loadPic("ciego3.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("ciego4.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("ciego5.alg"); - decompressPic(dir_hare_frente, 1); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + loadPic("ciego1.alg", drawSurface1, HALF_PAL); // ciego = blind + loadPic("ciego2.alg", drawSurface3, 1); + loadPic("ciego3.alg", extraSurface, 1); + loadPic("ciego4.alg", backSurface, 1); + loadPic("ciego5.alg", frontSurface, 1); + + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + updateScreen(); pause(1); if (flags[4] == 1) talk_hacker(_textd[_lang][66], "d66.als"); pause(6); - talk_ciego(_textd[_lang][78], "d78.als", _textd1[_lang][78 - TEXTD_START]); + talk_blind(11); pause(4); talk_hacker(_textd[_lang][67], "d67.als"); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + updateScreen(); pause(10); clearRoom(); playMusic(roomMusic); - loadPic("9.alg"); - decompressPic(dir_dibujo1, HALF_PAL); - loadPic("aux9.alg"); - decompressPic(dir_dibujo3, 1); - loadPic("96.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("97.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); + loadPic("9.alg", drawSurface1, HALF_PAL); + loadPic("aux9.alg", drawSurface3, 1); + loadPic("96.alg", frontSurface, 1); + loadPic("97.alg", extraSurface, 1); + loadPic("99.alg", backSurface, 1); withoutVerb(); if (_lang == kSpanish) - dir_texto = dir_hare_dch; + textSurface = extraSurface; flags[9] = 0; } @@ -3315,59 +2559,49 @@ void DrasculaEngine::animation_33_2() { flags[9] = 1; pause(12); - talk(_textd[_lang][56], "d56.als" ); + talk(56); pause(8); clearRoom(); - loadPic("ciego1.alg"); - decompressPic(dir_dibujo1, HALF_PAL); - loadPic("ciego2.alg"); - decompressPic(dir_dibujo3, 1); - loadPic("ciego3.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("ciego4.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("ciego5.alg"); - decompressPic(dir_hare_frente, 1); + loadPic("ciego1.alg", drawSurface1, HALF_PAL); // ciego = blind + loadPic("ciego2.alg", drawSurface3, 1); + loadPic("ciego3.alg", extraSurface, 1); + loadPic("ciego4.alg", backSurface, 1); + loadPic("ciego5.alg", frontSurface, 1); if (_lang == kSpanish) - dir_texto = dir_hare_frente; + textSurface = frontSurface; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + updateScreen(); pause(10); - talk_ciego(_textd[_lang][68], "d68.als", _textd1[_lang][68 - TEXTD_START]); + talk_blind(1); pause(5); talk_hacker(_textd[_lang][57], "d57.als"); pause(6); _system->delayMillis(1000); - talk_ciego(_textd[_lang][77], "d77.als", _textd1[_lang][77 - TEXTD_START]); + talk_blind(10); talk_hacker(_textd[_lang][65], "d65.als"); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + updateScreen(); pause(14); clearRoom(); playMusic(roomMusic); - loadPic("9.alg"); - decompressPic(dir_dibujo1, HALF_PAL); - loadPic("aux9.alg"); - decompressPic(dir_dibujo3, 1); - loadPic("96.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("97.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); + loadPic("9.alg", drawSurface1, HALF_PAL); + loadPic("aux9.alg", drawSurface3, 1); + loadPic("96.alg", frontSurface, 1); + loadPic("97.alg", extraSurface, 1); + loadPic("99.alg", backSurface, 1); withoutVerb(); if (_lang == kSpanish) - dir_texto = dir_hare_dch; + textSurface = extraSurface; flags[33] = 1; flags[9] = 0; @@ -3376,89 +2610,85 @@ void DrasculaEngine::animation_33_2() { void DrasculaEngine::animation_1_4() { if (flags[21] == 0) { strcpy(objName[2], "igor"); - talk(_text[_lang][275], "275.als"); + talk(275); updateRefresh_pre(); - copyBackground(131, 133, 199, 95, 50, 66, dir_dibujo3, dir_zona_pantalla); - updateScreen(199, 95, 199, 95, 50, 66, dir_zona_pantalla); + copyBackground(131, 133, 199, 95, 50, 66, drawSurface3, screenSurface); + updateScreen(199, 95, 199, 95, 50, 66, screenSurface); pause(3); updateRefresh_pre(); - copyBackground(182, 133, 199, 95, 50, 66, dir_dibujo3, dir_zona_pantalla); + copyBackground(182, 133, 199, 95, 50, 66, drawSurface3, screenSurface); pon_hare(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); pause(3); flags[18] = 1; flags[20] = 1; - talk_igor_sentado(_texti[_lang][13], "I13.als"); - talk_igor_sentado(_texti[_lang][14], "I14.als"); - talk_igor_sentado(_texti[_lang][15], "I15.als"); + talk_igor(13, kIgorSeated); + talk_igor(14, kIgorSeated); + talk_igor(15, kIgorSeated); flags[21] = 1; } else { - talk(_text[_lang][356], "356.als"); + talk(356); updateRefresh_pre(); - copyBackground(131, 133, 199, 95, 50, 66, dir_dibujo3, dir_zona_pantalla); - updateScreen(199, 95, 199, 95, 50, 66, dir_zona_pantalla); + copyBackground(131, 133, 199, 95, 50, 66, drawSurface3, screenSurface); + updateScreen(199, 95, 199, 95, 50, 66, screenSurface); pause(2); updateRefresh_pre(); - copyBackground(182, 133, 199, 95, 50, 66, dir_dibujo3, dir_zona_pantalla); + copyBackground(182, 133, 199, 95, 50, 66, drawSurface3, screenSurface); pon_hare(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); flags[18] = 1; flags[20] = 1; - talk(_text[_lang][276], "276.als"); + talk(276); pause(14); - talk_igor_sentado(_texti[_lang][6], "I6.als"); + talk_igor(6, kIgorSeated); } - conversa("op_6.cal"); + converse("op_6.cal"); flags[20] = 0; flags[18] = 0; } void DrasculaEngine::animation_5_4(){ sentido_hare = 3; - loadPic("anh_dr.alg"); - decompressPic(dir_hare_fondo, 1); + loadPic("anh_dr.alg", backSurface, 1); lleva_al_hare(99, 160); lleva_al_hare(38, 177); hare_se_ve = 0; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); delay(800); - anima("bio.bin", 14); + animate("bio.bin", 14); flags[29] = 1; hare_x = 95; hare_y = 82; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); openDoor(2, 0); - loadPic("auxigor.alg"); - decompressPic(dir_hare_frente, 1); - x_igor = 100; - y_igor = 65; - talk_igor_frente(_texti[_lang][29], "I29.ALS"); - talk_igor_frente(_texti[_lang][30], "I30.als"); - loadPic("96.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); + loadPic("auxigor.alg", frontSurface, 1); + igorX = 100; + igorY = 65; + talk_igor(29, kIgorFront); + talk_igor(30, kIgorFront); + loadPic("96.alg", frontSurface, 1); + loadPic("99.alg", backSurface, 1); hare_se_ve = 1; - FundeAlNegro(0); - sal_de_la_habitacion(0); + fadeToBlack(0); + exitRoom(0); } void DrasculaEngine::animation_6_4() { @@ -3466,30 +2696,24 @@ void DrasculaEngine::animation_6_4() { roomNumber = 26; clearRoom(); - loadPic("26.alg"); - decompressPic(dir_dibujo1, HALF_PAL); - loadPic("aux26.alg"); - decompressPic(dir_dibujo3, 1); - loadPic("auxigor.alg"); - decompressPic(dir_hare_frente, 1); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + loadPic("26.alg", drawSurface1, HALF_PAL); + loadPic("aux26.alg", drawSurface3, 1); + loadPic("auxigor.alg", frontSurface, 1); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); update_26_pre(); - x_igor = 104; - y_igor = 71; - pon_igor(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + igorX = 104; + igorY = 71; + placeIgor(); + updateScreen(); pause(40); - talk_igor_frente(_texti[_lang][26], "I26.als"); + talk_igor(26, kIgorFront); roomNumber = prevRoom; clearRoom(); - loadPic("96.alg"); - decompressPic(dir_hare_frente, 1); - loadPic(roomDisk); - decompressPic(dir_dibujo3, 1); + loadPic("96.alg", frontSurface, 1); + loadPic(roomDisk, drawSurface3, 1); char rm[20]; sprintf(rm, "%i.alg", roomNumber); - loadPic(rm); - decompressPic(dir_dibujo1, HALF_PAL); + loadPic(rm, drawSurface1, HALF_PAL); withoutVerb(); updateRoom(); } @@ -3499,23 +2723,21 @@ void DrasculaEngine::animation_8_4() { int estanteria_x[] = {1, 75, 149, 223, 1, 75, 149, 223, 149, 223, 149, 223, 149, 223}; int estanteria_y[] = {1, 1, 1, 1, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74}; - loadPic("an_8.alg"); - decompressPic(dir_hare_frente, 1); + loadPic("an_8.alg", frontSurface, 1); for (frame = 0; frame < 14; frame++) { pause(2); - copyBackground(estanteria_x[frame], estanteria_y[frame], 77, 45, 73, 72, dir_hare_frente, dir_zona_pantalla); - updateScreen(77, 45, 77, 45, 73, 72, dir_zona_pantalla); + copyBackground(estanteria_x[frame], estanteria_y[frame], 77, 45, 73, 72, frontSurface, screenSurface); + updateScreen(77, 45, 77, 45, 73, 72, screenSurface); } - loadPic("96.alg"); - decompressPic(dir_hare_frente, 1); + loadPic("96.alg", frontSurface, 1); openDoor(7, 2); } void DrasculaEngine::animation_9_4() { - anima("st.bin", 14); - FundeAlNegro(1); + animate("st.bin", 14); + fadeToBlack(1); } diff --git a/engines/drascula/detection.cpp b/engines/drascula/detection.cpp index b3d8d964c8..a426857fbd 100644 --- a/engines/drascula/detection.cpp +++ b/engines/drascula/detection.cpp @@ -35,31 +35,25 @@ namespace Drascula { struct DrasculaGameDescription { Common::ADGameDescription desc; - - int gameID; - int gameType; - uint32 features; - uint16 version; }; -uint32 DrasculaEngine::getGameID() const { - return _gameDescription->gameID; -} - uint32 DrasculaEngine::getFeatures() const { - return _gameDescription->features; + return _gameDescription->desc.flags; } -Common::Platform DrasculaEngine::getPlatform() const { - return _gameDescription->desc.platform; +Common::Language DrasculaEngine::getLanguage() const { + return _gameDescription->desc.language; } -uint16 DrasculaEngine::getVersion() const { - return _gameDescription->version; -} +void DrasculaEngine::loadArchives() { + const Common::ADGameFileDescription *ag; -Common::Language DrasculaEngine::getLanguage() const { - return _gameDescription->desc.language; + if (getFeatures() & GF_PACKED) { + for (ag = _gameDescription->desc.filesDescriptions; ag->fileName; ag++) + _arj.registerArchive(ag->fileName); + } + + _arj.enableFallback(true); } } @@ -84,10 +78,62 @@ static const DrasculaGameDescription gameDescriptions[] = { Common::kPlatformPC, Common::ADGF_NO_FLAGS }, - 0, - 0, - 0, - 0, + }, + + { + // Drascula English version (original packed files) + { + "drascula", + 0, + AD_ENTRY1s("packet.001", "c6a8697396e213a18472542d5f547cb4", 32847563), + Common::EN_ANY, + Common::kPlatformPC, + Common::ADGF_KEEPMATCH | GF_PACKED + }, + }, + + { + // Drascula German version (original packed files) + { + "drascula", + 0, + { + {"packet.001", 0, "c6a8697396e213a18472542d5f547cb4", 32847563}, + {"packet.003", 0, "e8f4dc6091037329bab4ddb1cba35807", 719728}, + {NULL, 0, NULL, 0} + }, + Common::DE_DEU, + Common::kPlatformPC, + GF_PACKED + }, + }, + + { + // Drascula French version (original packed files) + { + "drascula", + 0, + { + {"packet.001", 0, "c6a8697396e213a18472542d5f547cb4", 32847563}, + {"packet.002", 0, "4401123400f22f212b89f15fb4b43013", 721122}, + {NULL, 0, NULL, 0} + }, + Common::FR_FRA, + Common::kPlatformPC, + GF_PACKED + }, + }, + + { + // Drascula Spanish version (original packed version) + { + "drascula", + 0, + AD_ENTRY1s("packet.001", "3c971aba65a037d29d0b479cad6f5943", 31702652), + Common::ES_ESP, + Common::kPlatformPC, + GF_PACKED + }, }, { @@ -100,10 +146,6 @@ static const DrasculaGameDescription gameDescriptions[] = { Common::kPlatformPC, Common::ADGF_NO_FLAGS }, - 0, - 0, - 0, - 0, }, { @@ -116,10 +158,6 @@ static const DrasculaGameDescription gameDescriptions[] = { Common::kPlatformPC, Common::ADGF_NO_FLAGS }, - 0, - 0, - 0, - 0, }, { @@ -132,13 +170,20 @@ static const DrasculaGameDescription gameDescriptions[] = { Common::kPlatformPC, Common::ADGF_NO_FLAGS }, - 0, - 0, - 0, - 0, }, { + // Drascula Italian version (original packed version) + { + "drascula", + 0, + AD_ENTRY1s("packet.001", "0253e924af223f5fe52537023385159b", 32564209), + Common::IT_ITA, + Common::kPlatformPC, + GF_PACKED + }, + }, + { // Drascula Italian version { "drascula", @@ -148,32 +193,9 @@ static const DrasculaGameDescription gameDescriptions[] = { Common::kPlatformPC, Common::ADGF_NO_FLAGS }, - 0, - 0, - 0, - 0, }, - { AD_TABLE_END_MARKER, 0, 0, 0, 0 } -}; - -/** - * The fallback game descriptor used by the Drascula engine's fallbackDetector. - * Contents of this struct are to be overwritten by the fallbackDetector. - */ -static DrasculaGameDescription g_fallbackDesc = { - { - "", - "", - AD_ENTRY1(0, 0), // This should always be AD_ENTRY1(0, 0) in the fallback descriptor - Common::UNK_LANG, - Common::kPlatformPC, - Common::ADGF_NO_FLAGS - }, - 0, - 0, - 0, - 0, + { AD_TABLE_END_MARKER } }; } // End of namespace Drascula @@ -210,9 +232,6 @@ public: } virtual bool createInstance(OSystem *syst, Engine **engine, const Common::ADGameDescription *desc) const; - - const Common::ADGameDescription *fallbackDetect(const FSList *fslist) const; - }; bool DrasculaMetaEngine::createInstance(OSystem *syst, Engine **engine, const Common::ADGameDescription *desc) const { @@ -223,21 +242,6 @@ bool DrasculaMetaEngine::createInstance(OSystem *syst, Engine **engine, const Co return gd != 0; } -const Common::ADGameDescription *DrasculaMetaEngine::fallbackDetect(const FSList *fslist) const { - // Set the default values for the fallback descriptor's ADGameDescription part. - Drascula::g_fallbackDesc.desc.language = Common::UNK_LANG; - Drascula::g_fallbackDesc.desc.platform = Common::kPlatformPC; - Drascula::g_fallbackDesc.desc.flags = Common::ADGF_NO_FLAGS; - - // Set default values for the fallback descriptor's DrasculaGameDescription part. - Drascula::g_fallbackDesc.gameID = 0; - Drascula::g_fallbackDesc.features = 0; - Drascula::g_fallbackDesc.version = 0; - - //return (const Common::ADGameDescription *)&Drascula::g_fallbackDesc; - return NULL; -} - #if PLUGIN_ENABLED_DYNAMIC(DRASCULA) REGISTER_PLUGIN_DYNAMIC(DRASCULA, PLUGIN_TYPE_ENGINE, DrasculaMetaEngine); #else diff --git a/engines/drascula/drascula.cpp b/engines/drascula/drascula.cpp index 5c274b1ef0..4c3580caf1 100644 --- a/engines/drascula/drascula.cpp +++ b/engines/drascula/drascula.cpp @@ -58,13 +58,6 @@ DrasculaEngine::DrasculaEngine(OSystem *syst, const DrasculaGameDescription *gam _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume")); _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume")); - const GameSettings *g; - - const char *gameid = ConfMan.get("gameid").c_str(); - for (g = drasculaSettings; g->gameid; ++g) - if (!scumm_stricmp(g->gameid, gameid)) - _gameId = g->id; - _rnd = new Common::RandomSource(); syst->getEventManager()->registerRandomSource(*_rnd, "drascula"); @@ -79,48 +72,6 @@ DrasculaEngine::~DrasculaEngine() { delete _rnd; } -struct ItemLocation { - int x; - int y; -}; - -ItemLocation itemLocations[] = { - { 0, 0 }, // empty - { 5, 10 }, { 50, 10 }, { 95, 10 }, // 1-3 - { 140, 10 }, { 185, 10 }, { 230, 10 }, // 4-6 - { 275, 10 }, { 5, 40 }, { 50, 40 }, // 7-9 - { 95, 40 }, { 140, 40 }, { 185, 40 }, // 10-12 - { 230, 40 }, { 275, 40 }, { 5, 70 }, // 13-15 - { 50, 70 }, { 95, 70 }, { 140, 70 }, // 16-18 - { 185, 70 }, { 230, 70 }, { 275, 70 }, // 19-21 - { 5, 100 }, { 50, 100 }, { 95, 100 }, // 22-24 - { 140, 100 }, { 185, 100 }, { 230, 100 }, // 25-27 - { 275, 100 }, { 5, 130 }, { 50, 130 }, // 28-30 - { 95, 130 }, { 140, 130 }, { 185, 130 }, // 31-33 - { 230, 130 }, { 275, 130 }, { 5, 160 }, // 34-36 - { 50, 160 }, { 95, 160 }, { 140, 160 }, // 37-39 - { 185, 160 }, { 230, 160 }, { 275, 160 }, // 40-42 - { 275, 160 } // 43 -}; - -static const int x_pol[44] = {0, 1, 42, 83, 124, 165, 206, 247, 83, 1, 206, - 1, 42, 83, 124, 165, 206, 247, 83, 1, 206, - 247, 83, 165, 1, 206, 42, 124, 83, 1, 247, - 83, 165, 1, 206, 42, 124, 83, 1, 247, 42, - 1, 165, 206}; -static const int y_pol[44] = {0, 1, 1, 1, 1, 1, 1, 1, 27, 27, 1, - 27, 27, 27, 27, 27, 27, 27, 1, 1, 27, - 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, - 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, - 27, 1, 1}; -static const int x_barra[] = {6, 51, 96, 141, 186, 232, 276, 321}; -static const int x1d_menu[] = {280, 40, 80, 120, 160, 200, 240, 0, 40, 80, 120, - 160, 200, 240, 0, 40, 80, 120, 160, 200, 240, 0, - 40, 80, 120, 160, 200, 240, 0}; -static const int y1d_menu[] = {0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, - 50, 50, 50, 50, 50, 50, 50, 75, 75, 75, 75, 75, 75, 75, 100}; -static int frame_x[20] = {43, 87, 130, 173, 216, 259}; - int DrasculaEngine::init() { // Initialize backend _system->beginGFXTransaction(); @@ -149,11 +100,13 @@ int DrasculaEngine::init() { _lang = 0; } + loadArchives(); + return 0; } int DrasculaEngine::go() { - num_ejec = 1; // values from 1 to 6 will start each part of game + currentChapter = 1; // values from 1 to 6 will start each part of game hay_que_load = 0; for (;;) { @@ -162,38 +115,35 @@ int DrasculaEngine::go() { VGA = (byte *)malloc(320 * 200); memset(VGA, 0, 64000); - lleva_objeto = 0; - menu_bar = 0; menu_scr = 0; hay_nombre = 0; + takeObject = 0; + menuBar = 0; menuScreen = 0; hasName = 0; frame_y = 0; - hare_x = -1; hare_se_mueve = 0; sentido_hare = 3; num_frame = 0; hare_se_ve = 1; - comprueba_flags = 1; - rompo = 0; rompo2 = 0; - anda_a_objeto = 0; - step_x = PASO_HARE_X; step_y = PASO_HARE_Y; - alto_hare = CHARACTER_HEIGHT; ancho_hare = CHARACTER_WIDTH; alto_pies = PIES_HARE; - alto_talk = ALTO_TALK_HARE; ancho_talk = ANCHO_TALK_HARE; - hay_answer = 0; - conta_ciego_vez = 0; - cambio_de_color = 0; - rompo_y_salgo = 0; + hare_x = -1; characterMoved = 0; sentido_hare = 3; num_frame = 0; hare_se_ve = 1; + checkFlags = 1; + doBreak = 0; + walkToObject = 0; + stepX = STEP_X; stepY = STEP_Y; + alto_hare = CHARACTER_HEIGHT; ancho_hare = CHARACTER_WIDTH; feetHeight = FEET_HEIGHT; + talkHeight = TALK_HEIGHT; talkWidth = TALK_WIDTH; + hasAnswer = 0; + conta_blind_vez = 0; + changeColor = 0; + breakOut = 0; vb_x = 120; sentido_vb = 1; vb_se_mueve = 0; frame_vb = 1; frame_piano = 0; - frame_borracho = 0; - frame_velas = 0; + frame_drunk = 0; + frame_candles = 0; cont_sv = 0; term_int = 0; - corta_musica = 0; + musicStopped = 0; hay_seleccion = 0; - Leng = 0; UsingMem = 0; - GlobalSpeed = 0; - frame_ciego = 0; - frame_ronquido = 0; - frame_murcielago = 0; + globalSpeed = 0; + frame_blind = 0; + frame_snore = 0; + frame_bat = 0; c_mirar = 0; c_poder = 0; - ald = NULL; - sku = NULL; allocMemory(); @@ -201,68 +151,46 @@ int DrasculaEngine::go() { withVoices = 0; hay_seleccion = 0; - if (num_ejec != 6) { - loadPic("95.alg"); - decompressPic(dir_mesa, 1); - } - - if (num_ejec == 1) { - loadPic("96.alg"); - decompressPic(dir_hare_frente, COMPLETE_PAL); - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("97.alg"); - decompressPic(dir_hare_dch, 1); - } else if (num_ejec == 2) { - loadPic("96.alg"); - decompressPic(dir_hare_frente, COMPLETE_PAL); - loadPic("pts.alg"); - decompressPic(dir_dibujo2, 1); - } else if (num_ejec == 3) { - loadPic("aux13.alg"); - decompressPic(dir_dibujo1, COMPLETE_PAL); - loadPic("96.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("97.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); - } else if (num_ejec == 4) { - loadPic("96.alg"); - decompressPic(dir_hare_frente, COMPLETE_PAL); + if (currentChapter != 6) { + loadPic("95.alg", tableSurface, 1); + } + + if (currentChapter == 1) { + loadPic("96.alg", frontSurface, COMPLETE_PAL); + loadPic("99.alg", backSurface, 1); + loadPic("97.alg", extraSurface, 1); + } else if (currentChapter == 2) { + loadPic("96.alg", frontSurface, COMPLETE_PAL); + loadPic("pts.alg", drawSurface2, 1); + } else if (currentChapter == 3) { + loadPic("aux13.alg", drawSurface1, COMPLETE_PAL); + loadPic("96.alg", frontSurface, 1); + loadPic("97.alg", extraSurface, 1); + loadPic("99.alg", backSurface, 1); + } else if (currentChapter == 4) { + loadPic("96.alg", frontSurface, COMPLETE_PAL); if (hay_que_load == 0) animation_rayo(); - loadPic("96.alg"); - decompressPic(dir_hare_frente, 1); + loadPic("96.alg", frontSurface, 1); clearRoom(); - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("97.alg"); - decompressPic(dir_hare_dch, 1); - } else if (num_ejec == 5) { - loadPic("96.alg"); - decompressPic(dir_hare_frente, COMPLETE_PAL); - loadPic("97.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); - } else if (num_ejec == 6) { - x_igor = 105, y_igor = 85, sentido_igor = 1; + loadPic("99.alg", backSurface, 1); + loadPic("97.alg", extraSurface, 1); + } else if (currentChapter == 5) { + loadPic("96.alg", frontSurface, COMPLETE_PAL); + loadPic("97.alg", extraSurface, 1); + loadPic("99.alg", backSurface, 1); + } else if (currentChapter == 6) { + igorX = 105, igorY = 85, sentido_igor = 1; x_dr = 62, y_dr = 99, sentido_dr = 1; frame_pen = 0; flag_tv = 0; - dir_pendulo = dir_dibujo3; + pendulumSurface = drawSurface3; - loadPic("96.alg"); - decompressPic(dir_hare_frente, COMPLETE_PAL); - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("97.alg"); - decompressPic(dir_hare_dch, 1); - - loadPic("95.alg"); - decompressPic(dir_mesa, 1); + loadPic("96.alg", frontSurface, COMPLETE_PAL); + loadPic("99.alg", backSurface, 1); + loadPic("97.alg", extraSurface, 1); + loadPic("95.alg", tableSurface, 1); } memset(iconName, 0, sizeof(iconName)); @@ -275,10 +203,10 @@ int DrasculaEngine::go() { break; } releaseGame(); - if (num_ejec == 6) + if (currentChapter == 6) break; - num_ejec++; + currentChapter++; } return 0; @@ -286,7 +214,7 @@ int DrasculaEngine::go() { void DrasculaEngine::releaseGame() { if (hay_sb == 1) - ctvd_end(); + stopSound(); clearRoom(); black(); MusicFadeout(); @@ -296,55 +224,54 @@ void DrasculaEngine::releaseGame() { } void DrasculaEngine::allocMemory() { - dir_zona_pantalla = (byte *)malloc(64000); - assert(dir_zona_pantalla); - dir_dibujo1 = (byte *)malloc(64000); - assert(dir_dibujo1); - dir_hare_fondo = (byte *)malloc(64000); - assert(dir_hare_fondo); - dir_dibujo3 = (byte *)malloc(64000); - assert(dir_dibujo3); - dir_dibujo2 = (byte *)malloc(64000); - assert(dir_dibujo2); - dir_mesa = (byte *)malloc(64000); - assert(dir_mesa); - dir_hare_dch = (byte *)malloc(64000); - assert(dir_hare_dch); - dir_hare_frente = (byte *)malloc(64000); - assert(dir_hare_frente); + screenSurface = (byte *)malloc(64000); + assert(screenSurface); + frontSurface = (byte *)malloc(64000); + assert(frontSurface); + backSurface = (byte *)malloc(64000); + assert(backSurface); + drawSurface1 = (byte *)malloc(64000); + assert(drawSurface1); + drawSurface2 = (byte *)malloc(64000); + assert(drawSurface2); + drawSurface3 = (byte *)malloc(64000); + assert(drawSurface3); + tableSurface = (byte *)malloc(64000); + assert(tableSurface); + extraSurface = (byte *)malloc(64000); + assert(extraSurface); } void DrasculaEngine::freeMemory() { - free(dir_zona_pantalla); - free(dir_dibujo1); - free(dir_hare_fondo); - free(dir_dibujo2); - free(dir_mesa); - free(dir_dibujo3); - free(dir_hare_dch); - free(dir_hare_frente); + free(screenSurface); + free(drawSurface1); + free(backSurface); + free(drawSurface2); + free(tableSurface); + free(drawSurface3); + free(extraSurface); + free(frontSurface); } -void DrasculaEngine::loadPic(const char *NamePcc) { +void DrasculaEngine::loadPic(const char *NamePcc, byte *targetSurface, int colorCount) { unsigned int con, x = 0; unsigned int fExit = 0; byte ch, rep; - Common::File file; byte *auxPun; - file.open(NamePcc); - if (!file.isOpen()) + _arj.open(NamePcc); + if (!_arj.isOpen()) error("missing game data %s %c", NamePcc, 7); - Buffer_pcx = (byte *)malloc(65000); - auxPun = Buffer_pcx; - file.seek(128); + pcxBuffer = (byte *)malloc(65000); + auxPun = pcxBuffer; + _arj.seek(128); while (!fExit) { - ch = file.readByte(); + ch = _arj.readByte(); rep = 1; if ((ch & 192) == 192) { rep = (ch & 63); - ch = file.readByte(); + ch = _arj.readByte(); } for (con = 0; con < rep; con++) { *auxPun++ = ch; @@ -354,30 +281,32 @@ void DrasculaEngine::loadPic(const char *NamePcc) { } } - file.read(cPal, 768); - file.close(); + _arj.read(cPal, 768); + _arj.close(); + + decompressPic(targetSurface, colorCount); } -void DrasculaEngine::decompressPic(byte *dir_escritura, int plt) { - memcpy(dir_escritura, Buffer_pcx, 64000); - free(Buffer_pcx); - setRGB((byte *)cPal, plt); +void DrasculaEngine::decompressPic(byte *targetSurface, int colorCount) { + memcpy(targetSurface, pcxBuffer, 64000); + free(pcxBuffer); + setRGB((byte *)cPal, colorCount); } void DrasculaEngine::paleta_hare() { - int color, componente; + int color, component; for (color = 235; color < 253; color++) - for (componente = 0; componente < 3; componente++) - palHare[color][componente] = gamePalette[color][componente]; + for (component = 0; component < 3; component++) + palHare[color][component] = gamePalette[color][component]; } void DrasculaEngine::hare_oscuro() { - int color, componente; + int color, component; for (color = 235; color < 253; color++ ) - for (componente = 0; componente < 3; componente++) - gamePalette[color][componente] = palHareOscuro[color][componente]; + for (component = 0; component < 3; component++) + gamePalette[color][component] = palHareOscuro[color][component]; updatePalette(); } @@ -394,12 +323,12 @@ void DrasculaEngine::setRGB(byte *dir_lectura, int plt) { } void DrasculaEngine::black() { - int color, componente; + int color, component; DacPalette256 palNegra; for (color = 0; color < 256; color++) - for (componente = 0; componente < 3; componente++) - palNegra[color][componente] = 0; + for (component = 0; component < 3; component++) + palNegra[color][component] = 0; palNegra[254][0] = 0x3F; palNegra[254][1] = 0x3F; @@ -502,13 +431,13 @@ bool DrasculaEngine::escoba() { int n; if (_lang == kSpanish) - dir_texto = dir_hare_dch; + textSurface = extraSurface; else - dir_texto = dir_mesa; + textSurface = tableSurface; previousMusic = -1; - if (num_ejec != 2) { + if (currentChapter != 2) { int soc = 0; for (n = 0; n < 6; n++) { soc = soc + CHARACTER_WIDTH; @@ -522,7 +451,7 @@ bool DrasculaEngine::escoba() { for (n = 0; n < NUM_FLAGS; n++) flags[n] = 0; - if (num_ejec == 2) { + if (currentChapter == 2) { flags[16] = 1; flags[17] = 1; flags[27] = 1; @@ -531,19 +460,18 @@ bool DrasculaEngine::escoba() { for (n = 1; n < 7; n++) inventoryObjects[n] = n; - if (num_ejec == 1) { + if (currentChapter == 1) { pickObject(28); if (hay_que_load == 0) animation_1_1(); withoutVerb(); - loadPic("2aux62.alg"); - decompressPic(dir_dibujo2, 1); + loadPic("2aux62.alg", drawSurface2, 1); sentido_hare = 1; - obj_saliendo = 104; + objExit = 104; if (hay_que_load != 0) { - if (!para_cargar(nom_partida)) { + if (!para_cargar(saveName)) { return true; } } else { @@ -552,282 +480,273 @@ bool DrasculaEngine::escoba() { hare_y = 56; lleva_al_hare(65, 145); } - } else if (num_ejec == 2) { - suma_objeto(28); + } else if (currentChapter == 2) { + addObject(28); sentido_hare = 3; - obj_saliendo = 162; + objExit = 162; if (hay_que_load == 0) carga_escoba("14.ald"); else { - if (!para_cargar(nom_partida)) { + if (!para_cargar(saveName)) { return true; } } - } else if (num_ejec == 3) { - suma_objeto(28); - suma_objeto(11); - suma_objeto(14); - suma_objeto(22); - suma_objeto(9); - suma_objeto(20); - suma_objeto(19); + } else if (currentChapter == 3) { + addObject(28); + addObject(11); + addObject(14); + addObject(22); + addObject(9); + addObject(20); + addObject(19); flags[1] = 1; sentido_hare = 1; - obj_saliendo = 99; + objExit = 99; if (hay_que_load == 0) carga_escoba("20.ald"); else { - if (!para_cargar(nom_partida)) { + if (!para_cargar(saveName)) { return true; } } - } else if (num_ejec == 4) { - suma_objeto(28); - suma_objeto(9); - suma_objeto(20); - suma_objeto(22); - obj_saliendo = 100; + } else if (currentChapter == 4) { + addObject(28); + addObject(9); + addObject(20); + addObject(22); + objExit = 100; if (hay_que_load == 0) { carga_escoba("21.ald"); sentido_hare = 0; hare_x = 235; hare_y = 164; } else { - if (!para_cargar(nom_partida)) { + if (!para_cargar(saveName)) { return true; } } - } else if (num_ejec == 5) { - suma_objeto(28); - suma_objeto(7); - suma_objeto(9); - suma_objeto(11); - suma_objeto(13); - suma_objeto(14); - suma_objeto(15); - suma_objeto(17); - suma_objeto(20); + } else if (currentChapter == 5) { + addObject(28); + addObject(7); + addObject(9); + addObject(11); + addObject(13); + addObject(14); + addObject(15); + addObject(17); + addObject(20); sentido_hare = 1; - obj_saliendo = 100; + objExit = 100; if (hay_que_load == 0) { carga_escoba("45.ald"); } else { - if (!para_cargar(nom_partida)) { + if (!para_cargar(saveName)) { return true; } } - } else if (num_ejec == 6) { - suma_objeto(28); - suma_objeto(9); + } else if (currentChapter == 6) { + addObject(28); + addObject(9); sentido_hare = 1; - obj_saliendo = 104; + objExit = 104; if (hay_que_load == 0) { carga_escoba("58.ald"); animation_1_6(); } else { - if (!para_cargar(nom_partida)) { + if (!para_cargar(saveName)) { return true; } - loadPic("auxdr.alg"); - decompressPic(dir_dibujo2, 1); + loadPic("auxdr.alg", drawSurface2, 1); } } -bucles: - if (hare_se_mueve == 0) { - step_x = PASO_HARE_X; - step_y = PASO_HARE_Y; - } - if (hare_se_mueve == 0 && anda_a_objeto == 1) { - sentido_hare = sentido_final; - anda_a_objeto = 0; - } - - if (num_ejec == 2) { - if (roomNumber == 3 && (hare_x == 279) && (hare_y + alto_hare == 101)) - animation_1_2(); - else if (roomNumber == 14 && (hare_x == 214) && (hare_y + alto_hare == 121)) - lleva_al_hare(190, 130); - else if (roomNumber == 14 && (hare_x == 246) && (hare_y + alto_hare == 112)) - lleva_al_hare(190, 130); - } - - mueve_cursor(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + while (1) { + if (characterMoved == 0) { + stepX = STEP_X; + stepY = STEP_Y; + } + if (characterMoved == 0 && walkToObject == 1) { + sentido_hare = sentido_final; + walkToObject = 0; + } - if (num_ejec == 2) { - if (musicStatus() == 0 && roomMusic != 0) - playMusic(roomMusic); - } else { - if (musicStatus() == 0) - playMusic(roomMusic); - } + if (currentChapter == 2) { + if (roomNumber == 3 && (hare_x == 279) && (hare_y + alto_hare == 101)) + animation_1_2(); + else if (roomNumber == 14 && (hare_x == 214) && (hare_y + alto_hare == 121)) + lleva_al_hare(190, 130); + else if (roomNumber == 14 && (hare_x == 246) && (hare_y + alto_hare == 112)) + lleva_al_hare(190, 130); + } - MirarRaton(); + moveCursor(); + updateScreen(); - if (menu_scr == 0 && lleva_objeto == 1) - comprueba_objetos(); + if (currentChapter == 2) { + if (musicStatus() == 0 && roomMusic != 0) + playMusic(roomMusic); + } else { + if (musicStatus() == 0) + playMusic(roomMusic); + } - if (button_dch == 1 && menu_scr == 1) { - delay(100); - if (num_ejec == 2) - loadPic(fondo_y_menu); - else - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); - setPalette((byte *)&gamePalette); - menu_scr = 0; - espera_soltar(); - if (num_ejec != 3) - cont_sv = 0; - } - if (button_dch == 1 && menu_scr == 0) { - delay(100); - hare_se_mueve = 0; - if (sentido_hare == 2) - sentido_hare = 1; - if (num_ejec == 4) - loadPic("icons2.alg"); - else if (num_ejec == 5) - loadPic("icons3.alg"); - else if (num_ejec == 6) - loadPic("iconsp.alg"); - else - loadPic("icons.alg"); - decompressPic(dir_hare_fondo, 1); - menu_scr = 1; - espera_soltar(); - withoutVerb(); - if (num_ejec != 3) - cont_sv = 0; - } + updateEvents(); - if (button_izq == 1 && menu_bar == 1) { - delay(100); - elige_en_barra(); - if (num_ejec != 3) - cont_sv = 0; - } else if (button_izq == 1 && lleva_objeto == 0) { - delay(100); - if (comprueba1()) - return true; - if (num_ejec != 3) - cont_sv = 0; - } else if (button_izq == 1 && lleva_objeto == 1) { - if (comprueba2()) - return true; - if (num_ejec != 3) - cont_sv = 0; - } + if (menuScreen == 0 && takeObject == 1) + checkObjects(); - if (mouseY < 24 && menu_scr == 0) - menu_bar = 1; - else - menu_bar = 0; + if (button_dch == 1 && menuScreen == 1) { + delay(100); + if (currentChapter == 2) + loadPic(menuBackground, backSurface, 1); + else + loadPic("99.alg", backSurface, 1); + setPalette((byte *)&gamePalette); + menuScreen = 0; + updateEvents(); + if (currentChapter != 3) + cont_sv = 0; + } + if (button_dch == 1 && menuScreen == 0) { + delay(100); + characterMoved = 0; + if (sentido_hare == 2) + sentido_hare = 1; + if (currentChapter == 4) + loadPic("icons2.alg", backSurface, 1); + else if (currentChapter == 5) + loadPic("icons3.alg", backSurface, 1); + else if (currentChapter == 6) + loadPic("iconsp.alg", backSurface, 1); + else + loadPic("icons.alg", backSurface, 1); + menuScreen = 1; + updateEvents(); + withoutVerb(); + if (currentChapter != 3) + cont_sv = 0; + } - Common::KeyCode key = getscan(); - if (key == Common::KEYCODE_F1 && menu_scr == 0) { - elige_verbo(1); - if (num_ejec != 3) - cont_sv = 0; - } else if (key == Common::KEYCODE_F2 && menu_scr == 0) { - elige_verbo(2); - if (num_ejec != 3) - cont_sv = 0; - } else if (key == Common::KEYCODE_F3 && menu_scr == 0) { - elige_verbo(3); - if (num_ejec != 3) - cont_sv = 0; - } else if (key == Common::KEYCODE_F4 && menu_scr == 0) { - elige_verbo(4); - cont_sv = 0; - } else if (key == Common::KEYCODE_F5 && menu_scr == 0) { - elige_verbo(5); - if (num_ejec != 3) - cont_sv = 0; - } else if (key == Common::KEYCODE_F6 && menu_scr == 0) { - elige_verbo(6); - if (num_ejec != 3) + if (button_izq == 1 && menuBar == 1) { + delay(100); + elige_en_barra(); + if (currentChapter != 3) + cont_sv = 0; + } else if (button_izq == 1 && takeObject == 0) { + delay(100); + if (comprueba1()) + return true; + if (currentChapter != 3) + cont_sv = 0; + } else if (button_izq == 1 && takeObject == 1) { + if (comprueba2()) + return true; + if (currentChapter != 3) + cont_sv = 0; + } + + menuBar = (mouseY < 24 && menuScreen == 0) ? 1 : 0; + + Common::KeyCode key = getScan(); + if (key == Common::KEYCODE_F1 && menuScreen == 0) { + selectVerb(1); + if (currentChapter != 3) + cont_sv = 0; + } else if (key == Common::KEYCODE_F2 && menuScreen == 0) { + selectVerb(2); + if (currentChapter != 3) + cont_sv = 0; + } else if (key == Common::KEYCODE_F3 && menuScreen == 0) { + selectVerb(3); + if (currentChapter != 3) + cont_sv = 0; + } else if (key == Common::KEYCODE_F4 && menuScreen == 0) { + selectVerb(4); cont_sv = 0; - } else if (key == Common::KEYCODE_F9) { + } else if (key == Common::KEYCODE_F5 && menuScreen == 0) { + selectVerb(5); + if (currentChapter != 3) + cont_sv = 0; + } else if (key == Common::KEYCODE_F6 && menuScreen == 0) { + selectVerb(6); + if (currentChapter != 3) + cont_sv = 0; + } else if (key == Common::KEYCODE_F9) { mesa(); - if (num_ejec != 3) - cont_sv = 0; - } else if (key == Common::KEYCODE_F10) { - if (!saves()) - return true; - if (num_ejec != 3) + if (currentChapter != 3) cont_sv = 0; - } else if (key == Common::KEYCODE_F8) { - withoutVerb(); - if (num_ejec != 3) - cont_sv = 0; - } else if (key == Common::KEYCODE_v) { - withVoices = 1; - print_abc(_textsys[_lang][2], 96, 86); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - delay(1410); - if (num_ejec != 3) - cont_sv = 0; - } else if (key == Common::KEYCODE_t) { - withVoices = 0; - print_abc(_textsys[_lang][3], 94, 86); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - delay(1460); - if (num_ejec != 3) - cont_sv = 0; - } else if (key == Common::KEYCODE_ESCAPE) { - if (!confirma_salir()) - return false; - if (num_ejec != 3) - cont_sv = 0; - } else if (num_ejec == 6 && key == Common::KEYCODE_0 && roomNumber == 61) { - loadPic("alcbar.alg"); - decompressPic(dir_dibujo1, 255); - } else if (cont_sv == 1500) { - salva_pantallas(); - if (num_ejec != 3) - cont_sv = 0; - } else { - if (num_ejec != 3) - cont_sv++; + } else if (key == Common::KEYCODE_F10) { + if (!saves()) + return true; + if (currentChapter != 3) + cont_sv = 0; + } else if (key == Common::KEYCODE_F8) { + withoutVerb(); + if (currentChapter != 3) + cont_sv = 0; + } else if (key == Common::KEYCODE_v) { + withVoices = 1; + print_abc(_textsys[_lang][2], 96, 86); + updateScreen(); + delay(1410); + if (currentChapter != 3) + cont_sv = 0; + } else if (key == Common::KEYCODE_t) { + withVoices = 0; + print_abc(_textsys[_lang][3], 94, 86); + updateScreen(); + delay(1460); + if (currentChapter != 3) + cont_sv = 0; + } else if (key == Common::KEYCODE_ESCAPE) { + if (!confirmExit()) + return false; + if (currentChapter != 3) + cont_sv = 0; + } else if (currentChapter == 6 && key == Common::KEYCODE_0 && roomNumber == 61) { + loadPic("alcbar.alg", drawSurface1, 255); + } else if (cont_sv == 15000) { + screenSaver(); + if (currentChapter != 3) + cont_sv = 0; + } else { + if (currentChapter != 3) + cont_sv++; + } } - goto bucles; } void DrasculaEngine::pickObject(int objeto) { - if (num_ejec == 6) - loadPic("iconsp.alg"); - else if (num_ejec == 4) - loadPic("icons2.alg"); - else if (num_ejec == 5) - loadPic("icons3.alg"); + if (currentChapter == 6) + loadPic("iconsp.alg", backSurface, 1); + else if (currentChapter == 4) + loadPic("icons2.alg", backSurface, 1); + else if (currentChapter == 5) + loadPic("icons3.alg", backSurface, 1); else - loadPic("icons.alg"); - decompressPic(dir_hare_fondo, 1); + loadPic("icons.alg", backSurface, 1); chooseObject(objeto); - if (num_ejec == 2) - loadPic(fondo_y_menu); + if (currentChapter == 2) + loadPic(menuBackground, backSurface, 1); else - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); + loadPic("99.alg", backSurface, 1); } void DrasculaEngine::chooseObject(int objeto) { - if (num_ejec == 5) { - if (lleva_objeto == 1 && menu_scr == 0 && pickedObject != 16) - suma_objeto(pickedObject); + if (currentChapter == 5) { + if (takeObject == 1 && menuScreen == 0 && pickedObject != 16) + addObject(pickedObject); } else { - if (lleva_objeto == 1 && menu_scr == 0) - suma_objeto(pickedObject); + if (takeObject == 1 && menuScreen == 0) + addObject(pickedObject); } - copyBackground(x1d_menu[objeto], y1d_menu[objeto], 0, 0, OBJWIDTH,OBJHEIGHT, dir_hare_fondo, dir_dibujo3); - lleva_objeto = 1; + copyBackground(x1d_menu[objeto], y1d_menu[objeto], 0, 0, OBJWIDTH,OBJHEIGHT, backSurface, drawSurface3); + takeObject = 1; pickedObject = objeto; } -int DrasculaEngine::resta_objeto(int osj) { +int DrasculaEngine::removeObject(int osj) { int result = 1; for (int h = 1; h < 43; h++) { @@ -843,31 +762,30 @@ int DrasculaEngine::resta_objeto(int osj) { void DrasculaEngine::withoutVerb() { int c = 171; - if (menu_scr == 1) + if (menuScreen == 1) c = 0; - if (num_ejec == 5) { - if (lleva_objeto == 1 && pickedObject != 16) - suma_objeto(pickedObject); + if (currentChapter == 5) { + if (takeObject == 1 && pickedObject != 16) + addObject(pickedObject); } else { - if (lleva_objeto == 1) - suma_objeto(pickedObject); + if (takeObject == 1) + addObject(pickedObject); } - copyBackground(0, c, 0, 0, OBJWIDTH,OBJHEIGHT, dir_hare_fondo, dir_dibujo3); + copyBackground(0, c, 0, 0, OBJWIDTH,OBJHEIGHT, backSurface, drawSurface3); - lleva_objeto = 0; - hay_nombre = 0; + takeObject = 0; + hasName = 0; } -bool DrasculaEngine::para_cargar(char nom_game[]) { +bool DrasculaEngine::para_cargar(char gameName[]) { previousMusic = roomMusic; - menu_scr = 0; - if (num_ejec != 1) + menuScreen = 0; + if (currentChapter != 1) clearRoom(); - if (!carga_partida(nom_game)) + if (!loadGame(gameName)) return false; - if (num_ejec == 2 || num_ejec == 3 || num_ejec == 5) { - delete ald; - ald = NULL; + if (currentChapter == 2 || currentChapter == 3 || currentChapter == 5) { + // } carga_escoba(currentData); withoutVerb(); @@ -875,14 +793,14 @@ bool DrasculaEngine::para_cargar(char nom_game[]) { return true; } -static char *getLine(Common::File *fp, char *buf, int len) { +char *DrasculaEngine::getLine(char *buf, int len) { byte c; char *b; for (;;) { b = buf; - while (!fp->eos()) { - c = ~fp->readByte(); + while (!_arj.eos()) { + c = ~_arj.readByte(); if (c == '\r') continue; if (c == '\n' || b - buf >= (len - 1)) @@ -890,7 +808,7 @@ static char *getLine(Common::File *fp, char *buf, int len) { *b++ = c; } *b = '\0'; - if (fp->eos() && b == buf) + if (_arj.eos() && b == buf) return NULL; if (b != buf) break; @@ -898,6 +816,16 @@ static char *getLine(Common::File *fp, char *buf, int len) { return buf; } +void DrasculaEngine::getIntFromLine(char *buf, int len, int* result) { + getLine(buf, len); + sscanf(buf, "%d", result); +} + +void DrasculaEngine::getStringFromLine(char *buf, int len, char* result) { + getLine(buf, len); + sscanf(buf, "%s", result); +} + void DrasculaEngine::carga_escoba(const char *nom_fich) { int soc, l, martin = 0, obj_salir = 0; float chiquez = 0, pequegnez = 0; @@ -905,161 +833,115 @@ void DrasculaEngine::carga_escoba(const char *nom_fich) { char para_codificar[20]; char buffer[256]; - hay_nombre = 0; + hasName = 0; strcpy(para_codificar, nom_fich); strcpy(currentData, nom_fich); - ald = new Common::File; - ald->open(nom_fich); - if (!ald->isOpen()) { - error("missing data file"); + _arj.open(nom_fich); + if (!_arj.isOpen()) { + error("missing data file %s", nom_fich); } - int size = ald->size(); - getLine(ald, buffer, size); - roomNumber = atoi(buffer); - - getLine(ald, buffer, size); - sscanf(buffer, "%d", &roomMusic); - getLine(ald, buffer, size); - sscanf(buffer, "%s", roomDisk); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &nivel_osc); - - if (num_ejec == 2) { - getLine(ald, buffer, size); - sscanf(buffer, "%d", &martin); - if (martin == 0) - goto martini; + int size = _arj.size(); + + getIntFromLine(buffer, size, &roomNumber); + getIntFromLine(buffer, size, &roomMusic); + getStringFromLine(buffer, size, roomDisk); + getIntFromLine(buffer, size, &nivel_osc); + + if (currentChapter == 2) + getIntFromLine(buffer, size, &martin); + + if (currentChapter == 2 && martin != 0) { ancho_hare = martin; - getLine(ald, buffer, size); - sscanf(buffer, "%d",&alto_hare); - getLine(ald, buffer, size); - sscanf(buffer, "%d",&alto_pies); - getLine(ald, buffer, size); - sscanf(buffer, "%d",&step_x); - getLine(ald, buffer, size); - sscanf(buffer, "%d",&step_y); - - getLine(ald, buffer, size); - sscanf(buffer, "%s",pant1); - getLine(ald, buffer, size); - sscanf(buffer, "%s",pant2); - getLine(ald, buffer, size); - sscanf(buffer, "%s",pant3); - getLine(ald, buffer, size); - sscanf(buffer, "%s",pant4); - - loadPic(pant2); - decompressPic(dir_hare_dch, 1); - loadPic(pant1); - decompressPic(dir_hare_frente, 1); - loadPic(pant4); - decompressPic(dir_hare_fondo, 1); - - strcpy(fondo_y_menu, pant4); - } + getIntFromLine(buffer, size, &alto_hare); + getIntFromLine(buffer, size, &feetHeight); + getIntFromLine(buffer, size, &stepX); + getIntFromLine(buffer, size, &stepY); -martini: + getStringFromLine(buffer, size, pant1); + getStringFromLine(buffer, size, pant2); + getStringFromLine(buffer, size, pant3); + getStringFromLine(buffer, size, pant4); + + strcpy(menuBackground, pant4); + } - getLine(ald, buffer, size); - sscanf(buffer, "%d", &numRoomObjs); + getIntFromLine(buffer, size, &numRoomObjs); for (l = 0; l < numRoomObjs; l++) { - getLine(ald, buffer, size); - sscanf(buffer, "%d", &num_obj[l]); - getLine(ald, buffer, size); - sscanf(buffer, "%s", objName[l]); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &x1[l]); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &y1[l]); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &x2[l]); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &y2[l]); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &sitiobj_x[l]); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &sitiobj_y[l]); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &sentidobj[l]); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &visible[l]); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &isDoor[l]); + getIntFromLine(buffer, size, &objectNum[l]); + getStringFromLine(buffer, size, objName[l]); + getIntFromLine(buffer, size, &x1[l]); + getIntFromLine(buffer, size, &y1[l]); + getIntFromLine(buffer, size, &x2[l]); + getIntFromLine(buffer, size, &y2[l]); + getIntFromLine(buffer, size, &sitiobj_x[l]); + getIntFromLine(buffer, size, &sitiobj_y[l]); + getIntFromLine(buffer, size, &sentidobj[l]); + getIntFromLine(buffer, size, &visible[l]); + getIntFromLine(buffer, size, &isDoor[l]); if (isDoor[l] != 0) { - getLine(ald, buffer, size); - sscanf(buffer, "%s", alapantallakeva[l]); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &x_alakeva[l]); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &y_alakeva[l]); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &sentido_alkeva[l]); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &alapuertakeva[l]); - puertas_cerradas(l); + getStringFromLine(buffer, size, _targetSurface[l]); + getIntFromLine(buffer, size, &_destX[l]); + getIntFromLine(buffer, size, &_destY[l]); + getIntFromLine(buffer, size, &sentido_alkeva[l]); + getIntFromLine(buffer, size, &alapuertakeva[l]); + updateDoor(l); } } - getLine(ald, buffer, size); - sscanf(buffer, "%d", &suelo_x1); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &suelo_y1); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &suelo_x2); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &suelo_y2); - - if (num_ejec != 2) { - getLine(ald, buffer, size); - sscanf(buffer, "%d", &far); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &near); + getIntFromLine(buffer, size, &suelo_x1); + getIntFromLine(buffer, size, &suelo_y1); + getIntFromLine(buffer, size, &suelo_x2); + getIntFromLine(buffer, size, &suelo_y2); + + if (currentChapter != 2) { + getIntFromLine(buffer, size, &far); + getIntFromLine(buffer, size, &near); + } + _arj.close(); + + if (currentChapter == 2 && martin != 0) { + loadPic(pant2, extraSurface, 1); + loadPic(pant1, frontSurface, 1); + loadPic(pant4, backSurface, 1); } - delete ald; - ald = NULL; - if (num_ejec == 2) { + if (currentChapter == 2) { if (martin == 0) { - step_x = PASO_HARE_X; - step_y = PASO_HARE_Y; + stepX = STEP_X; + stepY = STEP_Y; alto_hare = CHARACTER_HEIGHT; ancho_hare = CHARACTER_WIDTH; - alto_pies = PIES_HARE; - loadPic("97.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("96.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); - - strcpy(fondo_y_menu, "99.alg"); + feetHeight = FEET_HEIGHT; + loadPic("97.alg", extraSurface, 1); + loadPic("96.alg", frontSurface, 1); + loadPic("99.alg", backSurface, 1); + + strcpy(menuBackground, "99.alg"); } } for (l = 0; l < numRoomObjs; l++) { - if (num_obj[l] == obj_saliendo) + if (objectNum[l] == objExit) obj_salir = l; } - if (num_ejec == 2) { + if (currentChapter == 2) { if (hare_x == -1) { - hare_x = x_alakeva[obj_salir]; - hare_y = y_alakeva[obj_salir] - alto_hare; + hare_x = _destX[obj_salir]; + hare_y = _destY[obj_salir] - alto_hare; } - hare_se_mueve = 0; + characterMoved = 0; } - loadPic(roomDisk); - decompressPic(dir_dibujo3, 1); + loadPic(roomDisk, drawSurface3, 1); char rm[20]; sprintf(rm, "%i.alg", roomNumber); - loadPic(rm); - decompressPic(dir_dibujo1, HALF_PAL); + loadPic(rm, drawSurface1, HALF_PAL); - copyBackground(0, 171, 0, 0, OBJWIDTH, OBJHEIGHT, dir_hare_fondo, dir_dibujo3); + copyBackground(0, 171, 0, 0, OBJWIDTH, OBJHEIGHT, backSurface, drawSurface3); color_hare(); if (nivel_osc != 0) @@ -1070,12 +952,12 @@ martini: paleta_hare_oscuro(); hare_claro(); - cambio_de_color = -1; + changeColor = -1; - if (num_ejec == 2) - color_abc(LIGHT_GREEN); + if (currentChapter == 2) + color_abc(kColorLightGreen); - if (num_ejec != 2) { + if (currentChapter != 2) { for (l = 0; l <= suelo_y1; l++) factor_red[l] = far; for (l = suelo_y1; l <= 201; l++) @@ -1095,17 +977,17 @@ martini: } } - if (num_ejec == 5 && roomNumber == 54) { + if (currentChapter == 5 && roomNumber == 54) { for (l = suelo_y1 - 1; l > 84; l--) { factor_red[l] = (int)(far - pequegnez); pequegnez = pequegnez + chiquez; } } - if (num_ejec != 2) { + if (currentChapter != 2) { if (hare_x == -1) { - hare_x = x_alakeva[obj_salir]; - hare_y = y_alakeva[obj_salir]; + hare_x = _destX[obj_salir]; + hare_y = _destY[obj_salir]; alto_hare = (CHARACTER_HEIGHT * factor_red[hare_y]) / 100; ancho_hare = (CHARACTER_WIDTH * factor_red[hare_y]) / 100; hare_y = hare_y - alto_hare; @@ -1113,26 +995,26 @@ martini: alto_hare = (CHARACTER_HEIGHT * factor_red[hare_y]) / 100; ancho_hare = (CHARACTER_WIDTH * factor_red[hare_y]) / 100; } - hare_se_mueve = 0; + characterMoved = 0; } - if (num_ejec == 2) { + if (currentChapter == 2) { soc = 0; for (l = 0; l < 6; l++) { - soc = soc + ancho_hare; + soc += ancho_hare; frame_x[l] = soc; } } - if (num_ejec == 5) + if (currentChapter == 5) hare_se_ve = 1; - updateData(); + updateVisible(); - if (num_ejec == 1) + if (currentChapter == 1) isDoor[7] = 0; - if (num_ejec == 2) { + if (currentChapter == 2) { if (roomNumber == 14 && flags[39] == 1) roomMusic = 16; else if (roomNumber == 15 && flags[39] == 1) @@ -1151,19 +1033,19 @@ martini: playMusic(roomMusic); } - if (num_ejec == 2) { + if (currentChapter == 2) { if (roomNumber == 9 || roomNumber == 2 || roomNumber == 14 || roomNumber == 18) - conta_ciego_vez = vez(); + conta_blind_vez = getTime(); } - if (num_ejec == 4) { + if (currentChapter == 4) { if (roomNumber == 26) - conta_ciego_vez = vez(); + conta_blind_vez = getTime(); } - if (num_ejec == 4 && roomNumber == 24 && flags[29] == 1) + if (currentChapter == 4 && roomNumber == 24 && flags[29] == 1) animation_7_4(); - if (num_ejec == 5) { + if (currentChapter == 5) { if (roomNumber == 45) hare_se_ve = 0; if (roomNumber == 49 && flags[7] == 0) @@ -1179,103 +1061,96 @@ void DrasculaEngine::clearRoom() { _system->updateScreen(); } -void DrasculaEngine::lleva_al_hare(int punto_x, int punto_y) { - if (num_ejec == 5 || num_ejec == 6) { +void DrasculaEngine::lleva_al_hare(int pointX, int pointY) { + if (currentChapter == 5 || currentChapter == 6) { if (hare_se_ve == 0) { hare_x = sitio_x; hare_y = sitio_y; - goto fin; + updateRoom(); + updateScreen(); + return; } } - sitio_x = punto_x; - sitio_y = punto_y; - empieza_andar(); + sitio_x = pointX; + sitio_y = pointY; + startWalking(); for (;;) { updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - if (hare_se_mueve == 0) + updateScreen(); + if (characterMoved == 0) break; } - if (anda_a_objeto == 1) { - anda_a_objeto = 0; + if (walkToObject == 1) { + walkToObject = 0; sentido_hare = sentido_final; } -fin: updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); } -void DrasculaEngine::mueve_cursor() { - int pos_cursor[8]; +void DrasculaEngine::moveCursor() { + int cursorPos[8]; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); updateRefresh_pre(); pon_hare(); updateRefresh(); - if (!strcmp(texto_nombre, "hacker") && hay_nombre == 1) { - if (_color != RED && menu_scr == 0) - color_abc(RED); - } else if (menu_scr == 0 && _color != LIGHT_GREEN) - color_abc(LIGHT_GREEN); - if (hay_nombre == 1 && menu_scr == 0) - centra_texto(texto_nombre, mouseX, mouseY); - if (menu_scr == 1) - menu_sin_volcar(); - else if (menu_bar == 1) - barra_menu(); - - pos_cursor[0] = 0; - pos_cursor[1] = 0; - pos_cursor[2] = mouseX - 20; - pos_cursor[3] = mouseY - 17; - pos_cursor[4] = OBJWIDTH; - pos_cursor[5] = OBJHEIGHT; - copyRectClip(pos_cursor, dir_dibujo3, dir_zona_pantalla); -} - -void DrasculaEngine::comprueba_objetos() { + if (!strcmp(textName, "hacker") && hasName == 1) { + if (_color != kColorRed && menuScreen == 0) + color_abc(kColorRed); + } else if (menuScreen == 0 && _color != kColorLightGreen) + color_abc(kColorLightGreen); + if (hasName == 1 && menuScreen == 0) + centerText(textName, mouseX, mouseY); + if (menuScreen == 1) + showMenu(); + else if (menuBar == 1) + clearMenu(); + + cursorPos[0] = 0; + cursorPos[1] = 0; + cursorPos[2] = mouseX - 20; + cursorPos[3] = mouseY - 17; + cursorPos[4] = OBJWIDTH; + cursorPos[5] = OBJHEIGHT; + copyRectClip(cursorPos, drawSurface3, screenSurface); +} + +void DrasculaEngine::checkObjects() { int l, veo = 0; for (l = 0; l < numRoomObjs; l++) { if (mouseX > x1[l] && mouseY > y1[l] && mouseX < x2[l] && mouseY < y2[l] && visible[l] == 1 && isDoor[l] == 0) { - strcpy(texto_nombre, objName[l]); - hay_nombre = 1; + strcpy(textName, objName[l]); + hasName = 1; veo = 1; } } - if (num_ejec == 2) { + if (currentChapter == 2) { if (mouseX > hare_x + 2 && mouseY > hare_y + 2 && mouseX < hare_x + ancho_hare - 2 && mouseY < hare_y + alto_hare - 2) { - strcpy(texto_nombre, "hacker"); - hay_nombre = 1; + strcpy(textName, "hacker"); + hasName = 1; veo = 1; } } else { if (mouseX > hare_x + 2 && mouseY > hare_y + 2 && mouseX < hare_x + ancho_hare - 2 && mouseY < hare_y + alto_hare - 2 && veo == 0) { - strcpy(texto_nombre, "hacker"); - hay_nombre = 1; + strcpy(textName, "hacker"); + hasName = 1; veo = 1; } } if (veo == 0) - hay_nombre = 0; -} - -void DrasculaEngine::espera_soltar() { - updateEvents(); -} - -void DrasculaEngine::MirarRaton() { - updateEvents(); + hasName = 0; } void DrasculaEngine::elige_en_barra() { @@ -1288,57 +1163,47 @@ void DrasculaEngine::elige_en_barra() { if (num_verbo < 1) withoutVerb(); else - elige_verbo(num_verbo); + selectVerb(num_verbo); } bool DrasculaEngine::comprueba1() { int l; - if (menu_scr == 1) - saca_objeto(); + if (menuScreen == 1) + removeObject(); else { for (l = 0; l < numRoomObjs; l++) { if (mouseX >= x1[l] && mouseY >= y1[l] - && mouseX <= x2[l] && mouseY <= y2[l] && rompo == 0) { - if (sal_de_la_habitacion(l)) + && mouseX <= x2[l] && mouseY <= y2[l] && doBreak == 0) { + if (exitRoom(l)) return true; - if (rompo == 1) + if (doBreak == 1) break; } } if (mouseX > hare_x && mouseY > hare_y && mouseX < hare_x + ancho_hare && mouseY < hare_y + alto_hare) - rompo = 1; + doBreak = 1; for (l = 0; l < numRoomObjs; l++) { if (mouseX > x1[l] && mouseY > y1[l] - && mouseX < x2[l] && mouseY < y2[l] && rompo == 0) { + && mouseX < x2[l] && mouseY < y2[l] && doBreak == 0) { sitio_x = sitiobj_x[l]; sitio_y = sitiobj_y[l]; sentido_final = sentidobj[l]; - rompo = 1; - anda_a_objeto = 1; - empieza_andar(); + doBreak = 1; + walkToObject = 1; + startWalking(); } } - if (rompo == 0) { - sitio_x = mouseX; - sitio_y = mouseY; - - if (sitio_x < suelo_x1) - sitio_x = suelo_x1; - if (sitio_x > suelo_x2) - sitio_x = suelo_x2; - if (sitio_y < suelo_y1 + alto_pies) - sitio_y = suelo_y1 + alto_pies; - if (sitio_y > suelo_y2) - sitio_y = suelo_y2; - - empieza_andar(); + if (doBreak == 0) { + sitio_x = CLIP(mouseX, suelo_x1, suelo_x2); + sitio_y = CLIP(mouseY, suelo_y1 + feetHeight, suelo_y2); + startWalking(); } - rompo = 0; + doBreak = 0; } return false; @@ -1347,23 +1212,23 @@ bool DrasculaEngine::comprueba1() { bool DrasculaEngine::comprueba2() { int l; - if (menu_scr == 1) { - if (coge_objeto()) + if (menuScreen == 1) { + if (pickupObject()) return true; } else { - if (!strcmp(texto_nombre, "hacker") && hay_nombre == 1) { - if (banderas(50)) + if (!strcmp(textName, "hacker") && hasName == 1) { + if (checkFlag(50)) return true; } else { for (l = 0; l < numRoomObjs; l++) { if (mouseX > x1[l] && mouseY > y1[l] && mouseX < x2[l] && mouseY < y2[l] && visible[l] == 1) { sentido_final = sentidobj[l]; - anda_a_objeto = 1; + walkToObject = 1; lleva_al_hare(sitiobj_x[l], sitiobj_y[l]); - if (banderas(num_obj[l])) + if (checkFlag(objectNum[l])) return true; - if (num_ejec == 4) + if (currentChapter == 4) break; } } @@ -1373,7 +1238,7 @@ bool DrasculaEngine::comprueba2() { return false; } -Common::KeyCode DrasculaEngine::getscan() { +Common::KeyCode DrasculaEngine::getScan() { updateEvents(); return _keyPressed.keycode; @@ -1420,30 +1285,30 @@ void DrasculaEngine::updateEvents() { } } -void DrasculaEngine::elige_verbo(int verbo) { +void DrasculaEngine::selectVerb(int verbo) { int c = 171; - if (menu_scr == 1) + if (menuScreen == 1) c = 0; - if (num_ejec == 5) { - if (lleva_objeto == 1 && pickedObject != 16) - suma_objeto(pickedObject); + if (currentChapter == 5) { + if (takeObject == 1 && pickedObject != 16) + addObject(pickedObject); } else { - if (lleva_objeto == 1) - suma_objeto(pickedObject); + if (takeObject == 1) + addObject(pickedObject); } - copyBackground(OBJWIDTH * verbo, c, 0, 0, OBJWIDTH, OBJHEIGHT, dir_hare_fondo, dir_dibujo3); + copyBackground(OBJWIDTH * verbo, c, 0, 0, OBJWIDTH, OBJHEIGHT, backSurface, drawSurface3); - lleva_objeto = 1; + takeObject = 1; pickedObject = verbo; } void DrasculaEngine::mesa() { int nivel_master, nivel_voc, nivel_cd; - copyRect(1, 56, 73, 63, 177, 97, dir_mesa, dir_zona_pantalla); - updateScreen(73, 63, 73, 63, 177, 97, dir_zona_pantalla); + copyRect(1, 56, 73, 63, 177, 97, tableSurface, screenSurface); + updateScreen(73, 63, 73, 63, 177, 97, screenSurface); for (;;) { nivel_master = 72 + 61 - ((_mixer->getVolumeForSoundType(Audio::Mixer::kPlainSoundType) / 16) * 4); @@ -1452,17 +1317,17 @@ void DrasculaEngine::mesa() { updateRoom(); - copyRect(1, 56, 73, 63, 177, 97, dir_mesa, dir_zona_pantalla); + copyRect(1, 56, 73, 63, 177, 97, tableSurface, screenSurface); - copyBackground(183, 56, 82, nivel_master, 39, 2 + ((_mixer->getVolumeForSoundType(Audio::Mixer::kPlainSoundType) / 16) * 4), dir_mesa, dir_zona_pantalla); - copyBackground(183, 56, 138, nivel_voc, 39, 2 + ((_mixer->getVolumeForSoundType(Audio::Mixer::kSFXSoundType) / 16) * 4), dir_mesa, dir_zona_pantalla); - copyBackground(183, 56, 194, nivel_cd, 39, 2 + ((_mixer->getVolumeForSoundType(Audio::Mixer::kMusicSoundType) / 16) * 4), dir_mesa, dir_zona_pantalla); + copyBackground(183, 56, 82, nivel_master, 39, 2 + ((_mixer->getVolumeForSoundType(Audio::Mixer::kPlainSoundType) / 16) * 4), tableSurface, screenSurface); + copyBackground(183, 56, 138, nivel_voc, 39, 2 + ((_mixer->getVolumeForSoundType(Audio::Mixer::kSFXSoundType) / 16) * 4), tableSurface, screenSurface); + copyBackground(183, 56, 194, nivel_cd, 39, 2 + ((_mixer->getVolumeForSoundType(Audio::Mixer::kMusicSoundType) / 16) * 4), tableSurface, screenSurface); - cursor_mesa(); + setCursorTable(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); - MirarRaton(); + updateEvents(); if (button_dch == 1) { delay(100); @@ -1500,12 +1365,12 @@ void DrasculaEngine::mesa() { } - espera_soltar(); + updateEvents(); } bool DrasculaEngine::saves() { - char nombres[10][23]; - char fichero[50]; + char names[10][23]; + char file[50]; char fileEpa[50]; int n, n2, num_sav = 0, y = 27; Common::InSaveFile *sav; @@ -1526,48 +1391,47 @@ bool DrasculaEngine::saves() { } } for (n = 0; n < NUM_SAVES; n++) - sav->readLine(nombres[n], 23); + sav->readLine(names[n], 23); delete sav; - loadPic("savescr.alg"); - decompressPic(dir_dibujo1, HALF_PAL); + loadPic("savescr.alg", drawSurface1, HALF_PAL); - color_abc(LIGHT_GREEN); + color_abc(kColorLightGreen); for (;;) { y = 27; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); for (n = 0; n < NUM_SAVES; n++) { - print_abc(nombres[n], 116, y); + print_abc(names[n], 116, y); y = y + 9; } print_abc(select, 117, 15); - cursor_mesa(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + setCursorTable(); + updateScreen(); y = 27; - MirarRaton(); + updateEvents(); if (button_izq == 1) { delay(100); for (n = 0; n < NUM_SAVES; n++) { if (mouseX > 115 && mouseY > y + (9 * n) && mouseX < 115 + 175 && mouseY < y + 10 + (9 * n)) { - strcpy(select, nombres[n]); + strcpy(select, names[n]); if (strcmp(select, "*")) hay_seleccion = 1; else { - introduce_nombre(); - strcpy(nombres[n], select); + enterName(); + strcpy(names[n], select); if (hay_seleccion == 1) { - snprintf(fichero, 50, "%s%02d", _targetName.c_str(), n + 1); - para_grabar(fichero); + snprintf(file, 50, "%s%02d", _targetName.c_str(), n + 1); + para_grabar(file); Common::OutSaveFile *tsav; if (!(tsav = _saveFileMan->openForSaving(fileEpa))) { error("Can't open %s file", fileEpa); } for (n = 0; n < NUM_SAVES; n++) { - tsav->writeString(nombres[n]); + tsav->writeString(names[n]); tsav->writeString("\n"); } tsav->finalize(); @@ -1578,39 +1442,39 @@ bool DrasculaEngine::saves() { print_abc(select, 117, 15); y = 27; for (n2 = 0; n2 < NUM_SAVES; n2++) { - print_abc(nombres[n2], 116, y); + print_abc(names[n2], 116, y); y = y + 9; } if (hay_seleccion == 1) { - snprintf(fichero, 50, "%s%02d", _targetName.c_str(), n + 1); + snprintf(file, 50, "%s%02d", _targetName.c_str(), n + 1); } num_sav = n; } } if (mouseX > 117 && mouseY > 15 && mouseX < 295 && mouseY < 24 && hay_seleccion == 1) { - introduce_nombre(); - strcpy(nombres[num_sav], select); + enterName(); + strcpy(names[num_sav], select); print_abc(select, 117, 15); y = 27; for (n2 = 0; n2 < NUM_SAVES; n2++) { - print_abc(nombres[n2], 116, y); + print_abc(names[n2], 116, y); y = y + 9; } } if (mouseX > 125 && mouseY > 123 && mouseX < 199 && mouseY < 149 && hay_seleccion == 1) { - if (!para_cargar(fichero)) + if (!para_cargar(file)) return false; break; } else if (mouseX > 208 && mouseY > 123 && mouseX < 282 && mouseY < 149 && hay_seleccion == 1) { - para_grabar(fichero); + para_grabar(file); Common::OutSaveFile *tsav; if (!(tsav = _saveFileMan->openForSaving(fileEpa))) { error("Can't open %s file", fileEpa); } for (n = 0; n < NUM_SAVES; n++) { - tsav->writeString(nombres[n]); + tsav->writeString(names[n]); tsav->writeString("\n"); } tsav->finalize(); @@ -1620,7 +1484,7 @@ bool DrasculaEngine::saves() { else if (hay_seleccion == 0) { print_abc("elige una partida", 117, 15); } - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); delay(400); } y = 26; @@ -1631,194 +1495,100 @@ bool DrasculaEngine::saves() { clearRoom(); char rm[20]; sprintf(rm, "%i.alg", roomNumber); - loadPic(rm); - decompressPic(dir_dibujo1, HALF_PAL); + loadPic(rm, drawSurface1, HALF_PAL); hay_seleccion = 0; return true; } -void DrasculaEngine::print_abc(const char *said, int x_pantalla, int y_pantalla) { - int pos_texto[8]; - int y_de_letra = 0, x_de_letra = 0, h, length; +void DrasculaEngine::print_abc(const char *said, int screenX, int screenY) { + int textPos[8]; + int letterY = 0, letterX = 0, h, length; length = strlen(said); for (h = 0; h < length; h++) { - y_de_letra = (_lang == kSpanish) ? Y_ABC_ESP : Y_ABC; int c = toupper(said[h]); - if (c == 'A') - x_de_letra = X_A; - else if (c == 'B') - x_de_letra = X_B; - else if (c == 'C') - x_de_letra = X_C; - else if (c == 'D') - x_de_letra = X_D; - else if (c == 'E') - x_de_letra = X_E; - else if (c == 'F') - x_de_letra = X_F; - else if (c == 'G') - x_de_letra = X_G; - else if (c == 'H') - x_de_letra = X_H; - else if (c == 'I') - x_de_letra = X_I; - else if (c == 'J') - x_de_letra = X_J; - else if (c == 'K') - x_de_letra = X_K; - else if (c == 'L') - x_de_letra = X_L; - else if (c == 'M') - x_de_letra = X_M; - else if (c == 'N') - x_de_letra = X_N; - else if (c == 'O') - x_de_letra = X_O; - else if (c == 'P') - x_de_letra = X_P; - else if (c == 'Q') - x_de_letra = X_Q; - else if (c == 'R') - x_de_letra = X_R; - else if (c == 'S') - x_de_letra = X_S; - else if (c == 'T') - x_de_letra = X_T; - else if (c == 'U') - x_de_letra = X_U; - else if (c == 'V') - x_de_letra = X_V; - else if (c == 'W') - x_de_letra = X_W; - else if (c == 'X') - x_de_letra = X_X; - else if (c == 'Y') - x_de_letra = X_Y; - else if (c == 'Z') - x_de_letra = X_Z; - else if (c == '\245') - x_de_letra = X_GN; - else if (c == '\244') - x_de_letra = X_GN; - else if (c == 0xa7 || c == ' ') - x_de_letra = SPACE; - else { - y_de_letra = (_lang == kSpanish) ? Y_SIGNOS_ESP : Y_SIGNOS; - if (c == '.') - x_de_letra = X_DOT; - else if (c == ',') - x_de_letra = X_COMA; - else if (c == '-') - x_de_letra = X_HYPHEN; - else if (c == '?') - x_de_letra = X_CIERRA_INTERROGACION; - else if (c == '\250') - x_de_letra = X_ABRE_INTERROGACION; -// else if (c == '\'') // FIXME -// x_de_letra = SPACE; // space for now - else if (c == '"') - x_de_letra = X_COMILLAS; - else if (c == '!') - x_de_letra = X_CIERRA_EXCLAMACION; - else if (c == '\255') - x_de_letra = X_ABRE_EXCLAMACION; - else if (c == ';') - x_de_letra = X_PUNTO_Y_COMA; - else if (c == '>') - x_de_letra = X_GREATER_THAN; - else if (c == '<') - x_de_letra = X_LESSER_THAN; - else if (c == '$') - x_de_letra = X_DOLAR; - else if (c == '%') - x_de_letra = X_PERCENT; - else if (c == ':') - x_de_letra = X_DOS_PUNTOS; - else if (c == '&') - x_de_letra = X_AND; - else if (c == '/') - x_de_letra = X_BARRA; - else if (c == '(') - x_de_letra = X_BRACKET_OPEN; - else if (c == ')') - x_de_letra = X_BRACKET_CLOSE; - else if (c == '*') - x_de_letra = X_ASTERISCO; - else if (c == '+') - x_de_letra = X_PLUS; - else if (c == '1') - x_de_letra = X_N1; - else if (c == '2') - x_de_letra = X_N2; - else if (c == '3') - x_de_letra = X_N3; - else if (c == '4') - x_de_letra = X_N4; - else if (c == '5') - x_de_letra = X_N5; - else if (c == '6') - x_de_letra = X_N6; - else if (c == '7') - x_de_letra = X_N7; - else if (c == '8') - x_de_letra = X_N8; - else if (c == '9') - x_de_letra = X_N9; - else if (c == '0') - x_de_letra = X_N0; - else y_de_letra=Y_ACENTOS; - - if (c == '\240') x_de_letra=X_A; - else if (c =='\202') x_de_letra = X_B; - else if (c =='\241') x_de_letra = X_C; - else if (c =='\242') x_de_letra = X_D; - else if (c =='\243') x_de_letra = X_E; - else if (c =='\205') x_de_letra = X_F; - else if (c =='\212') x_de_letra = X_G; - else if (c =='\215') x_de_letra = X_H; - else if (c =='\225') x_de_letra = X_I; - else if (c =='\227') x_de_letra = X_J; - else if (c =='\203') x_de_letra = X_K; - else if (c =='\210') x_de_letra = X_L; - else if (c =='\214') x_de_letra = X_M; - else if (c =='\223') x_de_letra = X_N; - else if (c =='\226') x_de_letra = X_GN; - else if (c =='\047') x_de_letra = X_O; - else if (c =='\200') x_de_letra = X_P; - else if (c =='\207') x_de_letra = X_P; - else if (c =='\265') x_de_letra = X_A; - else if (c =='\220') x_de_letra = X_B; - else if (c =='\326') x_de_letra = X_C; - else if (c =='\340') x_de_letra = X_D; - else if (c =='\351') x_de_letra = X_E; - else if (c =='\267') x_de_letra = X_F; - else if (c =='\324') x_de_letra = X_G; - else if (c =='\336') x_de_letra = X_H; - else if (c =='\343') x_de_letra = X_I; - else if (c =='\353') x_de_letra = X_J; - else if (c =='\266') x_de_letra = X_K; - else if (c =='\322') x_de_letra = X_L; - else if (c =='\327') x_de_letra = X_M; - else if (c =='\342') x_de_letra = X_N; - else if (c =='\352') x_de_letra = X_GN; - } - pos_texto[0] = x_de_letra; - pos_texto[1] = y_de_letra; - pos_texto[2] = x_pantalla; - pos_texto[3] = y_pantalla; - pos_texto[4] = CHAR_WIDTH; - pos_texto[5] = CHAR_HEIGHT; + for (int i = 0; i < CHARMAP_SIZE; i++) { + if (c == charMap[i].inChar) { + letterX = charMap[i].mappedChar; + + switch (charMap[i].charType) { + case 0: // letters + letterY = (_lang == kSpanish) ? 149 : 158; + break; + case 1: // signs + letterY = (_lang == kSpanish) ? 160 : 169; + break; + case 2: // accented + letterY = 180; + break; + } // switch + break; + } // if + } // for + + textPos[0] = letterX; + textPos[1] = letterY; + textPos[2] = screenX; + textPos[3] = screenY; + textPos[4] = CHAR_WIDTH; + textPos[5] = CHAR_HEIGHT; - copyRectClip(pos_texto, dir_texto, dir_zona_pantalla); + copyRectClip(textPos, textSurface, screenSurface); - x_pantalla = x_pantalla + CHAR_WIDTH; - if (x_pantalla > 317) { - x_pantalla = 0; - y_pantalla = y_pantalla + CHAR_HEIGHT + 2; + screenX = screenX + CHAR_WIDTH; + if (screenX > 317) { + screenX = 0; + screenY = screenY + CHAR_HEIGHT + 2; } + } // for +} + +void DrasculaEngine::print_abc_opc(const char *said, int screenX, int screenY, int game) { + int textPos[6]; + int signY, letterY, letterX = 0, h, length; + length = strlen(said); + + for (h = 0; h < length; h++) { + if (game == 1) { + letterY = 6; + signY = 15; + } else if (game == 3) { + letterY = 56; + signY = 65; + } else { + letterY = 31; + signY = 40; + } + + int c = toupper(said[h]); + + for (int i = 0; i < CHARMAP_SIZE; i++) { + if (c == charMap[i].inChar) { + // Convert the mapped char of the normal font to the + // mapped char of the dialogue font + + int multiplier = (charMap[i].mappedChar - 6) / 9; + + letterX = multiplier * 7 + 10; + + if (charMap[i].charType > 0) + letterY = signY; + break; + } // if + } // for + + textPos[0] = letterX; + textPos[1] = letterY; + textPos[2] = screenX; + textPos[3] = screenY; + textPos[4] = CHAR_WIDTH_OPC; + textPos[5] = CHAR_HEIGHT_OPC; + + copyRectClip(textPos, backSurface, screenSurface); + + screenX = screenX + CHAR_WIDTH_OPC; } } @@ -1826,17 +1596,17 @@ void DrasculaEngine::delay(int ms) { _system->delayMillis(ms * 2); // originaly was 1 } -bool DrasculaEngine::confirma_salir() { +bool DrasculaEngine::confirmExit() { byte key; - color_abc(RED); + color_abc(kColorRed); updateRoom(); - centra_texto(_textsys[_lang][1], 160, 87); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + centerText(_textsys[_lang][1], 160, 87); + updateScreen(); delay(100); for (;;) { - key = getscan(); + key = getScan(); if (key != 0) break; } @@ -1849,44 +1619,39 @@ bool DrasculaEngine::confirma_salir() { return true; } -void DrasculaEngine::salva_pantallas() { +void DrasculaEngine::screenSaver() { int xr, yr; byte *copia, *ghost; - Common::File file; float coeff = 0, coeff2 = 0; int count = 0; int count2 = 0; int tempLine[320]; int tempRow[200]; - // FIXME: that part (*.ghost) need RE from efecto.lib file for some gfx special effect - // for now ignore - clearRoom(); - loadPic("sv.alg"); - decompressPic(dir_dibujo1, HALF_PAL); + loadPic("sv.alg", drawSurface1, HALF_PAL); // inicio_ghost(); copia = (byte *)malloc(64000); ghost = (byte *)malloc(65536); // carga_ghost(); - file.open("ghost.drv"); - if (!file.isOpen()) + _arj.open("ghost.drv"); + if (!_arj.isOpen()) error("Cannot open file ghost.drv"); - file.read(ghost, 65536); - file.close(); + _arj.read(ghost, 65536); + _arj.close(); - MirarRaton(); + updateEvents(); xr = mouseX; yr = mouseY; for (;;) { - // efecto(dir_dibujo1); + // efecto(drawSurface1); - memcpy(copia, dir_dibujo1, 64000); + memcpy(copia, drawSurface1, 64000); coeff += 0.1f; coeff2 = coeff; @@ -1896,20 +1661,14 @@ void DrasculaEngine::salva_pantallas() { for (int i = 0; i < 320; i++) { tempLine[i] = (int)(sin(coeff2) * 16); coeff2 += 0.02f; - if (tempLine[i] < 0) - tempLine[i] += 200; - if (tempLine[i] > 199) - tempLine[i] -= 200; + tempLine[i] = checkWrapY(tempLine[i]); } coeff2 = coeff; for (int i = 0; i < 200; i++) { tempRow[i] = (int)(sin(coeff2) * 16); coeff2 += 0.02f; - if (tempRow[i] < 0) - tempRow[i] += 320; - if (tempRow[i] > 319) - tempRow[i] -= 320; + tempRow[i] = checkWrapX(tempRow[i]); } if (++count2 > 199) @@ -1920,33 +1679,21 @@ void DrasculaEngine::salva_pantallas() { for (int i = 0; i < 200; i++) { for (int j = 0; j < 320; j++) { x1_ = j + tempRow[i]; - if (x1_ < 0) - x1_ += 320; - if (x1_ > 319) - x1_ -= 319; + x1_ = checkWrapX(x1_); y1_ = i + count2; - if (y1_ < 0) - y1_ += 200; - if (y1_ > 199) - y1_ -= 200; + y1_ = checkWrapY(y1_); off1 = 320 * y1_ + x1_; x1_ = j + count; - if (x1_ < 0) - x1_ += 320; - if (x1_ > 319) - x1_ -= 320; + x1_ = checkWrapX(x1_); y1_ = i + tempLine[j]; - if (y1_ < 0) - y1_ += 200; - if (y1_ > 199) - y1_ -= 200; + y1_ = checkWrapY(y1_); off2 = 320 * y1_ + x1_; - VGA[320 * i + j] = ghost[dir_dibujo1[off2] + (copia[off1] << 8)]; + VGA[320 * i + j] = ghost[drawSurface1[off2] + (copia[off1] << 8)]; } } _system->copyRectToScreen((const byte *)VGA, 320, 0, 0, 320, 200); @@ -1956,7 +1703,7 @@ void DrasculaEngine::salva_pantallas() { // end of efecto() - MirarRaton(); + updateEvents(); if (button_dch == 1 || button_izq == 1) break; if (mouseX != xr) @@ -1970,32 +1717,31 @@ void DrasculaEngine::salva_pantallas() { char rm[20]; sprintf(rm, "%i.alg", roomNumber); - loadPic(rm); - decompressPic(dir_dibujo1, HALF_PAL); + loadPic(rm, drawSurface1, HALF_PAL); } void DrasculaEngine::fliplay(const char *filefli, int vel) { - OpenSSN(filefli, vel); - while (PlayFrameSSN() && (!term_int)) { - if (getscan() == Common::KEYCODE_ESCAPE) + openSSN(filefli, vel); + while (playFrameSSN() && (!term_int)) { + if (getScan() == Common::KEYCODE_ESCAPE) term_int = 1; } EndSSN(); } -void DrasculaEngine::FundeDelNegro(int VelocidadDeFundido) { +void DrasculaEngine::fadeFromBlack(int fadeSpeed) { char fundido; - unsigned int color, componente; + unsigned int color, component; DacPalette256 palFundido; for (fundido = 0; fundido < 64; fundido++) { for (color = 0; color < 256; color++) { - for (componente = 0; componente < 3; componente++) { - palFundido[color][componente] = LimitaVGA(gamePalette[color][componente] - 63 + fundido); + for (component = 0; component < 3; component++) { + palFundido[color][component] = adjustToVGA(gamePalette[color][component] - 63 + fundido); } } - pause(VelocidadDeFundido); + pause(fadeSpeed); setPalette((byte *)&palFundido); } @@ -2004,59 +1750,31 @@ void DrasculaEngine::FundeDelNegro(int VelocidadDeFundido) { void DrasculaEngine::color_abc(int cl) { _color = cl; - if (cl == 0) { - gamePalette[254][0] = 0; - gamePalette[254][1] = 0; - gamePalette[254][2] = 0; - } else if (cl == 1) { - gamePalette[254][0] = 0x10; - gamePalette[254][1] = 0x3E; - gamePalette[254][2] = 0x28; - } else if (cl == 3) { - gamePalette[254][0] = 0x16; - gamePalette[254][1] = 0x3F; - gamePalette[254][2] = 0x16; - } else if (cl == 4) { - gamePalette[254][0] = 0x9; - gamePalette[254][1] = 0x3F; - gamePalette[254][2] = 0x12; - } else if (cl == 5) { - gamePalette[254][0] = 0x3F; - gamePalette[254][1] = 0x3F; - gamePalette[254][2] = 0x15; - } else if (cl == 7) { - gamePalette[254][0] = 0x38; - gamePalette[254][1] = 0; - gamePalette[254][2] = 0; - } else if (cl == 8) { - gamePalette[254][0] = 0x3F; - gamePalette[254][1] = 0x27; - gamePalette[254][2] = 0x0B; - } else if (cl == 9) { - gamePalette[254][0] = 0x2A; - gamePalette[254][1] = 0; - gamePalette[254][2] = 0x2A; - } else if (cl == 10) { - gamePalette[254][0] = 0x30; - gamePalette[254][1] = 0x30; - gamePalette[254][2] = 0x30; - } else if (cl == 11) { - gamePalette[254][0] = 98; - gamePalette[254][1] = 91; - gamePalette[254][2] = 100; + char colorTable[][3] = { + { 0, 0, 0 }, { 0x10, 0x3E, 0x28 }, + { 0, 0, 0 }, // unused + { 0x16, 0x3F, 0x16 }, { 0x09, 0x3F, 0x12 }, + { 0x3F, 0x3F, 0x15 }, + { 0, 0, 0 }, // unused + { 0x38, 0, 0 }, { 0x3F, 0x27, 0x0B }, + { 0x2A, 0, 0x2A }, { 0x30, 0x30, 0x30 }, + { 98, 91, 100 } }; + for (int i = 0; i <= 2; i++) + gamePalette[254][i] = colorTable[cl][i]; + setPalette((byte *)&gamePalette); } -char DrasculaEngine::LimitaVGA(char valor) { - return (valor & 0x3F) * (valor > 0); +char DrasculaEngine::adjustToVGA(char value) { + return (value & 0x3F) * (value > 0); } -void DrasculaEngine::centra_texto(const char *mensaje, int x_texto, int y_texto) { +void DrasculaEngine::centerText(const char *message, int textX, int textY) { char bb[200], m2[200], m1[200], mb[10][50]; char m3[200]; - int h, fil, x_texto3, x_texto2, x_texto1, conta_f = 0, ya = 0; + int h, fil, textX3, textX2, textX1, conta_f = 0, ya = 0; strcpy(m1, " "); strcpy(m2, " "); @@ -2066,92 +1784,87 @@ void DrasculaEngine::centra_texto(const char *mensaje, int x_texto, int y_texto) for (h = 0; h < 10; h++) strcpy(mb[h], " "); - if (x_texto > 160) + if (textX > 160) ya = 1; - strcpy(m1, mensaje); - x_texto = CLIP<int>(x_texto, 60, 255); + strcpy(m1, message); + textX = CLIP<int>(textX, 60, 255); - x_texto1 = x_texto; + textX1 = textX; if (ya == 1) - x_texto1 = 315 - x_texto; + textX1 = 315 - textX; - x_texto2 = (strlen(m1) / 2) * CHAR_WIDTH; + textX2 = (strlen(m1) / 2) * CHAR_WIDTH; -tut: - strcpy(bb, m1); - scumm_strrev(bb); + while (true) { + strcpy(bb, m1); + scumm_strrev(bb); - if (x_texto1 < x_texto2) { - strcpy(m3, strrchr(m1, ' ')); - strcpy(m1, strstr(bb, " ")); - scumm_strrev(m1); - m1[strlen(m1) - 1] = '\0'; - strcat(m3, m2); - strcpy(m2, m3); - }; + if (textX1 < textX2) { + strcpy(m3, strrchr(m1, ' ')); + strcpy(m1, strstr(bb, " ")); + scumm_strrev(m1); + m1[strlen(m1) - 1] = '\0'; + strcat(m3, m2); + strcpy(m2, m3); + }; + + textX2 = (strlen(m1) / 2) * CHAR_WIDTH; - x_texto2 = (strlen(m1) / 2) * CHAR_WIDTH; - if (x_texto1 < x_texto2) - goto tut; - strcpy(mb[conta_f], m1); + if (textX1 < textX2) + continue; - if (!strcmp(m2, "")) - goto imprimir; - scumm_strrev(m2); - m2[strlen(m2) - 1] = '\0'; - scumm_strrev(m2); - strcpy(m1, m2); - strcpy(m2, ""); - conta_f++; + strcpy(mb[conta_f], m1); - goto tut; + if (!strcmp(m2, "")) + break; -imprimir: + scumm_strrev(m2); + m2[strlen(m2) - 1] = '\0'; + scumm_strrev(m2); + strcpy(m1, m2); + strcpy(m2, ""); + conta_f++; + } - fil = y_texto - (((conta_f + 3) * CHAR_HEIGHT)); + fil = textY - (((conta_f + 3) * CHAR_HEIGHT)); for (h = 0; h < conta_f + 1; h++) { - x_texto3 = strlen(mb[h]) / 2; - print_abc(mb[h], ((x_texto) - x_texto3 * CHAR_WIDTH) - 1, fil); + textX3 = strlen(mb[h]) / 2; + print_abc(mb[h], ((textX) - textX3 * CHAR_WIDTH) - 1, fil); fil = fil + CHAR_HEIGHT + 2; } } -void DrasculaEngine::playSound(const char *fichero) { - if (hay_sb == 1) { - sku = new Common::File; - sku->open(fichero); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); - } - } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); +void DrasculaEngine::playSound(int soundNum) { + char file[20]; + sprintf(file, "s%i.als", soundNum); + + if (hay_sb == 1) + playFile(file); } -bool DrasculaEngine::anima(const char *animation, int FPS) { - Common::File FileIn; +bool DrasculaEngine::animate(const char *animationFile, int FPS) { unsigned j; int NFrames = 1; int cnt = 2; + int dataSize = 0; AuxBuffLast = (byte *)malloc(65000); AuxBuffDes = (byte *)malloc(65000); - FileIn.open(animation); + _arj.open(animationFile); - if (!FileIn.isOpen()) { - error("No encuentro un fichero de animation."); + if (!_arj.isOpen()) { + error("Animation file %s not found", animationFile); } - FileIn.read(&NFrames, sizeof(NFrames)); - FileIn.read(&Leng, sizeof(Leng)); - AuxBuffOrg = (byte *)malloc(Leng); - FileIn.read(AuxBuffOrg, Leng); - FileIn.read(cPal, 768); + NFrames = _arj.readSint32LE(); + dataSize = _arj.readSint32LE(); + AuxBuffOrg = (byte *)malloc(dataSize); + _arj.read(AuxBuffOrg, dataSize); + _arj.read(cPal, 768); loadPCX(AuxBuffOrg); free(AuxBuffOrg); memcpy(VGA, AuxBuffDes, 64000); @@ -2161,10 +1874,10 @@ bool DrasculaEngine::anima(const char *animation, int FPS) { memcpy(AuxBuffLast, AuxBuffDes, 64000); WaitForNext(FPS); while (cnt < NFrames) { - FileIn.read(&Leng, sizeof(Leng)); - AuxBuffOrg = (byte *)malloc(Leng); - FileIn.read(AuxBuffOrg, Leng); - FileIn.read(cPal, 768); + dataSize = _arj.readSint32LE(); + AuxBuffOrg = (byte *)malloc(dataSize); + _arj.read(AuxBuffOrg, dataSize); + _arj.read(cPal, 768); loadPCX(AuxBuffOrg); free(AuxBuffOrg); for (j = 0;j < 64000; j++) { @@ -2174,7 +1887,7 @@ bool DrasculaEngine::anima(const char *animation, int FPS) { _system->updateScreen(); WaitForNext(FPS); cnt++; - byte key = getscan(); + byte key = getScan(); if (key == Common::KEYCODE_ESCAPE) term_int = 1; if (key != 0) @@ -2182,33 +1895,24 @@ bool DrasculaEngine::anima(const char *animation, int FPS) { } free(AuxBuffLast); free(AuxBuffDes); - FileIn.close(); + _arj.close(); - return ((term_int == 1) || (getscan() == Common::KEYCODE_ESCAPE)); + return ((term_int == 1) || (getScan() == Common::KEYCODE_ESCAPE)); } -void DrasculaEngine::animastopSound_corte() { - if (hay_sb == 1) { - ctvd_stop(); - delete sku; - sku = NULL; - ctvd_terminate(); - } -} - -void DrasculaEngine::FundeAlNegro(int VelocidadDeFundido) { +void DrasculaEngine::fadeToBlack(int fadeSpeed) { char fundido; - unsigned int color, componente; + unsigned int color, component; DacPalette256 palFundido; for (fundido = 63; fundido >= 0; fundido--) { for (color = 0; color < 256; color++) { - for (componente = 0; componente < 3; componente++) { - palFundido[color][componente] = LimitaVGA(gamePalette[color][componente] - 63 + fundido); + for (component = 0; component < 3; component++) { + palFundido[color][component] = adjustToVGA(gamePalette[color][component] - 63 + fundido); } } - pause(VelocidadDeFundido); + pause(fadeSpeed); setPalette((byte *)&palFundido); } @@ -2218,11 +1922,11 @@ void DrasculaEngine::pause(int cuanto) { _system->delayMillis(cuanto * 30); // was originaly 2 } -void DrasculaEngine::pon_igor() { +void DrasculaEngine::placeIgor() { int pos_igor[6]; pos_igor[0] = 1; - if (num_ejec == 4) { + if (currentChapter == 4) { pos_igor[1] = 138; } else { if (sentido_igor == 3) @@ -2230,22 +1934,22 @@ void DrasculaEngine::pon_igor() { else if (sentido_igor == 1) pos_igor[1] = 76; } - pos_igor[2] = x_igor; - pos_igor[3] = y_igor; + pos_igor[2] = igorX; + pos_igor[3] = igorY; pos_igor[4] = 54; pos_igor[5] = 61; - copyRectClip(pos_igor, dir_hare_frente, dir_zona_pantalla); + copyRectClip(pos_igor, frontSurface, screenSurface); } -void DrasculaEngine::pon_dr() { +void DrasculaEngine::placeDrascula() { int pos_dr[6]; if (sentido_dr == 1) pos_dr[0] = 47; else if (sentido_dr == 0) pos_dr[0] = 1; - else if (sentido_dr == 3 && num_ejec == 1) + else if (sentido_dr == 3 && currentChapter == 1) pos_dr[0] = 93; pos_dr[1] = 122; pos_dr[2] = x_dr; @@ -2253,13 +1957,13 @@ void DrasculaEngine::pon_dr() { pos_dr[4] = 45; pos_dr[5] = 77; - if (num_ejec == 6) - copyRectClip(pos_dr, dir_dibujo2, dir_zona_pantalla); + if (currentChapter == 6) + copyRectClip(pos_dr, drawSurface2, screenSurface); else - copyRectClip(pos_dr, dir_hare_fondo, dir_zona_pantalla); + copyRectClip(pos_dr, backSurface, screenSurface); } -void DrasculaEngine::pon_bj() { +void DrasculaEngine::placeBJ() { int pos_bj[6]; if (sentido_bj == 3) @@ -2272,53 +1976,51 @@ void DrasculaEngine::pon_bj() { pos_bj[4] = 26; pos_bj[5] = 76; - copyRectClip(pos_bj, dir_dibujo3, dir_zona_pantalla); + copyRectClip(pos_bj, drawSurface3, screenSurface); } -void DrasculaEngine::hipo(int counter) { +void DrasculaEngine::hiccup(int counter) { int y = 0, sentido = 0; - if (num_ejec == 3) + if (currentChapter == 3) y = -1; -comienza: - counter--; + do { + counter--; - updateRoom(); - if (num_ejec == 3) - updateScreen(0, 0, 0, y, 320, 200, dir_zona_pantalla); - else - updateScreen(0, 1, 0, y, 320, 198, dir_zona_pantalla); + updateRoom(); + if (currentChapter == 3) + updateScreen(0, 0, 0, y, 320, 200, screenSurface); + else + updateScreen(0, 1, 0, y, 320, 198, screenSurface); - if (sentido == 0) - y++; - else - y--; + if (sentido == 0) + y++; + else + y--; - if (num_ejec == 3) { - if (y == 1) - sentido = 1; - if (y == -1) - sentido = 0; - } else { - if (y == 2) - sentido = 1; - if (y == 0) - sentido = 0; - } - if (counter > 0) - goto comienza; + if (currentChapter == 3) { + if (y == 1) + sentido = 1; + if (y == -1) + sentido = 0; + } else { + if (y == 2) + sentido = 1; + if (y == 0) + sentido = 0; + } + } while (counter > 0); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); } -void DrasculaEngine::stopSound() { +void DrasculaEngine::finishSound() { delay(1); if (hay_sb == 1) { - while (LookForFree() != 0); - delete sku; - sku = NULL; + while (soundIsActive()) + _system->delayMillis(10); } } @@ -2336,31 +2038,31 @@ int DrasculaEngine::musicStatus() { } void DrasculaEngine::updateRoom() { - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); updateRefresh_pre(); - if (num_ejec == 3) { + if (currentChapter == 3) { if (flags[0] == 0) pon_hare(); else - copyRect(113, 54, hare_x - 20, hare_y - 1, 77, 89, dir_dibujo3, dir_zona_pantalla); + copyRect(113, 54, hare_x - 20, hare_y - 1, 77, 89, drawSurface3, screenSurface); } else { pon_hare(); } updateRefresh(); } -bool DrasculaEngine::carga_partida(const char *nom_game) { +bool DrasculaEngine::loadGame(const char *gameName) { int l, n_ejec2; Common::InSaveFile *sav; - if (!(sav = _saveFileMan->openForLoading(nom_game))) { + if (!(sav = _saveFileMan->openForLoading(gameName))) { error("missing savegame file"); } n_ejec2 = sav->readSint32LE(); - if (n_ejec2 != num_ejec) { - strcpy(nom_partida, nom_game); - num_ejec = n_ejec2 - 1; + if (n_ejec2 != currentChapter) { + strcpy(saveName, gameName); + currentChapter = n_ejec2 - 1; hay_que_load = 1; return false; } @@ -2377,71 +2079,71 @@ bool DrasculaEngine::carga_partida(const char *nom_game) { flags[l] = sav->readSint32LE(); } - lleva_objeto = sav->readSint32LE(); + takeObject = sav->readSint32LE(); pickedObject = sav->readSint32LE(); hay_que_load = 0; return true; } -void DrasculaEngine::puertas_cerradas(int l) { - if (num_ejec == 1 || num_ejec == 3 || num_ejec == 5 || num_ejec == 6) +void DrasculaEngine::updateDoor(int doorNum) { + if (currentChapter == 1 || currentChapter == 3 || currentChapter == 5 || currentChapter == 6) return; - else if (num_ejec == 2) { - if (num_obj[l] == 138) - isDoor[l] = flags[0]; - else if (num_obj[l] == 136) - isDoor[l] = flags[8]; - else if (num_obj[l] == 156) - isDoor[l] = flags[16]; - else if (num_obj[l] == 163) - isDoor[l] = flags[17]; - else if (num_obj[l] == 177) - isDoor[l] = flags[15]; - else if (num_obj[l] == 175) - isDoor[l] = flags[40]; - else if (num_obj[l] == 173) - isDoor[l] = flags[36]; - } else if (num_ejec == 4) { - if (num_obj[l] == 101 && flags[0] == 0) - isDoor[l] = 0; - else if (num_obj[l] == 101 && flags[0] == 1 && flags[28] == 1) - isDoor[l] = 1; - else if (num_obj[l] == 103) - isDoor[l] = flags[0]; - else if (num_obj[l] == 104) - isDoor[l] = flags[1]; - else if (num_obj[l] == 105) - isDoor[l] = flags[1]; - else if (num_obj[l] == 106) - isDoor[l] = flags[2]; - else if (num_obj[l] == 107) - isDoor[l] = flags[2]; - else if (num_obj[l] == 110) - isDoor[l] = flags[6]; - else if (num_obj[l] == 114) - isDoor[l] = flags[4]; - else if (num_obj[l] == 115) - isDoor[l] = flags[4]; - else if (num_obj[l] == 116 && flags[5] == 0) - isDoor[l] = 0; - else if (num_obj[l] == 116 && flags[5] == 1 && flags[23] == 1) - isDoor[l] = 1; - else if (num_obj[l] == 117) - isDoor[l] = flags[5]; - else if (num_obj[l] == 120) - isDoor[l] = flags[8]; - else if (num_obj[l] == 122) - isDoor[l] = flags[7]; + else if (currentChapter == 2) { + if (objectNum[doorNum] == 138) + isDoor[doorNum] = flags[0]; + else if (objectNum[doorNum] == 136) + isDoor[doorNum] = flags[8]; + else if (objectNum[doorNum] == 156) + isDoor[doorNum] = flags[16]; + else if (objectNum[doorNum] == 163) + isDoor[doorNum] = flags[17]; + else if (objectNum[doorNum] == 177) + isDoor[doorNum] = flags[15]; + else if (objectNum[doorNum] == 175) + isDoor[doorNum] = flags[40]; + else if (objectNum[doorNum] == 173) + isDoor[doorNum] = flags[36]; + } else if (currentChapter == 4) { + if (objectNum[doorNum] == 101 && flags[0] == 0) + isDoor[doorNum] = 0; + else if (objectNum[doorNum] == 101 && flags[0] == 1 && flags[28] == 1) + isDoor[doorNum] = 1; + else if (objectNum[doorNum] == 103) + isDoor[doorNum] = flags[0]; + else if (objectNum[doorNum] == 104) + isDoor[doorNum] = flags[1]; + else if (objectNum[doorNum] == 105) + isDoor[doorNum] = flags[1]; + else if (objectNum[doorNum] == 106) + isDoor[doorNum] = flags[2]; + else if (objectNum[doorNum] == 107) + isDoor[doorNum] = flags[2]; + else if (objectNum[doorNum] == 110) + isDoor[doorNum] = flags[6]; + else if (objectNum[doorNum] == 114) + isDoor[doorNum] = flags[4]; + else if (objectNum[doorNum] == 115) + isDoor[doorNum] = flags[4]; + else if (objectNum[doorNum] == 116 && flags[5] == 0) + isDoor[doorNum] = 0; + else if (objectNum[doorNum] == 116 && flags[5] == 1 && flags[23] == 1) + isDoor[doorNum] = 1; + else if (objectNum[doorNum] == 117) + isDoor[doorNum] = flags[5]; + else if (objectNum[doorNum] == 120) + isDoor[doorNum] = flags[8]; + else if (objectNum[doorNum] == 122) + isDoor[doorNum] = flags[7]; } } void DrasculaEngine::color_hare() { - int color, componente; + int color, component; for (color = 235; color < 253; color++) { - for (componente = 0; componente < 3; componente++) { - gamePalette[color][componente] = palHare[color][componente]; + for (component = 0; component < 3; component++) { + gamePalette[color][component] = palHare[color][component]; } } updatePalette(); @@ -2449,12 +2151,12 @@ void DrasculaEngine::color_hare() { void DrasculaEngine::funde_hare(int oscuridad) { char fundido; - unsigned int color, componente; + unsigned int color, component; for (fundido = oscuridad; fundido >= 0; fundido--) { for (color = 235; color < 253; color++) { - for (componente = 0; componente < 3; componente++) - gamePalette[color][componente] = LimitaVGA(gamePalette[color][componente] - 8 + fundido); + for (component = 0; component < 3; component++) + gamePalette[color][component] = adjustToVGA(gamePalette[color][component] - 8 + fundido); } } @@ -2462,41 +2164,41 @@ void DrasculaEngine::funde_hare(int oscuridad) { } void DrasculaEngine::paleta_hare_claro() { - int color, componente; + int color, component; for (color = 235; color < 253; color++) { - for (componente = 0; componente < 3; componente++) - palHareClaro[color][componente] = gamePalette[color][componente]; + for (component = 0; component < 3; component++) + palHareClaro[color][component] = gamePalette[color][component]; } } void DrasculaEngine::paleta_hare_oscuro() { - int color, componente; + int color, component; for (color = 235; color < 253; color++) { - for (componente = 0; componente < 3; componente++) - palHareOscuro[color][componente] = gamePalette[color][componente]; + for (component = 0; component < 3; component++) + palHareOscuro[color][component] = gamePalette[color][component]; } } void DrasculaEngine::hare_claro() { - int color, componente; + int color, component; for (color = 235; color < 253; color++) { - for (componente = 0; componente < 3; componente++) - gamePalette[color][componente] = palHareClaro[color][componente]; + for (component = 0; component < 3; component++) + gamePalette[color][component] = palHareClaro[color][component]; } updatePalette(); } -void DrasculaEngine::empieza_andar() { - hare_se_mueve = 1; +void DrasculaEngine::startWalking() { + characterMoved = 1; - step_x = PASO_HARE_X; - step_y = PASO_HARE_Y; + stepX = STEP_X; + stepY = STEP_Y; - if (num_ejec == 2) { + if (currentChapter == 2) { if ((sitio_x < hare_x) && (sitio_y <= (hare_y + alto_hare))) quadrant_1(); else if ((sitio_x < hare_x) && (sitio_y > (hare_y + alto_hare))) @@ -2506,9 +2208,9 @@ void DrasculaEngine::empieza_andar() { else if ((sitio_x > hare_x + ancho_hare) && (sitio_y > (hare_y + alto_hare))) quadrant_4(); else if (sitio_y < hare_y + alto_hare) - anda_parriba(); + walkUp(); else if (sitio_y > hare_y + alto_hare) - anda_pabajo(); + walkDown(); } else { if ((sitio_x < hare_x + ancho_hare / 2 ) && (sitio_y <= (hare_y + alto_hare))) quadrant_1(); @@ -2519,72 +2221,74 @@ void DrasculaEngine::empieza_andar() { else if ((sitio_x > hare_x + ancho_hare / 2) && (sitio_y > (hare_y + alto_hare))) quadrant_4(); else - hare_se_mueve = 0; + characterMoved = 0; } - conta_vez = vez(); + conta_vez = getTime(); } void DrasculaEngine::pon_hare() { int pos_hare[6]; int r; - if (hare_se_mueve == 1 && step_x == PASO_HARE_X) { - for (r = 0; r < step_x; r++) { - if (num_ejec != 2) { + if (characterMoved == 1 && stepX == STEP_X) { + for (r = 0; r < stepX; r++) { + if (currentChapter != 2) { if (sentido_hare == 0 && sitio_x - r == hare_x + ancho_hare / 2) { - hare_se_mueve = 0; - step_x = PASO_HARE_X; - step_y = PASO_HARE_Y; + characterMoved = 0; + stepX = STEP_X; + stepY = STEP_Y; } if (sentido_hare == 1 && sitio_x + r == hare_x + ancho_hare / 2) { - hare_se_mueve = 0; - step_x = PASO_HARE_X; - step_y = PASO_HARE_Y; + characterMoved = 0; + stepX = STEP_X; + stepY = STEP_Y; hare_x = sitio_x - ancho_hare / 2; hare_y = sitio_y - alto_hare; } - } else if (num_ejec == 2) { + } else if (currentChapter == 2) { if (sentido_hare == 0 && sitio_x - r == hare_x) { - hare_se_mueve = 0; - step_x = PASO_HARE_X; - step_y = PASO_HARE_Y; + characterMoved = 0; + stepX = STEP_X; + stepY = STEP_Y; } if (sentido_hare == 1 && sitio_x + r == hare_x + ancho_hare) { - hare_se_mueve = 0; - step_x = PASO_HARE_X; - step_y = PASO_HARE_Y; + characterMoved = 0; + stepX = STEP_X; + stepY = STEP_Y; hare_x = sitio_x - ancho_hare + 4; hare_y = sitio_y - alto_hare; } } } } - if (hare_se_mueve == 1 && step_y == PASO_HARE_Y) { - for (r = 0; r < step_y; r++) { + if (characterMoved == 1 && stepY == STEP_Y) { + for (r = 0; r < stepY; r++) { if (sentido_hare == 2 && sitio_y - r == hare_y + alto_hare) { - hare_se_mueve = 0; - step_x = PASO_HARE_X; - step_y = PASO_HARE_Y; + characterMoved = 0; + stepX = STEP_X; + stepY = STEP_Y; } if (sentido_hare == 3 && sitio_y + r == hare_y + alto_hare) { - hare_se_mueve = 0; - step_x = PASO_HARE_X; - step_y = PASO_HARE_Y; + characterMoved = 0; + stepX = STEP_X; + stepY = STEP_Y; } } } - if (num_ejec == 1 || num_ejec == 4 || num_ejec == 5 || num_ejec == 6) { - if (hare_se_ve == 0) - goto no_vuelco; + if (currentChapter == 1 || currentChapter == 4 || currentChapter == 5 || currentChapter == 6) { + if (hare_se_ve == 0) { + increaseFrameNum(); + return; + } } - if (hare_se_mueve == 0) { + if (characterMoved == 0) { pos_hare[0] = 0; pos_hare[1] = DIF_MASK_HARE; pos_hare[2] = hare_x; pos_hare[3] = hare_y; - if (num_ejec == 2) { + if (currentChapter == 2) { pos_hare[4] = ancho_hare; pos_hare[5] = alto_hare; } else { @@ -2594,36 +2298,36 @@ void DrasculaEngine::pon_hare() { if (sentido_hare == 0) { pos_hare[1] = 0; - if (num_ejec == 2) - copyRectClip(pos_hare, dir_hare_dch, dir_zona_pantalla); + if (currentChapter == 2) + copyRectClip(pos_hare, extraSurface, screenSurface); else reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], - factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); + factor_red[hare_y + alto_hare], extraSurface, screenSurface); } else if (sentido_hare == 1) { - if (num_ejec == 2) - copyRectClip(pos_hare, dir_hare_dch, dir_zona_pantalla); + if (currentChapter == 2) + copyRectClip(pos_hare, extraSurface, screenSurface); else reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], - factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); + factor_red[hare_y + alto_hare], extraSurface, screenSurface); } else if (sentido_hare == 2) { - if (num_ejec == 2) - copyRectClip(pos_hare, dir_hare_fondo, dir_zona_pantalla); + if (currentChapter == 2) + copyRectClip(pos_hare, backSurface, screenSurface); else reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], - factor_red[hare_y + alto_hare], dir_hare_fondo, dir_zona_pantalla); + factor_red[hare_y + alto_hare], backSurface, screenSurface); } else { - if (num_ejec == 2) - copyRectClip(pos_hare, dir_hare_frente, dir_zona_pantalla); + if (currentChapter == 2) + copyRectClip(pos_hare, frontSurface, screenSurface); else reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], - factor_red[hare_y + alto_hare], dir_hare_frente, dir_zona_pantalla); + factor_red[hare_y + alto_hare], frontSurface, screenSurface); } - } else if (hare_se_mueve == 1) { + } else if (characterMoved == 1) { pos_hare[0] = frame_x[num_frame]; pos_hare[1] = frame_y + DIF_MASK_HARE; pos_hare[2] = hare_x; pos_hare[3] = hare_y; - if (num_ejec == 2) { + if (currentChapter == 2) { pos_hare[4] = ancho_hare; pos_hare[5] = alto_hare; } else { @@ -2632,234 +2336,231 @@ void DrasculaEngine::pon_hare() { } if (sentido_hare == 0) { pos_hare[1] = 0; - if (num_ejec == 2) - copyRectClip(pos_hare, dir_hare_dch, dir_zona_pantalla); + if (currentChapter == 2) + copyRectClip(pos_hare, extraSurface, screenSurface); else reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], - factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); + factor_red[hare_y + alto_hare], extraSurface, screenSurface); } else if (sentido_hare == 1) { - if (num_ejec == 2) - copyRectClip(pos_hare, dir_hare_dch, dir_zona_pantalla); + if (currentChapter == 2) + copyRectClip(pos_hare, extraSurface, screenSurface); else reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], - factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); + factor_red[hare_y + alto_hare], extraSurface, screenSurface); } else if (sentido_hare == 2) { - if (num_ejec == 2) - copyRectClip(pos_hare, dir_hare_fondo, dir_zona_pantalla); + if (currentChapter == 2) + copyRectClip(pos_hare, backSurface, screenSurface); else reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], - factor_red[hare_y + alto_hare], dir_hare_fondo, dir_zona_pantalla); + factor_red[hare_y + alto_hare], backSurface, screenSurface); } else { - if (num_ejec == 2) - copyRectClip(pos_hare, dir_hare_frente, dir_zona_pantalla); + if (currentChapter == 2) + copyRectClip(pos_hare, frontSurface, screenSurface); else reduce_hare_chico(pos_hare[0], pos_hare[1], pos_hare[2], pos_hare[3], pos_hare[4], pos_hare[5], - factor_red[hare_y + alto_hare], dir_hare_frente, dir_zona_pantalla); + factor_red[hare_y + alto_hare], frontSurface, screenSurface); } - -no_vuelco: - aumenta_num_frame(); + increaseFrameNum(); } } -void DrasculaEngine::menu_sin_volcar() { +void DrasculaEngine::showMenu() { int h, n, x; char texto_icono[13]; - x = sobre_que_objeto(); + x = whichObject(); strcpy(texto_icono, iconName[x]); for (n = 1; n < 43; n++) { h = inventoryObjects[n]; if (h != 0) { - if (num_ejec == 6) + if (currentChapter == 6) copyBackground(x_pol[n], y_pol[n], itemLocations[n].x, itemLocations[n].y, - OBJWIDTH, OBJHEIGHT, dir_mesa, dir_zona_pantalla); + OBJWIDTH, OBJHEIGHT, tableSurface, screenSurface); else copyBackground(x_pol[n], y_pol[n], itemLocations[n].x, itemLocations[n].y, - OBJWIDTH, OBJHEIGHT, dir_hare_frente, dir_zona_pantalla); + OBJWIDTH, OBJHEIGHT, frontSurface, screenSurface); } copyRect(x1d_menu[h], y1d_menu[h], itemLocations[n].x, itemLocations[n].y, - OBJWIDTH, OBJHEIGHT, dir_hare_fondo, dir_zona_pantalla); + OBJWIDTH, OBJHEIGHT, backSurface, screenSurface); } if (x < 7) print_abc(texto_icono, itemLocations[x].x - 2, itemLocations[x].y - 7); } -void DrasculaEngine::barra_menu() { +void DrasculaEngine::clearMenu() { int n, sobre_verbo = 1; for (n = 0; n < 7; n++) { if (mouseX > x_barra[n] && mouseX < x_barra[n + 1]) sobre_verbo = 0; copyRect(OBJWIDTH * n, OBJHEIGHT * sobre_verbo, x_barra[n], 2, - OBJWIDTH, OBJHEIGHT, dir_hare_fondo, dir_zona_pantalla); + OBJWIDTH, OBJHEIGHT, backSurface, screenSurface); sobre_verbo = 1; } } -void DrasculaEngine::saca_objeto() { +void DrasculaEngine::removeObject() { int h = 0, n; updateRoom(); for (n = 1; n < 43; n++){ - if (sobre_que_objeto() == n) { + if (whichObject() == n) { h = inventoryObjects[n]; inventoryObjects[n] = 0; if (h != 0) - lleva_objeto = 1; + takeObject = 1; } } - espera_soltar(); + updateEvents(); - if (lleva_objeto == 1) + if (takeObject == 1) chooseObject(h); } -bool DrasculaEngine::sal_de_la_habitacion(int l) { - char salgo[13]; +bool DrasculaEngine::exitRoom(int l) { + char roomExit[13]; - if (num_ejec == 1) { - if (num_obj[l] == 105 && flags[0] == 0) - talk(_text[_lang][442], "442.als"); + if (currentChapter == 1) { + if (objectNum[l] == 105 && flags[0] == 0) + talk(442); else { - puertas_cerradas(l); + updateDoor(l); if (isDoor[l] != 0) { lleva_al_hare(sitiobj_x[l], sitiobj_y[l]); sentido_hare = sentidobj[l]; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - hare_se_mueve = 0; + updateScreen(); + characterMoved = 0; sentido_hare = sentido_alkeva[l]; - obj_saliendo = alapuertakeva[l]; - rompo = 1; + objExit = alapuertakeva[l]; + doBreak = 1; previousMusic = roomMusic; - if (num_obj[l] == 105) { + if (objectNum[l] == 105) { animation_2_1(); return true; } clearRoom(); - strcpy(salgo, alapantallakeva[l]); - strcat(salgo, ".ald"); + strcpy(roomExit, _targetSurface[l]); + strcat(roomExit, ".ald"); hare_x = -1; - carga_escoba(salgo); + carga_escoba(roomExit); } } - } else if (num_ejec == 2) { - puertas_cerradas(l); + } else if (currentChapter == 2) { + updateDoor(l); if (isDoor[l] != 0) { lleva_al_hare(sitiobj_x[l], sitiobj_y[l]); - hare_se_mueve = 0; + characterMoved = 0; sentido_hare = sentido_alkeva[l]; - obj_saliendo = alapuertakeva[l]; - rompo = 1; + objExit = alapuertakeva[l]; + doBreak = 1; previousMusic = roomMusic; - if (num_obj[l] == 136) + if (objectNum[l] == 136) animation_2_2(); - if (num_obj[l] == 124) + if (objectNum[l] == 124) animation_3_2(); - if (num_obj[l] == 173) { + if (objectNum[l] == 173) { animation_35_2(); return true; - } if (num_obj[l] == 146 && flags[39] == 1) { + } if (objectNum[l] == 146 && flags[39] == 1) { flags[5] = 1; flags[11] = 1; } - if (num_obj[l] == 176 && flags[29] == 1) { + if (objectNum[l] == 176 && flags[29] == 1) { flags[29] = 0; - resta_objeto(23); - suma_objeto(11); + removeObject(23); + addObject(11); } clearRoom(); - delete ald; - ald = NULL; - strcpy(salgo, alapantallakeva[l]); - strcat(salgo, ".ald"); + + strcpy(roomExit, _targetSurface[l]); + strcat(roomExit, ".ald"); hare_x =- 1; - carga_escoba(salgo); + carga_escoba(roomExit); } - } else if (num_ejec == 3) { - puertas_cerradas(l); + } else if (currentChapter == 3) { + updateDoor(l); if (isDoor[l] != 0 && visible[l] == 1) { lleva_al_hare(sitiobj_x[l], sitiobj_y[l]); sentido_hare = sentidobj[l]; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - hare_se_mueve = 0; + updateScreen(); + characterMoved = 0; sentido_hare = sentido_alkeva[l]; - obj_saliendo = alapuertakeva[l]; - rompo = 1; + objExit = alapuertakeva[l]; + doBreak = 1; previousMusic = roomMusic; clearRoom(); - strcpy(salgo, alapantallakeva[l]); - strcat(salgo, ".ald"); + strcpy(roomExit, _targetSurface[l]); + strcat(roomExit, ".ald"); hare_x =- 1; - carga_escoba(salgo); + carga_escoba(roomExit); } - } else if (num_ejec == 4) { - puertas_cerradas(l); + } else if (currentChapter == 4) { + updateDoor(l); if (isDoor[l] != 0) { lleva_al_hare(sitiobj_x[l], sitiobj_y[l]); sentido_hare = sentidobj[l]; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - hare_se_mueve = 0; + updateScreen(); + characterMoved = 0; sentido_hare = sentido_alkeva[l]; - obj_saliendo = alapuertakeva[l]; - rompo = 1; + objExit = alapuertakeva[l]; + doBreak = 1; previousMusic = roomMusic; - if (num_obj[l] == 108) + if (objectNum[l] == 108) lleva_al_hare(171, 78); clearRoom(); - strcpy(salgo, alapantallakeva[l]); - strcat(salgo, ".ald"); + strcpy(roomExit, _targetSurface[l]); + strcat(roomExit, ".ald"); hare_x = -1; - carga_escoba(salgo); + carga_escoba(roomExit); } - } else if (num_ejec == 5) { - puertas_cerradas(l); + } else if (currentChapter == 5) { + updateDoor(l); if (isDoor[l] != 0 && visible[l] == 1) { lleva_al_hare(sitiobj_x[l], sitiobj_y[l]); sentido_hare = sentidobj[l]; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - hare_se_mueve = 0; + updateScreen(); + characterMoved = 0; sentido_hare = sentido_alkeva[l]; - obj_saliendo = alapuertakeva[l]; - rompo = 1; + objExit = alapuertakeva[l]; + doBreak = 1; previousMusic = roomMusic; hare_se_ve = 1; clearRoom(); - strcpy(salgo, alapantallakeva[l]); - strcat(salgo, ".ald"); + strcpy(roomExit, _targetSurface[l]); + strcat(roomExit, ".ald"); hare_x = -1; - carga_escoba(salgo); + carga_escoba(roomExit); } - } else if (num_ejec == 6) { - puertas_cerradas(l); + } else if (currentChapter == 6) { + updateDoor(l); if (isDoor[l] != 0) { lleva_al_hare(sitiobj_x[l], sitiobj_y[l]); sentido_hare = sentidobj[l]; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - hare_se_mueve = 0; + updateScreen(); + characterMoved = 0; sentido_hare = sentido_alkeva[l]; - obj_saliendo = alapuertakeva[l]; - rompo = 1; + objExit = alapuertakeva[l]; + doBreak = 1; previousMusic = roomMusic; clearRoom(); - strcpy(salgo, alapantallakeva[l]); - strcat(salgo, ".ald"); + strcpy(roomExit, _targetSurface[l]); + strcat(roomExit, ".ald"); hare_x = -1; - carga_escoba(salgo); + carga_escoba(roomExit); - if (obj_saliendo == 105) + if (objExit == 105) animation_19_6(); } } @@ -2867,468 +2568,61 @@ bool DrasculaEngine::sal_de_la_habitacion(int l) { return false; } -bool DrasculaEngine::coge_objeto() { +bool DrasculaEngine::pickupObject() { int h, n; h = pickedObject; - comprueba_flags = 1; + checkFlags = 1; updateRoom(); - menu_sin_volcar(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - if (pickedObject < 7) - goto usando_verbos; - - for (n = 1; n < 43; n++) { - if (sobre_que_objeto() == n && inventoryObjects[n] == 0) { - inventoryObjects[n] = h; - lleva_objeto = 0; - comprueba_flags = 0; + showMenu(); + updateScreen(); + + // Objects with an ID smaller than 7 are the inventory verbs + if (pickedObject >= 7) { + for (n = 1; n < 43; n++) { + if (whichObject() == n && inventoryObjects[n] == 0) { + inventoryObjects[n] = h; + takeObject = 0; + checkFlags = 0; + } } } -usando_verbos: - - if (comprueba_flags == 1) { - if (comprueba_banderas_menu()) + if (checkFlags == 1) { + if (checkMenuFlags()) return true; } - espera_soltar(); - if (lleva_objeto == 0) + updateEvents(); + if (takeObject == 0) withoutVerb(); return false; } -bool DrasculaEngine::banderas(int fl) { - hare_se_mueve = 0; - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - hay_answer = 1; - - if (menu_scr == 1) { - if (num_ejec == 1) { - if (pickedObject == kVerbLook && fl == 28) - talk(_text[_lang][328], "328.als"); - } else if (num_ejec == 2) { - if ((pickedObject == kVerbLook && fl == 22 && flags[23] == 0) - || (pickedObject == kVerbOpen && fl == 22 && flags[23] == 0)) { - talk(_text[_lang][164], "164.als"); - flags[23] = 1; - withoutVerb(); - suma_objeto(7); - suma_objeto(18); - } else if (pickedObject == kVerbLook && fl == 22 && flags[23] == 1) - talk(_text[_lang][307], "307.als"); - else if (pickedObject == kVerbLook && fl == 28) - talk(_text[_lang][328], "328.als"); - else if (pickedObject == kVerbLook && fl == 7) - talk(_text[_lang][143], "143.als"); - else if (pickedObject == kVerbTalk && fl == 7) - talk(_text[_lang][144], "144.als"); - else if (pickedObject == kVerbLook && fl == 8) - talk(_text[_lang][145], "145.als"); - else if (pickedObject == kVerbTalk && fl == 8) - talk(_text[_lang][146], "146.als"); - else if (pickedObject == kVerbLook && fl == 9) - talk(_text[_lang][147], "147.als"); - else if (pickedObject == kVerbTalk && fl == 9) - talk(_text[_lang][148], "148.als"); - else if (pickedObject == kVerbLook && fl == 10) - talk(_text[_lang][151], "151.als"); - else if (pickedObject == kVerbLook && fl == 11) - talk(_text[_lang][152], "152.als"); - else if (pickedObject == kVerbTalk && fl == 11) - talk(_text[_lang][153], "153.als"); - else if (pickedObject == kVerbLook && fl == 12) - talk(_text[_lang][154], "154.als"); - else if (pickedObject == kVerbLook && fl == 13) - talk(_text[_lang][155], "155.als"); - else if (pickedObject == kVerbLook && fl == 14) - talk(_text[_lang][157], "157.als"); - else if (pickedObject == kVerbLook && fl == 15) - talk(_text[_lang][58], "58.als"); - else if (pickedObject == kVerbLook && fl == 16) - talk(_text[_lang][158], "158.als"); - else if (pickedObject == kVerbLook && fl == 17) - talk(_text[_lang][159], "159.als"); - else if (pickedObject == kVerbLook && fl == 18) - talk(_text[_lang][160], "160.als"); - else if (pickedObject == kVerbLook && fl == 19) - talk(_text[_lang][161], "161.als"); - else if (pickedObject == kVerbLook && fl == 20) - talk(_text[_lang][162], "162.als"); - else if (pickedObject == kVerbLook && fl == 23) - talk(_text[_lang][152], "152.als"); - else - hay_answer = 0; - } else if (num_ejec == 3) { - if (pickedObject == kVerbLook && fl == 22) - talk(_text[_lang][307], "307.als"); - else if (pickedObject == kVerbLook && fl == 28) - talk(_text[_lang][328], "328.als"); - else if (pickedObject == kVerbLook && fl == 7) - talk(_text[_lang][143], "143.als"); - else if (pickedObject == kVerbTalk && fl == 7) - talk(_text[_lang][144], "144.als"); - else if (pickedObject == kVerbLook && fl == 8) - talk(_text[_lang][145], "145.als"); - else if (pickedObject == kVerbTalk && fl == 8) - talk(_text[_lang][146], "146.als"); - else if (pickedObject == kVerbLook && fl == 9) - talk(_text[_lang][147], "147.als"); - else if (pickedObject == kVerbTalk && fl == 9) - talk(_text[_lang][148], "148.als"); - else if (pickedObject == kVerbLook && fl == 10) - talk(_text[_lang][151], "151.als"); - else if (pickedObject == kVerbLook && fl == 11) - talk(_text[_lang][152], "152.als"); - else if (pickedObject == kVerbTalk && fl == 11) - talk(_text[_lang][153], "153.als"); - else if (pickedObject == kVerbLook && fl == 12) - talk(_text[_lang][154], "154.als"); - else if (pickedObject == kVerbLook && fl == 13) - talk(_text[_lang][155], "155.als"); - else if (pickedObject == kVerbLook && fl == 14) - talk(_text[_lang][157], "157.als"); - else if (pickedObject == kVerbLook && fl == 15) - talk(_text[_lang][58], "58.als"); - else if (pickedObject == kVerbLook && fl == 16) - talk(_text[_lang][158], "158.als"); - else if (pickedObject == kVerbLook && fl == 17) - talk(_text[_lang][159], "159.als"); - else if (pickedObject == kVerbLook && fl == 18) - talk(_text[_lang][160], "160.als"); - else if (pickedObject == kVerbLook && fl == 19) - talk(_text[_lang][161], "161.als"); - else if (pickedObject == kVerbLook && fl == 20) - talk(_text[_lang][162], "162.als"); - else if (pickedObject == kVerbLook && fl == 23) - talk(_text[_lang][152], "152.als"); - else - hay_answer = 0; - } else if (num_ejec == 4) { - if ((pickedObject == 18 && fl == 19) || (pickedObject == 19 && fl == 18)) { - withoutVerb(); - chooseObject(21); - resta_objeto(18); - resta_objeto(19); - } else if ((pickedObject == 14 && fl == 19) || (pickedObject == 19 && fl == 14)) - talk(_text[_lang][484], "484.als"); - else if (pickedObject == kVerbLook && fl == 28) - talk(_text[_lang][328], "328.als"); - else if (pickedObject == kVerbLook && fl == 7) - talk(_text[_lang][478], "478.als"); - else if (pickedObject == kVerbLook && fl == 8) - talk(_text[_lang][480], "480.als"); - else if (pickedObject == kVerbLook && fl == 9) { - talk(_text[_lang][482], "482.als"); - talk(_text[_lang][483], "483.als"); - } else if (pickedObject == kVerbLook && fl == 10) - talk(_text[_lang][485], "485.als"); - else if (pickedObject == kVerbLook && fl == 11) - talk(_text[_lang][488], "488.als"); - else if (pickedObject == kVerbLook && fl == 12) - talk(_text[_lang][486], "486.als"); - else if (pickedObject == kVerbLook && fl == 13) - talk(_text[_lang][490], "490.als"); - else if (pickedObject == kVerbLook && fl == 14) - talk(_text[_lang][122], "122.als"); - else if (pickedObject == kVerbLook && fl == 15) - talk(_text[_lang][117], "117.als"); - else if (pickedObject == kVerbTalk && fl == 15) - talk(_text[_lang][118], "118.als"); - else if (pickedObject == kVerbOpen && fl == 15) - talk(_text[_lang][119], "119.als"); - else if (pickedObject == kVerbLook && fl == 16) - talk(_text[_lang][491], "491.als"); - else if (pickedObject == kVerbLook && fl == 17) - talk(_text[_lang][478], "478.als"); - else if (pickedObject == kVerbLook && fl == 18) - talk(_text[_lang][493], "493.als"); - else if (pickedObject == kVerbLook && fl == 19) { - talk(_text[_lang][494], "494.als"); - talk(_text[_lang][495], "495.als"); - } else if (pickedObject == kVerbLook && fl == 20) - talk(_text[_lang][162], "162.als"); - else if (pickedObject == kVerbLook && fl == 21) - talk(_text[_lang][496], "496.als"); - else if (pickedObject == kVerbLook && fl == 22) - talk(_text[_lang][161], "161.als"); - else - hay_answer = 0; - } else if (num_ejec == 5) { - if (pickedObject == kVerbLook && fl == 28) - talk(_text[_lang][328], "328.als"); - else if (pickedObject == kVerbLook && fl == 7) - talk(_text[_lang][478],"478.als"); - else if (pickedObject == kVerbLook && fl == 8) - talk(_text[_lang][120], "120.als"); - else if (pickedObject == kVerbLook && fl == 9) { - talk(_text[_lang][482], "482.als"); - talk(_text[_lang][483], "483.als"); - } else if (pickedObject == kVerbLook && fl == 11) - talk(_text[_lang][488], "488.als"); - else if (pickedObject == kVerbLook && fl == 13) - talk(_text[_lang][490], "490.als"); - else if (pickedObject == kVerbLook && fl == 14) - talk(_text[_lang][121], "121.als"); - else if (pickedObject == kVerbLook && fl == 15) - talk(_text[_lang][117], "117.als"); - else if (pickedObject == kVerbTalk && fl == 15) - talk(_text[_lang][118], "118.als"); - else if (pickedObject == kVerbOpen && fl == 15) - talk(_text[_lang][119], "119.als"); - else if (pickedObject == kVerbLook && fl == 17) - talk(_text[_lang][478], "478.als"); - else if (pickedObject == kVerbLook && fl == 20) - talk(_text[_lang][162], "162.als"); - else - hay_answer = 0; - } else if (num_ejec == 6) { - if (pickedObject == kVerbLook && fl == 28) - talk(_text[_lang][328], "328.als"); - else if (pickedObject == kVerbLook && fl == 9) { - talk(_text[_lang][482], "482.als"); - talk(_text[_lang][483], "483.als"); - } else if (pickedObject == kVerbLook && fl == 20) - talk(_text[_lang][123], "123.als"); - else if (pickedObject == kVerbLook && fl == 21) - talk(_text[_lang][441], "441.als"); - else - hay_answer = 0; - } - } else { - if (num_ejec == 1) { - if (pickedObject == kVerbLook && fl == 50) - talk(_text[_lang][308], "308.als"); - else if (pickedObject == kVerbOpen && fl == 50) - talk(_text[_lang][310], "310.als"); - else if (pickedObject == kVerbClose && fl == 50) - talk(_text[_lang][311], "311.als"); - else if (pickedObject == kVerbMove && fl == 50) - talk(_text[_lang][312], "312.als"); - else if (pickedObject == kVerbPick && fl == 50) - talk(_text[_lang][313], "313.als"); - else if (pickedObject == kVerbTalk && fl == 50) - talk(_text[_lang][314], "314.als"); - else if (roomNumber == 62) - room_62(fl); - else if (roomNumber == 63) - room_63(fl); - else - hay_answer = 0; - } else if (num_ejec == 2) { - if (pickedObject == kVerbLook && fl == 50) - talk(_text[_lang][308], "308.als"); - else if (pickedObject == kVerbOpen && fl == 50) - talk(_text[_lang][310], "310.als"); - else if (pickedObject == kVerbClose && fl == 50) - talk(_text[_lang][311], "311.als"); - else if (pickedObject == kVerbMove && fl == 50) - talk(_text[_lang][312], "312.als"); - else if (pickedObject == kVerbPick && fl == 50) - talk(_text[_lang][313], "313.als"); - else if (pickedObject == kVerbTalk && fl == 50) - talk(_text[_lang][314], "314.als"); - // Note: the original check was strcmp(num_room, "18.alg") - else if (pickedObject == 11 && fl == 50 && flags[22] == 0 && roomNumber != 18) - talk(_text[_lang][315], "315.als"); - else if (pickedObject == 13 && fl == 50) - talk(_text[_lang][156], "156.als"); - else if (pickedObject == 20 && fl == 50) - talk(_text[_lang][163], "163.als"); - else if (roomNumber == 1) - room_1(fl); - else if (roomNumber == 3) - room_3(fl); - else if (roomNumber == 4) - room_4(fl); - else if (roomNumber == 5) - room_5(fl); - else if (roomNumber == 6) - room_6(fl); - else if (roomNumber == 7) - room_7(fl); - else if (roomNumber == 8) - room_8(fl); - else if (roomNumber == 9) - room_9(fl); - else if (roomNumber == 12) - room_12(fl); - else if (roomNumber == 14) - room_14(fl); - else if (roomNumber == 15) - room_15(fl); - else if (roomNumber == 16) - room_16(fl); - else if (roomNumber == 17) - room_17(fl); - else if (roomNumber == 18) - room_18(fl); - else if (roomNumber == 19) - room_19(fl); - else - hay_answer = 0; - } else if (num_ejec == 3) { - if (pickedObject == kVerbLook && fl == 50) - talk(_text[_lang][309], "309.als"); - else if (pickedObject == kVerbOpen && fl == 50) - talk(_text[_lang][310], "310.als"); - else if (pickedObject == kVerbClose && fl == 50) - talk(_text[_lang][311], "311.als"); - else if (pickedObject == kVerbMove && fl == 50) - talk(_text[_lang][312], "312.als"); - else if (pickedObject == kVerbPick && fl == 50) - talk(_text[_lang][313], "313.als"); - else if (pickedObject == kVerbTalk && fl == 50) - talk(_text[_lang][314], "314.als"); - else if (roomNumber == 13) { - if (room_13(fl)) - return true; - } else - hay_answer = 0; - } else if (num_ejec == 4) { - if (roomNumber == 28) - talk(_text[_lang][178], "178.als"); - else if (pickedObject == kVerbLook && fl == 50) - talk(_text[_lang][309], "309.als"); - else if (pickedObject == kVerbOpen && fl == 50) - talk(_text[_lang][310], "310.als"); - else if (pickedObject == kVerbClose && fl == 50) - talk(_text[_lang][311], "311.als"); - else if (pickedObject == kVerbMove && fl == 50) - talk(_text[_lang][312], "312.als"); - else if (pickedObject == kVerbPick && fl == 50) - talk(_text[_lang][313], "313.als"); - else if (pickedObject == kVerbTalk && fl == 50) - talk(_text[_lang][314], "314.als"); - else if (pickedObject == 8 && fl == 50 && flags[18] == 0) - talk(_text[_lang][481], "481.als"); - else if (pickedObject == 9 && fl == 50) - talk(_text[_lang][484], "484.als"); - else if (pickedObject == 12 && fl == 50 && flags[18] == 0) - talk(_text[_lang][487], "487.als"); - else if (pickedObject == 20 && fl == 50) - talk(_text[_lang][487], "487.als"); - else if (roomNumber == 21) { - if (room_21(fl)) - return true; - } else if (roomNumber == 22) - room_22(fl); - else if (roomNumber == 23) - room_23(fl); - else if (roomNumber == 24) - room_24(fl); - else if (roomNumber == 26) - room_26(fl); - else if (roomNumber == 27) - room_27(fl); - else if (roomNumber == 29) - room_29(fl); - else if (roomNumber == 30) - room_30(fl); - else if (roomNumber == 31) - room_31(fl); - else if (roomNumber == 34) - room_34(fl); - else if (roomNumber == 35) - room_35(fl); - else if (roomNumber == 44) - room_44(fl); - else - hay_answer = 0; - } else if (num_ejec == 5) { - if (pickedObject == kVerbLook && fl == 50) - talk("Cuanto mas me miro, mas me gusto", "54.als"); - else if (pickedObject == kVerbOpen && fl == 50) - talk("y luego como me cierro", "19.als"); - else if (pickedObject == kVerbClose && fl == 50) - talk("Tendre que abrirme primero no", "19.als"); - else if (pickedObject == kVerbMove && fl == 50) - talk("Estoy bien donde estoy", "19.als"); - else if (pickedObject == kVerbPick && fl == 50) - talk("Ya me tengo", "11.als"); - else if (pickedObject == kVerbTalk && fl == 50) - talk("hola yo", "16.als"); - else if (pickedObject == 20 && fl == 50) - talk(_text[_lang][487], "487.als"); - else if (roomNumber == 49) - room_49(fl); - else if (roomNumber == 53) - room_53(fl); - else if (roomNumber == 54) - room_54(fl); - else if (roomNumber == 55) - room_55(fl); - else if (roomNumber == 56) { - if (room_56(fl)) - return true; - } else - hay_answer = 0; - } else if (num_ejec == 6) { - if (pickedObject == kVerbLook && fl == 50 && flags[0] == 1) - talk(_text[_lang][308], "308.als"); - else if (pickedObject == kVerbLook && fl == 50 && flags[0] == 0) - talk(_text[_lang][310], "250.als" ); - else if (pickedObject == kVerbOpen && fl == 50) - talk(_text[_lang][310], "310.als" ); - else if (pickedObject == kVerbClose && fl == 50) - talk(_text[_lang][311], "311.als" ); - else if (pickedObject == kVerbMove && fl == 50) - talk(_text[_lang][312], "312.als" ); - else if (pickedObject == kVerbPick && fl == 50) - talk(_text[_lang][313], "313.als" ); - else if (pickedObject == kVerbTalk && fl == 50) - talk(_text[_lang][314], "314.als" ); - else if (roomNumber == 102) - room_pendulo(fl); - else if (roomNumber == 58) - room_58(fl); - else if (roomNumber == 59) - room_59(fl); - else if (roomNumber == 60) { - if (room_60(fl)) - return true; - } else if (roomNumber == 61) - room_61(fl); - else - hay_answer = 0; - } - } - if (hay_answer == 0 && hay_nombre == 1) - room_0(); - else if (hay_answer == 0 && menu_scr == 1) - room_0(); - - return false; -} - -void DrasculaEngine::cursor_mesa() { - int pos_cursor[8]; +void DrasculaEngine::setCursorTable() { + int cursorPos[8]; - pos_cursor[0] = 225; - pos_cursor[1] = 56; - pos_cursor[2] = mouseX - 20; - pos_cursor[3] = mouseY - 12; - pos_cursor[4] = 40; - pos_cursor[5] = 25; + cursorPos[0] = 225; + cursorPos[1] = 56; + cursorPos[2] = mouseX - 20; + cursorPos[3] = mouseY - 12; + cursorPos[4] = 40; + cursorPos[5] = 25; - copyRectClip(pos_cursor, dir_mesa, dir_zona_pantalla); + copyRectClip(cursorPos, tableSurface, screenSurface); } -void DrasculaEngine::introduce_nombre() { +void DrasculaEngine::enterName() { Common::KeyCode key; int v = 0, h = 0; char select2[23]; strcpy(select2, " "); for (;;) { select2[v] = '-'; - copyBackground(115, 14, 115, 14, 176, 9, dir_dibujo1, dir_zona_pantalla); + copyBackground(115, 14, 115, 14, 176, 9, drawSurface1, screenSurface); print_abc(select2, 117, 15); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - key = getscan(); + updateScreen(); + key = getScan(); delay(70); if (key != 0) { if (key >= 0 && key <= 0xFF && isalpha(key)) @@ -3339,7 +2633,7 @@ void DrasculaEngine::introduce_nombre() { select2[v] = key; else if (key == Common::KEYCODE_SPACE) select2[v] = '\167'; - else if (key == ESC) + else if (key == Common::KEYCODE_ESCAPE) break; else if (key == Common::KEYCODE_RETURN) { select2[v] = '\0'; @@ -3366,67 +2660,67 @@ void DrasculaEngine::introduce_nombre() { } } -void DrasculaEngine::para_grabar(char nom_game[]) { - saveGame(nom_game); - playSound("99.als"); - stopSound(); +void DrasculaEngine::para_grabar(char gameName[]) { + saveGame(gameName); + playSound(99); + finishSound(); } -void DrasculaEngine::OpenSSN(const char *Name, int Pause) { +void DrasculaEngine::openSSN(const char *Name, int Pause) { MiVideoSSN = (byte *)malloc(64256); - GlobalSpeed = 1000 / Pause; + globalSpeed = 1000 / Pause; FrameSSN = 0; UsingMem = 0; if (MiVideoSSN == NULL) return; - _Sesion = new Common::File; - _Sesion->open(Name); - mSesion = TryInMem(_Sesion); + _arj.open(Name); + mSession = TryInMem(); LastFrame = _system->getMillis(); } -int DrasculaEngine::PlayFrameSSN() { +int DrasculaEngine::playFrameSSN() { int Exit = 0; - int Lengt; + uint32 Lengt; byte *BufferSSN; if (!UsingMem) - _Sesion->read(&CHUNK, 1); + _arj.read(&CHUNK, 1); else { - memcpy(&CHUNK, mSesion, 1); - mSesion += 1; + memcpy(&CHUNK, mSession, 1); + mSession += 1; } + switch (CHUNK) { - case SET_PAL: + case kFrameSetPal: if (!UsingMem) - _Sesion->read(dacSSN, 768); + _arj.read(dacSSN, 768); else { - memcpy(dacSSN, mSesion, 768); - mSesion += 768; + memcpy(dacSSN, mSession, 768); + mSession += 768; } set_dacSSN(dacSSN); break; - case EMPTY_FRAME: + case kFrameEmptyFrame: WaitFrameSSN(); break; - case INIT_FRAME: + case kFrameInit: if (!UsingMem) { - _Sesion->read(&CMP, 1); - _Sesion->read(&Lengt, 4); + CMP = _arj.readByte(); + Lengt = _arj.readUint32LE(); } else { - memcpy(&CMP, mSesion, 1); - mSesion += 1; - memcpy(&Lengt, mSesion, 4); - mSesion += 4; + memcpy(&CMP, mSession, 1); + mSession += 1; + Lengt = READ_LE_UINT32(mSession); + mSession += 4; } - if (CMP == CMP_RLE) { + if (CMP == kFrameCmpRle) { if (!UsingMem) { BufferSSN = (byte *)malloc(Lengt); - _Sesion->read(BufferSSN, Lengt); + _arj.read(BufferSSN, Lengt); } else { BufferSSN = (byte *)malloc(Lengt); - memcpy(BufferSSN, mSesion, Lengt); - mSesion += Lengt; + memcpy(BufferSSN, mSession, Lengt); + mSession += Lengt; } Des_RLE(BufferSSN, MiVideoSSN); free(BufferSSN); @@ -3442,14 +2736,14 @@ int DrasculaEngine::PlayFrameSSN() { _system->updateScreen(); FrameSSN++; } else { - if (CMP == CMP_OFF) { + if (CMP == kFrameCmpOff) { if (!UsingMem) { BufferSSN = (byte *)malloc(Lengt); - _Sesion->read(BufferSSN, Lengt); + _arj.read(BufferSSN, Lengt); } else { BufferSSN = (byte *)malloc(Lengt); - memcpy(BufferSSN, mSesion, Lengt); - mSesion += Lengt; + memcpy(BufferSSN, mSession, Lengt); + mSession += Lengt; } Des_OFF(BufferSSN, MiVideoSSN, Lengt); free(BufferSSN); @@ -3467,7 +2761,7 @@ int DrasculaEngine::PlayFrameSSN() { } } break; - case END_ANIM: + case kFrameEndAnim: Exit = 1; break; default: @@ -3483,24 +2777,23 @@ void DrasculaEngine::EndSSN() { if (UsingMem) free(pointer); else { - _Sesion->close(); - delete _Sesion; + _arj.close(); } } -byte *DrasculaEngine::TryInMem(Common::File *Sesion) { +byte *DrasculaEngine::TryInMem() { int Lengt; - Sesion->seek(0, SEEK_END); - Lengt = Sesion->pos(); - Sesion->seek(0, SEEK_SET); + _arj.seek(0, SEEK_END); + Lengt = _arj.pos(); + _arj.seek(0, SEEK_SET); pointer = (byte *)malloc(Lengt); if (pointer == NULL) return NULL; - Sesion->read(pointer, Lengt); + _arj.read(pointer, Lengt); UsingMem = 1; - Sesion->close(); - delete Sesion; + _arj.close(); + return pointer; } @@ -3551,9 +2844,9 @@ void DrasculaEngine::MixVideo(byte *OldScreen, byte *NewScreen) { void DrasculaEngine::WaitFrameSSN() { uint32 now; - while ((now = _system->getMillis()) - LastFrame < ((uint32) GlobalSpeed)) - _system->delayMillis(GlobalSpeed - (now - LastFrame)); - LastFrame = LastFrame + GlobalSpeed; + while ((now = _system->getMillis()) - LastFrame < ((uint32) globalSpeed)) + _system->delayMillis(globalSpeed - (now - LastFrame)); + LastFrame = LastFrame + globalSpeed; } byte *DrasculaEngine::loadPCX(byte *NamePcc) { @@ -3590,51 +2883,47 @@ void DrasculaEngine::WaitForNext(int FPS) { _system->delayMillis(1000 / FPS); } -int DrasculaEngine::vez() { +int DrasculaEngine::getTime() { return _system->getMillis() / 20; // originaly was 1 } -void DrasculaEngine::reduce_hare_chico(int xx1, int yy1, int xx2, int yy2, int ancho, int alto, int factor, byte *dir_inicio, byte *dir_fin) { - float suma_x, suma_y; +void DrasculaEngine::reduce_hare_chico(int xx1, int yy1, int xx2, int yy2, int width, int height, int factor, byte *dir_inicio, byte *dir_fin) { + float totalX, totalY; int n, m; - float pixel_x, pixel_y; - int pos_pixel[6]; + float pixelX, pixelY; + int pixelPos[6]; - nuevo_ancho = (ancho * factor) / 100; - nuevo_alto = (alto * factor) / 100; + newWidth = (width * factor) / 100; + newHeight = (height * factor) / 100; - suma_x = ancho / nuevo_ancho; - suma_y = alto / nuevo_alto; + totalX = width / newWidth; + totalY = height / newHeight; - pixel_x = xx1; - pixel_y = yy1; + pixelX = xx1; + pixelY = yy1; - for (n = 0; n < nuevo_alto; n++) { - for (m = 0; m < nuevo_ancho; m++) { - pos_pixel[0] = (int)pixel_x; - pos_pixel[1] = (int)pixel_y; - pos_pixel[2] = xx2 + m; - pos_pixel[3] = yy2 + n; - pos_pixel[4] = 1; - pos_pixel[5] = 1; + for (n = 0; n < newHeight; n++) { + for (m = 0; m < newWidth; m++) { + pixelPos[0] = (int)pixelX; + pixelPos[1] = (int)pixelY; + pixelPos[2] = xx2 + m; + pixelPos[3] = yy2 + n; + pixelPos[4] = 1; + pixelPos[5] = 1; - copyRectClip(pos_pixel, dir_inicio, dir_fin); + copyRectClip(pixelPos, dir_inicio, dir_fin); - pixel_x = pixel_x + suma_x; + pixelX = pixelX + totalX; } - pixel_x = xx1; - pixel_y = pixel_y + suma_y; + pixelX = xx1; + pixelY = pixelY + totalY; } } -char DrasculaEngine::codifica(char car) { - return ~car; -} - void DrasculaEngine::quadrant_1() { float distance_x, distance_y; - if (num_ejec == 2) + if (currentChapter == 2) distance_x = hare_x - sitio_x; else distance_x = hare_x + ancho_hare / 2 - sitio_x; @@ -3644,18 +2933,18 @@ void DrasculaEngine::quadrant_1() { if (distance_x < distance_y) { direccion_hare = 0; sentido_hare = 2; - step_x = (int)(distance_x / (distance_y / PASO_HARE_Y)); + stepX = (int)(distance_x / (distance_y / STEP_Y)); } else { direccion_hare = 7; sentido_hare = 0; - step_y = (int)(distance_y / (distance_x / PASO_HARE_X)); + stepY = (int)(distance_y / (distance_x / STEP_X)); } } void DrasculaEngine::quadrant_2() { float distance_x, distance_y; - if (num_ejec == 2) + if (currentChapter == 2) distance_x = abs(hare_x + ancho_hare - sitio_x); else distance_x = abs(hare_x + ancho_hare / 2 - sitio_x); @@ -3665,18 +2954,18 @@ void DrasculaEngine::quadrant_2() { if (distance_x < distance_y) { direccion_hare = 1; sentido_hare = 2; - step_x = (int)(distance_x / (distance_y / PASO_HARE_Y)); + stepX = (int)(distance_x / (distance_y / STEP_Y)); } else { direccion_hare = 2; sentido_hare = 1; - step_y = (int)(distance_y / (distance_x / PASO_HARE_X)); + stepY = (int)(distance_y / (distance_x / STEP_X)); } } void DrasculaEngine::quadrant_3() { float distance_x, distance_y; - if (num_ejec == 2) + if (currentChapter == 2) distance_x = hare_x - sitio_x; else distance_x = hare_x + ancho_hare / 2 - sitio_x; @@ -3686,18 +2975,18 @@ void DrasculaEngine::quadrant_3() { if (distance_x < distance_y) { direccion_hare = 5; sentido_hare = 3; - step_x = (int)(distance_x / (distance_y / PASO_HARE_Y)); + stepX = (int)(distance_x / (distance_y / STEP_Y)); } else { direccion_hare = 6; sentido_hare = 0; - step_y = (int)(distance_y / (distance_x / PASO_HARE_X)); + stepY = (int)(distance_y / (distance_x / STEP_X)); } } void DrasculaEngine::quadrant_4() { float distance_x, distance_y; - if (num_ejec == 2) + if (currentChapter == 2) distance_x = abs(hare_x + ancho_hare - sitio_x); else distance_x = abs(hare_x + ancho_hare / 2 - sitio_x); @@ -3707,22 +2996,22 @@ void DrasculaEngine::quadrant_4() { if (distance_x < distance_y) { direccion_hare = 4; sentido_hare = 3; - step_x = (int)(distance_x / (distance_y / PASO_HARE_Y)); + stepX = (int)(distance_x / (distance_y / STEP_Y)); } else { direccion_hare = 3; sentido_hare = 1; - step_y = (int)(distance_y / (distance_x / PASO_HARE_X)); + stepY = (int)(distance_y / (distance_x / STEP_X)); } } -void DrasculaEngine::saveGame(char nom_game[]) { +void DrasculaEngine::saveGame(char gameName[]) { Common::OutSaveFile *out; int l; - if (!(out = _saveFileMan->openForSaving(nom_game))) { + if (!(out = _saveFileMan->openForSaving(gameName))) { error("no puedo abrir el archivo"); } - out->writeSint32LE(num_ejec); + out->writeSint32LE(currentChapter); out->write(currentData, 20); out->writeSint32LE(hare_x); out->writeSint32LE(hare_y); @@ -3736,51 +3025,49 @@ void DrasculaEngine::saveGame(char nom_game[]) { out->writeSint32LE(flags[l]); } - out->writeSint32LE(lleva_objeto); + out->writeSint32LE(takeObject); out->writeSint32LE(pickedObject); out->finalize(); if (out->ioFailed()) - warning("Can't write file '%s'. (Disk full?)", nom_game); + warning("Can't write file '%s'. (Disk full?)", gameName); delete out; } -void DrasculaEngine::aumenta_num_frame() { - diff_vez = vez() - conta_vez; +void DrasculaEngine::increaseFrameNum() { + diff_vez = getTime() - conta_vez; if (diff_vez >= 6) { - conta_vez = vez(); + conta_vez = getTime(); num_frame++; if (num_frame == 6) num_frame = 0; if (direccion_hare == 0 || direccion_hare == 7) { - hare_x = hare_x - step_x; - hare_y = hare_y - step_y; + hare_x = hare_x - stepX; + hare_y = hare_y - stepY; } else if (direccion_hare == 1 || direccion_hare == 2) { - hare_x = hare_x + step_x; - hare_y = hare_y - step_y; + hare_x = hare_x + stepX; + hare_y = hare_y - stepY; } else if (direccion_hare == 3 || direccion_hare == 4) { - hare_x = hare_x + step_x; - hare_y = hare_y + step_y; + hare_x = hare_x + stepX; + hare_y = hare_y + stepY; } else if (direccion_hare == 5 || direccion_hare == 6) { - hare_x = hare_x - step_x; - hare_y = hare_y + step_y; + hare_x = hare_x - stepX; + hare_y = hare_y + stepY; } } - if (num_ejec != 2) { - diferencia_y = (int)(alto_hare - nuevo_alto); - diferencia_x = (int)(ancho_hare - nuevo_ancho); - hare_y = hare_y + diferencia_y; - hare_x = hare_x + diferencia_x; - alto_hare = (int)nuevo_alto; - ancho_hare = (int)nuevo_ancho; + if (currentChapter != 2) { + hare_y += (int)(alto_hare - newHeight); + hare_x += (int)(ancho_hare - newWidth); + alto_hare = (int)newHeight; + ancho_hare = (int)newWidth; } } -int DrasculaEngine::sobre_que_objeto() { +int DrasculaEngine::whichObject() { int n = 0; for (n = 1; n < 43; n++) { @@ -3792,14 +3079,14 @@ int DrasculaEngine::sobre_que_objeto() { return n; } -bool DrasculaEngine::comprueba_banderas_menu() { +bool DrasculaEngine::checkMenuFlags() { int h, n; for (n = 0; n < 43; n++) { - if (sobre_que_objeto() == n) { + if (whichObject() == n) { h = inventoryObjects[n]; if (h != 0) - if (banderas(h)) + if (checkFlag(h)) return true; } } @@ -3807,7 +3094,7 @@ bool DrasculaEngine::comprueba_banderas_menu() { return false; } -void DrasculaEngine::conversa(const char *nom_fich) { +void DrasculaEngine::converse(const char *nom_fich) { int h; int game1 = 1, game2 = 1, game3 = 1, game4 = 1; char phrase1[78]; @@ -3828,58 +3115,46 @@ void DrasculaEngine::conversa(const char *nom_fich) { int used3 = 0; char buffer[256]; - rompo_y_salgo = 0; + breakOut = 0; strcpy(para_codificar, nom_fich); - if (num_ejec == 5) + if (currentChapter == 5) withoutVerb(); - ald = new Common::File; - ald->open(nom_fich); - if (!ald->isOpen()) { - error("missing data file"); + _arj.open(nom_fich); + if (!_arj.isOpen()) { + error("missing data file %s", nom_fich); } - int size = ald->size(); - - getLine(ald, buffer, size); - sscanf(buffer, "%s", phrase1); - getLine(ald, buffer, size); - sscanf(buffer, "%s", phrase2); - getLine(ald, buffer, size); - sscanf(buffer, "%s", phrase3); - getLine(ald, buffer, size); - sscanf(buffer, "%s", phrase4); - getLine(ald, buffer, size); - sscanf(buffer, "%s", sound1); - getLine(ald, buffer, size); - sscanf(buffer, "%s", sound2); - getLine(ald, buffer, size); - sscanf(buffer, "%s", sound3); - getLine(ald, buffer, size); - sscanf(buffer, "%s", sound4); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &answer1); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &answer2); - getLine(ald, buffer, size); - sscanf(buffer, "%d", &answer3); - delete ald; - ald = NULL; - - if (num_ejec == 2 && !strcmp(nom_fich, "op_5.cal") && flags[38] == 1 && flags[33] == 1) { + int size = _arj.size(); + + getStringFromLine(buffer, size, phrase1); + getStringFromLine(buffer, size, phrase2); + getStringFromLine(buffer, size, phrase3); + getStringFromLine(buffer, size, phrase4); + getStringFromLine(buffer, size, sound1); + getStringFromLine(buffer, size, sound2); + getStringFromLine(buffer, size, sound3); + getStringFromLine(buffer, size, sound4); + getIntFromLine(buffer, size, &answer1); + getIntFromLine(buffer, size, &answer2); + getIntFromLine(buffer, size, &answer3); + + _arj.close(); + + if (currentChapter == 2 && !strcmp(nom_fich, "op_5.cal") && flags[38] == 1 && flags[33] == 1) { strcpy(phrase3, _text[_lang][405]); strcpy(sound3, "405.als"); answer3 = 31; } - if (num_ejec == 6 && !strcmp(nom_fich, "op_12.cal") && flags[7] == 1) { + if (currentChapter == 6 && !strcmp(nom_fich, "op_12.cal") && flags[7] == 1) { strcpy(phrase3, _text[_lang][273]); strcpy(sound3, "273.als"); answer3 = 14; } - if (num_ejec == 6 && !strcmp(nom_fich, "op_12.cal") && flags[10] == 1) { + if (currentChapter == 6 && !strcmp(nom_fich, "op_12.cal") && flags[10] == 1) { strcpy(phrase3, " cuanto queda para que acabe el partido?"); strcpy(sound3, "274.als"); answer3 = 15; @@ -3905,377 +3180,193 @@ void DrasculaEngine::conversa(const char *nom_fich) { if (phrase4[h] == (char)0xa7) phrase4[h] = ' '; - loadPic("car.alg"); - decompressPic(dir_hare_fondo, 1); + loadPic("car.alg", backSurface, 1); // TODO code here should limit y position for mouse in dialog menu, // but we can't implement this due lack backend functionality // from 1(top) to 31 - color_abc(LIGHT_GREEN); - -bucle_opc: + color_abc(kColorLightGreen); - updateRoom(); - - if (num_ejec == 1 || num_ejec == 4 || num_ejec == 6) { - if (musicStatus() == 0 && flags[11] == 0) - playMusic(roomMusic); - } else if (num_ejec == 2) { - if (musicStatus() == 0 && flags[11] == 0 && roomMusic != 0) - playMusic(roomMusic); - } else if (num_ejec == 3 || num_ejec == 5) { - if (musicStatus() == 0) - playMusic(roomMusic); - } - - MirarRaton(); - - if (mouseY > 0 && mouseY < 9) { - if (used1 == 1 && _color != WHITE) - color_abc(WHITE); - else if (used1 == 0 && _color != LIGHT_GREEN) - color_abc(LIGHT_GREEN); - } else if (mouseY > 8 && mouseY < 17) { - if (used2 == 1 && _color != WHITE) - color_abc(WHITE); - else if (used2 == 0 && _color != LIGHT_GREEN) - color_abc(LIGHT_GREEN); - } else if (mouseY > 16 && mouseY < 25) { - if (used3 == 1 && _color != WHITE) - color_abc(WHITE); - else if (used3 == 0 && _color != LIGHT_GREEN) - color_abc(LIGHT_GREEN); - } else if (_color != LIGHT_GREEN) - color_abc(LIGHT_GREEN); - - if (mouseY > 0 && mouseY < 9) - game1 = 2; - else if (mouseY > 8 && mouseY < 17) - game2 = 2; - else if (mouseY > 16 && mouseY < 25) - game3 = 2; - else if (mouseY > 24 && mouseY < 33) - game4 = 2; - - print_abc_opc(phrase1, 1, 2, game1); - print_abc_opc(phrase2, 1, 10, game2); - print_abc_opc(phrase3, 1, 18, game3); - print_abc_opc(phrase4, 1, 26, game4); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - if ((button_izq == 1) && (game1 == 2)) { - delay(100); - used1 = 1; - talk(phrase1, sound1); - if (num_ejec == 3) - grr(); - else - response(answer1); - } else if ((button_izq == 1) && (game2 == 2)) { - delay(100); - used2 = 1; - talk(phrase2, sound2); - if (num_ejec == 3) - grr(); - else - response(answer2); - } else if ((button_izq == 1) && (game3 == 2)) { - delay(100); - used3 = 1; - talk(phrase3, sound3); - if (num_ejec == 3) - grr(); - else - response(answer3); - } else if ((button_izq == 1) && (game4 == 2)) { - delay(100); - talk(phrase4, sound4); - rompo_y_salgo = 1; - } - - if (button_izq == 1) { - delay(100); - color_abc(LIGHT_GREEN); - } - - if (used1 == 0) - game1 = 1; - else - game1 = 3; - if (used2 == 0) - game2 = 1; - else - game2 = 3; - if (used3 == 0) - game3 = 1; - else - game3 = 3; - - game4 = 1; - - if (rompo_y_salgo == 0) - goto bucle_opc; + while (breakOut == 0) { + updateRoom(); - if (num_ejec == 2) - loadPic(fondo_y_menu); - else - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); - if (num_ejec != 5) - withoutVerb(); -} + if (currentChapter == 1 || currentChapter == 4 || currentChapter == 6) { + if (musicStatus() == 0 && flags[11] == 0) + playMusic(roomMusic); + } else if (currentChapter == 2) { + if (musicStatus() == 0 && flags[11] == 0 && roomMusic != 0) + playMusic(roomMusic); + } else if (currentChapter == 3 || currentChapter == 5) { + if (musicStatus() == 0) + playMusic(roomMusic); + } -void DrasculaEngine::print_abc_opc(const char *said, int x_pantalla, int y_pantalla, int game) { - int pos_texto[6]; - int y_de_signos, y_de_letra, x_de_letra = 0, h, length; - length = strlen(said); + updateEvents(); - for (h = 0; h < length; h++) { - if (game == 1) { - y_de_letra = Y_ABC_OPC_1; - y_de_signos = Y_SIGNOS_OPC_1; - } else if (game == 3) { - y_de_letra = Y_ABC_OPC_3; - y_de_signos = Y_SIGNOS_OPC_3; - } else { - y_de_letra = Y_ABC_OPC_2; - y_de_signos = Y_SIGNOS_OPC_2; + if (mouseY > 0 && mouseY < 9) { + if (used1 == 1 && _color != kColorWhite) + color_abc(kColorWhite); + else if (used1 == 0 && _color != kColorLightGreen) + color_abc(kColorLightGreen); + } else if (mouseY > 8 && mouseY < 17) { + if (used2 == 1 && _color != kColorWhite) + color_abc(kColorWhite); + else if (used2 == 0 && _color != kColorLightGreen) + color_abc(kColorLightGreen); + } else if (mouseY > 16 && mouseY < 25) { + if (used3 == 1 && _color != kColorWhite) + color_abc(kColorWhite); + else if (used3 == 0 && _color != kColorLightGreen) + color_abc(kColorLightGreen); + } else if (_color != kColorLightGreen) + color_abc(kColorLightGreen); + + if (mouseY > 0 && mouseY < 9) + game1 = 2; + else if (mouseY > 8 && mouseY < 17) + game2 = 2; + else if (mouseY > 16 && mouseY < 25) + game3 = 2; + else if (mouseY > 24 && mouseY < 33) + game4 = 2; + + print_abc_opc(phrase1, 1, 2, game1); + print_abc_opc(phrase2, 1, 10, game2); + print_abc_opc(phrase3, 1, 18, game3); + print_abc_opc(phrase4, 1, 26, game4); + + updateScreen(); + + if ((button_izq == 1) && (game1 == 2)) { + delay(100); + used1 = 1; + talk(phrase1, sound1); + if (currentChapter == 3) + grr(); + else + response(answer1); + } else if ((button_izq == 1) && (game2 == 2)) { + delay(100); + used2 = 1; + talk(phrase2, sound2); + if (currentChapter == 3) + grr(); + else + response(answer2); + } else if ((button_izq == 1) && (game3 == 2)) { + delay(100); + used3 = 1; + talk(phrase3, sound3); + if (currentChapter == 3) + grr(); + else + response(answer3); + } else if ((button_izq == 1) && (game4 == 2)) { + delay(100); + talk(phrase4, sound4); + breakOut = 1; } - int c = toupper(said[h]); - if (c == 'A') - x_de_letra = X_A_OPC; - else if (c == '\265') x_de_letra = X_A_OPC; - else if (c == '\267') x_de_letra = X_A_OPC; - else if (c == '\266') x_de_letra = X_A_OPC; - else if (c == 'B') - x_de_letra = X_B_OPC; - else if (c == 'C') - x_de_letra = X_C_OPC; - else if (c == '\200') x_de_letra = X_C_OPC; - else if (c == '\207') x_de_letra = X_C_OPC; - else if (c == 'D') - x_de_letra = X_D_OPC; - else if (c == 'E') - x_de_letra = X_E_OPC; - else if (c == '\220') x_de_letra = X_E_OPC; - else if (c == '\324') x_de_letra = X_E_OPC; - else if (c == '\322') x_de_letra = X_E_OPC; - else if (c == 'F') - x_de_letra = X_F_OPC; - else if (c == 'G') - x_de_letra = X_G_OPC; - else if (c == 'H') - x_de_letra = X_H_OPC; - else if (c == 'I') - x_de_letra = X_I_OPC; - else if (c == '\326') x_de_letra = X_I_OPC; - else if (c == '\336') x_de_letra = X_I_OPC; - else if (c == '\327') x_de_letra = X_I_OPC; - else if (c == 'J') - x_de_letra = X_J_OPC; - else if (c == 'K') - x_de_letra = X_K_OPC; - else if (c == 'L') - x_de_letra = X_L_OPC; - else if (c == 'M') - x_de_letra = X_M_OPC; - else if (c == 'N') - x_de_letra = X_N_OPC; - else if (c == '\047') x_de_letra = X_GN_OPC; - else if (c == 'O') - x_de_letra = X_O_OPC; - else if (c == 'P') - x_de_letra = X_P_OPC; - else if (c == '\340') x_de_letra = X_O_OPC; - else if (c == '\342') x_de_letra = X_O_OPC; - else if (c == '\343') x_de_letra = X_O_OPC; - else if (c == 'Q') - x_de_letra = X_Q_OPC; - else if (c == 'R') - x_de_letra = X_R_OPC; - else if (c == 'S') - x_de_letra = X_S_OPC; - else if (c == 'T') - x_de_letra = X_T_OPC; - else if (c == 'U') - x_de_letra = X_U_OPC; - else if (c == '\353') x_de_letra = X_U_OPC; - else if (c == '\352') x_de_letra = X_U_OPC; - else if (c == '\351') x_de_letra = X_U_OPC; - else if (c == 'V') - x_de_letra = X_V_OPC; - else if (c == 'W') - x_de_letra = X_W_OPC; - else if (c == 'X') - x_de_letra = X_X_OPC; - else if (c == 'Y') - x_de_letra = X_Y_OPC; - else if (c == 'Z') - x_de_letra = X_Z_OPC; - else if (c == ' ') - x_de_letra = SPACE_OPC; - else { - y_de_letra = y_de_signos; - if (c == '.') - x_de_letra = X_DOT_OPC; - else if (c == ',') - x_de_letra = X_COMA_OPC; - else if (c == '-') - x_de_letra = X_HYPHEN_OPC; - else if (c == '?') - x_de_letra = X_CIERRA_INTERROGACION_OPC; - else if (c == 0xa8) - x_de_letra = X_ABRE_INTERROGACION_OPC; -// else if (c == '\'') // FIXME -// x_de_letra = SPACE; // space for now - else if (c == '"') - x_de_letra = X_COMILLAS_OPC; - else if (c == '!') - x_de_letra = X_CIERRA_INTERROGACION_OPC; - else if (c == 0xad) - x_de_letra = X_ABRE_EXCLAMACION_OPC; - else if (c == ';') - x_de_letra = X_PUNTO_Y_COMA_OPC; - else if (c == '>') - x_de_letra = X_GREATER_THAN_OPC; - else if (c == '<') - x_de_letra = X_LESSER_THAN_OPC; - else if (c == '$') - x_de_letra = X_DOLAR_OPC; - else if (c == '%') - x_de_letra = X_PERCENT_OPC; - else if (c == ':') - x_de_letra = X_DOS_PUNTOS_OPC; - else if (c == '&') - x_de_letra = X_AND_OPC; - else if (c == '/') - x_de_letra = X_BARRA_OPC; - else if (c == '(') - x_de_letra = X_BRACKET_OPEN_OPC; - else if (c == ')') - x_de_letra = X_BRACKET_CLOSE_OPC; - else if (c == '*') - x_de_letra = X_ASTERISCO_OPC; - else if (c == '+') - x_de_letra = X_PLUS_OPC; - else if (c == '1') - x_de_letra = X_N1_OPC; - else if (c == '2') - x_de_letra = X_N2_OPC; - else if (c == '3') - x_de_letra = X_N3_OPC; - else if (c == '4') - x_de_letra = X_N4_OPC; - else if (c == '5') - x_de_letra = X_N5_OPC; - else if (c == '6') - x_de_letra = X_N6_OPC; - else if (c == '7') - x_de_letra = X_N7_OPC; - else if (c == '8') - x_de_letra = X_N8_OPC; - else if (c == '9') - x_de_letra = X_N9_OPC; - else if (c == '0') - x_de_letra = X_N0_OPC; + if (button_izq == 1) { + delay(100); + color_abc(kColorLightGreen); } - pos_texto[0] = x_de_letra; - pos_texto[1] = y_de_letra; - pos_texto[2] = x_pantalla; - pos_texto[3] = y_pantalla; - pos_texto[4] = CHAR_WIDTH_OPC; - pos_texto[5] = CHAR_HEIGHT_OPC; - - copyRectClip(pos_texto, dir_hare_fondo, dir_zona_pantalla); + game1 = (used1 == 0) ? 1 : 3; + game2 = (used2 == 0) ? 1 : 3; + game3 = (used3 == 0) ? 1 : 3; + game4 = 1; + } // while (breakOut == 0) - x_pantalla = x_pantalla + CHAR_WIDTH_OPC; - } + if (currentChapter == 2) + loadPic(menuBackground, backSurface, 1); + else + loadPic("99.alg", backSurface, 1); + if (currentChapter != 5) + withoutVerb(); } -void DrasculaEngine::response(int funcion) { - if (num_ejec == 1) { - if (funcion == 10) - talk_borracho(_textb[_lang][1], "B1.als"); - else if (funcion == 11) - talk_borracho(_textb[_lang][2], "B2.als"); - else if (funcion == 12) - talk_borracho(_textb[_lang][3], "B3.als"); - } else if (num_ejec == 2) { - if (funcion == 8) +void DrasculaEngine::response(int function) { + if (currentChapter == 1) { + if (function == 10) + talk_drunk(1); + else if (function == 11) + talk_drunk(2); + else if (function == 12) + talk_drunk(3); + } else if (currentChapter == 2) { + if (function == 8) animation_8_2(); - else if (funcion == 9) + else if (function == 9) animation_9_2(); - else if (funcion == 10) + else if (function == 10) animation_10_2(); - else if (funcion == 15) + else if (function == 15) animation_15_2(); - else if (funcion == 16) + else if (function == 16) animation_16_2(); - else if (funcion == 17) + else if (function == 17) animation_17_2(); - else if (funcion == 19) + else if (function == 19) animation_19_2(); - else if (funcion == 20) + else if (function == 20) animation_20_2(); - else if (funcion == 21) + else if (function == 21) animation_21_2(); - else if (funcion == 23) + else if (function == 23) animation_23_2(); - else if (funcion == 28) + else if (function == 28) animation_28_2(); - else if (funcion == 29) + else if (function == 29) animation_29_2(); - else if (funcion == 30) + else if (function == 30) animation_30_2(); - else if (funcion == 31) + else if (function == 31) animation_31_2(); - } else if (num_ejec == 4) { - if (funcion == 2) + } else if (currentChapter == 4) { + if (function == 2) animation_2_4(); - else if (funcion == 3) + else if (function == 3) animation_3_4(); - else if (funcion == 4) + else if (function == 4) animation_4_4(); - } else if (num_ejec == 5) { - if (funcion == 2) + } else if (currentChapter == 5) { + if (function == 2) animation_2_5(); - else if (funcion == 3) + else if (function == 3) animation_3_5(); - else if (funcion == 6) + else if (function == 6) animation_6_5(); - else if (funcion == 7) + else if (function == 7) animation_7_5(); - else if (funcion == 8) + else if (function == 8) animation_8_5(); - else if (funcion == 15) + else if (function == 15) animation_15_5(); - else if (funcion == 16) + else if (function == 16) animation_16_5(); - else if (funcion == 17) + else if (function == 17) animation_17_5(); - } else if (num_ejec == 6) { - if (funcion == 2) + } else if (currentChapter == 6) { + if (function == 2) animation_2_6(); - else if (funcion == 3) + else if (function == 3) animation_3_6(); - else if (funcion == 4) + else if (function == 4) animation_4_6(); - else if (funcion == 11) + else if (function == 11) animation_11_6(); - else if (funcion == 12) + else if (function == 12) animation_12_6(); - else if (funcion == 13) + else if (function == 13) animation_13_6(); - else if (funcion == 14) + else if (function == 14) animation_14_6(); - else if (funcion == 15) + else if (function == 15) animation_15_6(); } } -void DrasculaEngine::suma_objeto(int osj) { +void DrasculaEngine::addObject(int osj) { int h, position = 0; for (h = 1; h < 43; h++) { @@ -4294,12 +3385,9 @@ void DrasculaEngine::suma_objeto(int osj) { } } -void DrasculaEngine::stopSound_corte() { +void DrasculaEngine::stopSound() { if (hay_sb == 1) { - ctvd_stop(); - delete sku; - sku = NULL; - ctvd_terminate(); + _mixer->stopHandle(_soundHandle); } } @@ -4322,39 +3410,27 @@ void DrasculaEngine::MusicFadeout() { _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, org_vol); } -void DrasculaEngine::ctvd_end() { - _mixer->stopHandle(_soundHandle); -} - -void DrasculaEngine::ctvd_stop() { - _mixer->stopHandle(_soundHandle); -} - -void DrasculaEngine::ctvd_terminate() { -// _mixer->stopHandle(_soundHandle); -} +void DrasculaEngine::playFile(const char *fname) { + _arj.open(fname); -void DrasculaEngine::ctvd_speaker(int flag) {} - -void DrasculaEngine::ctvd_output(Common::File *file_handle) {} - -void DrasculaEngine::ctvd_init(int b) { - int soundSize = sku->size(); + int soundSize = _arj.size(); byte *soundData = (byte *)malloc(soundSize); - sku->seek(32); - sku->read(soundData, soundSize); + _arj.seek(32); + _arj.read(soundData, soundSize); + _arj.close(); + _mixer->playRaw(Audio::Mixer::kSFXSoundType, &_soundHandle, soundData, soundSize - 64, 11025, Audio::Mixer::FLAG_AUTOFREE | Audio::Mixer::FLAG_UNSIGNED); } -int DrasculaEngine::LookForFree() { +bool DrasculaEngine::soundIsActive() { return _mixer->isSoundHandleActive(_soundHandle); } -void DrasculaEngine::updateData() { - if (num_ejec == 1) { +void DrasculaEngine::updateVisible() { + if (currentChapter == 1) { // nothing - } else if (num_ejec == 2) { + } else if (currentChapter == 2) { if (roomNumber == 2 && flags[40] == 0) visible[3] = 0; else if (roomNumber == 3 && flags[3] == 1) @@ -4368,9 +3444,9 @@ void DrasculaEngine::updateData() { visible[4] = 0; else if (roomNumber == 18 && flags[28] == 1) visible[2] = 0; - } else if (num_ejec == 3) { + } else if (currentChapter == 3) { // nothing - } else if (num_ejec == 4) { + } else if (currentChapter == 4) { if (roomNumber == 23 && flags[0] == 0 && flags[11] == 0) visible[2] = 1; if (roomNumber == 23 && flags[0] == 1 && flags[11] == 0) @@ -4395,7 +3471,7 @@ void DrasculaEngine::updateData() { visible[3] = 1; if (roomNumber == 35 && flags[15] == 1) visible[1] = 0; - } else if (num_ejec == 5) { + } else if (currentChapter == 5) { if (roomNumber == 49 && flags[6] == 1) visible[2] = 0; if (roomNumber == 49 && flags[6] == 0) @@ -4410,7 +3486,7 @@ void DrasculaEngine::updateData() { visible[3] = 0; if (roomNumber == 55 && flags[8] == 1) visible[1] = 0; - } else if (num_ejec == 6) { + } else if (currentChapter == 6) { if (roomNumber == 58 && flags[8] == 0) isDoor[1] = 0; if (roomNumber == 58 && flags[8] == 1) @@ -4425,16 +3501,16 @@ void DrasculaEngine::updateData() { } } -void DrasculaEngine::anda_pabajo() { +void DrasculaEngine::walkDown() { direccion_hare = 4; sentido_hare = 3; - step_x = 0; + stepX = 0; } -void DrasculaEngine::anda_parriba() { +void DrasculaEngine::walkUp() { direccion_hare = 0; sentido_hare = 2; - step_x = 0; + stepX = 0; } void DrasculaEngine::pon_vb() { @@ -4470,27 +3546,23 @@ void DrasculaEngine::pon_vb() { frame_vb = 1; } - copyRectClip(pos_vb, dir_hare_frente, dir_zona_pantalla); + copyRectClip(pos_vb, frontSurface, screenSurface); } -void DrasculaEngine::lleva_vb(int punto_x) { - if (punto_x < vb_x) - sentido_vb = 0; - else - sentido_vb = 1; - +void DrasculaEngine::lleva_vb(int pointX) { + sentido_vb = (pointX < vb_x) ? 0 : 1; vb_se_mueve = 1; for (;;) { updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); if (sentido_vb == 0) { vb_x = vb_x - 5; - if (vb_x <= punto_x) + if (vb_x <= pointX) break; } else { vb_x = vb_x + 5; - if (vb_x >= punto_x) + if (vb_x >= pointX) break; } pause(5); @@ -4501,150 +3573,123 @@ void DrasculaEngine::lleva_vb(int punto_x) { void DrasculaEngine::hipo_sin_nadie(int counter){ int y = 0, sentido = 0; - if (num_ejec == 3) + if (currentChapter == 3) y = -1; -comienza: - counter--; + do { + counter--; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - if (num_ejec == 3) - updateScreen(0, 0, 0, y, 320, 200, dir_zona_pantalla); - else - updateScreen(0, 1, 0, y, 320, 198, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + if (currentChapter == 3) + updateScreen(0, 0, 0, y, 320, 200, screenSurface); + else + updateScreen(0, 1, 0, y, 320, 198, screenSurface); - if (sentido == 0) - y++; - else - y--; + if (sentido == 0) + y++; + else + y--; - if (num_ejec == 3) { - if (y == 1) - sentido = 1; - if (y == -1) - sentido = 0; - } else { - if (y == 2) - sentido = 1; - if (y == 0) - sentido = 0; - } - if (counter > 0) - goto comienza; + if (currentChapter == 3) { + if (y == 1) + sentido = 1; + if (y == -1) + sentido = 0; + } else { + if (y == 2) + sentido = 1; + if (y == 0) + sentido = 0; + } + } while (counter > 0); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + updateScreen(); } void DrasculaEngine::openDoor(int nflag, int doorNum) { if (flags[nflag] == 0) { - if (num_ejec == 1 /*|| num_ejec == 4*/) { + if (currentChapter == 1 /*|| currentChapter == 4*/) { if (nflag != 7) { - playSound("s3.als"); + playSound(3); flags[nflag] = 1; } } else { - playSound("s3.als"); + playSound(3); flags[nflag] = 1; } if (doorNum != NO_DOOR) - puertas_cerradas(doorNum); + updateDoor(doorNum); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - stopSound(); + updateScreen(); + finishSound(); withoutVerb(); } } -void DrasculaEngine::mapa() { +void DrasculaEngine::showMap() { int l, veo = 0; for (l = 0; l < numRoomObjs; l++) { if (mouseX > x1[l] && mouseY > y1[l] && mouseX < x2[l] && mouseY < y2[l] && visible[l] == 1) { - strcpy(texto_nombre, objName[l]); - hay_nombre = 1; + strcpy(textName, objName[l]); + hasName = 1; veo = 1; } } if (veo == 0) - hay_nombre = 0; + hasName = 0; } void DrasculaEngine::grr() { int length = 30; - color_abc(DARK_GREEN); + color_abc(kColorDarkGreen); - if (hay_sb == 1) { - sku = new Common::File; - sku->open("s10.als"); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); - } - ctvd_init(4); - ctvd_speaker(1); - ctvd_output(sku); - } + if (hay_sb == 1) + playFile("s10.als"); updateRoom(); - copyBackground(253, 110, 150, 65, 20, 30, dir_dibujo3, dir_zona_pantalla); + copyBackground(253, 110, 150, 65, 20, 30, drawSurface3, screenSurface); if (withVoices == 0) - centra_texto(".groaaarrrrgghhh!", 153, 65); + centerText(".groaaarrrrgghhh!", 153, 65); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); -bucless: - int key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } + while (!isTalkFinished(&length)); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); } -void DrasculaEngine::activa_pendulo() { +void DrasculaEngine::activatePendulum() { flags[1] = 2; hare_se_ve = 0; roomNumber = 102; - loadPic("102.alg"); - decompressPic(dir_dibujo1, HALF_PAL); - loadPic("an_p1.alg"); - decompressPic(dir_dibujo3, 1); - loadPic("an_p2.alg"); - decompressPic(dir_hare_dch, 1); - loadPic("an_p3.alg"); - decompressPic(dir_hare_frente, 1); - - copyBackground(0, 171, 0, 0, OBJWIDTH, OBJHEIGHT, dir_hare_fondo, dir_dibujo3); - - conta_ciego_vez = vez(); + loadPic("102.alg", drawSurface1, HALF_PAL); + loadPic("an_p1.alg", drawSurface3, 1); + loadPic("an_p2.alg", extraSurface, 1); + loadPic("an_p3.alg", frontSurface, 1); + + copyBackground(0, 171, 0, 0, OBJWIDTH, OBJHEIGHT, backSurface, drawSurface3); + + conta_blind_vez = getTime(); } void DrasculaEngine::closeDoor(int nflag, int doorNum) { if (flags[nflag] == 1) { - playSound("s4.als"); + playSound(4); flags[nflag] = 0; if (doorNum != NO_DOOR) - puertas_cerradas(doorNum); + updateDoor(doorNum); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - stopSound(); + updateScreen(); + finishSound(); withoutVerb(); } } diff --git a/engines/drascula/drascula.h b/engines/drascula/drascula.h index 512ebb9950..3552bb1c0f 100644 --- a/engines/drascula/drascula.h +++ b/engines/drascula/drascula.h @@ -35,6 +35,7 @@ #include "common/hash-str.h" #include "common/events.h" #include "common/keyboard.h" +#include "common/unarj.h" #include "sound/audiostream.h" #include "sound/mixer.h" @@ -46,6 +47,7 @@ namespace Drascula { enum DrasculaGameFeatures { + GF_PACKED = (1 << 0) }; enum Languages { @@ -66,23 +68,63 @@ enum Verbs { kVerbMove = 6 }; +enum Colors { + kColorBrown = 1, + kColorDarkBlue = 2, + kColorLightGreen = 3, + kColorDarkGreen = 4, + kColorYellow = 5, + kColorOrange = 6, + kColorRed = 7, + kColorMaroon = 8, + kColorPurple = 9, + kColorWhite = 10, + kColorPink = 11 +}; + +enum SSNFrames { + kFrameInit = 0, + kFrameCmpRle = 1, + kFrameCmpOff = 2, + kFrameEndAnim = 3, + kFrameSetPal = 4, + kFrameMouseKey = 5, // unused + kFrameEmptyFrame = 6 +}; + +enum IgorTalkerTypes { + kIgorDch = 0, + kIgorFront = 1, + kIgorDoor = 2, + kIgorSeated = 3, + kIgorWig = 4 +}; + #define TEXTD_START 68 struct DrasculaGameDescription; -struct RoomTalkAction; +struct RoomTalkAction { + int num; + int action; + int objectID; + int speechID; +}; + +struct ItemLocation { + int x; + int y; +}; + +struct CharInfo { + int inChar; + int mappedChar; + int charType; // 0 - letters, 1 - signs, 2 - accented +}; + +#define CHARMAP_SIZE 93 #define NUM_SAVES 10 #define NUM_FLAGS 50 -#define ESC 0x01 -#define F1 0x3B -#define F2 0x3C -#define F3 0x3D -#define F4 0x3E -#define F5 0x3F -#define F6 0x40 -#define F8 0x42 -#define F9 0x43 -#define F10 0x44 #define DIF_MASK 55 #define OBJWIDTH 40 #define OBJHEIGHT 25 @@ -92,170 +134,25 @@ struct RoomTalkAction; #define CHAR_WIDTH 8 #define CHAR_HEIGHT 6 -#define Y_ABC 158 -#define Y_ABC_ESP 149 -#define Y_SIGNOS 169 -#define Y_SIGNOS_ESP 160 -#define Y_ACENTOS 180 - -#define X_A 6 -#define X_B 15 -#define X_C 24 -#define X_D 33 -#define X_E 42 -#define X_F 51 -#define X_G 60 -#define X_H 69 -#define X_I 78 -#define X_J 87 -#define X_K 96 -#define X_L 105 -#define X_M 114 -#define X_N 123 -#define X_GN 132 -#define X_O 141 -#define X_P 150 -#define X_Q 159 -#define X_R 168 -#define X_S 177 -#define X_T 186 -#define X_U 195 -#define X_V 204 -#define X_W 213 -#define X_X 222 -#define X_Y 231 -#define X_Z 240 -#define X_DOT 6 -#define X_COMA 15 -#define X_HYPHEN 24 -#define X_CIERRA_INTERROGACION 33 -#define X_ABRE_INTERROGACION 42 -#define X_COMILLAS 51 -#define X_CIERRA_EXCLAMACION 60 -#define X_ABRE_EXCLAMACION 69 -#define X_PUNTO_Y_COMA 78 -#define X_GREATER_THAN 87 -#define X_LESSER_THAN 96 -#define X_DOLAR 105 -#define X_PERCENT 114 -#define X_DOS_PUNTOS 123 -#define X_AND 132 -#define X_BARRA 141 -#define X_BRACKET_OPEN 150 -#define X_BRACKET_CLOSE 159 -#define X_ASTERISCO 168 -#define X_PLUS 177 -#define X_N1 186 -#define X_N2 195 -#define X_N3 204 -#define X_N4 213 -#define X_N5 222 -#define X_N6 231 -#define X_N7 240 -#define X_N8 249 -#define X_N9 258 -#define X_N0 267 -#define SPACE 250 -#define ALTO_TALK_HARE 25 -#define ANCHO_TALK_HARE 23 -#define VON_BRAUN 1 -#define DARK_BLUE 2 -#define LIGHT_GREEN 3 -#define DARK_GREEN 4 -#define YELLOW 5 -#define ORANGE 6 -#define RED 7 -#define MAROON 8 -#define PURPLE 9 -#define WHITE 10 -#define PINK 11 -#define PASO_HARE_X 8 -#define PASO_HARE_Y 3 +#define TALK_HEIGHT 25 +#define TALK_WIDTH 23 +#define STEP_X 8 +#define STEP_Y 3 #define CHARACTER_HEIGHT 70 #define CHARACTER_WIDTH 43 -#define PIES_HARE 12 +#define FEET_HEIGHT 12 #define CHAR_WIDTH_OPC 6 #define CHAR_HEIGHT_OPC 5 -#define Y_ABC_OPC_1 6 -#define Y_SIGNOS_OPC_1 15 -#define Y_ABC_OPC_2 31 -#define Y_SIGNOS_OPC_2 40 -#define Y_ABC_OPC_3 56 -#define Y_SIGNOS_OPC_3 65 -#define X_A_OPC 10 -#define X_B_OPC 17 -#define X_C_OPC 24 -#define X_D_OPC 31 -#define X_E_OPC 38 -#define X_F_OPC 45 -#define X_G_OPC 52 -#define X_H_OPC 59 -#define X_I_OPC 66 -#define X_J_OPC 73 -#define X_K_OPC 80 -#define X_L_OPC 87 -#define X_M_OPC 94 -#define X_N_OPC 101 -#define X_GN_OPC 108 -#define X_O_OPC 115 -#define X_P_OPC 122 -#define X_Q_OPC 129 -#define X_R_OPC 136 -#define X_S_OPC 143 -#define X_T_OPC 150 -#define X_U_OPC 157 -#define X_V_OPC 164 -#define X_W_OPC 171 -#define X_X_OPC 178 -#define X_Y_OPC 185 -#define X_Z_OPC 192 -#define SPACE_OPC 199 -#define X_DOT_OPC 10 -#define X_COMA_OPC 17 -#define X_HYPHEN_OPC 24 -#define X_CIERRA_INTERROGACION_OPC 31 -#define X_ABRE_INTERROGACION_OPC 38 -#define X_COMILLAS_OPC 45 -#define X_CIERRA_EXCLAMACION_OPC 52 -#define X_ABRE_EXCLAMACION_OPC 59 -#define X_PUNTO_Y_COMA_OPC 66 -#define X_GREATER_THAN_OPC 73 -#define X_LESSER_THAN_OPC 80 -#define X_DOLAR_OPC 87 -#define X_PERCENT_OPC 94 -#define X_DOS_PUNTOS_OPC 101 -#define X_AND_OPC 108 -#define X_BARRA_OPC 115 -#define X_BRACKET_OPEN_OPC 122 -#define X_BRACKET_CLOSE_OPC 129 -#define X_ASTERISCO_OPC 136 -#define X_PLUS_OPC 143 -#define X_N1_OPC 150 -#define X_N2_OPC 157 -#define X_N3_OPC 164 -#define X_N4_OPC 171 -#define X_N5_OPC 178 -#define X_N6_OPC 185 -#define X_N7_OPC 192 -#define X_N8_OPC 199 -#define X_N9_OPC 206 -#define X_N0_OPC 213 #define NO_DOOR 99 -#define INIT_FRAME 0 -#define CMP_RLE 1 -#define CMP_OFF 2 -#define END_ANIM 3 -#define SET_PAL 4 -#define MOUSE_KEY 5 -#define EMPTY_FRAME 6 - #define COMPLETE_PAL 256 #define HALF_PAL 128 +static const int interf_x[] ={ 1, 65, 129, 193, 1, 65, 129 }; +static const int interf_y[] ={ 51, 51, 51, 51, 83, 83, 83 }; + class DrasculaEngine : public ::Engine { - int _gameId; Common::KeyState _keyPressed; protected: @@ -266,27 +163,23 @@ protected: public: DrasculaEngine(OSystem *syst, const DrasculaGameDescription *gameDesc); virtual ~DrasculaEngine(); - int getGameId() { - return _gameId; - } Common::RandomSource *_rnd; const DrasculaGameDescription *_gameDescription; - uint32 getGameID() const; uint32 getFeatures() const; - uint16 getVersion() const; - Common::Platform getPlatform() const; Common::Language getLanguage() const; void updateEvents(); + void loadArchives(); + Audio::SoundHandle _soundHandle; void allocMemory(); void freeMemory(); void releaseGame(); - void loadPic(const char *); - void decompressPic(byte *dir_escritura, int plt); + void loadPic(const char *NamePcc, byte *targetSurface, int colorCount); + void decompressPic(byte *targetSurface, int colorCount); typedef char DacPalette256[256][3]; @@ -299,7 +192,20 @@ public: void copyRect(int xorg, int yorg, int xdes, int ydes, int width, int height, byte *src, byte *dest); void copyRectClip(int *Array, byte *src, byte *dest); + void updateScreen() { + updateScreen(0, 0, 0, 0, 320, 200, screenSurface); + } void updateScreen(int xorg, int yorg, int xdes, int ydes, int width, int height, byte *buffer); + int checkWrapX(int x) { + if (x < 0) x += 320; + if (x > 319) x -= 320; + return x; + } + int checkWrapY(int y) { + if (y < 0) y += 200; + if (y > 199) y -= 200; + return y; + } DacPalette256 gamePalette; DacPalette256 palHare; @@ -308,22 +214,21 @@ public: byte *VGA; - byte *dir_dibujo1; - byte *dir_hare_fondo; - byte *dir_dibujo3; - byte *dir_dibujo2; - byte *dir_mesa; - byte *dir_hare_dch; - byte *dir_zona_pantalla; - byte *dir_hare_frente; - byte *dir_texto; - byte *dir_pendulo; + byte *drawSurface1; + byte *backSurface; + byte *drawSurface3; + byte *drawSurface2; + byte *tableSurface; + byte *extraSurface; // not sure about this one, was "dir_hare_dch" + byte *screenSurface; + byte *frontSurface; + byte *textSurface; + byte *pendulumSurface; byte cPal[768]; - byte *Buffer_pcx; - long LenFile; + byte *pcxBuffer; - Common::File *ald, *sku; + Common::ArjFile _arj; int hay_sb; int nivel_osc, previousMusic, roomMusic; @@ -331,64 +236,63 @@ public: char roomDisk[20]; char currentData[20]; int numRoomObjs; - char fondo_y_menu[20]; + char menuBackground[20]; char objName[30][20]; char iconName[44][13]; - int num_obj[40], visible[40], isDoor[40]; + int objectNum[40], visible[40], isDoor[40]; int sitiobj_x[40], sitiobj_y[40], sentidobj[40]; int inventoryObjects[43]; - char alapantallakeva[40][20]; - int x_alakeva[40], y_alakeva[40], sentido_alkeva[40], alapuertakeva[40]; + char _targetSurface[40][20]; + int _destX[40], _destY[40], sentido_alkeva[40], alapuertakeva[40]; int x1[40], y1[40], x2[40], y2[40]; - int lleva_objeto, pickedObject; + int takeObject, pickedObject; int withVoices; - int menu_bar, menu_scr, hay_nombre; - char texto_nombre[20]; - int frame_ciego; - int frame_ronquido; - int frame_murcielago; + int menuBar, menuScreen, hasName; + char textName[20]; + int frame_blind; + int frame_snore; + int frame_bat; int c_mirar; int c_poder; int flags[NUM_FLAGS]; int frame_y; - int hare_x, hare_y, hare_se_mueve, direccion_hare, sentido_hare, num_frame, hare_se_ve; - int sitio_x, sitio_y, comprueba_flags; - int rompo, rompo2; - int step_x, step_y; - int alto_hare, ancho_hare, alto_pies; - int alto_talk, ancho_talk; + int hare_x, hare_y, characterMoved, direccion_hare, sentido_hare, num_frame, hare_se_ve; + int sitio_x, sitio_y, checkFlags; + int doBreak; + int stepX, stepY; + int alto_hare, ancho_hare, feetHeight; + int talkHeight, talkWidth; int suelo_x1, suelo_y1, suelo_x2, suelo_y2; int near, far; - int sentido_final, anda_a_objeto; - int obj_saliendo; + int sentido_final, walkToObject; + int objExit; int diff_vez, conta_vez; - int hay_answer; - int conta_ciego_vez; - int cambio_de_color; - int rompo_y_salgo; + int hasAnswer; + int conta_blind_vez; + int changeColor; + int breakOut; int vb_x, sentido_vb, vb_se_mueve, frame_vb; - float nuevo_alto, nuevo_ancho; - int diferencia_x, diferencia_y; + float newHeight, newWidth; int factor_red[202]; int frame_piano; - int frame_borracho; - int frame_velas; + int frame_drunk; + int frame_candles; int color_solo; - int parpadeo; - int x_igor, y_igor, sentido_igor; + int blinking; + int igorX, igorY, sentido_igor; int x_dr, y_dr, sentido_dr; int x_bj, y_bj, sentido_bj; int cont_sv; int term_int; - int num_ejec; + int currentChapter; int hay_que_load; - char nom_partida[13]; + char saveName[13]; int _color; - int corta_musica; + int musicStopped; char select[23]; int hay_seleccion; int mouseX; @@ -399,20 +303,14 @@ public: bool escoba(); void black(); - void talk_vb(int); - void talk_vb(const char *, const char *); - void talk_vbpuerta(int); - void talk_vbpuerta(const char *said, const char *filename); - void talk_ciego(const char *, const char *, const char *); - void talk_hacker(const char *, const char *); void pickObject(int); - void anda_parriba(); - void anda_pabajo(); + void walkUp(); + void walkDown(); void pon_vb(); - void lleva_vb(int punto_x); + void lleva_vb(int pointX); void hipo_sin_nadie(int counter); void openDoor(int nflag, int doorNum); - void mapa(); + void showMap(); void animation_1_1(); void animation_2_1(); void animation_1_2(); @@ -440,8 +338,8 @@ public: void animation_21_2(); void animation_22_2(); void animation_23_2(); - void animation_23_anexo(); - void animation_23_anexo2(); + void animation_23_joined(); + void animation_23_joined2(); void animation_24_2(); void animation_25_2(); void animation_26_2(); @@ -499,107 +397,111 @@ public: void carga_escoba(const char *); void clearRoom(); void lleva_al_hare(int, int); - void mueve_cursor(); - void comprueba_objetos(); - void espera_soltar(); - void MirarRaton(); + void moveCursor(); + void checkObjects(); void elige_en_barra(); bool comprueba1(); bool comprueba2(); - Common::KeyCode getscan(); - void elige_verbo(int); + Common::KeyCode getScan(); + void selectVerb(int); void mesa(); bool saves(); void print_abc(const char *, int, int); void delay(int ms); - bool confirma_salir(); - void salva_pantallas(); + bool confirmExit(); + void screenSaver(); void chooseObject(int objeto); - void suma_objeto(int); - int resta_objeto(int osj); + void addObject(int); + int removeObject(int osj); void fliplay(const char *filefli, int vel); - void FundeDelNegro(int VelocidadDeFundido); - char LimitaVGA(char valor); + void fadeFromBlack(int fadeSpeed); + char adjustToVGA(char value); void color_abc(int cl); - void centra_texto(const char *,int,int); - void playSound(const char *); - bool anima(const char *animation, int FPS); - void stopSound_corte(); - void FundeAlNegro(int VelocidadDeFundido); + void centerText(const char *,int,int); + void playSound(int soundNum); + bool animate(const char *animation, int FPS); + void fadeToBlack(int fadeSpeed); void pause(int); - void talk_dr_grande(const char *said, const char *filename); - void pon_igor(); - void pon_bj(); - void pon_dr(); + void placeIgor(); + void placeBJ(); + void placeDrascula(); + void talkInit(const char *filename); - void talk_igor_dch(const char *said, const char *filename); - void talk_dr_dch(const char *said, const char *filename); - void talk_dr_izq(const char *said, const char *filename); + bool isTalkFinished(int* length); + void talk_igor(int, int); + void talk_drascula(int index, int talkerType = 0); void talk_solo(const char *, const char *); - void talk_igor_frente(const char *, const char *); - void talk_tabernero(const char *said, const char *filename); - void talk_igorpuerta(const char *said, const char *filename); - void talk_igor_peluca(const char *said, const char *filename); - void hipo(int); - void stopSound(); + void talk_bartender(int, int talkerType = 0); + void talk_pen(const char *, const char *, int); + void talk_bj_bed(int); + void talk_htel(int); void talk_bj(int); - void talk_bj(const char *, const char *); - void talk_baul(const char *said, const char *filename); + void talk_baul(int); void talk(int); void talk(const char *, const char *); void talk_sinc(const char *, const char *, const char *); + void talk_drunk(int); + void talk_pianist(int); + void talk_wolf(int); + void talk_mus(int); + void talk_dr_grande(int); + void talk_vb(int); + void talk_vbpuerta(int); + void talk_blind(int); + void talk_hacker(const char *, const char *); + + void hiccup(int); + void finishSound(); + void stopSound(); void closeDoor(int nflag, int doorNum); void playMusic(int p); void stopMusic(); int musicStatus(); void updateRoom(); - bool carga_partida(const char *); - void puertas_cerradas(int); - void animastopSound_corte(); + bool loadGame(const char *); + void updateDoor(int); void color_hare(); void funde_hare(int oscuridad); void paleta_hare_claro(); void paleta_hare_oscuro(); void hare_claro(); - void updateData(); - void empieza_andar(); + void updateVisible(); + void startWalking(); void updateRefresh(); void updateRefresh_pre(); void pon_hare(); - void menu_sin_volcar(); - void barra_menu(); - void saca_objeto(); - bool sal_de_la_habitacion(int); - bool coge_objeto(); - bool banderas(int); - void cursor_mesa(); - void introduce_nombre(); + void showMenu(); + void clearMenu(); + void removeObject(); + bool exitRoom(int); + bool pickupObject(); + bool checkFlag(int); + void setCursorTable(); + void enterName(); void para_grabar(char[]); - int LookForFree(); - void OpenSSN(const char *Name, int Pause); + bool soundIsActive(); + void openSSN(const char *Name, int Pause); void WaitFrameSSN(); void MixVideo(byte *OldScreen, byte *NewScreen); void Des_RLE(byte *BufferRLE, byte *MiVideoRLE); void Des_OFF(byte *BufferOFF, byte *MiVideoOFF, int Lenght); void set_dacSSN(byte *dacSSN); - byte *TryInMem(Common::File *Sesion); + byte *TryInMem(); void EndSSN(); - int PlayFrameSSN(); + int playFrameSSN(); byte *AuxBuffOrg; byte *AuxBuffLast; byte *AuxBuffDes; - int Leng; byte *pointer; int UsingMem; - Common::File *_Sesion; byte CHUNK; byte CMP, dacSSN[768]; byte *MiVideoSSN; - byte *mSesion; + byte *mSession; int FrameSSN; - int GlobalSpeed; + int globalSpeed; uint32 LastFrame; int frame_pen; @@ -608,9 +510,8 @@ public: byte *loadPCX(byte *NamePcc); void set_dac(byte *dac); void WaitForNext(int FPS); - int vez(); + int getTime(); void reduce_hare_chico(int, int, int, int, int, int, int, byte *, byte *); - char codifica(char); void quadrant_1(); void quadrant_2(); void quadrant_3(); @@ -619,9 +520,9 @@ public: void update_62_pre(); void update_63(); void saveGame(char[]); - void aumenta_num_frame(); - int sobre_que_objeto(); - bool comprueba_banderas_menu(); + void increaseFrameNum(); + int whichObject(); + bool checkMenuFlags(); bool roomParse(RoomTalkAction*, int); void room_0(); void room_1(int); @@ -654,23 +555,23 @@ public: void room_44(int); void room_62(int); void room_63(int); - void conversa(const char *); + void converse(const char *); void print_abc_opc(const char *, int, int, int); void response(int); - void talk_borracho(const char *said, const char *filename); - void talk_pianista(const char *said, const char *filename); void MusicFadeout(); - void ctvd_end(); - void ctvd_stop(); - void ctvd_terminate(); - void ctvd_speaker(int flag); - void ctvd_output(Common::File *file_handle); - void ctvd_init(int b); + void playFile(const char *fname); + + char *getLine(char *buf, int len); + void getIntFromLine(char *buf, int len, int* result); + void getStringFromLine(char *buf, int len, char* result); + void grr(); bool room_13(int fl); void update_13(); void update_20(); + void updateAnim(int y, int destX, int destY, int width, int height, int count, byte* src, int delayVal = 3); + void updateAnim2(int y, int px, int py, int width, int height, int count, byte* src); void animation_1_3(); void animation_2_3(); void animation_3_3(); @@ -715,15 +616,12 @@ public: void update_56_pre(); void update_50(); void update_57(); - void talk_igor_sentado(const char *, const char *); - void talk_lobo(const char *said, const char *filename); - void talk_mus(const char *said, const char *filename); void room_58(int); void room_59(int); bool room_60(int); void room_61(int); - void room_pendulo(int); - void update_pendulo(); + void room_pendulum(int); + void update_pendulum(); void update_58(); void update_58_pre(); void update_59_pre(); @@ -746,13 +644,7 @@ public: void animation_15_6(); void animation_18_6(); void animation_19_6(); - void activa_pendulo(); - void talk_pen(const char *, const char *); - void talk_pen2(const char *, const char *); - void talk_taber2(const char *, const char *); - void talk_bj_cama(int); - void talk_bj_cama(const char *said, const char * filename); - void talk_htel(const char *said, const char *filename); + void activatePendulum(); private: int _lang; @@ -774,6 +666,14 @@ extern const char *_textverbs[][6]; extern const char *_textmisc[][2]; extern const char *_textd1[][11]; +extern const ItemLocation itemLocations[]; +extern int frame_x[20]; +extern const int x_pol[44], y_pol[44]; +extern const int x_barra[]; +extern const int x1d_menu[], y1d_menu[]; + +extern const CharInfo charMap[]; + } // End of namespace Drascula #endif /* DRASCULA_H */ diff --git a/engines/drascula/module.mk b/engines/drascula/module.mk index 042b227ca3..2f72855af1 100644 --- a/engines/drascula/module.mk +++ b/engines/drascula/module.mk @@ -5,8 +5,7 @@ MODULE_OBJS = \ detection.o \ drascula.o \ rooms.o \ - talk.o \ - texts.o + talk.o # This module can be built as a plugin diff --git a/engines/drascula/rooms.cpp b/engines/drascula/rooms.cpp index 50f1110c23..d5b4c0b82e 100644 --- a/engines/drascula/rooms.cpp +++ b/engines/drascula/rooms.cpp @@ -24,176 +24,15 @@ */ #include "drascula/drascula.h" +#include "drascula/staticdata.h" namespace Drascula { -static const int mirar_t[3] = {100, 101, 54}; -static const char mirar_v[3][14] = {"100.als", "101.als", "54.als"}; -static const int poder_t[6] = {11, 109, 111, 110, 115, 116}; -static const char poder_v[6][14] = {"11.als", "109.als", "111.als", "110.als", "115.als", "116.als"}; - -struct RoomTalkAction { - int num; - int action; - int objectID; - int speechID; -}; - -// TODO: move these elsewhere, or in a .dat file? -// Note: default action needs to be LAST for each group -// of actions with the same number -RoomTalkAction room0Actions[] = { - // num action object speech - { 1, kVerbLook, -1, 54 }, - { 1, kVerbMove, -1, 19 }, - { 1, kVerbPick, -1, 11 }, - { 1, kVerbOpen, -1, 9 }, - { 1, kVerbClose, -1, 9 }, - { 1, kVerbTalk, -1, 16 }, - { 1, kVerbDefault, -1, 11 }, - // ------------------------------- - { 2, kVerbMove, -1, 19 }, - { 2, kVerbOpen, -1, 9 }, - { 2, kVerbClose, -1, 9 }, - { 2, kVerbTalk, -1, 16 }, - // ------------------------------- - { 3, kVerbLook, -1, 316 }, - { 3, kVerbMove, -1, 317 }, - { 3, kVerbPick, -1, 318 }, - { 3, kVerbOpen, -1, 319 }, - { 3, kVerbClose, -1, 319 }, - { 3, kVerbTalk, -1, 320 }, - { 3, kVerbDefault, -1, 318 }, - // ------------------------------- - { 4, kVerbMove, -1, 19 }, - { 4, kVerbOpen, -1, 9 }, - { 4, kVerbClose, -1, 9 }, - { 4, kVerbTalk, -1, 16 }, - // ------------------------------- - { 5, kVerbOpen, -1, 9 }, - { 5, kVerbClose, -1, 9 }, - { 5, kVerbTalk, -1, 16 }, - // ------------------------------- - { 6, kVerbMove, -1, 19 }, - { 6, kVerbOpen, -1, 9 }, - { 6, kVerbClose, -1, 9 }, - { 6, kVerbTalk, -1, 16 } -}; - -RoomTalkAction room1Actions[] = { - // num action object speech - { -1, kVerbPick, 118, 5 }, - { -1, kVerbOpen, 118, 3 }, - { -1, kVerbClose, 118, 4 }, - { -1, kVerbTalk, 118, 6 }, - // ------------------------------- - { -1, kVerbLook, 119, 8 }, - { -1, kVerbMove, 119, 13 }, - { -1, kVerbClose, 119, 10 }, - { -1, kVerbTalk, 119, 12 }, - // ------------------------------- - { -1, kVerbMove, 120, 13 }, - { -1, kVerbOpen, 120, 18 }, - { -1, kVerbTalk, 120, 15 } -}; - -RoomTalkAction room3Actions[] = { - // num action object speech - { -1, kVerbLook, 129, 21 }, - { -1, kVerbPick, 129, 5 }, - { -1, kVerbMove, 129, 24 }, - { -1, kVerbOpen, 129, 22 }, - { -1, kVerbClose, 129, 10 }, - // ------------------------------- - { -1, kVerbLook, 131, 27 }, - { -1, kVerbPick, 131, 5 }, - { -1, kVerbMove, 131, 24 }, - { -1, kVerbOpen, 131, 22 }, - { -1, kVerbClose, 131, 10 }, - { -1, kVerbTalk, 131, 23 }, - // ------------------------------- - { -1, kVerbLook, 132, 28 }, - { -1, kVerbPick, 132, 5 }, - { -1, kVerbMove, 132, 24 }, - { -1, kVerbOpen, 132, 22 }, - { -1, kVerbClose, 132, 10 }, - { -1, kVerbTalk, 132, 23 }, - // ------------------------------- - { -1, kVerbLook, 133, 321 }, - { -1, kVerbPick, 133, 31 }, - { -1, kVerbMove, 133, 34 }, - { -1, kVerbOpen, 133, 30 }, - { -1, kVerbClose, 133, 10 }, - // ------------------------------- - { -1, kVerbLook, 166, 55 }, - { -1, kVerbPick, 166, 7 }, - // ------------------------------- - { -1, kVerbLook, 211, 184 } -}; - -RoomTalkAction room4Actions[] = { - // num action object speech - { -1, kVerbLook, 189, 182 }, - // ------------------------------- - { -1, kVerbLook, 207, 175 }, - { -1, kVerbTalk, 207, 176 }, - // ------------------------------- - { -1, kVerbLook, 208, 177 }, - // ------------------------------- - { -1, kVerbLook, 209, 179 }, - // ------------------------------- - { -1, kVerbLook, 210, 180 }, - { -1, kVerbOpen, 210, 181 } -}; - -RoomTalkAction room5Actions[] = { - // num action object speech - { -1, kVerbMove, 136, 13 }, - { -1, kVerbOpen, 136, 18 }, - { -1, kVerbTalk, 136, 15 }, - // ------------------------------- - { -1, kVerbLook, 212, 187 }, - { -1, kVerbTalk, 212, 188 }, - // ------------------------------- - { -1, kVerbLook, 213, 189 }, - { -1, kVerbOpen, 213, 190 } -}; - -RoomTalkAction room6Actions[] = { - // num action object speech - { -1, kVerbPick, 144, 43 }, - // ------------------------------- - { -1, kVerbLook, 138, 35 }, - { -1, kVerbTalk, 138, 6 }, - // ------------------------------- - { -1, kVerbLook, 143, 37 }, - { -1, kVerbPick, 143, 7 }, - { -1, kVerbMove, 143, 7 }, - { -1, kVerbTalk, 143, 38 }, - // ------------------------------- - { -1, kVerbLook, 139, 36 }, - // ------------------------------- - { -1, kVerbLook, 140, 147 } -}; - -RoomTalkAction room12Actions[] = { - // num action object speech - { -1, kVerbLook, 154, 329 }, - { -1, kVerbTalk, 154, 330 }, - // ------------------------------- - { -1, kVerbMove, 155, 48 }, - { -1, kVerbTalk, 155, 331 }, - // ------------------------------- - { -1, kVerbLook, 156, 35 }, - { -1, kVerbMove, 156, 48 }, - { -1, kVerbTalk, 156, 50 }, -}; - bool DrasculaEngine::roomParse(RoomTalkAction* roomActions, int fl) { bool didAction = false; for (int i = 0; i < ARRAYSIZE(roomActions); i++) { - if (roomActions[i].num == num_ejec || + if (roomActions[i].num == currentChapter || roomActions[i].num == -1) { if (roomActions[i].action == pickedObject || roomActions[i].action == kVerbDefault) { @@ -211,74 +50,27 @@ bool DrasculaEngine::roomParse(RoomTalkAction* roomActions, int fl) { } void DrasculaEngine::room_0() { + static const int mirar_t[3] = {100, 101, 54}; + static const int poder_t[6] = {11, 109, 111, 110, 115, 116}; + if (roomParse(room0Actions, -1)) return; // non-default actions - if (num_ejec == 2) { - if (pickedObject == kVerbLook) { - talk(_text[_lang][mirar_t[c_mirar]], mirar_v[c_mirar]); - c_mirar++; - if (c_mirar == 3) - c_mirar = 0; - } else if (pickedObject == kVerbPick) { - talk(_text[_lang][poder_t[c_poder]], poder_v[c_poder]); - c_poder++; - if (c_poder == 6) - c_poder = 0; - } else { - talk(_text[_lang][poder_t[c_poder]], poder_v[c_poder]); - c_poder++; - if (c_poder == 6) - c_poder = 0; - } - } else if (num_ejec == 4) { - if (pickedObject == kVerbLook) { - talk(_text[_lang][mirar_t[c_mirar]], mirar_v[c_mirar]); - c_mirar++; - if (c_mirar == 3) - c_mirar = 0; - } else if (pickedObject == kVerbPick) { - talk(_text[_lang][poder_t[c_poder]], poder_v[c_poder]); - c_poder++; - if (c_poder == 6) - c_poder = 0; - } else { - talk(_text[_lang][poder_t[c_poder]], poder_v[c_poder]); - c_poder++; - if (c_poder == 6) - c_poder = 0; - } - } else if (num_ejec == 5) { - if (pickedObject == kVerbLook) { - talk(_text[_lang][mirar_t[c_mirar]], mirar_v[c_mirar]); - c_mirar++; - if (c_mirar == 3) - c_mirar = 0; - } else if (pickedObject == kVerbPick) { - talk(_text[_lang][poder_t[c_poder]], poder_v[c_poder]); - c_poder++; - if (c_poder == 6) - c_poder = 0; - } else { - talk(_text[_lang][poder_t[c_poder]], poder_v[c_poder]); - c_poder++; - if (c_poder == 6) - c_poder = 0; - } - } else if (num_ejec == 6) { + if (currentChapter == 2 || currentChapter == 4 || + currentChapter == 5 || currentChapter == 6) { if (pickedObject == kVerbLook) { - talk(_text[_lang][mirar_t[c_mirar]], mirar_v[c_mirar]); + talk(mirar_t[c_mirar]); c_mirar++; if (c_mirar == 3) c_mirar = 0; } else if (pickedObject == kVerbPick) { - talk(_text[_lang][poder_t[c_poder]], poder_v[c_poder]); + talk(poder_t[c_poder]); c_poder++; if (c_poder == 6) c_poder = 0; } else { - talk(_text[_lang][poder_t[c_poder]], poder_v[c_poder]); + talk(poder_t[c_poder]); c_poder++; if (c_poder == 6) c_poder = 0; @@ -297,7 +89,7 @@ void DrasculaEngine::room_1(int fl) { } else if (pickedObject == kVerbLook && fl == 120 && flags[8] == 0) talk(14); else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_3(int fl) { @@ -311,18 +103,18 @@ void DrasculaEngine::room_3(int fl) { } else if (pickedObject == kVerbTalk && fl == 133) { talk_sinc(_text[_lang][322], "322.als", "13333334125433333333"); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); pause(25); talk(33); } else if (pickedObject == kVerbLook && fl == 165) { talk(149); talk(150); } else if (pickedObject == kVerbPick && fl == 165) { - copyBackground(0, 0, 0,0, 320, 200, dir_dibujo1, dir_zona_pantalla); + copyBackground(0, 0, 0,0, 320, 200, drawSurface1, screenSurface); updateRefresh_pre(); - copyRect(44, 1, hare_x, hare_y, 41, 70, dir_dibujo2, dir_zona_pantalla); + copyRect(44, 1, hare_x, hare_y, 41, 70, drawSurface2, screenSurface); updateRefresh(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); pause(4); pickObject(10); flags[3] = 1; @@ -336,7 +128,7 @@ void DrasculaEngine::room_3(int fl) { talk(185); talk(186); } else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_4(int fl) { @@ -350,20 +142,20 @@ void DrasculaEngine::room_4(int fl) { if (flags[7] == 1 && flags[26] == 1 && flags[34] == 1 && flags[35] == 1 && flags[37] == 1) flags[38] = 1; } else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_5(int fl) { if (roomParse(room5Actions, fl)) return; - if (pickedObject == kVerbLook && fl == 136 && flags[8] == 0) + if (pickedObject == kVerbLook && fl == 136 && flags[8] == 0) talk(14); else if (pickedObject == 10 && fl == 136) { animation_5_2(); - resta_objeto(10); + removeObject(10); } else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_6(int fl){ @@ -378,53 +170,53 @@ void DrasculaEngine::room_6(int fl){ else if (pickedObject == kVerbClose && fl == 138) closeDoor(0, 1); else if (pickedObject == kVerbOpen && fl == 143 && flags[2] == 0) { - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); updateRefresh_pre(); - copyRect(228, 102, hare_x + 5, hare_y - 1, 47, 73, dir_dibujo3, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyRect(228, 102, hare_x + 5, hare_y - 1, 47, 73, drawSurface3, screenSurface); + updateScreen(); pause(10); - playSound("s3.als"); + playSound(3); flags[2] = 1; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - stopSound(); + updateScreen(); + finishSound(); } else if (pickedObject == kVerbClose && fl == 143 && flags[2] == 1) { - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); flags[2] = 0; updateRefresh_pre(); - copyRect(228, 102, hare_x + 5, hare_y - 1, 47, 73, dir_dibujo3, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyRect(228, 102, hare_x + 5, hare_y - 1, 47, 73, drawSurface3, screenSurface); + updateScreen(); pause(5); - playSound("s4.als"); + playSound(4); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - stopSound(); + updateScreen(); + finishSound(); } else if (pickedObject == kVerbOpen && fl == 139 && flags[1] == 0) { - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); updateRefresh_pre(); - copyRect(267, 1, hare_x - 14, hare_y - 2, 52, 73, dir_dibujo3, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyRect(267, 1, hare_x - 14, hare_y - 2, 52, 73, drawSurface3, screenSurface); + updateScreen(); pause(19); - playSound("s3.als"); + playSound(3); flags[1] = 1; visible[4] = 1; visible[2] = 0; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - stopSound(); + updateScreen(); + finishSound(); } else if (pickedObject == kVerbPick && fl == 140) { - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); updateRefresh_pre(); - copyRect(267, 1, hare_x - 14, hare_y - 2, 52, 73, dir_dibujo3, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyRect(267, 1, hare_x - 14, hare_y - 2, 52, 73, drawSurface3, screenSurface); + updateScreen(); pause(19); pickObject(9); visible[4] = 0; flags[10] = 1; } else if (pickedObject == kVerbOpen && fl == 140) - hay_answer = 1; + hasAnswer = 1; else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_7(int fl){ @@ -439,7 +231,7 @@ void DrasculaEngine::room_7(int fl){ if (flags[7] == 1 && flags[26] == 1 && flags[34] == 1 && flags[35] == 1 && flags[37] == 1) flags[38] = 1; } else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_8(int fl) { @@ -452,7 +244,7 @@ void DrasculaEngine::room_8(int fl) { } else if (pickedObject == kVerbLook && fl == 147) talk(59); else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_9(int fl){ @@ -468,10 +260,10 @@ void DrasculaEngine::room_9(int fl){ animation_33_2(); else if (pickedObject == 7 && fl == 51) { animation_6_2(); - resta_objeto(7); + removeObject(7); pickObject(14);} else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_12(int fl){ @@ -483,7 +275,7 @@ void DrasculaEngine::room_12(int fl){ else if (pickedObject == kVerbClose && fl == 156) closeDoor(16, 4); else - hay_answer = 0; + hasAnswer = 0; } bool DrasculaEngine::room_13(int fl) { @@ -493,18 +285,21 @@ bool DrasculaEngine::room_13(int fl) { talk(412); strcpy(objName[1], "yoda"); } else if (pickedObject == kVerbTalk && fl == 51) - conversa("op_7.cal"); + converse("op_7.cal"); else if (pickedObject == 19 && fl == 51) animation_1_3(); else if (pickedObject == 9 && fl == 51) { animation_2_3(); return true; } else - hay_answer = 0; + hasAnswer = 0; return false; } void DrasculaEngine::room_14(int fl) { + if (roomParse(room14Actions, fl)) + return; + if (pickedObject == kVerbTalk && fl == 54 && flags[39] == 0) animation_12_2(); else if (pickedObject == kVerbTalk && fl == 54 && flags[39] == 1) @@ -517,24 +312,8 @@ void DrasculaEngine::room_14(int fl) { animation_36_2(); else if (pickedObject == kVerbTalk && fl == 53) animation_13_2(); - else if (pickedObject == kVerbLook && fl == 200) - talk(165); - else if (pickedObject == kVerbLook && fl == 201) - talk(166); - else if (pickedObject == kVerbLook && fl == 202) - talk(167); - else if (pickedObject == kVerbLook && fl == 203) - talk(168); - else if (pickedObject == kVerbPick && fl == 203) - talk(170); - else if (pickedObject == kVerbMove && fl == 203) - talk(170); - else if (pickedObject == kVerbTalk && fl == 203) - talk(169); - else if (pickedObject == kVerbLook && fl == 204) - talk(171); else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_15(int fl) { @@ -551,15 +330,15 @@ void DrasculaEngine::room_15(int fl) { talk_sinc(_text[_lang][46], "46.als", "4442444244244"); sentido_hare = 1; } else if (pickedObject == 18 && fl == 188 && flags[26] == 0) { - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - copyRect(133, 135, hare_x + 6, hare_y, 39, 63, dir_dibujo3, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - playSound("s8.als"); - stopSound(); - talk(_text[_lang][338], "338.als"); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + copyRect(133, 135, hare_x + 6, hare_y, 39, 63, drawSurface3, screenSurface); + updateScreen(); + playSound(8); + finishSound(); + talk(338); flags[27] = 0; pickObject(19); - resta_objeto(18); + removeObject(18); } else if (pickedObject == kVerbMove && fl == 188 && flags[27] == 0) { animation_34_2(); talk(339); @@ -577,65 +356,65 @@ void DrasculaEngine::room_15(int fl) { else if (pickedObject == kVerbOpen && fl == 206) talk(174); else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_16(int fl) { if (pickedObject == kVerbTalk && fl == 163) - talk(_text[_lang][6], "6.als"); + talk(6); else if (pickedObject == kVerbOpen && fl == 163) openDoor(17, 0); else if (pickedObject == kVerbClose && fl == 163) closeDoor(17, 0); else if (pickedObject == kVerbLook && fl == 183) - talk(_text[_lang][340], "340.als"); + talk(340); else if (pickedObject == kVerbTalk && fl == 183) { - talk(_text[_lang][341], "341.als"); + talk(341); pause(10); talk_sinc(_text[_lang][50], "50.als", "11111111111144432554433"); pause(3); - talk_baul(_text[_lang][83], "d83.als"); + talk_baul(83); } else if (pickedObject == kVerbOpen && fl == 183) { openDoor(19, NO_DOOR); if (flags[20] == 0) { flags[20] = 1; sentido_hare = 3; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - talk(_text[_lang][342], "342.als"); + updateScreen(); + talk(342); pickObject(22); } } else if (pickedObject == kVerbClose && fl == 183) closeDoor(19, NO_DOOR); else if (pickedObject == kVerbLook && fl == 185) - talk(_text[_lang][37], "37.als"); + talk(37); else if (pickedObject == kVerbPick && fl == 185) - talk(_text[_lang][7], "7.als"); + talk(7); else if (pickedObject == kVerbMove && fl == 185) - talk(_text[_lang][7], "7.als"); + talk(7); else if (pickedObject == kVerbTalk && fl == 185) - talk(_text[_lang][38], "38.als"); + talk(38); else if (pickedObject == kVerbLook && fl == 187) { - talk(_text[_lang][343], "343.als"); + talk(343); sentido_hare = 3; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - talk(_text[_lang][344], "344.als"); + updateScreen(); + talk(344); } else if (pickedObject == kVerbTalk && fl == 187) - talk(_text[_lang][345], "345.als"); + talk(345); else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_17(int fl) { if (pickedObject == kVerbLook && fl == 177) - talk(_text[_lang][35], "35.als"); + talk(35); else if (pickedObject == kVerbTalk && fl == 177 && flags[18] == 0) - talk(_text[_lang][6], "6.als"); + talk(6); else if (pickedObject == kVerbTalk && fl == 177 && flags[18] == 1) animation_18_2(); else if (pickedObject == kVerbOpen && fl == 177 && flags[18] == 1) - talk(_text[_lang][346], "346.als"); + talk(346); else if (pickedObject == kVerbOpen && fl == 177 && flags[14] == 0 && flags[18] == 0) animation_22_2(); else if (pickedObject == kVerbOpen && fl == 177 && flags[14] == 1) @@ -643,81 +422,70 @@ void DrasculaEngine::room_17(int fl) { else if (pickedObject == kVerbClose && fl == 177 && flags[14] == 1) closeDoor(15, 1); else if (pickedObject == 11 && fl == 50 && flags[22] == 0) { - talk(_text[_lang][347], "347.als"); + talk(347); flags[29] = 1; pickObject(23); - resta_objeto(11); + removeObject(11); } else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_18(int fl) { if (pickedObject == kVerbTalk && fl == 55 && flags[36] == 0) animation_24_2(); else if (pickedObject == kVerbTalk && fl == 55 && flags[36] == 1) - talk(_text[_lang][109], "109.als"); + talk(109); else if (pickedObject == kVerbLook && fl == 181) - talk(_text[_lang][348], "348.als"); + talk(348); else if (pickedObject == kVerbPick && fl == 182) { - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); updateRefresh_pre(); - copyRect(44, 1, hare_x, hare_y, 41, 70, dir_dibujo2, dir_zona_pantalla); + copyRect(44, 1, hare_x, hare_y, 41, 70, drawSurface2, screenSurface); updateRefresh(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); pause(4); pickObject(12); visible[2] = 0; flags[28] = 1; - } else if (pickedObject == kVerbLook && fl == 182) - talk(_text[_lang][154], "154.als"); - else if (pickedObject == 8 && fl == 55 && flags[38] == 0 && flags[33] == 1) - talk(_text[_lang][349], "349.als"); - else if (pickedObject == 13 && fl == 55 && flags[38] == 0 && flags[33] == 1) - talk(_text[_lang][349], "349.als"); - else if (pickedObject == 15 && fl == 55 && flags[38] == 0 && flags[33] == 1) - talk(_text[_lang][349], "349.als"); - else if (pickedObject == 16 && fl == 55 && flags[38] == 0 && flags[33] == 1) - talk(_text[_lang][349], "349.als"); - else if (pickedObject == 17 && fl == 55 && flags[38] == 0 && flags[33] == 1) - talk(_text[_lang][349], "349.als"); - else if (pickedObject == 8 && fl == 55 && flags[38] == 1 && flags[33] == 1) - animation_24_2(); - else if (pickedObject == 13 && fl == 55 && flags[38] == 1 && flags[33] == 1) - animation_24_2(); - else if (pickedObject == 15 && fl == 55 && flags[38] == 1 && flags[33] == 1) - animation_24_2(); - else if (pickedObject == 16 && fl == 55 && flags[38] == 1 && flags[33] == 1) - animation_24_2(); - else if (pickedObject == 17 && fl == 55 && flags[38] == 1 && flags[33] == 1) - animation_24_2(); + } else if (pickedObject == kVerbLook && fl == 182) { + talk(154); + } else if (fl == 55 && flags[38] == 0 && flags[33] == 0) { + if (pickedObject == 8 || pickedObject == 13 || pickedObject == 15 || + pickedObject == 16 || pickedObject == 17) + talk(349); + } else if (fl == 55 && flags[38] == 1 && flags[33] == 1) { + if (pickedObject == 8 || pickedObject == 13 || pickedObject == 15 || + pickedObject == 16 || pickedObject == 17) + animation_24_2(); + } else if (pickedObject == 11 && fl == 50 && flags[22] == 0) { sentido_hare = 3; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + updateScreen(); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); updateRefresh_pre(); - copyRect(1, 1, hare_x - 1, hare_y + 3, 42, 67, dir_dibujo2, dir_zona_pantalla); + copyRect(1, 1, hare_x - 1, hare_y + 3, 42, 67, drawSurface2, screenSurface); updateRefresh(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); pause(6); - talk(_text[_lang][347], "347.als"); + talk(347); flags[29] = 1; pickObject(23); - resta_objeto(11); + removeObject(11); } else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_19(int fl) { if (pickedObject == kVerbLook && fl == 214) - talk(_text[_lang][191], "191.als"); + talk(191); else - hay_answer = 0; + hasAnswer = 0; } bool DrasculaEngine::room_21(int fl) { if (pickedObject == kVerbOpen && fl == 101 && flags[28] == 0) - talk(_text[_lang][419], "419.als"); + talk(419); else if (pickedObject == kVerbOpen && fl == 101 && flags[28] == 1) openDoor(0, 1); else if (pickedObject == kVerbClose && fl == 101) @@ -734,51 +502,51 @@ bool DrasculaEngine::room_21(int fl) { animation_9_4(); return true; } else - hay_answer = 0; + hasAnswer = 0; return false; } void DrasculaEngine::room_22(int fl) { if (pickedObject == kVerbPick && fl == 140) - talk(_text[_lang][7], "7.als"); + talk(7); else if (pickedObject == 11 && fl == 140) { pickObject(18); visible[1] = 0; flags[24] = 1; } else if (pickedObject == 22 && fl == 52) { - anima("up.bin",14); + animate("up.bin",14); flags[26]=1; - playSound("s1.als"); - hipo(14); - stopSound(); + playSound(1); + hiccup(14); + finishSound(); withoutVerb(); - resta_objeto(22); - updateData(); + removeObject(22); + updateVisible(); sentido_hare = 3; - talk(_text[_lang][499], "499.als"); - talk(_text[_lang][500], "500.als"); + talk(499); + talk(500); } else if (pickedObject == kVerbLook && fl == 52) - talk(_text[_lang][497], "497.als"); + talk(497); else if (pickedObject == kVerbTalk && fl == 52) - talk(_text[_lang][498], "498.als"); + talk(498); else if (pickedObject == kVerbPick && fl == 180 && flags[26] == 0) - talk(_text[_lang][420], "420.als"); + talk(420); else if (pickedObject == kVerbPick && fl == 180 && flags[26] == 1) { pickObject(7); visible[3] = 0; flags[27] = 1; } else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_23(int fl) { if (pickedObject == kVerbOpen && fl == 103) { openDoor(0, 0); - updateData(); + updateVisible(); } else if(pickedObject == kVerbClose && fl == 103) { closeDoor(0, 0); - updateData(); + updateVisible(); } else if(pickedObject == kVerbOpen && fl == 104) openDoor(1, 1); else if(pickedObject == kVerbClose && fl == 104) @@ -792,7 +560,7 @@ void DrasculaEngine::room_23(int fl) { if (flags[18] == 1) animation_6_4(); } else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_24(int fl) { @@ -805,16 +573,16 @@ void DrasculaEngine::room_24(int fl) { else if (pickedObject == kVerbClose && fl == 106) closeDoor(2, 1); else if (pickedObject == kVerbLook && fl == 151) - talk(_text[_lang][461], "461.als"); + talk(461); else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_26(int fl) { if (pickedObject == kVerbOpen && fl == 107 && flags[30] == 0) openDoor(2, 0); else if (pickedObject == kVerbOpen && fl == 107 && flags[30] == 1) - talk(_text[_lang][421], "421.als"); + talk(421); else if (pickedObject == kVerbClose && fl == 107) closeDoor(2, 0); else if (pickedObject == 10 && fl == 50 && flags[18] == 1 && flags[12] == 1) @@ -832,37 +600,37 @@ void DrasculaEngine::room_26(int fl) { flags[12] = 1; closeDoor(2, 0); sentido_hare = 2; - talk_igorpuerta(_texti[_lang][27], "I27.als"); + talk_igor(27, kIgorDoor); flags[30] = 1; - talk_igorpuerta(_texti[_lang][28], "I28.als"); + talk_igor(28, kIgorDoor); lleva_al_hare(153, 180); } else if (pickedObject == kVerbPick && fl == 143 && flags[18] == 0) { lleva_al_hare(260, 180); - copyBackground(80, 78, 199, 94, 38, 27, dir_dibujo3, dir_zona_pantalla); - updateScreen(199, 94, 199, 94, 38, 27, dir_zona_pantalla); + copyBackground(80, 78, 199, 94, 38, 27, drawSurface3, screenSurface); + updateScreen(199, 94, 199, 94, 38, 27, screenSurface); pause(3); - talk_igor_peluca(_texti[_lang][25], "I25.als"); + talk_igor(25, kIgorWig); lleva_al_hare(153, 180); } else if (pickedObject == kVerbTalk && fl == 51) animation_1_4(); else if (pickedObject == kVerbOpen && fl == 167) - talk(_text[_lang][467], "467.als"); + talk(467); else if (pickedObject == kVerbLook && fl == 164) - talk(_text[_lang][470], "470.als"); + talk(470); else if (pickedObject == kVerbOpen && fl == 164) - talk(_text[_lang][471], "471.als"); + talk(471); else if (pickedObject == kVerbLook && fl == 163) - talk(_text[_lang][472], "472.als"); + talk(472); else if (pickedObject == kVerbPick && fl == 163) - talk(_text[_lang][473], "473.als"); + talk(473); else if (pickedObject == kVerbLook && fl == 165) - talk(_text[_lang][474], "474.als"); + talk(474); else if (pickedObject == kVerbLook && fl == 168) - talk(_text[_lang][476], "476.als"); + talk(476); else if (pickedObject == kVerbPick && fl == 168) - talk(_text[_lang][477], "477.als"); + talk(477); else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_27(int fl) { @@ -871,7 +639,7 @@ void DrasculaEngine::room_27(int fl) { else if (pickedObject == kVerbClose && fl == 110) closeDoor(6, 1); else if (pickedObject == kVerbOpen && fl == 116 && flags[23] == 0) - talk(_text[_lang][419], "419.als"); + talk(419); else if (pickedObject == kVerbOpen && fl == 116 && flags[23] == 1) openDoor(5, 3); else if (pickedObject == 17 && fl == 116) { @@ -879,11 +647,11 @@ void DrasculaEngine::room_27(int fl) { openDoor(5,3); withoutVerb(); } else if (pickedObject == kVerbLook && fl == 175) - talk(_text[_lang][429], "429.als"); + talk(429); else if (fl == 150) - talk(_text[_lang][460], "460.als"); + talk(460); else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_29(int fl) { @@ -892,17 +660,17 @@ void DrasculaEngine::room_29(int fl) { else if (pickedObject == kVerbClose && fl == 114) closeDoor(4, 1); else if (pickedObject == kVerbLook && fl == 152) - talk(_text[_lang][463], "463.als"); + talk(463); else if (pickedObject == kVerbOpen && fl == 152) - talk(_text[_lang][464], "464.als"); + talk(464); else if (pickedObject == kVerbLook && fl == 153) - talk(_text[_lang][465], "465.als"); + talk(465); else if (pickedObject == kVerbPick && fl == 154) - talk(_text[_lang][466], "466.als"); + talk(466); else if (pickedObject == kVerbOpen && fl == 156) - talk(_text[_lang][467], "467.als"); + talk(467); else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_30(int fl) { @@ -911,12 +679,12 @@ void DrasculaEngine::room_30(int fl) { else if (pickedObject == kVerbClose && fl == 115) closeDoor(4, 0); else if (pickedObject == kVerbOpen && fl == 144 && flags[19] == 0) - talk(_text[_lang][422], "422.als"); + talk(422); else if (pickedObject == kVerbOpen && fl == 144 && flags[19] == 1 && flags[22] == 1) openDoor(16, 1); else if (pickedObject == kVerbOpen && fl == 144 && flags[19] == 1 && flags[22] == 0) { openDoor(16, 1); - talk(_text[_lang][423], "423.als"); + talk(423); flags[22] = 1; pickObject(12); if (flags[11] == 1 && flags[14] == 1) @@ -926,14 +694,14 @@ void DrasculaEngine::room_30(int fl) { } else if (pickedObject == kVerbClose && fl == 144) closeDoor(16, 1); else if (pickedObject == 13 && fl == 144) { - talk(_text[_lang][424], "424.als"); + talk(424); flags[19] = 1; } else if (pickedObject == kVerbOpen && fl == 157) - talk(_text[_lang][468], "468.als"); + talk(468); else if (pickedObject == kVerbLook && fl == 158) - talk(_text[_lang][469], "469.als"); + talk(469); else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_31(int fl) { @@ -946,32 +714,32 @@ void DrasculaEngine::room_31(int fl) { else if (pickedObject == kVerbClose && fl == 117) closeDoor(5, 0); else if (pickedObject == kVerbLook && fl == 161) - talk(_text[_lang][470], "470.als"); + talk(470); else if (pickedObject == kVerbOpen && fl == 161) - talk(_text[_lang][471], "471.als"); + talk(471); else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_34(int fl) { if (pickedObject == kVerbMove && fl == 146) animation_8_4(); else if (pickedObject == kVerbLook && fl == 146) - talk(_text[_lang][458], "458.als"); + talk(458); else if (pickedObject == kVerbPick && fl == 146) - talk(_text[_lang][459], "459.als"); + talk(459); else if (pickedObject == kVerbOpen && fl == 120 && flags[25] == 1) openDoor(8, 2); else if (pickedObject == kVerbOpen && fl == 120 && flags[25] == 0) { openDoor(8, 2); sentido_hare = 3; - talk(_text[_lang][425], "425.als"); + talk(425); pickObject(14); flags[25] = 1; } else if (pickedObject == kVerbClose && fl == 120) closeDoor(8, 2); else - hay_answer=0; + hasAnswer=0; } void DrasculaEngine::room_35(int fl) { @@ -984,44 +752,44 @@ void DrasculaEngine::room_35(int fl) { if (flags[18] == 1) animation_6_4(); } else if (pickedObject == kVerbPick && fl == 147) { - talk(_text[_lang][426], "426.als"); + talk(426); pickObject(15); visible[1] = 0; flags[15] = 1; flags[17] = 1; - updateData(); + updateVisible(); } else if (pickedObject == kVerbPick && fl == 149) { pickObject(13); visible[3] = 0; flags[17] = 0; } else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_44(int fl) { if (pickedObject == kVerbLook && fl == 172) - talk(_text[_lang][428], "428.als"); + talk(428); else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_49(int fl){ if (pickedObject == kVerbTalk && fl ==51) - conversa("op_9.cal"); + converse("op_9.cal"); else if (pickedObject == kVerbLook && fl == 51) - talk(_text[_lang][132], "132.als"); + talk(132); else if ((pickedObject == 8 && fl == 51) || (pickedObject == 8 && fl == 203)) animation_5_5(); else if (pickedObject == kVerbLook && fl == 200) - talk(_text[_lang][133], "133.als"); + talk(133); else if (pickedObject == kVerbTalk && fl == 200) - talk(_text[_lang][134], "134.als"); + talk(134); else if (pickedObject == kVerbLook && fl == 201) - talk(_text[_lang][135], "135.als"); + talk(135); else if (pickedObject == kVerbLook && fl == 203) - talk(_text[_lang][137], "137.als"); + talk(137); else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_53(int fl) { @@ -1029,15 +797,15 @@ void DrasculaEngine::room_53(int fl) { pickObject(16); visible[3] = 0; } else if (pickedObject == kVerbLook && fl == 121) - talk(_text[_lang][128], "128.als"); + talk(128); else if (pickedObject == kVerbLook && fl == 209) - talk(_text[_lang][129], "129.als"); + talk(129); else if (pickedObject == kVerbMove && fl == 123) animation_11_5(); else if (pickedObject == kVerbLook && fl == 52) - talk(_text[_lang][447], "447.als"); + talk(447); else if (pickedObject == kVerbTalk && fl == 52) - talk(_text[_lang][131], "131.als"); + talk(131); else if (pickedObject == 12 && fl == 52) animation_10_5(); else if (pickedObject == 15 && fl == 52) @@ -1045,71 +813,71 @@ void DrasculaEngine::room_53(int fl) { else if (pickedObject == 16 && fl == 121) { flags[2] = 1; withoutVerb(); - updateData(); + updateVisible(); } else if (pickedObject == 16) { - talk(_text[_lang][439], "439.als"); + talk(439); withoutVerb(); visible[3] = 1; } else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_54(int fl) { if ((pickedObject == kVerbTalk && fl == 118) || (pickedObject == kVerbLook && fl == 118 && flags[0] == 0)) animation_1_5(); else if (pickedObject == kVerbLook && fl == 118 && flags[0]==1) - talk(_text[_lang][124], "124.als"); + talk(124); else if (pickedObject == kVerbLook && fl == 53) - talk(_text[_lang][127], "127.als"); + talk(127); else if (pickedObject == kVerbTalk && fl == 53 && flags[14] == 0) { - talk(_text[_lang][288], "288.als"); + talk(288); flags[12] = 1; pause(10); - talk_mus(_texte[_lang][1], "E1.als"); - talk(_text[_lang][289], "289.als"); - talk_mus(_texte[_lang][2], "E2.als"); - talk_mus(_texte[_lang][3], "E3.als"); - conversa("op_10.cal"); + talk_mus(1); + talk(289); + talk_mus(2); + talk_mus(3); + converse("op_10.cal"); flags[12] = 0; flags[14] = 1; } else if (pickedObject == kVerbTalk && fl == 53 && flags[14] == 1) - talk(_text[_lang][109], "109.als"); + talk(109); else if (pickedObject == kVerbPick && fl == 9999 && flags[13] == 0) { pickObject(8); flags[13] = 1; - talk_mus(_texte[_lang][10], "e10.als"); - updateData(); + talk_mus(10); + updateVisible(); } else if (pickedObject == kVerbOpen && fl == 119) - talk(_text[_lang][125], "125.als"); + talk(125); else if (pickedObject == kVerbLook && fl == 119) - talk(_text[_lang][126], "126.als"); + talk(126); else if (pickedObject == 10 && fl == 119) { pause(4); - talk(_text[_lang][436], "436.als"); + talk(436); withoutVerb(); - resta_objeto(10); + removeObject(10); } else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_55(int fl) { if (pickedObject == kVerbPick && fl == 122) { pickObject(12); flags[8] = 1; - updateData(); + updateVisible(); } else if (pickedObject == kVerbLook && fl == 122) - talk(_text[_lang][138], "138.als"); + talk(138); else if (pickedObject == kVerbLook && fl == 204) - talk(_text[_lang][139], "139.als"); + talk(139); else if (pickedObject == kVerbLook && fl == 205) - talk(_text[_lang][140], "140.als"); + talk(140); else if (fl == 206) { - playSound("s11.als"); - anima("det.bin", 17); - stopSound(); + playSound(11); + animate("det.bin", 17); + finishSound(); lleva_al_hare(hare_x - 3, hare_y + alto_hare + 6); } else - hay_answer = 0; + hasAnswer = 0; } bool DrasculaEngine::room_56(int fl) { @@ -1117,13 +885,13 @@ bool DrasculaEngine::room_56(int fl) { animation_14_5(); return true; } else if (pickedObject == kVerbLook && fl == 124) - talk(_text[_lang][450], "450.als"); + talk(450); else if (pickedObject == kVerbOpen && fl == 207) - talk(_text[_lang][141], "141.als"); + talk(141); else if (pickedObject == kVerbLook && fl == 208) - talk(_text[_lang][142], "142.als"); + talk(142); else - hay_answer = 0; + hasAnswer = 0; return false; } @@ -1132,198 +900,190 @@ void DrasculaEngine::room_58(int fl) { if (pickedObject == kVerbMove && fl == 103) animation_7_6(); else if (pickedObject == kVerbLook && fl == 104) - talk(_text[_lang][454], "454.als"); + talk(454); else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_59(int fl) { if ((pickedObject == kVerbTalk && fl == 51) || (pickedObject == kVerbLook && fl == 51)) { flags[9] = 1; talk(259); - talk_bj_cama(13); + talk_bj_bed(13); talk(263); - talk_bj_cama(14); + talk_bj_bed(14); pause(40); talk(264); - talk_bj_cama(15); + talk_bj_bed(15); talk(265); flags[9] = 0; if (flags[11] == 0) { - playSound("s12.als"); + playSound(12); delay(40); - stopSound(); + finishSound(); delay(10); lleva_al_hare(174, 168); sentido_hare = 2; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); pause(40); - playSound("s12.als"); + playSound(12); pause(19); - stopSound_corte(); + stopSound(); hare_se_ve = 0; updateRoom(); - copyRect(101, 34, hare_x - 4, hare_y - 1, 37, 70, dir_dibujo3, dir_zona_pantalla); - copyBackground(0, 0, 0, 0, 320, 200, dir_zona_pantalla, dir_dibujo1); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyRect(101, 34, hare_x - 4, hare_y - 1, 37, 70, drawSurface3, screenSurface); + copyBackground(0, 0, 0, 0, 320, 200, screenSurface, drawSurface1); + updateScreen(); hare_se_ve = 1; clearRoom(); - loadPic("tlef0.alg"); - decompressPic(dir_dibujo1, COMPLETE_PAL); - loadPic("tlef1.alg"); - decompressPic(dir_dibujo3, 1); - loadPic("tlef2.alg"); - decompressPic(dir_hare_frente, 1); - loadPic("tlef3.alg"); - decompressPic(dir_hare_fondo, 1); - talk_htel(_text[_lang][240], "240.als"); - - color_abc(VON_BRAUN); + loadPic("tlef0.alg", drawSurface1, COMPLETE_PAL); + loadPic("tlef1.alg", drawSurface3, 1); + loadPic("tlef2.alg", frontSurface, 1); + loadPic("tlef3.alg", backSurface, 1); + talk_htel(240); + + color_abc(kColorBrown); talk_solo(_textvb[_lang][58], "VB58.als"); - talk_htel(_text[_lang][241], "241.als"); - color_abc(VON_BRAUN); + talk_htel(241); + color_abc(kColorBrown); talk_solo(_textvb[_lang][59], "VB59.als"); - talk_htel(_text[_lang][242], "242.als"); - color_abc(VON_BRAUN); + talk_htel(242); + color_abc(kColorBrown); talk_solo(_textvb[_lang][60], "VB60.als"); - talk_htel(_text[_lang][196], "196.als"); - color_abc(VON_BRAUN); + talk_htel(196); + color_abc(kColorBrown); talk_solo(_textvb[_lang][61],"VB61.als"); - talk_htel(_text[_lang][244], "244.als"); - color_abc(VON_BRAUN); + talk_htel(244); + color_abc(kColorBrown); talk_solo(_textvb[_lang][62], "VB62.als"); clearRoom(); - loadPic("aux59.alg"); - decompressPic(dir_dibujo3, 1); - loadPic("96.alg"); - decompressPic(dir_hare_frente, COMPLETE_PAL); - loadPic("99.alg"); - decompressPic(dir_hare_fondo, 1); - loadPic("59.alg"); - decompressPic(dir_dibujo1, HALF_PAL); + loadPic("aux59.alg", drawSurface3, 1); + loadPic("96.alg", frontSurface, COMPLETE_PAL); + loadPic("99.alg", backSurface, 1); + loadPic("59.alg", drawSurface1, HALF_PAL); sentido_hare = 3; - talk(_text[_lang][245], "245.als"); + talk(245); withoutVerb(); flags[11] = 1; } } else - hay_answer = 0; + hasAnswer = 0; } bool DrasculaEngine::room_60(int fl) { if (pickedObject == kVerbMove && fl == 112) animation_10_6(); else if (pickedObject == kVerbLook && fl == 112) - talk(_text[_lang][440], "440.als"); + talk(440); else if (pickedObject == kVerbTalk && fl == 52) { - talk(_text[_lang][266], "266.als"); - talk_taber2(_textt[_lang][1], "t1.als"); - conversa("op_12.cal"); + talk(266); + talk_bartender(1, 1); + converse("op_12.cal"); withoutVerb(); pickedObject = 0; } else if (pickedObject == kVerbTalk && fl == 115) - talk(_text[_lang][455], "455.als"); + talk(455); else if (pickedObject == kVerbTalk && fl == 56) - talk(_text[_lang][455], "455.als"); + talk(455); else if (pickedObject == kVerbLook && fl == 114) - talk(_text[_lang][167], "167.als"); + talk(167); else if (pickedObject == kVerbLook && fl == 113) - talk(_text[_lang][168], "168.als"); + talk(168); else if (pickedObject == kVerbPick && fl == 113) - talk(_text[_lang][170], "170.als"); + talk(170); else if (pickedObject == kVerbMove && fl == 113) - talk(_text[_lang][170], "170.als"); + talk(170); else if (pickedObject == kVerbTalk && fl == 113) - talk(_text[_lang][169], "169.als"); + talk(169); else if (pickedObject == 21 && fl == 56) animation_18_6(); else if (pickedObject == 9 && fl == 56 && flags[6] == 1) { animation_9_6(); return true; } else if (pickedObject == 9 && fl == 56 && flags[6] == 0) { - anima("cnf.bin", 14); - talk(_text[_lang][455], "455.als"); + animate("cnf.bin", 14); + talk(455); } else - hay_answer = 0; + hasAnswer = 0; return false; } void DrasculaEngine::room_61(int fl) { if (pickedObject == kVerbLook && fl == 116) - talk(_text[_lang][172], "172.als"); + talk(172); else if (pickedObject == kVerbLook && fl == 117) - talk(_text[_lang][173], "173.als"); + talk(173); else if (pickedObject == kVerbMove && fl == 117) - talk(_text[_lang][174], "174.als"); + talk(174); else if (pickedObject == kVerbOpen && fl == 117) - talk(_text[_lang][174], "174.als"); + talk(174); else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::room_62(int fl) { if (pickedObject == kVerbTalk && fl == 53) - conversa("op_13.cal"); + converse("op_13.cal"); else if (pickedObject == kVerbTalk && fl == 52 && flags[0] == 0) animation_3_1(); else if (pickedObject == kVerbTalk && fl == 52 && flags[0] == 1) - talk(_text[_lang][109], "109.als"); + talk(109); else if (pickedObject == kVerbTalk && fl == 54) animation_4_1(); else if (pickedObject == kVerbLook && fl == 100) - talk(_text[_lang][168], "168.als"); + talk(168); else if (pickedObject == kVerbTalk && fl == 100) - talk(_text[_lang][169], "169.als"); + talk(169); else if (pickedObject == kVerbPick && fl == 100) - talk(_text[_lang][170], "170.als"); + talk(170); else if (pickedObject == kVerbLook && fl == 101) - talk(_text[_lang][171], "171.als"); + talk(171); else if (pickedObject == kVerbLook && fl == 102) - talk(_text[_lang][167], "167.als"); + talk(167); else if (pickedObject == kVerbLook && fl == 103) - talk(_text[_lang][166], "166.als"); - else hay_answer = 0; + talk(166); + else hasAnswer = 0; } void DrasculaEngine::room_63(int fl) { if (pickedObject == kVerbLook && fl == 110) - talk(_text[_lang][172], "172.als"); + talk(172); else if (pickedObject == kVerbLook && fl == 109) - talk(_text[_lang][173], "173.als"); + talk(173); else if (pickedObject == kVerbMove && fl == 109) - talk(_text[_lang][174], "174.als"); + talk(174); else if (pickedObject == kVerbLook && fl == 108) - talk(_text[_lang][334], "334.als"); + talk(334); else if (pickedObject == kVerbTalk && fl == 108) - talk(_text[_lang][333], "333.als"); + talk(333); else - hay_answer = 0; + hasAnswer = 0; } -void DrasculaEngine::room_pendulo(int fl) { +void DrasculaEngine::room_pendulum(int fl) { if (pickedObject == kVerbLook && fl == 100) - talk(_text[_lang][452], "452.als"); + talk(452); else if (pickedObject == kVerbLook && fl == 101) - talk (_text[_lang][123], "123.als"); + talk(123); else if (pickedObject == kVerbPick && fl == 101) pickObject(20); else if (pickedObject == 20 && fl == 100) animation_6_6(); else if (pickedObject == kVerbPick || pickedObject == kVerbOpen) - talk(_text[_lang][453], "453.als"); + talk(453); else - hay_answer = 0; + hasAnswer = 0; } void DrasculaEngine::updateRefresh() { - if (num_ejec == 1) { + if (currentChapter == 1) { if (roomNumber == 63) update_63(); else if (roomNumber == 62) update_62(); - } else if (num_ejec == 2) { + } else if (currentChapter == 2) { if (roomNumber == 3) update_3(); else if (roomNumber == 2) @@ -1339,13 +1099,13 @@ void DrasculaEngine::updateRefresh() { else if (roomNumber == 18) update_18(); else if (roomNumber == 10) - mapa(); - } else if (num_ejec == 3) { + showMap(); + } else if (currentChapter == 3) { if (roomNumber == 20) update_20(); else if (roomNumber == 13) update_13(); - } else if (num_ejec == 4) { + } else if (currentChapter == 4) { if (roomNumber == 29) update_29(); else if (roomNumber == 26) @@ -1358,14 +1118,14 @@ void DrasculaEngine::updateRefresh() { update_34(); else if (roomNumber == 35) update_35(); - } else if (num_ejec == 5) { + } else if (currentChapter == 5) { if (roomNumber == 45) - mapa(); + showMap(); else if (roomNumber == 50) update_50(); else if (roomNumber == 57) update_57(); - } else if (num_ejec == 6) { + } else if (currentChapter == 6) { if (roomNumber == 60) update_60(); else if (roomNumber == 61) @@ -1376,12 +1136,12 @@ void DrasculaEngine::updateRefresh() { } void DrasculaEngine::updateRefresh_pre() { - if (num_ejec == 1) { + if (currentChapter == 1) { if (roomNumber == 62) update_62_pre(); else if (roomNumber == 16) - pon_bj(); - } else if (num_ejec == 2) { + placeBJ(); + } else if (currentChapter == 2) { if (roomNumber == 1) update_1_pre(); else if (roomNumber == 3) @@ -1404,9 +1164,9 @@ void DrasculaEngine::updateRefresh_pre() { update_17_pre(); else if (roomNumber == 18) update_18_pre(); - } else if (num_ejec == 3) { + } else if (currentChapter == 3) { // nothing - } else if (num_ejec == 4) { + } else if (currentChapter == 4) { if (roomNumber == 21) update_21_pre(); else if (roomNumber == 22) @@ -1429,7 +1189,7 @@ void DrasculaEngine::updateRefresh_pre() { update_34_pre(); else if (roomNumber == 35) update_35_pre(); - } else if (num_ejec == 5) { + } else if (currentChapter == 5) { if (roomNumber == 49) update_49_pre(); else if (roomNumber == 53) @@ -1438,9 +1198,9 @@ void DrasculaEngine::updateRefresh_pre() { update_54_pre(); else if (roomNumber == 56) update_56_pre(); - } else if (num_ejec == 6) { + } else if (currentChapter == 6) { if (roomNumber == 102) - update_pendulo(); + update_pendulum(); else if (roomNumber == 58) update_58_pre(); else if (roomNumber == 59) @@ -1451,25 +1211,25 @@ void DrasculaEngine::updateRefresh_pre() { } void DrasculaEngine::update_1_pre() { - int cambio_col_antes = cambio_de_color; + int cambio_col_antes = changeColor; if (hare_x > 98 && hare_x < 153) - cambio_de_color = 1; + changeColor = 1; else - cambio_de_color = 0; + changeColor = 0; - if (cambio_col_antes != cambio_de_color && cambio_de_color == 1) + if (cambio_col_antes != changeColor && changeColor == 1) hare_oscuro(); - if (cambio_col_antes != cambio_de_color && cambio_de_color == 0) + if (cambio_col_antes != changeColor && changeColor == 0) hare_claro(); if (flags[8] == 0) - copyBackground(2, 158, 208, 67, 27, 40, dir_dibujo3, dir_zona_pantalla); + copyBackground(2, 158, 208, 67, 27, 40, drawSurface3, screenSurface); } void DrasculaEngine::update_2(){ int pos_murci[6]; - int diferencia; + int difference; int murci_x[] = {0, 38, 76, 114, 152, 190, 228, 266, 0, 38, 76, 114, 152, 190, 228, 266, 0, 38, 76, 114, 152, 190, @@ -1486,16 +1246,16 @@ void DrasculaEngine::update_2(){ 41, 41, 41, 41, 4, 4, 4, 4}; - if (frame_murcielago == 41) - frame_murcielago = 0; + if (frame_bat == 41) + frame_bat = 0; - pos_murci[0] = murci_x[frame_murcielago]; - pos_murci[1] = murci_y[frame_murcielago]; + pos_murci[0] = murci_x[frame_bat]; + pos_murci[1] = murci_y[frame_bat]; - if (frame_murcielago < 22) { + if (frame_bat < 22) { pos_murci[4] = 37; pos_murci[5] = 21; - } else if (frame_murcielago > 27) { + } else if (frame_bat > 27) { pos_murci[4] = 57; pos_murci[5] = 36; } else { @@ -1506,538 +1266,943 @@ void DrasculaEngine::update_2(){ pos_murci[2] = 239; pos_murci[3] = 19; - copyRectClip(pos_murci, dir_dibujo3, dir_zona_pantalla); - diferencia = vez() - conta_ciego_vez; - if (diferencia >= 6) { - frame_murcielago++; - conta_ciego_vez = vez(); + copyRectClip(pos_murci, drawSurface3, screenSurface); + difference = getTime() - conta_blind_vez; + if (difference >= 6) { + frame_bat++; + conta_blind_vez = getTime(); } - copyRect(29, 37, 58, 114, 57, 39, dir_dibujo3, dir_zona_pantalla); - mapa(); + copyRect(29, 37, 58, 114, 57, 39, drawSurface3, screenSurface); + showMap(); } void DrasculaEngine::update_3_pre() { if (flags[3] == 1) - copyBackground(258, 110, 85, 44, 23, 53, dir_dibujo3, dir_zona_pantalla); + copyBackground(258, 110, 85, 44, 23, 53, drawSurface3, screenSurface); } void DrasculaEngine::update_3() { if (hare_y + alto_hare < 118) - copyRect(129, 110, 194, 36, 126, 88, dir_dibujo3, dir_zona_pantalla); - copyRect(47, 57, 277, 143, 43, 50, dir_dibujo3, dir_zona_pantalla); + copyRect(129, 110, 194, 36, 126, 88, drawSurface3, screenSurface); + copyRect(47, 57, 277, 143, 43, 50, drawSurface3, screenSurface); } void DrasculaEngine::update_4() { - int cambio_col_antes = cambio_de_color; + int cambio_col_antes = changeColor; if (hare_x > 190) - cambio_de_color = 1; + changeColor = 1; else - cambio_de_color = 0; + changeColor = 0; - if (cambio_col_antes != cambio_de_color && cambio_de_color == 1) + if (cambio_col_antes != changeColor && changeColor == 1) hare_oscuro(); - if (cambio_col_antes != cambio_de_color && cambio_de_color == 0) + if (cambio_col_antes != changeColor && changeColor == 0) hare_claro(); } void DrasculaEngine::update_5_pre(){ if (flags[8] == 0) - copyBackground(256, 152, 208, 67, 27, 40, dir_dibujo3, dir_zona_pantalla); + copyBackground(256, 152, 208, 67, 27, 40, drawSurface3, screenSurface); } void DrasculaEngine::update_5() { - copyRect(114, 130, 211, 87, 109, 69, dir_dibujo3, dir_zona_pantalla); + copyRect(114, 130, 211, 87, 109, 69, drawSurface3, screenSurface); } void DrasculaEngine::update_6_pre() { - int cambio_col_antes = cambio_de_color; + int cambio_col_antes = changeColor; if ((hare_x > 149 && hare_y + alto_hare > 160 && hare_x < 220 && hare_y + alto_hare < 188) || (hare_x > 75 && hare_y + alto_hare > 183 && hare_x < 145)) - cambio_de_color = 0; + changeColor = 0; else - cambio_de_color = 1; + changeColor = 1; - if (cambio_col_antes != cambio_de_color && cambio_de_color == 1) + if (cambio_col_antes != changeColor && changeColor == 1) hare_oscuro(); - if (cambio_col_antes != cambio_de_color && cambio_de_color == 0) + if (cambio_col_antes != changeColor && changeColor == 0) hare_claro(); if (flags[1] == 0) - copyBackground(97, 117, 34, 148, 36, 31, dir_dibujo3, dir_zona_pantalla); + copyBackground(97, 117, 34, 148, 36, 31, drawSurface3, screenSurface); if (flags[0] == 0) - copyBackground(3, 103, 185, 69, 23, 76, dir_dibujo3, dir_zona_pantalla); + copyBackground(3, 103, 185, 69, 23, 76, drawSurface3, screenSurface); if (flags[2] == 0) - copyBackground(28, 100, 219, 72, 64, 97, dir_dibujo3, dir_zona_pantalla); + copyBackground(28, 100, 219, 72, 64, 97, drawSurface3, screenSurface); } void DrasculaEngine::update_7_pre() { if (flags[35] == 0) - copyBackground(1, 72, 158, 162, 19, 12, dir_dibujo3, dir_zona_pantalla); + copyBackground(1, 72, 158, 162, 19, 12, drawSurface3, screenSurface); } void DrasculaEngine::update_9_pre() { - int ciego_x[] = {26, 68, 110, 152, 194, 236, 278, 26, 68}; - int ciego_y[] = {51, 51, 51, 51, 51, 51, 51, 127, 127}; - int diferencia; + int blind_x[] = {26, 68, 110, 152, 194, 236, 278, 26, 68}; + int blind_y[] = {51, 51, 51, 51, 51, 51, 51, 127, 127}; + int difference; - copyRect(ciego_x[frame_ciego], ciego_y[frame_ciego], 122, 57, 41, 72, dir_dibujo3, dir_zona_pantalla); + copyRect(blind_x[frame_blind], blind_y[frame_blind], 122, 57, 41, 72, drawSurface3, screenSurface); if (flags[9] == 0) { - diferencia = vez() - conta_ciego_vez; - if (diferencia >= 11) { - frame_ciego++; - conta_ciego_vez = vez(); + difference = getTime() - conta_blind_vez; + if (difference >= 11) { + frame_blind++; + conta_blind_vez = getTime(); } - if (frame_ciego == 9) - frame_ciego = 0; + if (frame_blind == 9) + frame_blind = 0; } else - frame_ciego = 3; + frame_blind = 3; } void DrasculaEngine::update_12_pre() { if (flags[16] == 0) - copyBackground(1, 131, 106, 117, 55, 68, dir_dibujo3, dir_zona_pantalla); + copyBackground(1, 131, 106, 117, 55, 68, drawSurface3, screenSurface); } void DrasculaEngine::update_13() { if (hare_x > 55 && flags[3] == 0) animation_6_3(); if (flags[1] == 0) - copyRect(185, 110, 121, 65, 67, 88, dir_dibujo3, dir_zona_pantalla); + copyRect(185, 110, 121, 65, 67, 88, drawSurface3, screenSurface); if (flags[2] == 0) - copyRect(185, 21, 121, 63, 67, 88, dir_dibujo3, dir_zona_pantalla); - copyRect(3, 127, 99, 102, 181, 71, dir_dibujo3, dir_zona_pantalla); + copyRect(185, 21, 121, 63, 67, 88, drawSurface3, screenSurface); + copyRect(3, 127, 99, 102, 181, 71, drawSurface3, screenSurface); } void DrasculaEngine::update_14_pre() { - int velas_y[] = {158, 172, 186}; + int candles_y[] = {158, 172, 186}; int cirio_x[] = {14, 19, 24}; int pianista_x[] = {1, 91, 61, 31, 91, 31, 1, 61, 31}; - int borracho_x[] = {1, 42, 83, 124, 165, 206, 247, 1}; - int diferencia; + int drunk_x[] = {1, 42, 83, 124, 165, 206, 247, 1}; + int difference; - copyBackground(123, velas_y[frame_velas], 142, 14, 39, 13, dir_dibujo3, dir_zona_pantalla); - copyBackground(cirio_x[frame_velas], 146, 311, 80, 4, 8, dir_dibujo3, dir_zona_pantalla); + copyBackground(123, candles_y[frame_candles], 142, 14, 39, 13, drawSurface3, screenSurface); + copyBackground(cirio_x[frame_candles], 146, 311, 80, 4, 8, drawSurface3, screenSurface); - if (parpadeo == 5) - copyBackground(1, 149, 127, 52, 9, 5, dir_dibujo3, dir_zona_pantalla); + if (blinking == 5) + copyBackground(1, 149, 127, 52, 9, 5, drawSurface3, screenSurface); if (hare_x > 101 && hare_x < 155) - copyBackground(31, 138, 178, 51, 18, 16, dir_dibujo3, dir_zona_pantalla); + copyBackground(31, 138, 178, 51, 18, 16, drawSurface3, screenSurface); if (flags[11] == 0) - copyBackground(pianista_x[frame_piano], 157, 245, 130, 29, 42, dir_dibujo3, dir_zona_pantalla); + copyBackground(pianista_x[frame_piano], 157, 245, 130, 29, 42, drawSurface3, screenSurface); else if (flags[5] == 0) - copyBackground(145, 139, 228, 112, 47, 60, dir_hare_dch, dir_zona_pantalla); + copyBackground(145, 139, 228, 112, 47, 60, extraSurface, screenSurface); else - copyBackground(165, 140, 229, 117, 43, 59, dir_dibujo3, dir_zona_pantalla); + copyBackground(165, 140, 229, 117, 43, 59, drawSurface3, screenSurface); if (flags[12] == 1) - copyBackground(borracho_x[frame_borracho], 82, 170, 50, 40, 53, dir_dibujo3, dir_zona_pantalla); - diferencia = vez() - conta_ciego_vez; - if (diferencia > 6) { + copyBackground(drunk_x[frame_drunk], 82, 170, 50, 40, 53, drawSurface3, screenSurface); + difference = getTime() - conta_blind_vez; + if (difference > 6) { if (flags[12] == 1) { - frame_borracho++; - if (frame_borracho == 8) { - frame_borracho = 0; + frame_drunk++; + if (frame_drunk == 8) { + frame_drunk = 0; flags[12] = 0; } } else if ((_rnd->getRandomNumber(94) == 15) && (flags[13] == 0)) flags[12] = 1; - frame_velas++; - if (frame_velas == 3) - frame_velas = 0; + frame_candles++; + if (frame_candles == 3) + frame_candles = 0; frame_piano++; if (frame_piano == 9) frame_piano = 0; - parpadeo = _rnd->getRandomNumber(10); - conta_ciego_vez = vez(); + blinking = _rnd->getRandomNumber(10); + conta_blind_vez = getTime(); } } void DrasculaEngine::update_15() { - copyRect(1, 154, 83, 122, 131, 44, dir_dibujo3, dir_zona_pantalla); + copyRect(1, 154, 83, 122, 131, 44, drawSurface3, screenSurface); } void DrasculaEngine::update_16_pre() { if (flags[17] == 0) - copyBackground(1, 103, 24, 72, 33, 95, dir_dibujo3, dir_zona_pantalla); + copyBackground(1, 103, 24, 72, 33, 95, drawSurface3, screenSurface); if (flags[19] == 1) - copyBackground(37, 151, 224, 115, 56, 47, dir_dibujo3, dir_zona_pantalla); + copyBackground(37, 151, 224, 115, 56, 47, drawSurface3, screenSurface); } void DrasculaEngine::update_17_pre() { if (flags[15] == 1) - copyBackground(1, 135, 108, 65, 44, 63, dir_dibujo3, dir_zona_pantalla); + copyBackground(1, 135, 108, 65, 44, 63, drawSurface3, screenSurface); } void DrasculaEngine::update_17() { - copyRect(48, 135, 78, 139, 80, 30, dir_dibujo3, dir_zona_pantalla); + copyRect(48, 135, 78, 139, 80, 30, drawSurface3, screenSurface); } void DrasculaEngine::update_18_pre() { - int diferencia; - int ronquido_x[] = {95, 136, 95, 136, 95, 95, 95, 95, 136, 95, 95, 95, 95, 95, 95, 95}; - int ronquido_y[] = {18, 18, 56, 56, 94, 94, 94, 94, 94, 18, 18, 18, 18, 18, 18, 18}; + int difference; + int snore_x[] = {95, 136, 95, 136, 95, 95, 95, 95, 136, 95, 95, 95, 95, 95, 95, 95}; + int snore_y[] = {18, 18, 56, 56, 94, 94, 94, 94, 94, 18, 18, 18, 18, 18, 18, 18}; if (flags[21] == 0) { - copyBackground(1, 69, 120, 58, 56, 61, dir_dibujo3, dir_zona_pantalla); - copyBackground(ronquido_x[frame_ronquido], ronquido_y[frame_ronquido], 124, 59, 40, 37, dir_dibujo3, dir_zona_pantalla); + copyBackground(1, 69, 120, 58, 56, 61, drawSurface3, screenSurface); + copyBackground(snore_x[frame_snore], snore_y[frame_snore], 124, 59, 40, 37, drawSurface3, screenSurface); } else pon_vb(); - diferencia = vez() - conta_ciego_vez; - if (diferencia > 9) { - frame_ronquido++; - if (frame_ronquido == 16) - frame_ronquido = 0; - conta_ciego_vez = vez(); + difference = getTime() - conta_blind_vez; + if (difference > 9) { + frame_snore++; + if (frame_snore == 16) + frame_snore = 0; + conta_blind_vez = getTime(); } } void DrasculaEngine::update_18() { if (flags[24] == 1) - copyRect(177, 1, 69, 29, 142, 130, dir_dibujo3, dir_zona_pantalla); - copyRect(105, 132, 109, 108, 196, 65, dir_dibujo3, dir_zona_pantalla); + copyRect(177, 1, 69, 29, 142, 130, drawSurface3, screenSurface); + copyRect(105, 132, 109, 108, 196, 65, drawSurface3, screenSurface); } void DrasculaEngine::update_20() { - copyRect(1, 137, 106, 121, 213, 61, dir_dibujo3, dir_zona_pantalla); + copyRect(1, 137, 106, 121, 213, 61, drawSurface3, screenSurface); } void DrasculaEngine::update_21_pre() { if (flags[0] == 1) - copyBackground(2, 171, 84, 126, 17, 26, dir_dibujo3, dir_zona_pantalla); + copyBackground(2, 171, 84, 126, 17, 26, drawSurface3, screenSurface); if (flags[10] == 1) - copyBackground(20, 163, 257, 149, 14, 34, dir_dibujo3, dir_zona_pantalla); + copyBackground(20, 163, 257, 149, 14, 34, drawSurface3, screenSurface); } void DrasculaEngine::update_22_pre() { if (flags[24] == 1) - copyBackground(2, 187, 107, 106, 62, 12, dir_dibujo3, dir_zona_pantalla); + copyBackground(2, 187, 107, 106, 62, 12, drawSurface3, screenSurface); if (flags[27] == 0) - copyBackground(32, 181, 203, 88, 13, 5, dir_dibujo3, dir_zona_pantalla); + copyBackground(32, 181, 203, 88, 13, 5, drawSurface3, screenSurface); if (flags[26] == 0) - copyBackground(2, 133, 137, 83, 29, 53, dir_dibujo3, dir_zona_pantalla); + copyBackground(2, 133, 137, 83, 29, 53, drawSurface3, screenSurface); else - copyBackground(65, 174, 109, 145, 55, 25, dir_dibujo3, dir_zona_pantalla); + copyBackground(65, 174, 109, 145, 55, 25, drawSurface3, screenSurface); } void DrasculaEngine::update_23_pre() { if (flags[11] == 1 && flags[0] == 0) - copyBackground(87, 171, 237, 110, 20, 28, dir_dibujo3, dir_zona_pantalla); + copyBackground(87, 171, 237, 110, 20, 28, drawSurface3, screenSurface); if (flags[0] == 1) - copyBackground(29, 126, 239, 94, 57, 73, dir_dibujo3, dir_zona_pantalla); + copyBackground(29, 126, 239, 94, 57, 73, drawSurface3, screenSurface); if (flags[1] == 1) - copyRect(1, 135, 7, 94, 27, 64, dir_dibujo3, dir_zona_pantalla); + copyRect(1, 135, 7, 94, 27, 64, drawSurface3, screenSurface); } void DrasculaEngine::update_24_pre() { if (flags[1] == 1) - copyBackground(1, 163, 225, 124, 12, 36, dir_dibujo3, dir_zona_pantalla); + copyBackground(1, 163, 225, 124, 12, 36, drawSurface3, screenSurface); if (flags[2] == 1) - copyBackground(14, 153, 30, 107, 23, 46, dir_dibujo3, dir_zona_pantalla); + copyBackground(14, 153, 30, 107, 23, 46, drawSurface3, screenSurface); } void DrasculaEngine::update_26_pre() { - int diferencia; + int difference; if (flags[2] == 1) - copyBackground(1, 130, 87, 44, 50, 69, dir_dibujo3, dir_zona_pantalla); + copyBackground(1, 130, 87, 44, 50, 69, drawSurface3, screenSurface); if (flags[12] == 1) - copyBackground(52, 177, 272, 103, 27, 22, dir_dibujo3, dir_zona_pantalla); + copyBackground(52, 177, 272, 103, 27, 22, drawSurface3, screenSurface); if (flags[18] == 0) - copyBackground(80, 133, 199, 95, 50, 66, dir_dibujo3, dir_zona_pantalla); + copyBackground(80, 133, 199, 95, 50, 66, drawSurface3, screenSurface); - if (parpadeo == 5 && flags[18] == 0) - copyBackground(52, 172, 226, 106, 3, 4, dir_dibujo3, dir_zona_pantalla); + if (blinking == 5 && flags[18] == 0) + copyBackground(52, 172, 226, 106, 3, 4, drawSurface3, screenSurface); - diferencia = vez() - conta_ciego_vez; - if (diferencia >= 10) { - parpadeo = _rnd->getRandomNumber(10); - conta_ciego_vez = vez(); + difference = getTime() - conta_blind_vez; + if (difference >= 10) { + blinking = _rnd->getRandomNumber(10); + conta_blind_vez = getTime(); } if (flags[20] == 1) - copyBackground(182, 133, 199, 95, 50, 66, dir_dibujo3, dir_zona_pantalla); + copyBackground(182, 133, 199, 95, 50, 66, drawSurface3, screenSurface); } void DrasculaEngine::update_26() { if (flags[29] == 1) - copyRect(93, 1, hare_x, hare_y, 45, 78, dir_hare_fondo, dir_zona_pantalla); + copyRect(93, 1, hare_x, hare_y, 45, 78, backSurface, screenSurface); - copyRect(233, 107, 17, 102, 66, 92, dir_dibujo3, dir_zona_pantalla); + copyRect(233, 107, 17, 102, 66, 92, drawSurface3, screenSurface); } void DrasculaEngine::update_27_pre() { if (flags[5] == 1) - copyRect(1, 175, 59, 109, 17, 24, dir_dibujo3, dir_zona_pantalla); + copyRect(1, 175, 59, 109, 17, 24, drawSurface3, screenSurface); if (flags[6] == 1) - copyRect(19, 177, 161, 103, 18, 22, dir_dibujo3, dir_zona_pantalla); + copyRect(19, 177, 161, 103, 18, 22, drawSurface3, screenSurface); } void DrasculaEngine::update_27() { - copyRect(38, 177, 103, 171, 21, 22, dir_dibujo3, dir_zona_pantalla); - copyRect(60, 162, 228, 156, 18, 37, dir_dibujo3, dir_zona_pantalla); + copyRect(38, 177, 103, 171, 21, 22, drawSurface3, screenSurface); + copyRect(60, 162, 228, 156, 18, 37, drawSurface3, screenSurface); } void DrasculaEngine::update_29_pre() { if (flags[4] == 1) - copyBackground(12, 113, 247, 49, 41, 84, dir_dibujo3, dir_zona_pantalla); + copyBackground(12, 113, 247, 49, 41, 84, drawSurface3, screenSurface); } void DrasculaEngine::update_29() { - copyRect(1, 180, 150, 126, 10, 17, dir_dibujo3, dir_zona_pantalla); + copyRect(1, 180, 150, 126, 10, 17, drawSurface3, screenSurface); } void DrasculaEngine::update_30_pre() { if (flags[4] == 1) - copyBackground(1, 148, 148, 66, 35, 51, dir_dibujo3, dir_zona_pantalla); + copyBackground(1, 148, 148, 66, 35, 51, drawSurface3, screenSurface); if (flags[16] == 1) - copyBackground(37, 173, 109, 84, 20, 26, dir_dibujo3, dir_zona_pantalla); + copyBackground(37, 173, 109, 84, 20, 26, drawSurface3, screenSurface); } void DrasculaEngine::update_31_pre() { if (flags[13] == 1) - copyBackground(1, 163, 116, 41, 61, 36, dir_dibujo3, dir_zona_pantalla); + copyBackground(1, 163, 116, 41, 61, 36, drawSurface3, screenSurface); if (flags[5] == 1) - copyBackground(1, 78, 245, 63, 30, 84, dir_dibujo3, dir_zona_pantalla); + copyBackground(1, 78, 245, 63, 30, 84, drawSurface3, screenSurface); } void DrasculaEngine::update_31() { - copyRect(63, 190, 223, 157, 17, 9, dir_dibujo3, dir_zona_pantalla); + copyRect(63, 190, 223, 157, 17, 9, drawSurface3, screenSurface); } void DrasculaEngine::update_34_pre() { if (flags[7] == 1) - copyBackground(99, 127, 73, 41, 79, 72, dir_dibujo3, dir_zona_pantalla); + copyBackground(99, 127, 73, 41, 79, 72, drawSurface3, screenSurface); if (flags[8] == 1) - copyBackground(36, 129, 153, 41, 62, 65, dir_dibujo3, dir_zona_pantalla); + copyBackground(36, 129, 153, 41, 62, 65, drawSurface3, screenSurface); } void DrasculaEngine::update_34() { - copyRect(5, 171, 234, 126, 29, 23, dir_dibujo3, dir_zona_pantalla); + copyRect(5, 171, 234, 126, 29, 23, drawSurface3, screenSurface); } void DrasculaEngine::update_35_pre() { if (flags[14] == 1) - copyBackground(1, 86, 246, 65, 68, 87, dir_dibujo3, dir_zona_pantalla); + copyBackground(1, 86, 246, 65, 68, 87, drawSurface3, screenSurface); if (flags[17] == 0 && flags[15] == 1) - copyBackground(111, 150, 118, 52, 40, 23, dir_dibujo3, dir_zona_pantalla); + copyBackground(111, 150, 118, 52, 40, 23, drawSurface3, screenSurface); if (flags[17] == 1) - copyBackground(70, 150, 118, 52, 40, 23, dir_dibujo3, dir_zona_pantalla); + copyBackground(70, 150, 118, 52, 40, 23, drawSurface3, screenSurface); } void DrasculaEngine::update_35() { - copyRect(1, 174, 54, 152, 195, 25, dir_dibujo3, dir_zona_pantalla); + copyRect(1, 174, 54, 152, 195, 25, drawSurface3, screenSurface); } void DrasculaEngine::update_49_pre() { if (flags[6] == 0) - copyBackground(2, 136, 176, 81, 49, 62, dir_dibujo3, dir_zona_pantalla); + copyBackground(2, 136, 176, 81, 49, 62, drawSurface3, screenSurface); } void DrasculaEngine::update_50() { - copyRect(4, 153, 118, 95, 67, 44, dir_dibujo3, dir_zona_pantalla); + copyRect(4, 153, 118, 95, 67, 44, drawSurface3, screenSurface); } void DrasculaEngine::update_53_pre() { if (flags[1] == 0) - copyRect(2, 113, 205, 50, 38, 86, dir_dibujo3, dir_zona_pantalla); + copyRect(2, 113, 205, 50, 38, 86, drawSurface3, screenSurface); if (flags[2] == 0) - copyBackground(41, 159, 27, 117, 25, 40, dir_dibujo3, dir_zona_pantalla); + copyBackground(41, 159, 27, 117, 25, 40, drawSurface3, screenSurface); if (flags[9] == 1) - copyBackground(67, 184, 56, 93, 32, 15, dir_dibujo3, dir_zona_pantalla); + copyBackground(67, 184, 56, 93, 32, 15, drawSurface3, screenSurface); } void DrasculaEngine::update_54_pre() { if (flags[5] == 1) - copyBackground(168, 156, 187, 111, 7, 11, dir_dibujo3, dir_zona_pantalla); + copyBackground(168, 156, 187, 111, 7, 11, drawSurface3, screenSurface); if (flags[12] == 1) - copyBackground(16, 156, 190, 64, 18, 24, dir_dibujo3, dir_zona_pantalla); + copyBackground(16, 156, 190, 64, 18, 24, drawSurface3, screenSurface); } void DrasculaEngine::update_56_pre() { if (flags[10] == 0) - copyBackground(2, 126, 42, 67, 57, 67, dir_dibujo3, dir_zona_pantalla); + copyBackground(2, 126, 42, 67, 57, 67, drawSurface3, screenSurface); if (flags[11] == 1) - copyBackground(60, 160, 128, 97, 103, 38, dir_dibujo3, dir_zona_pantalla); + copyBackground(60, 160, 128, 97, 103, 38, drawSurface3, screenSurface); } void DrasculaEngine::update_57() { - copyRect(7, 113, 166, 61, 62, 82, dir_dibujo3, dir_zona_pantalla); + copyRect(7, 113, 166, 61, 62, 82, drawSurface3, screenSurface); } void DrasculaEngine::update_58_pre() { if (flags[0] == 0) - copyBackground(1, 156, 143, 120, 120, 43, dir_dibujo3, dir_zona_pantalla); + copyBackground(1, 156, 143, 120, 120, 43, drawSurface3, screenSurface); if (flags[1] == 2) - copyRect(252, 171, 173, 116, 25, 28, dir_dibujo3, dir_zona_pantalla); + copyRect(252, 171, 173, 116, 25, 28, drawSurface3, screenSurface); if (flags[1] == 0 && flags[0] == 0) - copyRect(278, 171, 173, 116, 25, 28, dir_dibujo3, dir_zona_pantalla); + copyRect(278, 171, 173, 116, 25, 28, drawSurface3, screenSurface); if (flags[2] == 0) { - pon_igor(); - pon_dr(); + placeIgor(); + placeDrascula(); } if (flags[3] == 1) - copyRect(1, 29, 204, 0, 18, 125, dir_dibujo3, dir_zona_pantalla); + copyRect(1, 29, 204, 0, 18, 125, drawSurface3, screenSurface); if (flags[8] == 1) - copyBackground(20, 60, 30, 64, 46, 95, dir_dibujo3, dir_zona_pantalla); + copyBackground(20, 60, 30, 64, 46, 95, drawSurface3, screenSurface); } void DrasculaEngine::update_58() { if (hare_se_ve == 1) - copyRect(67, 139, 140, 147, 12, 16, dir_dibujo3, dir_zona_pantalla); + copyRect(67, 139, 140, 147, 12, 16, drawSurface3, screenSurface); } void DrasculaEngine::update_59_pre() { if (flags[4] == 0) - copyRect(1, 146, 65, 106, 83, 40, dir_dibujo3, dir_zona_pantalla); + copyRect(1, 146, 65, 106, 83, 40, drawSurface3, screenSurface); if (flags[9] == 1) { - copyBackground(65, 103, 65, 103, 49, 38, dir_dibujo1, dir_zona_pantalla); - copyRect(1, 105, 65, 103, 49, 38, dir_dibujo3, dir_zona_pantalla); + copyBackground(65, 103, 65, 103, 49, 38, drawSurface1, screenSurface); + copyRect(1, 105, 65, 103, 49, 38, drawSurface3, screenSurface); } } void DrasculaEngine::update_60_pre() { - int velas_y[] = {158, 172, 186}; - int diferencia; + int candles_y[] = {158, 172, 186}; + int difference; if (flags[5] == 0) - pon_dr(); + placeDrascula(); - copyBackground(123, velas_y[frame_velas], 142, 14, 39, 13, dir_dibujo3, dir_zona_pantalla); + copyBackground(123, candles_y[frame_candles], 142, 14, 39, 13, drawSurface3, screenSurface); if (flag_tv == 1) - copyBackground(114, 158, 8, 30, 8, 23, dir_dibujo3, dir_zona_pantalla); + copyBackground(114, 158, 8, 30, 8, 23, drawSurface3, screenSurface); - diferencia = vez() - conta_ciego_vez; - parpadeo = _rnd->getRandomNumber(7); - if (parpadeo == 5 && flag_tv == 0) + difference = getTime() - conta_blind_vez; + blinking = _rnd->getRandomNumber(7); + if (blinking == 5 && flag_tv == 0) flag_tv = 1; - else if (parpadeo == 5 && flag_tv == 1) + else if (blinking == 5 && flag_tv == 1) flag_tv = 0; - if (diferencia > 6) { - frame_velas++; - if (frame_velas == 3) - frame_velas = 0; - conta_ciego_vez = vez(); + if (difference > 6) { + frame_candles++; + if (frame_candles == 3) + frame_candles = 0; + conta_blind_vez = getTime(); } } void DrasculaEngine::update_60() { if (hare_y - 10 < y_dr && flags[5] == 0) - pon_dr(); + placeDrascula(); } void DrasculaEngine::update_61() { - copyRect(1, 154, 83, 122, 131, 44, dir_dibujo3, dir_zona_pantalla); + copyRect(1, 154, 83, 122, 131, 44, drawSurface3, screenSurface); } void DrasculaEngine::update_62_pre() { - int velas_y[] = { 158, 172, 186 }; + int candles_y[] = { 158, 172, 186 }; int cirio_x[] = { 14, 19, 24 }; int pianista_x[] = {1, 91, 61, 31, 91, 31, 1, 61, 31 }; - int borracho_x[] = {1, 42, 83, 124, 165, 206, 247, 1 }; - int diferencia; + int drunk_x[] = {1, 42, 83, 124, 165, 206, 247, 1 }; + int difference; - copyBackground(123, velas_y[frame_velas], 142, 14, 39, 13, dir_dibujo3, dir_zona_pantalla); - copyBackground(cirio_x[frame_velas], 146, 311, 80, 4, 8, dir_dibujo3, dir_zona_pantalla); + copyBackground(123, candles_y[frame_candles], 142, 14, 39, 13, drawSurface3, screenSurface); + copyBackground(cirio_x[frame_candles], 146, 311, 80, 4, 8, drawSurface3, screenSurface); - if (parpadeo == 5) - copyBackground(1, 149, 127, 52, 9, 5, dir_dibujo3, dir_zona_pantalla); + if (blinking == 5) + copyBackground(1, 149, 127, 52, 9, 5, drawSurface3, screenSurface); if (hare_x > 101 && hare_x < 155) - copyBackground(31, 138, 178, 51, 18, 16, dir_dibujo3, dir_zona_pantalla); + copyBackground(31, 138, 178, 51, 18, 16, drawSurface3, screenSurface); if (flags[11] == 0) - copyBackground(pianista_x[frame_piano], 157, 245, 130, 29, 42, dir_dibujo3, dir_zona_pantalla); + copyBackground(pianista_x[frame_piano], 157, 245, 130, 29, 42, drawSurface3, screenSurface); else if (flags[5] == 0) - copyBackground(145, 139, 228, 112, 47, 60, dir_hare_dch, dir_zona_pantalla); + copyBackground(145, 139, 228, 112, 47, 60, extraSurface, screenSurface); else - copyBackground(165, 140, 229, 117, 43, 59, dir_dibujo3, dir_zona_pantalla); + copyBackground(165, 140, 229, 117, 43, 59, drawSurface3, screenSurface); if (flags[12] == 1) - copyBackground(borracho_x[frame_borracho], 82, 170, 50, 40, 53, dir_dibujo3, dir_zona_pantalla); + copyBackground(drunk_x[frame_drunk], 82, 170, 50, 40, 53, drawSurface3, screenSurface); - diferencia = vez() - conta_ciego_vez; - if (diferencia > 6) { + difference = getTime() - conta_blind_vez; + if (difference > 6) { if (flags[12] == 1) { - frame_borracho++; - if (frame_borracho == 8) { - frame_borracho = 0; + frame_drunk++; + if (frame_drunk == 8) { + frame_drunk = 0; flags[12] = 0; } } else if ((_rnd->getRandomNumber(94) == 15) && (flags[13] == 0)) flags[12] = 1; - frame_velas++; - if (frame_velas == 3) - frame_velas = 0; + frame_candles++; + if (frame_candles == 3) + frame_candles = 0; frame_piano++; if (frame_piano == 9) frame_piano = 0; - parpadeo = _rnd->getRandomNumber(10); - conta_ciego_vez = vez(); + blinking = _rnd->getRandomNumber(10); + conta_blind_vez = getTime(); } } void DrasculaEngine::update_62() { - int borracho_x[] = { 1, 42, 83, 124, 165, 206, 247, 1 }; + int drunk_x[] = { 1, 42, 83, 124, 165, 206, 247, 1 }; - copyRect(1, 1, 0, 0, 62, 142, dir_dibujo2, dir_zona_pantalla); + copyRect(1, 1, 0, 0, 62, 142, drawSurface2, screenSurface); if (hare_y + alto_hare < 89) { - copyRect(205, 1, 180, 9, 82, 80, dir_dibujo3, dir_zona_pantalla); - copyBackground(borracho_x[frame_borracho], 82, 170, 50, 40, 53, dir_dibujo3, dir_zona_pantalla); + copyRect(205, 1, 180, 9, 82, 80, drawSurface3, screenSurface); + copyBackground(drunk_x[frame_drunk], 82, 170, 50, 40, 53, drawSurface3, screenSurface); } } void DrasculaEngine::update_63() { - copyRect(1, 154, 83, 122, 131, 44, dir_dibujo3, dir_zona_pantalla); + copyRect(1, 154, 83, 122, 131, 44, drawSurface3, screenSurface); } -void DrasculaEngine::update_pendulo() { - int pendulo_x[] = {40, 96, 152, 208, 264, 40, 96, 152, 208, 208, 152, 264, 40, 96, 152, 208, 264}; - int diferencia; +void DrasculaEngine::update_pendulum() { + int pendulum_x[] = {40, 96, 152, 208, 264, 40, 96, 152, 208, 208, 152, 264, 40, 96, 152, 208, 264}; + int difference; if (frame_pen <= 4) - dir_pendulo = dir_dibujo3; + pendulumSurface = drawSurface3; else if (frame_pen <= 11) - dir_pendulo = dir_hare_dch; + pendulumSurface = extraSurface; else - dir_pendulo = dir_hare_frente; + pendulumSurface = frontSurface; - copyBackground(pendulo_x[frame_pen], 19, 152, 0, 55, 125, dir_pendulo, dir_zona_pantalla); + copyBackground(pendulum_x[frame_pen], 19, 152, 0, 55, 125, pendulumSurface, screenSurface); if (flags[1] == 2) - copyRect(18, 145, 145, 105, 25, 29, dir_dibujo3, dir_zona_pantalla); + copyRect(18, 145, 145, 105, 25, 29, drawSurface3, screenSurface); if (flags[1] == 0) - copyRect(44, 145, 145, 105, 25, 29, dir_dibujo3, dir_zona_pantalla); + copyRect(44, 145, 145, 105, 25, 29, drawSurface3, screenSurface); - diferencia = vez() - conta_ciego_vez; - if (diferencia > 8) { + difference = getTime() - conta_blind_vez; + if (difference > 8) { frame_pen++; if (frame_pen == 17) frame_pen = 0; - conta_ciego_vez = vez(); + conta_blind_vez = getTime(); + } +} + +bool DrasculaEngine::checkFlag(int fl) { + characterMoved = 0; + updateRoom(); + updateScreen(); + + hasAnswer = 1; + + if (menuScreen == 1) { + if (currentChapter == 1) { + if (pickedObject == kVerbLook && fl == 28) + talk(328); + } else if (currentChapter == 2) { + if ((pickedObject == kVerbLook && fl == 22 && flags[23] == 0) + || (pickedObject == kVerbOpen && fl == 22 && flags[23] == 0)) { + talk(164); + flags[23] = 1; + withoutVerb(); + addObject(7); + addObject(18); + } else if (pickedObject == kVerbLook && fl == 22 && flags[23] == 1) + talk(307); + else if (pickedObject == kVerbLook && fl == 28) + talk(328); + else if (pickedObject == kVerbLook && fl == 7) + talk(143); + else if (pickedObject == kVerbTalk && fl == 7) + talk(144); + else if (pickedObject == kVerbLook && fl == 8) + talk(145); + else if (pickedObject == kVerbTalk && fl == 8) + talk(146); + else if (pickedObject == kVerbLook && fl == 9) + talk(147); + else if (pickedObject == kVerbTalk && fl == 9) + talk(148); + else if (pickedObject == kVerbLook && fl == 10) + talk(151); + else if (pickedObject == kVerbLook && fl == 11) + talk(152); + else if (pickedObject == kVerbTalk && fl == 11) + talk(153); + else if (pickedObject == kVerbLook && fl == 12) + talk(154); + else if (pickedObject == kVerbLook && fl == 13) + talk(155); + else if (pickedObject == kVerbLook && fl == 14) + talk(157); + else if (pickedObject == kVerbLook && fl == 15) + talk(58); + else if (pickedObject == kVerbLook && fl == 16) + talk(158); + else if (pickedObject == kVerbLook && fl == 17) + talk(159); + else if (pickedObject == kVerbLook && fl == 18) + talk(160); + else if (pickedObject == kVerbLook && fl == 19) + talk(161); + else if (pickedObject == kVerbLook && fl == 20) + talk(162); + else if (pickedObject == kVerbLook && fl == 23) + talk(152); + else + hasAnswer = 0; + } else if (currentChapter == 3) { + if (pickedObject == kVerbLook && fl == 22) + talk(307); + else if (pickedObject == kVerbLook && fl == 28) + talk(328); + else if (pickedObject == kVerbLook && fl == 7) + talk(143); + else if (pickedObject == kVerbTalk && fl == 7) + talk(144); + else if (pickedObject == kVerbLook && fl == 8) + talk(145); + else if (pickedObject == kVerbTalk && fl == 8) + talk(146); + else if (pickedObject == kVerbLook && fl == 9) + talk(147); + else if (pickedObject == kVerbTalk && fl == 9) + talk(148); + else if (pickedObject == kVerbLook && fl == 10) + talk(151); + else if (pickedObject == kVerbLook && fl == 11) + talk(152); + else if (pickedObject == kVerbTalk && fl == 11) + talk(153); + else if (pickedObject == kVerbLook && fl == 12) + talk(154); + else if (pickedObject == kVerbLook && fl == 13) + talk(155); + else if (pickedObject == kVerbLook && fl == 14) + talk(157); + else if (pickedObject == kVerbLook && fl == 15) + talk(58); + else if (pickedObject == kVerbLook && fl == 16) + talk(158); + else if (pickedObject == kVerbLook && fl == 17) + talk(159); + else if (pickedObject == kVerbLook && fl == 18) + talk(160); + else if (pickedObject == kVerbLook && fl == 19) + talk(161); + else if (pickedObject == kVerbLook && fl == 20) + talk(162); + else if (pickedObject == kVerbLook && fl == 23) + talk(152); + else + hasAnswer = 0; + } else if (currentChapter == 4) { + if ((pickedObject == 18 && fl == 19) || (pickedObject == 19 && fl == 18)) { + withoutVerb(); + chooseObject(21); + removeObject(18); + removeObject(19); + } else if ((pickedObject == 14 && fl == 19) || (pickedObject == 19 && fl == 14)) + talk(484); + else if (pickedObject == kVerbLook && fl == 28) + talk(328); + else if (pickedObject == kVerbLook && fl == 7) + talk(478); + else if (pickedObject == kVerbLook && fl == 8) + talk(480); + else if (pickedObject == kVerbLook && fl == 9) { + talk(482); + talk(483); + } else if (pickedObject == kVerbLook && fl == 10) + talk(485); + else if (pickedObject == kVerbLook && fl == 11) + talk(488); + else if (pickedObject == kVerbLook && fl == 12) + talk(486); + else if (pickedObject == kVerbLook && fl == 13) + talk(490); + else if (pickedObject == kVerbLook && fl == 14) + talk(122); + else if (pickedObject == kVerbLook && fl == 15) + talk(117); + else if (pickedObject == kVerbTalk && fl == 15) + talk(118); + else if (pickedObject == kVerbOpen && fl == 15) + talk(119); + else if (pickedObject == kVerbLook && fl == 16) + talk(491); + else if (pickedObject == kVerbLook && fl == 17) + talk(478); + else if (pickedObject == kVerbLook && fl == 18) + talk(493); + else if (pickedObject == kVerbLook && fl == 19) { + talk(494); + talk(495); + } else if (pickedObject == kVerbLook && fl == 20) + talk(162); + else if (pickedObject == kVerbLook && fl == 21) + talk(496); + else if (pickedObject == kVerbLook && fl == 22) + talk(161); + else + hasAnswer = 0; + } else if (currentChapter == 5) { + if (pickedObject == kVerbLook && fl == 28) + talk(328); + else if (pickedObject == kVerbLook && fl == 7) + talk(478); + else if (pickedObject == kVerbLook && fl == 8) + talk(120); + else if (pickedObject == kVerbLook && fl == 9) { + talk(482); + talk(483); + } else if (pickedObject == kVerbLook && fl == 11) + talk(488); + else if (pickedObject == kVerbLook && fl == 13) + talk(490); + else if (pickedObject == kVerbLook && fl == 14) + talk(121); + else if (pickedObject == kVerbLook && fl == 15) + talk(117); + else if (pickedObject == kVerbTalk && fl == 15) + talk(118); + else if (pickedObject == kVerbOpen && fl == 15) + talk(119); + else if (pickedObject == kVerbLook && fl == 17) + talk(478); + else if (pickedObject == kVerbLook && fl == 20) + talk(162); + else + hasAnswer = 0; + } else if (currentChapter == 6) { + if (pickedObject == kVerbLook && fl == 28) + talk(328); + else if (pickedObject == kVerbLook && fl == 9) { + talk(482); + talk(483); + } else if (pickedObject == kVerbLook && fl == 20) + talk(123); + else if (pickedObject == kVerbLook && fl == 21) + talk(441); + else + hasAnswer = 0; + } + } else { + if (currentChapter == 1) { + if (pickedObject == kVerbLook && fl == 50) + talk(308); + else if (pickedObject == kVerbOpen && fl == 50) + talk(310); + else if (pickedObject == kVerbClose && fl == 50) + talk(311); + else if (pickedObject == kVerbMove && fl == 50) + talk(312); + else if (pickedObject == kVerbPick && fl == 50) + talk(313); + else if (pickedObject == kVerbTalk && fl == 50) + talk(314); + else if (roomNumber == 62) + room_62(fl); + else if (roomNumber == 63) + room_63(fl); + else + hasAnswer = 0; + } else if (currentChapter == 2) { + if (pickedObject == kVerbLook && fl == 50) + talk(308); + else if (pickedObject == kVerbOpen && fl == 50) + talk(310); + else if (pickedObject == kVerbClose && fl == 50) + talk(311); + else if (pickedObject == kVerbMove && fl == 50) + talk(312); + else if (pickedObject == kVerbPick && fl == 50) + talk(313); + else if (pickedObject == kVerbTalk && fl == 50) + talk(314); + // Note: the original check was strcmp(num_room, "18.alg") + else if (pickedObject == 11 && fl == 50 && flags[22] == 0 && roomNumber != 18) + talk(315); + else if (pickedObject == 13 && fl == 50) + talk(156); + else if (pickedObject == 20 && fl == 50) + talk(163); + else if (roomNumber == 1) + room_1(fl); + else if (roomNumber == 3) + room_3(fl); + else if (roomNumber == 4) + room_4(fl); + else if (roomNumber == 5) + room_5(fl); + else if (roomNumber == 6) + room_6(fl); + else if (roomNumber == 7) + room_7(fl); + else if (roomNumber == 8) + room_8(fl); + else if (roomNumber == 9) + room_9(fl); + else if (roomNumber == 12) + room_12(fl); + else if (roomNumber == 14) + room_14(fl); + else if (roomNumber == 15) + room_15(fl); + else if (roomNumber == 16) + room_16(fl); + else if (roomNumber == 17) + room_17(fl); + else if (roomNumber == 18) + room_18(fl); + else if (roomNumber == 19) + room_19(fl); + else + hasAnswer = 0; + } else if (currentChapter == 3) { + if (pickedObject == kVerbLook && fl == 50) + talk(309); + else if (pickedObject == kVerbOpen && fl == 50) + talk(310); + else if (pickedObject == kVerbClose && fl == 50) + talk(311); + else if (pickedObject == kVerbMove && fl == 50) + talk(312); + else if (pickedObject == kVerbPick && fl == 50) + talk(313); + else if (pickedObject == kVerbTalk && fl == 50) + talk(314); + else if (roomNumber == 13) { + if (room_13(fl)) + return true; + } else + hasAnswer = 0; + } else if (currentChapter == 4) { + if (roomNumber == 28) + talk(178); + else if (pickedObject == kVerbLook && fl == 50) + talk(309); + else if (pickedObject == kVerbOpen && fl == 50) + talk(310); + else if (pickedObject == kVerbClose && fl == 50) + talk(311); + else if (pickedObject == kVerbMove && fl == 50) + talk(312); + else if (pickedObject == kVerbPick && fl == 50) + talk(313); + else if (pickedObject == kVerbTalk && fl == 50) + talk(314); + else if (pickedObject == 8 && fl == 50 && flags[18] == 0) + talk(481); + else if (pickedObject == 9 && fl == 50) + talk(484); + else if (pickedObject == 12 && fl == 50 && flags[18] == 0) + talk(487); + else if (pickedObject == 20 && fl == 50) + talk(487); + else if (roomNumber == 21) { + if (room_21(fl)) + return true; + } else if (roomNumber == 22) + room_22(fl); + else if (roomNumber == 23) + room_23(fl); + else if (roomNumber == 24) + room_24(fl); + else if (roomNumber == 26) + room_26(fl); + else if (roomNumber == 27) + room_27(fl); + else if (roomNumber == 29) + room_29(fl); + else if (roomNumber == 30) + room_30(fl); + else if (roomNumber == 31) + room_31(fl); + else if (roomNumber == 34) + room_34(fl); + else if (roomNumber == 35) + room_35(fl); + else if (roomNumber == 44) + room_44(fl); + else + hasAnswer = 0; + } else if (currentChapter == 5) { + if (pickedObject == kVerbLook && fl == 50) + talk("Cuanto mas me miro, mas me gusto", "54.als"); + else if (pickedObject == kVerbOpen && fl == 50) + talk("y luego como me cierro", "19.als"); + else if (pickedObject == kVerbClose && fl == 50) + talk("Tendre que abrirme primero no", "19.als"); + else if (pickedObject == kVerbMove && fl == 50) + talk("Estoy bien donde estoy", "19.als"); + else if (pickedObject == kVerbPick && fl == 50) + talk("Ya me tengo", "11.als"); + else if (pickedObject == kVerbTalk && fl == 50) + talk("hola yo", "16.als"); + else if (pickedObject == 20 && fl == 50) + talk(487); + else if (roomNumber == 49) + room_49(fl); + else if (roomNumber == 53) + room_53(fl); + else if (roomNumber == 54) + room_54(fl); + else if (roomNumber == 55) + room_55(fl); + else if (roomNumber == 56) { + if (room_56(fl)) + return true; + } else + hasAnswer = 0; + } else if (currentChapter == 6) { + if (pickedObject == kVerbLook && fl == 50 && flags[0] == 1) + talk(308); + else if (pickedObject == kVerbLook && fl == 50 && flags[0] == 0) + talk(310 ); + else if (pickedObject == kVerbOpen && fl == 50) + talk(310 ); + else if (pickedObject == kVerbClose && fl == 50) + talk(311 ); + else if (pickedObject == kVerbMove && fl == 50) + talk(312 ); + else if (pickedObject == kVerbPick && fl == 50) + talk(313 ); + else if (pickedObject == kVerbTalk && fl == 50) + talk(314 ); + else if (roomNumber == 102) + room_pendulum(fl); + else if (roomNumber == 58) + room_58(fl); + else if (roomNumber == 59) + room_59(fl); + else if (roomNumber == 60) { + if (room_60(fl)) + return true; + } else if (roomNumber == 61) + room_61(fl); + else + hasAnswer = 0; + } } + if (hasAnswer == 0 && hasName == 1) + room_0(); + else if (hasAnswer == 0 && menuScreen == 1) + room_0(); + + return false; } } // End of namespace Drascula diff --git a/engines/drascula/texts.cpp b/engines/drascula/staticdata.h index c84f176d35..c5fb4c0679 100644 --- a/engines/drascula/texts.cpp +++ b/engines/drascula/staticdata.h @@ -23,10 +23,273 @@ * */ +#ifndef STATICDATA_H +#define STATICDATA_H + #include "drascula/drascula.h" namespace Drascula { +const CharInfo charMap[CHARMAP_SIZE] = { + // Letters + // --------------------------------------- + { 'A', 6, 0 }, { 'B', 15, 0 }, + { 'C', 24, 0 }, { 'D', 33, 0 }, + { 'E', 42, 0 }, { 'F', 51, 0 }, + { 'G', 60, 0 }, { 'H', 69, 0 }, + { 'I', 78, 0 }, { 'J', 87, 0 }, + { 'K', 96, 0 }, { 'L', 105, 0 }, + { 'M', 114, 0 }, { 'N', 123, 0 }, + { '\244', 132, 0 }, { '\245', 132, 0 }, // special Spanish char + { 'O', 141, 0 }, { 'P', 150, 0 }, + { 'Q', 159, 0 }, { 'R', 168, 0 }, + { 'S', 177, 0 }, { 'T', 186, 0 }, + { 'U', 195, 0 }, { 'V', 204, 0 }, + { 'W', 213, 0 }, { 'X', 222, 0 }, + { 'Y', 231, 0 }, { 'Z', 240, 0 }, + // --------------------------------------- + { 0xa7, 250, 0 }, { ' ', 250, 0 }, + // Signs + // --------------------------------------- + { '.', 6, 1 }, { ',', 15, 1 }, + { '-', 24, 1 }, { '?', 33, 1 }, + { '\250', 42, 1 }, { '"', 51, 1 }, + { '!', 60, 1 }, { '\255', 69, 1 }, + { ';', 78, 1 }, { '>', 87, 1 }, + { '<', 96, 1 }, { '$', 105, 1 }, + { '%', 114, 1 }, { ':', 123, 1 }, + { '&', 132, 1 }, { '/', 141, 1 }, + { '(', 150, 1 }, { ')', 159, 1 }, + { '*', 168, 1 }, { '+', 177, 1 }, + { '1', 186, 1 }, { '2', 195, 1 }, + { '3', 204, 1 }, { '4', 213, 1 }, + { '5', 222, 1 }, { '6', 231, 1 }, + { '7', 240, 1 }, { '8', 249, 1 }, + { '9', 258, 1 }, { '0', 267, 1 }, + // Accented + // --------------------------------------- + { '\240', 6, 2 }, { '\202', 15, 2 }, // A, B + { '\241', 24, 2 }, { '\242', 33, 2 }, // C, D + { '\243', 42, 2 }, { '\205', 51, 2 }, // E, F + { '\212', 60, 2 }, { '\215', 69, 2 }, // G, H + { '\225', 78, 2 }, { '\227', 87, 2 }, // I, J + { '\203', 96, 2 }, { '\210', 105, 2 }, // K, L + { '\214', 114, 2 }, { '\223', 123, 2 }, // M, N + { '\226', 132, 2 }, { '\047', 141, 2 }, // special Spanish char, O + { '\200', 150, 2 }, { '\207', 150, 2 }, // P, P + { '\265', 6, 2 }, { '\220', 15, 2 }, // A, B + { '\326', 24, 2 }, { '\340', 33, 2 }, // C, D + { '\351', 42, 2 }, { '\267', 51, 2 }, // E, F + { '\324', 60, 2 }, { '\336', 69, 2 }, // G, H + { '\343', 78, 2 }, { '\353', 87, 2 }, // I, J + { '\266', 96, 2 }, { '\322', 105, 2 }, // K, L + { '\327', 114, 2 }, { '\342', 123, 2 }, // M, N + { '\352', 132, 2 } // special Spanish char +}; + +const ItemLocation itemLocations[] = { + { 0, 0 }, // empty + { 5, 10 }, { 50, 10 }, { 95, 10 }, // 1-3 + { 140, 10 }, { 185, 10 }, { 230, 10 }, // 4-6 + { 275, 10 }, { 5, 40 }, { 50, 40 }, // 7-9 + { 95, 40 }, { 140, 40 }, { 185, 40 }, // 10-12 + { 230, 40 }, { 275, 40 }, { 5, 70 }, // 13-15 + { 50, 70 }, { 95, 70 }, { 140, 70 }, // 16-18 + { 185, 70 }, { 230, 70 }, { 275, 70 }, // 19-21 + { 5, 100 }, { 50, 100 }, { 95, 100 }, // 22-24 + { 140, 100 }, { 185, 100 }, { 230, 100 }, // 25-27 + { 275, 100 }, { 5, 130 }, { 50, 130 }, // 28-30 + { 95, 130 }, { 140, 130 }, { 185, 130 }, // 31-33 + { 230, 130 }, { 275, 130 }, { 5, 160 }, // 34-36 + { 50, 160 }, { 95, 160 }, { 140, 160 }, // 37-39 + { 185, 160 }, { 230, 160 }, { 275, 160 }, // 40-42 + { 275, 160 } // 43 +}; + +const int x_pol[44] = {0, 1, 42, 83, 124, 165, 206, 247, 83, 1, 206, + 1, 42, 83, 124, 165, 206, 247, 83, 1, 206, + 247, 83, 165, 1, 206, 42, 124, 83, 1, 247, + 83, 165, 1, 206, 42, 124, 83, 1, 247, 42, + 1, 165, 206}; +const int y_pol[44] = {0, 1, 1, 1, 1, 1, 1, 1, 27, 27, 1, + 27, 27, 27, 27, 27, 27, 27, 1, 1, 27, + 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, + 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, + 27, 1, 1}; +const int x_barra[] = {6, 51, 96, 141, 186, 232, 276, 321}; +const int x1d_menu[] = {280, 40, 80, 120, 160, 200, 240, 0, 40, 80, 120, + 160, 200, 240, 0, 40, 80, 120, 160, 200, 240, 0, + 40, 80, 120, 160, 200, 240, 0}; +const int y1d_menu[] = {0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, + 50, 50, 50, 50, 50, 50, 50, 75, 75, 75, 75, 75, 75, 75, 100}; +int frame_x[20] = {43, 87, 130, 173, 216, 259}; + + +// Note: default action needs to be LAST for each group +// of actions with the same number +RoomTalkAction room0Actions[] = { + // num action object speech + { 1, kVerbLook, -1, 54 }, + { 1, kVerbMove, -1, 19 }, + { 1, kVerbPick, -1, 11 }, + { 1, kVerbOpen, -1, 9 }, + { 1, kVerbClose, -1, 9 }, + { 1, kVerbTalk, -1, 16 }, + { 1, kVerbDefault, -1, 11 }, + // ---------------------------------- + { 2, kVerbMove, -1, 19 }, + { 2, kVerbOpen, -1, 9 }, + { 2, kVerbClose, -1, 9 }, + { 2, kVerbTalk, -1, 16 }, + // ---------------------------------- + { 3, kVerbLook, -1, 316 }, + { 3, kVerbMove, -1, 317 }, + { 3, kVerbPick, -1, 318 }, + { 3, kVerbOpen, -1, 319 }, + { 3, kVerbClose, -1, 319 }, + { 3, kVerbTalk, -1, 320 }, + { 3, kVerbDefault, -1, 318 }, + // ---------------------------------- + { 4, kVerbMove, -1, 19 }, + { 4, kVerbOpen, -1, 9 }, + { 4, kVerbClose, -1, 9 }, + { 4, kVerbTalk, -1, 16 }, + // ---------------------------------- + { 5, kVerbOpen, -1, 9 }, + { 5, kVerbClose, -1, 9 }, + { 5, kVerbTalk, -1, 16 }, + // ---------------------------------- + { 6, kVerbMove, -1, 19 }, + { 6, kVerbOpen, -1, 9 }, + { 6, kVerbClose, -1, 9 }, + { 6, kVerbTalk, -1, 16 } +}; + +RoomTalkAction room1Actions[] = { + // num action object speech + { -1, kVerbPick, 118, 5 }, + { -1, kVerbOpen, 118, 3 }, + { -1, kVerbClose, 118, 4 }, + { -1, kVerbTalk, 118, 6 }, + // ---------------------------------- + { -1, kVerbLook, 119, 8 }, + { -1, kVerbMove, 119, 13 }, + { -1, kVerbClose, 119, 10 }, + { -1, kVerbTalk, 119, 12 }, + // ---------------------------------- + { -1, kVerbMove, 120, 13 }, + { -1, kVerbOpen, 120, 18 }, + { -1, kVerbTalk, 120, 15 } +}; + +RoomTalkAction room3Actions[] = { + // num action object speech + { -1, kVerbLook, 129, 21 }, + { -1, kVerbPick, 129, 5 }, + { -1, kVerbMove, 129, 24 }, + { -1, kVerbOpen, 129, 22 }, + { -1, kVerbClose, 129, 10 }, + // ---------------------------------- + { -1, kVerbLook, 131, 27 }, + { -1, kVerbPick, 131, 5 }, + { -1, kVerbMove, 131, 24 }, + { -1, kVerbOpen, 131, 22 }, + { -1, kVerbClose, 131, 10 }, + { -1, kVerbTalk, 131, 23 }, + // ---------------------------------- + { -1, kVerbLook, 132, 28 }, + { -1, kVerbPick, 132, 5 }, + { -1, kVerbMove, 132, 24 }, + { -1, kVerbOpen, 132, 22 }, + { -1, kVerbClose, 132, 10 }, + { -1, kVerbTalk, 132, 23 }, + // ---------------------------------- + { -1, kVerbLook, 133, 321 }, + { -1, kVerbPick, 133, 31 }, + { -1, kVerbMove, 133, 34 }, + { -1, kVerbOpen, 133, 30 }, + { -1, kVerbClose, 133, 10 }, + // ---------------------------------- + { -1, kVerbLook, 166, 55 }, + { -1, kVerbPick, 166, 7 }, + // ---------------------------------- + { -1, kVerbLook, 211, 184 } +}; + +RoomTalkAction room4Actions[] = { + // num action object speech + { -1, kVerbLook, 189, 182 }, + // ---------------------------------- + { -1, kVerbLook, 207, 175 }, + { -1, kVerbTalk, 207, 176 }, + // ---------------------------------- + { -1, kVerbLook, 208, 177 }, + // ---------------------------------- + { -1, kVerbLook, 209, 179 }, + // ---------------------------------- + { -1, kVerbLook, 210, 180 }, + { -1, kVerbOpen, 210, 181 } +}; + +RoomTalkAction room5Actions[] = { + // num action object speech + { -1, kVerbMove, 136, 13 }, + { -1, kVerbOpen, 136, 18 }, + { -1, kVerbTalk, 136, 15 }, + // ---------------------------------- + { -1, kVerbLook, 212, 187 }, + { -1, kVerbTalk, 212, 188 }, + // ---------------------------------- + { -1, kVerbLook, 213, 189 }, + { -1, kVerbOpen, 213, 190 } +}; + +RoomTalkAction room6Actions[] = { + // num action object speech + { -1, kVerbPick, 144, 43 }, + // ---------------------------------- + { -1, kVerbLook, 138, 35 }, + { -1, kVerbTalk, 138, 6 }, + // ---------------------------------- + { -1, kVerbLook, 143, 37 }, + { -1, kVerbPick, 143, 7 }, + { -1, kVerbMove, 143, 7 }, + { -1, kVerbTalk, 143, 38 }, + // ---------------------------------- + { -1, kVerbLook, 139, 36 }, + // ---------------------------------- + { -1, kVerbLook, 140, 147 } +}; + +RoomTalkAction room12Actions[] = { + // num action object speech + { -1, kVerbLook, 154, 329 }, + { -1, kVerbTalk, 154, 330 }, + // ---------------------------------- + { -1, kVerbMove, 155, 48 }, + { -1, kVerbTalk, 155, 331 }, + // ---------------------------------- + { -1, kVerbLook, 156, 35 }, + { -1, kVerbMove, 156, 48 }, + { -1, kVerbTalk, 156, 50 } +}; + +RoomTalkAction room14Actions[] = { + // num action object speech + { -1, kVerbLook, 200, 165 }, + // ---------------------------------- + { -1, kVerbLook, 201, 166 }, + // ---------------------------------- + { -1, kVerbLook, 202, 167 }, + // ---------------------------------- + { -1, kVerbLook, 203, 168 }, + { -1, kVerbPick, 203, 170 }, + { -1, kVerbMove, 203, 170 }, + { -1, kVerbTalk, 203, 169 }, + // ---------------------------------- + { -1, kVerbLook, 204, 171 } +}; + const char *_text[][501] = { { // 0 @@ -63,12 +326,12 @@ const char *_text[][501] = { "", "", "I'LL BE BACK IN FIFTEEN MINUTES", - "FORBIDDEN TO PUT UP POSTERS", + "IT IS FORBIDDEN TO PUT UP POSTERS", "IT'S UNCLE EVARISTO'S TOMB", // 30 "ITS LOCKED", "I'VE GOT ONE", - "YOO HOO, UNCLE EVERISTO!", + "YOO HOO, UNCLE EVARISTO!", "THERE'S NO REPLY", "IT'S NOT WELL PARKED", // 35 @@ -97,7 +360,7 @@ const char *_text[][501] = { "I CAN'T SEE ANYTHING IN PARTICULAR", // 55 "IT'S FERNAN, THE PLANT", - "IT'S ONE OF THE FENCES SPIKES", + "IT'S ONE OF THE FENCE SPIKES", "HEY! THERE'S A PACKET OF MATCHES UNDER HERE", "LOOK! A PACKET OF KLEENEX, AND ONE'S STILL UNUSED", "THERE ISN'T ANYTHING ELSE IN THE BUCKET", @@ -170,23 +433,23 @@ const char *_text[][501] = { // 115 "I COULD DO IT, BUT I JUST FEEL A LITTLE LAZY", "I DO NOT SEE THE REASON", - "IT'S A QUITE NICE BRAIN", + "IT'S QUITE A NICE BRAIN", "AND SO BRAIN, WHAT ARE YOU UP TONIGHT?", "NO, IT MUST BE KEPT SOMEWHERE AWAY FROM THE MUTANT ACTION OF THE ATMOSPHERE", // 120 "HE IS VERY STIFF, JUST LIKE MY BOSS", "A VERY SHARP STICK", - "YOU FAITHFUL SHARP-PAINTED STICK, NOBLE TRANSILVAAANIAN OAK TREE", + "YOU FAITHFUL SHARP-PAINTED STICK, NOBLE TRANSILVANIAN OAK TREE", "DAMN, I HAVE TO CUT MY NAILS!", "B.J. IS IN THERE... SHE IS A REALLY HOT CHICK!", // 125 "IT IS FIRMLY LOCKED", "\"SAVE AWAY LOCKS LTD.\"", "IT IS THE TYPICAL SKELETON YOU FIND IN THE DUNGEONS OF ALL THE GAMES", - "IT IS COMMONLY USED TO COMMUNICATE ELECTRICITY TO THE MACHINES CONNECTED TO IT", - "IT IS ABSOLUTELY HAND MADE BECAUSE THE JAPANESE MAKE THEM POCKET SIZE", + "IT IS COMMONLY USED TO TRANSFER ELECTRICITY TO THE MACHINES CONNECTED TO IT", + "IT IS HAND MADE BECAUSE THE JAPANESE MAKE THEM POCKET SIZE", // 130 - "I HAVE ONLY SEEN IN MY LIFE ANOTHER THING AS UGLY AS THIS ONE", + "I HAVE ONLY ONCE SEEN IN MY LIFE ANOTHER THING AS UGLY AS THIS", "FORGET IT. I AM NOT GOING TO TELL HIM ANYTHING IN CASE HE GETS MAD", "IT SEEMS QUITE RATIONAL", "IT IS A PICTURE OF PLATO WRITING HIS LOST DIALOGUE", @@ -194,8 +457,8 @@ const char *_text[][501] = { // 135 "THAT'S A VERY CUTE DESK", "IT IS A VAMPIRES HUNTER'S DIPLOMA OFFICIALLY APPROVED BY OXFORD UNIVERSITY", - "IT'S A DARK NIGHT WITH FULL MOON", - "IT SEEMS LIKE THESE SCREWS ARE NOT MUCH TWISTED", + "IT'S A DARK NIGHT WITH A FULL MOON", + "IT SEEMS LIKE THESE SCREWS ARE NOT TIGHTENED PROPERLY", "DON'T LOOK NOW, BUT I THINK THAT A HIDDEN CAMERA IS FOCUSING ON ME", // 140 "THAT'S A VERY MODERN STICK DETECTOR", @@ -206,44 +469,44 @@ const char *_text[][501] = { // 145 "THOSE ARE STRANGE LEAVES. THEY MUST HAVE BROUGHT THEM FROM SOUTH AMERICA OR AROUND THERE", "I DON'T THINK THEY WOULD ANSWER ME", - "THAT'S A BEAUTIFUL WOODEN CRUCIFIX. THE ICON DOESN'T REALLY GET ALL THE BEAUTY WITHIN IT", + "THAT'S A BEAUTIFUL WOODEN CRUCIFIX. THE ICON DOESN'T REALLY SHOW THE BEAUTY WITHIN IT", "I ONLY PRAY BEFORE I GO TO BED", "HEY, THIS PIKE SEEMS A LITTLE BIT LOOSE!", // 150 - "I HOPE YOU WON'T COMPLAIN ABOUT GETTING NO CLUES FROM ME", + "I HOPE YOU WON'T COMPLAIN ABOUT NOT GETTING ANY CLUES FROM ME", "IT'S A QUITE CONVENTIONAL PIKE", "THEY ARE CUTE, THOUGH THEY ARE COVERED WITH A LITTLE BIT OF SHIT", "NO, THEY WON'T HEAR ME. HA,HA,HA THIS IS GREAT!", - "\"SLEEPING BEAUTY\" FROM CHAIKOSKY, OR CHOIFRUSKY, OR WHATEVER IT IS", + "\"SLEEPING BEAUTY\" FROM TCHAIKOVSKY, OR CHOIFRUSKY, OR WHATEVER IT IS", // 155 "VERY TEMPTING", - "NO, I'M NOT ONE OF THOSE WHO PUT USED BUBBLE GUMS IN THEIR MOUTH", - "THAT'S A VERY NICE SICKLE. I WONDER WHERE THE HAMMER MAY BE", + "NO, I DO NOT PUT USED BUBBLE GUMS IN MY MOUTH", + "THAT'S A VERY NICE SICKLE. I WONDER WHERE THE HAMMER IS", "TOBACCO MANUFACTURERS WARN ABOUT HEALTH BEING SERIOUSLY DAMAGED BY SANITARY AUTHORITIES", "AN ABSOLUTELY NORMAL CANDLE, INCLUDING WAX AND EVERYTHING", // 160 - "THESE TWO SHINY COINS DO REALLY GLITTER!", - "THIS SHINY COIN DOES REALLY GLITTER!", - "WITH THIS I WILL BE IMMUNE AGAINST VAMPIRE'S BITES", + "THESE TWO SHINY COINS REALLY DO GLITTER!", + "THIS SHINY COIN REALLY DOES GLITTER!", + "WITH THIS I WILL BE IMMUNE AGAINST VAMPIRE BITES", "NO, IT'S IS NOT THE RIGHT MOMENT YET", - "THERE IS A ONE THOUSAND BILL AND A COUPLE COINS", + "THERE IS A ONE THOUSAND BILL AND A COUPLE OF COINS", // 165 "IT SAYS \"PLEASE, DO NOT THROW FOOD TO THE PIANIST\"", - "OMELET, 200. FRIED FISH, 150, MAYONNAISE POTATOES, 225", - "BEST BURGERS ON THIS SIDE OF THE DANUBE, ONLY FOR 325!", - "THAT'S A NICE SKULL WITH A VERY PENETRATING LOOK, HA, HA, HA, HA, THAT WAS GOOD!", + "OMELETTE, 200. FRIED FISH, 150, MAYONNAISE POTATOES, 225", + "BEST BURGERS ON THIS SIDE OF THE DANUBE, ONLY 325!", + "THAT'S A NICE SKULL WITH A VERY PENETRATING LOOK, HA, HA, HA, HA, THAT WAS GOOD!", "HI SKULL, YOU REMIND ME OF UNCLE HAMLET", // 170 "I HAVE THE HABIT OF NOT TOUCHING THINGS THAT HAVE BEEN ALIVE", "IT'S A BIN", "IT'S A BET FOR TONIGHT'S GAME", - "I WONDER WHAT THERE IS BEHIND THAT", - "HEY, THAT CURTAIN IS NOT MOVING!", + "I WONDER WHAT IS BEHIND THAT", + "HEY, THE CURTAIN WONT MOVE!", // 175 "MAN, THIS CASTLE IS REALLY GLOOMY", "I CAN'T, HE IS TOO FAR AWAY TO HEAR ME", - "IT'S THE TYPICAL TRANSILVANIAN FOREST, WITH TREES", - "MAN YOU REALLY SAY STUPID THINGS, AND THIS IS TOO DARK!", + "IT'S A TYPICAL TRANSILVANIAN FOREST, WITH TREES", + "MAN YOU SAY REALLY STUPID THINGS, AND THIS IS TOO DARK!", "GARCIA, CANDY STORE. SWEETS AND BUBBLE GUM", // 180 "A VERY NICE DOOR", @@ -252,7 +515,7 @@ const char *_text[][501] = { "", "AREN'T THESE BUGS REALLY CUTE?", // 185 - "BSSST, PUSSYCAT... LITTLE CAT", + "PSSST, PUSSYCAT... LITTLE CAT", "THERE IS NO ANSWER", "THE MOON IS A SATELLITE THAT TURNS AROUND THE EARTH WITH A REVOLUTION PERIOD OF 28 DAYS", "HI, LOONY MOON", @@ -271,8 +534,8 @@ const char *_text[][501] = { "IT'S JUST FIVE MINUTES", // 200 "I'M JOHN HACKER AND I REPRESENT A BRITISH PROPERTY COMPANY", - "AS FAR AS I KNOW, COUNT DRASCULA WANTS TO BUY SOME PIECES OF LAND IN GIBRALTAR AND MY COMPANY SENT ME HERE TO NEGOTIATE THE SELLING", - "I THINK I'M GOING BACK TO MY MUM'S TOMORROW FIRST THING IN THE MORNING", + "AS FAR AS I KNOW, COUNT DRASCULA WANTS TO BUY SOME PIECES OF LAND IN GIBRALTAR AND MY COMPANY SENT ME HERE TO NEGOTIATE THE SALE", + "I THINK I'M GOING BACK TO MY MUM'S TOMORROW, FIRST THING IN THE MORNING", "BEAUTIFUL NIGHT, HUH?", "NO, NOTHING", // 205 @@ -295,8 +558,8 @@ const char *_text[][501] = { "OH, SURE...OF COURSE!", // 220 "WELL, THANKS VERY MUCH FOR YOUR HELP. I WON'T BOTHER YOU ANYMORE IF YOU PLEASE TELL ME WHERE THE DOOR IS...", - "IT'S BECAUSE THE KNOCK MUST HAVE AFFECTED MY BRAIN...I CAN'T SEE A THING...", - "WELL...THAT DOESN'T MATTER. I ALWAYS CARRY A SPARE ONE", + "THE KNOCK MUST HAVE AFFECTED MY BRAIN...I CAN'T SEE A THING...", + "WELL...THAT DOESN'T MATTER. I ALWAYS CARRY A SPARE PAIR", "WOW, WHAT A HOT CHICK!! I DIDN'T NOTICE!, BUT OF COURSE, I WASN'T WEARING MY GLASSES", "HEY...", // 225 @@ -310,12 +573,12 @@ const char *_text[][501] = { "WHAT?", "TO TELL YOU THE TRUTH...ON SECOND THOUGHTS...I DON'T REALLY THINK SO", "AND SO TELL ME YOU ERUDITE PHILOSOPHER, IS THERE ANY RELATIONSHIP CAUSE-AND-EFFECT BETWEEN SILLY AND BILLY?", - "OK, OK, FORGET IT. I DON'T EVEN KNOW WHO I SAID ANYTHING ABOUT IT", + "OK, OK, FORGET IT. I DON'T EVEN KNOW WHY I SAID ANYTHING ABOUT IT", // 235 - "WHAT ARE YOU DOING HERE PHILOSPOZING INSTEAD OF BEING EATING SOME PEOPLE", + "WHAT ARE YOU DOING PHILOSOPHIZING INSTEAD OF EATING SOME PEOPLE", "HOW COME?", - "HEY, COULD YOU SAY AGAIN ALL THAT ABOUT PRE-EVOLUTIONARY RELATIONSHIPS?", - "YES, MAN. ALL THAT STUFF YOU TOLD ME ABOUT BEFORE. I DIDN'T GET IT VERY WELL, YOU KNOW", + "HEY, COULD YOU SAY ALL THAT STUFF ABOUT PRE-EVOLUTIONARY RELATIONSHIPS AGAIN?", + "YES, MAN. ALL THAT STUFF YOU TOLD ME ABOUT BEFORE. I DIDN'T UNDERSTAND IT, YOU KNOW", "NO, I'D RATHER NOT SAY ANYTHING, IN CASE HE GETS ANGRY OR SOMETHING...", // 240 "HELLO?", @@ -330,25 +593,25 @@ const char *_text[][501] = { "HER BRAIN?\?!!", "TO TELL YOU THE TRUTH, I THINK I HAD JUST ENOUGH WITH YOUR OF YOUR LITTLE MONSTER", // 250 - "OH PLEASE, HOLLY VIRGIN, DON'T LET ANYTHING WORSE HAPPEN TO ME!!", - "YOU ARE NOT GOING TO GET YOUR WAY. I'M SURE SUPERMAN WILL CAME AND RESCUE ME!", - "WHAT A SHIT OF GAME IS THIS IN WHICH THE PROTAGONIST DIES!", + "OH PLEASE, HOLY VIRGIN, DON'T LET ANYTHING WORSE HAPPEN TO ME!!", + "YOU ARE NOT GOING TO GET YOUR WAY. I'M SURE SUPERMAN WILL COME AND RESCUE ME!", + "WHAT SORT OF A SHIT GAME IS THIS IN WHICH THE PROTAGONIST DIES!", "HEY, WAIT A SECOND!, WHAT ABOUT MY LAST WISH?", "HA. HA, I'M NOW IMMUNIZED AGAINST YOU DAMNED EVIL!. THIS CIGARETTE IS AN ANTI-VAMPIRE BREW THAT VON BRAUN GAVE TO ME", // 255 "YES SURE, BUT YOU'LL NEVER GET ME TO GIVE YOU THE RECIPE", "APART FROM CREATING TORTURE, I CAN ALSO STAND IT.", "OH, NO PLEASE! I'LL TALK, BUT PLEASE, DON'T DO THAT TO ME!", - "ALL RIGHT THEN. I TOLD YOU WHAT YOU WANTED TO KNOW. NOW SET B.J. AND ME FREE AND LEAVE US ALONE!", + "ALL RIGHT THEN. I TOLD YOU WHAT YOU WANTED TO KNOW. NOW SET B.J. AND ME FREE THEN LEAVE US ALONE!", "WHAT ARE YOU DOING HERE B.J.?. WHERE IS DRASCULA?", // 260 - "WHAT A MEAN GUY!. JUST BECAUSE HE BELONGS TO THE NOBILITY HE THINKS HE IS ENTITLED TO SLEEP WITH ANYBODY HE FEELS LIKE", + "WHAT A MEAN GUY!. JUST BECAUSE HE BELONGS TO NOBILITY HE THINKS HE IS ENTITLED TO SLEEP WITH ANYBODY HE FEELS LIKE", "DOWN WITH ARISTOCRATIC DESPOTISM!!", "POOR PEOPLE OF THE WORLD FOR EVER..!!", - "AND AS I CAN SEE HE HAS CHAINED YOU UP WITH LOCKS AND ALL THAT STUFF, HUH?", - "WELL, ALL RIGHT. DO YOU HAVE A HAIRPIN OVER THERE?", + "AND I CAN SEE HE HAS CHAINED YOU UP WITH LOCKS AND ALL THAT STUFF, HUH?", + "WELL, ALL RIGHT. DO YOU HAVE A HAIR PIN OVER THERE?", // 265 - "ALL RIGHT, OK, DON'T GET MAD. I'LL THINK ABOUT SOMETHING", + "ALL RIGHT, OK, DON'T GET MAD. I'LL THINK OF SOMETHING", "YOU...BARTENDER!!", "HOW IS THE GAME GOING?", "WHO?", @@ -367,27 +630,27 @@ const char *_text[][501] = { "THEN WEAR GLASSES", // 280 "WHAT IS ALL THAT ABOUT THE SUPERNATURAL ORGY?", - "OK, OK, STOP IT. I THINK I CAN GET THE PICTURE", + "OK, OK, STOP IT. I THINK I GET THE PICTURE", "COULDN'T YOU TELL ME WHERE DRASCULA IS?", "OH...PLEASE...COME ON...!", "WHY NOT?", // 285 - "OH...BUT DIES HE SLEEP AT NIGHT?", + "OH...BUT DOES HE SLEEP AT NIGHT?", "WELL, I HOPE YOU GET LUCKY", "I HAVE TO TALK TO HIM...", - "YOOUUU...SKELETOOOONN..!!!", + "YOUUU...SKELETONNNN..!!!", "GOOD HEAVENS!, IT'S A DEAD MAN TALKING!", // 290 - "TELL HOW DID YOU GET TO END UP HERE", + "HOW DID YOU END UP HERE", "AND WHY WOULD DRASCULA WANT TO CREATE A MONSTER?", "WHAT'S YOUR NAME, MY SKELETON FRIEND?", "HEY, DON'T YOU WANT ANYTHING TO EAT?", - "I BET YOUR STOMACH IS PRETTY EMPTY...HA, HA,HA!", + "I BET YOUR STOMACH IS PRETTY EMPTY...HA,HA,HA!", // 295 - "THE THING IS THAT I DON'T FEEL LIKE TALKING RIGHT NOW", + "I DON'T FEEL LIKE TALKING RIGHT NOW", "I HOPE SOMEONE F...(WHISTLE) YOU...,AND YOUR F...(WHISTLE) SON OF (WHISTLE TWICE)", "I REALLY LOVED HER. I KNOW SHE WASN'T MUCH OF A WONDER, BUT NOBODY'S PERFECT, RIGHT?", - "BESIDES. SHE REALLY HAD ONE OF THOSE GREAT BODIES THAT YOU NEVER FORGET...", + "BESIDES. SHE HAD ONE OF THOSE GREAT BODIES THAT YOU NEVER FORGET...", "I'LL NEVER BE THE SAME AGAIN. I WILL SHUT MYSELF AWAY IN A MONASTERY, AND WILL LET MY LIFE JUST FLOW...", // 300 "NOTHING WILL GET ME OUT OF THIS MYSTERY BECAUSE...", @@ -396,11 +659,11 @@ const char *_text[][501] = { "I WANT TO BECOME A PROGRAMMER", "TELL ME SOMETHING ABOUT PELAYO", // 305 - "I'LL JUST GO ON PLAYING, AND I'LL FORGET I SAW YOU", + "I'LL JUST GO ON PLAYING, AND FORGET I SAW YOU", "WHOSE STUPID IDEA COULD THIS BE?", - "IT'S LIKE MY GRANDMOTHER'S HANDBAG ", + "IT LOOKS LIKE MY GRANDMOTHER'S HANDBAG ", "JESUS, AREN'T I JUST REALLY COOL MAN...!", - "THE MORE I SEE MYSELF, THE MORE I LOVE ME", + "THE MORE I SEE MYSELF, THE MORE I LOVE MYSELF", // 310 "HOW DO I LOCK MYSELF THEN?", "I'LL HAVE TO OPEN ME FIRST, RIGHT?", @@ -409,14 +672,14 @@ const char *_text[][501] = { "HI, MYSELF!", // 315 "I'LL WEAR THEM WHEN THE RIGHT TIME COMES", - "I CAN'T SEE ANYTHING SPECIAL ABOUT IT", + "I DON'T SEE ANYTHING SPECIAL ABOUT IT", "IT'S ALL RIGHT WHERE IT IS", "AND WHAT FOR?", "I CAN'T", // 320 "HI, YOU!", "IT'S UNCLE DESIDERIO'S PANTHEON!", - "YOOUU...UNCLE DESIDERIOOOO!!", + "YOUUU...UNCLE DESIDERIOOOO!!", "NO, I DON'T WANT TO CUT MYSELF AGAIN", "AHHH,,,EXCUS....", // 325 @@ -429,24 +692,24 @@ const char *_text[][501] = { "COME OUT TO THE BALCONY MY JULIET!!", "YOU ARE THE LIGHT THAT ILLUMINATES MY WAY!", "HEY, DOOR!, WHAT'S THE MATTER?", - "YOOOUU, CIGARETTE SPENDING MACHINEEE!", + "YOUUU, CIGARETTE SPENDING MACHINE!", "IT'S A CIGARETTE SPENDING MACHINE", // 335 "I HAVE ANOTHER COIN INSIDE", - "NO, I JUST DECIDED TO QUIT SMOKING AND DRINKING ALCOHOL", - "I WILL DEVOTE MYSELF TO WOMEN FROM NO ON", + "NO, I JUST QUIT SMOKING AND DRINKING ALCOHOL", + "I WILL DEVOTE MYSELF TO WOMEN FROM NOW ON", "THIS IS A TRICK! NOTHING CAME OUT!", "AT LAST!", // 340 - "JUST A TRUNK", + "ITS JUST A TRUNK", "HELLO TRUNK, YOUR NAME IS JUST LIKE MY COUSIN FRANK...", "I'VE FOUND B.J.'S HANDBAG!", - "OH MY GOD! DON'T GET MY IMAGE REFLECTED! I'M A VAMPIRE!", + "OH MY GOD! I HAVE NO REFLECTION! I'M A VAMPIRE!", "OH...JESUS, IT'S JUST A DRAWING!", // 345 "LITTLE MIRROR, TELL ME, WHO IS THE MOST BEAUTIFUL IN THE WHOLE KINGDOM?", "HE WON'T OPEN", - "ALL RIGHT. I GOT THE EAR-PLUGS ON", + "ALL RIGHT. I GOT THE EAR-PLUGS IN", "IT'S A VAMPIRE'S HUNTER DIPLOMA, OFFICIALLY APPROVED BY OXFORD UNIVERSITY", "NOT YET. THERE ARE STILL SOME INGREDIENTS MISSING. IT'S NOT WORTH WAKING HIM UP", // 350 @@ -463,28 +726,28 @@ const char *_text[][501] = { "CAN'T YOU PLAY ONE FROM BLUR?", // 360 "HOW CAN YOU STAY HERE ALL DAY PLAYING THE SAME SONG ALL THE TIME?", - "AND THEN, HOW CAN YOU HEAR ME?", - "PLEASE, LEND ME THE ERA-PLUGS", + "AND HOW CAN YOU HEAR ME?", + "PLEASE, LEND ME THE EAR-PLUGS", "COME ON, I'LL GIVE THEM BACK TO YOU RIGHT AWAY", - "COOOMEE OONNN...", + "COME ONNN...", // 365 "WELL GOODBYE, I HAVE TO KILL A VAMPIRE", "", "WHAT'S YOUR LANGUAGE, TRANSILVANIAN?", "WHO IS UNCLE DESIDERIO?", - "BUT, WHAT'S THE MATTER WITH THAT DRASCULA?", + "BUT, WHAT'S THE MATTER WITH DRASCULA?", // 370 "WHO IS THAT GUY NAMED VON BRAUN?", "AND WHY DOESN'T HE DO IT?", - "AND WHERE CAN I FIND VON BRAUN?", + "WHERE CAN I FIND VON BRAUN?", "WELL, THANKS AND GOODBYE. HOPE YOU SLEEP IT OFF JUST FINE", - "WE'D BETTER CALL FIRST", + "WE HAD BETTER CALL FIRST", // 375 "ARE YOU PROFESSOR BRAUN?", "AND COULD YOU TELL ME WHERE I CA...?", "I DON'T BELIEVE HE IS GANIMEDES THE DWARF", "PROFESSOR!!", - "PLEASE HELP ME!. THE LIFE OF MY GIRLFRIEND DEPENDS ON YOU!!", + "PLEASE HELP ME!. MY GIRLFRIEND'S LIFE DEPENDS ON YOU!!", // 380 "WELL, ALL RIGHT. I DON'T NEED YOUR HELP", "ALL RIGHT. I'M LEAVING", @@ -501,12 +764,12 @@ const char *_text[][501] = { "ALL RIGHT OLD MAN. I CAME FOR MY MONEY", "NO, NOTHING. I WAS JUST LEAVING", "SORRY...", - "DO YOU LIKE THIS BOOK?. IT HAS SOME SCORES FROM TCHAIKOWSKY", + "DO YOU LIKE THIS BOOK?. IT HAS SOME SCORES FROM TCHAIKOVSKY", "HOW CAN I KILL A VAMPIRE?", // 395 "HAS ANYBODY TOLD YOU THAT SLEEPING IN A BAD POSITION IS NOT GOOD FOR YOU?", "THAT'S WHAT MY MUM ALWAYS TELL ME", - "WHY WOULDN'T DRASCULA KILL YOU?", + "WHY DIDN'T DRASCULA KILL YOU?", "AND WHAT WAS IT?", "GREAT! YOU HAVE AN IMMUNIZING BREW", // 400 @@ -523,7 +786,7 @@ const char *_text[][501] = { "WHAT HAPPENS? DIDN'T YOU HAVE TO GO TO THE COURT?", // 410 "...BUT... IF I MEET MORE VAMPIRES?", - "IT'S A VAMPIRE THAT DOESN'T LET ME COME THROUGH", + "IT'S A VAMPIRE THAT WON'T LET ME COME THROUGH", "HE LOOKS LIKE YODA, BUT A LITTLE TALLER", "HEY YODA, IF YOU JUST LET ME GO ON MY WAY, I'LL GIVE YOU A PENNY", "OK, OK, YOU GET MAD ABOUT NOTHING MAN", @@ -534,55 +797,55 @@ const char *_text[][501] = { "I'D BETTER NOT SAY ANYTHING, IN CASE YOU GET MAD", "IT'S LOCKED", // 420 - "THE MAGPIE WOULD STICK OUT MY EYES IF I TRIED!", + "THE MAGPIE WOULD PECK OUT MY EYES IF I TRIED!", "OH MY GOD. IT'S LOCKED...THAT'S SCARY, HUH?", "THE HINGES ARE RUSTY", "THERE IS ONLY ONE CAN OF FLOUR IN THERE", "THAT TOOK AWAY THE RUST", // 425 - "I HAVE FOUND A PINE STICK", + "I FOUND A PINE STICK", "I'LL TAKE THIS THICKER ONE", "WELL, I THINK I CAN GET RID OF THIS STUPID DISGUISE", - "\"PASSAGE TO TOWERS CLOSED FOR REPAIRS. PLEASE USE MAIN ENTRANCE. SORRY FOR THE INCONVENIENCE\"", - "...HE IS PALE, HE HAS FANGS AND WEARS A TOUPE\220 AND HE SURE IS DRASCULA!", + "\"PASSAGE TO TOWERS CLOSED FOR REPAIRS. PLEASE USE THE MAIN ENTRANCE. SORRY FOR THE INCONVENIENCE\"", + "...HE IS PALE, HE HAS FANGS AND WEARS A TOUPE\220 HE SURE IS DRASCULA!", // 430 "IT'S B.J.! ARE YOU ALL RIGHT B.J.?", "YES, I KNOW SHE IS STUPID, BUT I'M SO LONELY", "YOU DON'T HAVE A KEY AROUND THERE, DO YOU?", - "I BET YOU DON'T HAVE A PICKLOCK AROUND!", - "GIVE ME A HAIRPIN, I'M GOING TO PLAY MCGYVER HERE!", + "I BET YOU DON'T HAVE A LOCK PICK AROUND!", + "GIVE ME A HAIR PIN, I'M GOING TO PLAY MCGYVER HERE!", // 435 "DON'T GO ANYWHERE. I'LL BE RIGHT BACK", "SHOOT! IT'S BROKEN!", "OLEEEE! I EVEN SHAVED DUDE!", "YES, DARLING?", - "HE'S NOT ARRIVED YET", + "HE HAS NOT ARRIVED YET", // 440 "THE PIANIST IS NOT HERE", - "A TRANSYLVANIAN SCOTCH ON THE ROCKS", + "A TRANSILVANIAN SCOTCH ON THE ROCKS", "I DON'T HAVE A ROOM YET", "IT LOOKS LIKE HE GOT STUCK IN THE BATH AND DECIDED TO RUN A BAR", - "HE WAS DRUNK AS A SAILOR", + "HE WAS AS DRUNK AS A SAILOR", // 445 - "THAT HAIR...REMINDS ME OF SOMEBODY", + "THAT HAIR...IT REMINDS ME OF SOMEBODY", "IT'S A RAW-BONED SKELETON", "LOOK! THERE'S MIGUEL BOSE!", - "HE'S ASLEEP. IT'D BE A SHAME WAKING HIM UP", + "HE'S ASLEEP. IT'D BE A SHAME TO WAKE HIM UP", "HE'S UGLIER THAN EMILIO DE PAZ", // 450 - "A PINE-WOODEN COFFIN", + "A PINE WOOD COFFIN", "HE IS GOING TO CUT ME IN LITTLE SLICES. JUST LIKE A SAUSAGE", - "I DON'T LIKE PENDULAE. I'D RATHER PREFER ARTICHOKES", + "I DON'T LIKE PENDULAE. I'D PREFER ARTICHOKES", "I CAN'T MAKE IT. I'M HANDCUFFED", "IT'S OBVIOUSLY A SECRET DOOR", // 455 "THEY IGNORE ME", "COME ON..!", - "WHEN I READ THE SCRIPT IT WAS SUPPOSED TO MOVE, BUT THE BUDGET GOT CRAZY AND THEY COULDN'T AFFORD TO PAY THE GYM, SO THAT I NEVER GOT TOUGH. END OF STORY", - "IT SEEMS A LITTLE LOOSE FROM THE WALL", - "I DON'T THINK IS GOING TO HELP ME ANYWAY. IT'S TOO WET TO LIGHT IT", + "WHEN I READ THE SCRIPT IT WAS SUPPOSED TO MOVE, BUT THE BUDGET GOT CRAZY AND THEY COULDN'T AFFORD TO PAY THE GYM, SO I NEVER GOT STRONGER. END OF STORY", + "IT SEEMS A LITTLE LOOSE ON THE WALL", + "I DON'T THINK IT IS GOING TO HELP ME ANYWAY. IT'S TOO WET TO LIGHT", // 460 - "TO WEST WING? NO WAY! NOBODY KNOWS WHAT YOU CAN FIND THERE!!", + "TO THE WEST WING? NO WAY! NOBODY KNOWS WHAT YOU WILL FIND IN THERE!!", "SHE'S GOT NICE TRANSILVANIAN REASONS", "", "IT'S A SHAME THERE ISN'T A ROASTED LAMB IN THERE", @@ -601,7 +864,7 @@ const char *_text[][501] = { "A SHELF WITH BOOKS AND SOME OTHER THINGS", // 475 "BUT WHO CAN I CALL AT THIS TIME?", - "\"HOW TO MAKE THE TAX RETURN FORMS\". HOW INTERESTING!", + "\"HOW TO FILL IN TAX RETURN FORMS\". HOW INTERESTING!", "I ALREADY HAVE ONE AT HOME. I THINK IT'S A WORLDWIDE BEST SELLER", "A COMPLETELY NORMAL KEY", "I THINK SHE IS NOT FROM AROUND HERE", @@ -612,23 +875,23 @@ const char *_text[][501] = { "LET'S SEE IF ANOTHER ONE COMES SOON!", "NO, IT HAS TO BE WITH A DIRTY AND STINKY VAMPIRE, JUST LIKE THE ONE I KILLED BEFORE", // 485 - "THIS IS THE ONE AND ONLY WIG ELVIS USED WHEN HE GOT BALD", + "THIS IS THE ONE AND ONLY WIG THAT ELVIS USED WHEN HE WENT BALD", "IT'S FLOUR, BUT DON'T ASK ME ANY COMMERCIAL NAMES", "MAYBE ANOTHER TIME, OK?", "THAT'S A GREAT AXE, IT'S A SHAME THERE IS NO VAMPIRE'S HEAD AROUND HERE, HUH?", - "NO. I'M REALLY A GOOD PERSON", + "NO. I REALLY AM A GOOD PERSON", // 490 - "IT'S MARGARET'S THATCHER DEODORANT...HA, HA, HA...!!", + "IT'S MARGARET'S THATCHERS DEODORANT...HA, HA, HA...!!", "THAT'S A PRETTY CUTE CLOAK", "", - "JUST LIKE ALL BRANCHES FROM ANY TREE IN THE WORLD, THERE IS NOTHING SPECIAL.", - "HEY, THAT'S AMAZING! A ROPE WITHIN THIS TYPE OF ADVENTURE!", + "JUST LIKE ALL THE BRANCHES FROM ANY TREE IN THE WORLD, THERE IS NOTHING SPECIAL.", + "HEY, THAT'S AMAZING! A ROPE WITHIN THIS TYPE OF ADVENTURE GAME!", // 495 "I WONDER WHAT WE COULD USE IT FOR...", "A ROPE TIED TO A BRANCH OR THE OTHER WAY AROUND, HOWEVER YOU WANT TO PUT IT...", "IT LOOKS LIKE THIS MAGPIE IS EVIL-MINDED", "FORGET IT, I'M NOT SAYING ANYTHING IN CASE HE GETS MAD", - "SHE LOOKS DEAD, BUT SHE REALLY ISN'T, HUH?", + "SHE LOOKS DEAD, BUT REALLY SHE ISN'T, HUH?", // 500 "NO ANIMAL WAS HARMED DURING THE PRODUCTION OF THIS GAME", }, @@ -3057,7 +3320,7 @@ const char *_textd[][84] = { "HEY IGOR, HOW IS EVERYTHING GOING?", "IT'S ALWAYS THE SAME STORY EVERYTIME THERE'S A GOOD GAME ON THE SATELLITE! ANYWAY, WE'LL GO WATCH IT IN THE BAR, AS USUAL", "IGOR LISTEN CAREFULLY MAN, WE ARE GOING TO START WITH PHASE NUMBER ONE OF MY PLAN TO CONQUER THE WORLD", - "FIRST WE'LL CAPTURE ONE OF THE LIGHTNINGS AND WE'LL DEMAGNETIZE IT WITH OUR INDIFIBULATOR. THE ELECTRICITY WILL COME THROUGH TO MY MONSTER AND HE'LL GET ALIVE!", + "FIRST WE'LL CAPTURE SOME LIGHTNING AND WE'LL DEMAGNETIZE IT WITH OUR INDIFIBULATOR. THE ELECTRICITY WILL COME THROUGH TO MY MONSTER AND HE WILL LIVE!", // 5 "IF EVERYTHING WORKS OUT ALL RIGHT, THIS WILL BE THE BEGINNING OF A GREAT ARMY THAT WILL CONQUER THE WORLD FOR ME. HA, HA", "THE MONSTERS WILL DESTROY ALL THE ARMY'S WEAPONS IN THE WORLD, MEANWHILE, WE'LL BE SAFE IN THE PIECES OF LAND I BOUGHT IN GIBRALTAR", @@ -3066,19 +3329,19 @@ const char *_textd[][84] = { "I'M NOT TALKING TO YOU, IDIOT! I'M JUST GIVING YOU THE PLOT. ALL RIGHT, EVERYTHING READY?", // 10 "THE TIME HAS COME! TURN ON THE ALKALINE BATTERIES' SWITCH", - "DAMNED IT! WHAT WENT WRONG?", - "ARE YOU SURE YOU CHECKED IT ALL AND THERE WAS NOTHING MISSING? YOU'VE BEEN LATELY MESSING AROUND WITH THAT STUFF ABOUT TAXES AND I DON'T KNOW MAN...", - "YOU STUPID THING! YOU FORGOT TO CONNECT THE INDIFIBULATOR. THE SCREWS HAVE PROBABLY MAGNETIZED AND HIS BRAIN BURNT", + "DAMN IT! WHAT WENT WRONG?", + "ARE YOU SURE YOU CHECKED IT ALL AND THERE WAS NOTHING MISSING? LATELY YOU'VE BEEN MESSING AROUND WITH THAT STUFF ABOUT TAXES AND I DON'T KNOW MAN...", + "YOU STUPID THING! YOU FORGOT TO CONNECT THE INDIFIBULATOR. THE SCREWS HAVE PROBABLY MAGNETIZED AND HIS BRAIN HAS PROBABLY BURNT", "YOU ARE DEAD, YOU ARE DEAD...WAIT TILL I GET YOU!", // 15 "SHUT UP! I'LL GET ANOTHER BRAIN TOMORROW AND THEN WE WILL REPEAT THE EXPERIMENT", "THIS TIME I'LL GET A WOMAN'S BRAIN. SHINY AND NOT USED YET...HA, HA, HA, GOODIE ONE!", "SO WHAT? I'M THE BAD GUY, RIGHT? SO I CAN BE AS FULL OF MACHISMO AS I WANT, ALL RIGHT? AND IF YOU SAY SOMETHING AGAIN I'LL TURN YOUR HUMP BACK TO FRONT!", - "HA, HA, HA. YOU FELL TOOO!! NOW YOU ARE GOING TO PAY FOR DARING TO FIGHT AGAINST ME! IGOR, TAKE HIM TO THE PENDULUM OF DEATH!", + "HA, HA, HA. YOU FELL TOO!! NOW YOU ARE GOING TO PAY FOR DARING TO FIGHT ME! IGOR, TAKE HIM TO THE PENDULUM OF DEATH!", "AND SO, TELL ME, YOU STUPID HUMAN. HOW COME YOU WANT TO DESTROY ME?", // 20 "THAT'S BEAUTIFUL!. IF IT WASN'T BECAUSE IT MAKES ME LAUGH, I WOULD CRY", - "OUR GIRLFRIEND'S BRAIN TO HELP ME CONQUERING THE WORLD", + "YOUR GIRLFRIEND'S BRAIN, TO HELP ME CONQUER THE WORLD", "YES, SURE! I'LL TAKE IT FROM HER AND GIVE IT TO MY FRUSKYNSTEIN. THE WORLD WILL BE MINE WITH IT, HA, HA", "WHAT!? YOU'RE DEAD, MAN! I'M GOING TO...YOU REALLY GOT ME ANGRY MAN...COME ON, PREPARE TO DIE!", "HA, HA, HA. NOT EVEN IN YOUR WILDEST DREAMS!", @@ -3090,7 +3353,7 @@ const char *_textd[][84] = { "WELL, WE'LL SEE THAT", // 30 "OK, LET'S SEE IT. IGOR, BRING ME THE CD \"SCRATCHING YOUR NAILS ALL OVER THE BLACKBOARD\"", - "NO WAY. THE GIRL STAYS WITH ME. YOU RE STAYING THERE UNTIL THE PENDULUM CUTS YOU INTO THIN SLICES. HA, HA, HA", + "NO WAY. THE GIRL STAYS WITH ME. YOU'RE STAYING THERE UNTIL THE PENDULUM CUTS YOU INTO THIN SLICES. HA, HA, HA", "MAN I'M I JUST BAD... COME ON IGOR, LET'S MAKE THE BREW AND CONQUER THE WORLD", "WHAT HAPPENS NOW?", "YES, WHAT?...OH, DAMNED, THE GAME!", @@ -3098,7 +3361,7 @@ const char *_textd[][84] = { "I FORGOT ABOUT THAT. GET THE GIRL AND LET'S GO AND WATCH IT. WE CAN CONQUER THE WORLD LATER", "THANKS MAN, I WAS THIRSTY", "OH, THE CRUCIFIX!!...THE CRUCIFIX...!", - "I DIDN'T NOTICE ABOUT THAT BEAUTIFUL CRUCIFIX!", + "I DIDN'T NOTICE THAT BEAUTIFUL CRUCIFIX!", "LEAVE ME ALONE!, I'M WATCHING THE GAME", // 40 "", @@ -3125,7 +3388,7 @@ const char *_textd[][84] = { "YOU LOOK BLIND. YOU'RE WEARING DARK GLASSES LIKE STEVIE WONDER", "LOOK, I'M SORRY, I DIDN'T KNOW YOU COULD SEE", // 60 - "BUT HAVEN'T YOU JUST TOLD ME YOU WEREN'T BLIND", + "BUT YOU JUST TOLD ME YOU WEREN'T BLIND", "BUT IF YOU CAN'T SEE", "OOOOKAY. SORRY. IN THAT CASE, HI THERE SIGHTLESS PERSON", "I'M JOHN HACKER. YOU MUST BE ONE OF THOSE CHARACTERS WHO WILL HELP ME OUT IN EXCHANGE FOR AN OBJECT. AREN'T YOU? EH? AREN'T YOU?", @@ -3133,15 +3396,15 @@ const char *_textd[][84] = { // 65 "AH YES, I SUPPOSE THAT'S TRUE. GOODBYE SIGHTLESS PERSON... BLIND MAN", "HERE IS THE LARGE AMOUNT OF MONEY YOU ASKED ME FOR", - "YOU BETTER HAVE HAD", + "YOU BETTER HAVE", "HI THERE FOREIGNER", "AND HOW DO YOU KNOW I'M BLIND?", // 70 - "AND I'M NOT KIDDING YOU BUT YOUR'S ARE LIKE WOODY ALLEN'S", + "AND I'M NOT KIDDING YOU BUT YOURS ARE LIKE WOODY ALLEN'S", "NO, I CAN'T SEE", "AND I'M NOT", "OH OF COURSE. JUST COS I CAN'T SEE, YOU ACCUSE ME OF BEING BLIND", - "HI THERE FOREIGNER! WHAT ARE YOU DOING IN TRANSYLVANIA?", + "HI THERE FOREIGNER! WHAT ARE YOU DOING IN TRANSILVANIA?", // 75 "THAT'S RIGHT, FOREIGNER. IN EXCHANGE FOR A LARGE SUM OF MONEY I'LL GIVE YOU A SICKLE FOR WHEN YOU MIGHT NEED IT", "SHHHH, I'M A SICKLES TRADER, THAT'S WHY I HAVE TO HIDE", @@ -3151,7 +3414,7 @@ const char *_textd[][84] = { // 80 "", "", - "", + "No, nada", "bla, bla, bla." }, { @@ -3254,7 +3517,7 @@ const char *_textd[][84] = { // 80 "", "", - "", + "No, nada", "\244a, \244a, \244a. que bueno, que bueno." }, { @@ -3357,7 +3620,7 @@ const char *_textd[][84] = { // 80 "", "", - "", + "No, nada", "bla, bla, bla." }, { @@ -3460,7 +3723,7 @@ const char *_textd[][84] = { // 80 "", "", - "", + "No, nada", "bla, bla, bla." }, { @@ -3563,7 +3826,7 @@ const char *_textd[][84] = { // 80 "", "", - "", + "No, nada", "bla, bla, bla." }, }; @@ -3573,21 +3836,21 @@ const char *_textb[][15] = { // 0 "", "I'M HERE, DRINKING", - "THEY ARE ALL DEAD, THANKS. BURPP...", + "THEY ARE ALL DEAD, THANKS. BURP...", "YES, SURE...", "SHE FEELS ATTRACTED TO UNCLE DESIDERIO", // 5 "EVEN BETTER, UNCLE DESIDERIO'S DEAD BODY", - "MY UNCLE. HE WENT TO CASTLE AND NEVER CAME BACK", + "MY UNCLE. HE WENT TO THE CASTLE AND NEVER CAME BACK", "WELL, HE CAME BACK JUST A LITTLE. IF ONLY VON BRAUN HADN'T SCREWED THINGS UP MY UNCLE WOULD BE DRINKING WITH US NOW", "NOTHING...", "WELL, YES !. THAT MEAN MAN HAS TERRIFIED US ALL", // 10 "FROM TIME TO TIME HE COMES DOWN TO THE VILLAGE AND TAKES SOMEONE WITH HIM.", - "A LITTLE WHILE AFTER WE JUST A FEW FOUND BODY PARTS. I THINK HE IS DEALING WITH ORGANS OR SOMETHING LIKE THAT", - "THE ONLY PERSON IN THE VILLAGE WHO KNOWS HOW TO END UP WITH DRASCULA IS A CULTIVATED PERSON", + "A LITTLE WHILE AFTER WE JUST A FEW FOUND BODY PARTS. I THINK HE IS DEALING IN ORGANS OR SOMETHING LIKE THAT", + "THE ONLY PERSON IN THE VILLAGE WHO KNOWS HOW TO GET TO DRASCULA IS A CULTIVATED PERSON", "HE LIVES IN A LOG-CABIN OUT OF TOWN, EVER SINCE DRASCULA BEAT HIM UP", - "HE IS THE ONLY ONE WHO COULD HELP US WITH DRASCULA, AND HE DOESN'T WANT TO HEAR ABOUT US. HOW DO YOU LIKE THAT?", + "HE IS THE ONLY ONE WHO COULD HELP US WITH DRASCULA, AND HE DOESN'T WANT TO HEAR ABOUT IT. HOW DO YOU LIKE THAT?", }, { // 0 @@ -3678,25 +3941,25 @@ const char *_textbj[][29] = { "ARE YOU ALL RIGHT? HEY, COME ON, WAKE UP! CAN YOU HEAR ME? ARE YOU DEAD?", "NO, MY NAME IS BILLIE JEAN, BUT YOU CAN CALL ME B.J. IT'S SHORTER", "HA, HA...! THAT WAS A GOOD ONE!", - "WELL, JHONNY. YOU SEE, I WAS HERE JUST READY TO GO TO BED WHEN I HEARD THIS STRONG NOISE DOWN THE CORRIDOR", + "WELL, JHONNY. YOU SEE, I WAS HERE JUST READY TO GO TO BED WHEN I HEARD THIS LOUD NOISE DOWN THE CORRIDOR", // 5 "I DIDN'T PAY ATTENTION AT FIRST, BUT AFTER ABOUT TWO HOURS OR SO I COULDN'T SLEEP AND WENT OUT FOR A WALK", "AS I OPENED THE DOOR I WAS SHOCKED TO FIND YOU THERE, LYING ON THE FLOOR. I THOUGHT YOU WERE DEAD, I SWEAR... HA, HA, SILLY BILLY", "I WAS GOING TO GIVE YOU THE KISS OF LIFE BUT IT WASN'T NECESSARY BECAUSE YOU STARTED TO TALK", - "YOU SAID SOMETHING ABOUT A SCARECROW. I WAS VERY SCARED, YOU KNOW. IT'S A REAL SHOCK WHEN A DEAD PERSON STARTS TALKING RIGHT?", + "YOU SAID SOMETHING ABOUT A SCARECROW. I WAS VERY SCARED, YOU KNOW. IT'S A REAL SHOCK WHEN A DEAD PERSON STARTS TALKING?", "ISN'T THAT RIGHT? WELL, THEN I MANAGED TO BRING YOU TO MY ROOM THE BEST WAY I COULD. I PUT YOU IN BED... AND THAT'S ALL... HA, HA, HA...", // 10 - "OH, NO...! IT WASN'T THE HIT, HA, HA. I JUST STEEPED ON YOUR GLASSES BY ACCIDENT", + "OH, NO...! IT WASN'T THE HIT, HA, HA. I JUST STEPPED ON YOUR GLASSES BY ACCIDENT", "YOU REALLY LOOK GOOD WITH THOSE GLASSES. I KNOW HE'S NOT FERNANDO LANCHA, BUT I FIND HIM ATTRACTIVE...", "YES, YES, I DO... COME ON, HOLD ME AND KISS ME TIGHT", - "OH JHONNY, HONEY, THANKS GOD YOU'RE HERE... THAT DAMNED DRASCULA TIED ME UP TO THE BED AND THEN HE'S GONE DOWNSTAIRS TO SEE THE FOOTBALL GAME", + "OH JHONNY, HONEY, THANK GOD YOU'RE HERE... THAT DAMNED DRASCULA TIED ME UP TO THE BED AND THEN HE'S GONE DOWNSTAIRS TO WATCH THE FOOTBALL GAME", "YES, IT'S TRUE. PLEASE, SET ME FREE", // 15 - "NO, I'M SORRY. I USED THEM ALL IN THE TOWER WHEN I WAS TRYING TO LIBERATE WHILE YOU LET ME DOWN", + "NO, I'M SORRY. I USED THEM ALL IN THE TOWER WHEN I WAS TRYING TO ESCAPE WHILE YOU LET ME DOWN", "JOHNNY, IS THAT YOU? OH, GOD, GREAT! I KNEW YOU'D COME!", - "YOU DON'T EVEN KNOW HOW MUCH THAT EVIL DRASCULA HAS MADE ME SUFFER", - "FIRSTLY HE BROUGHT ME FLYING OVER HER AND THEN PUT ME IN THIS DISGUSTING ROOM WITHOUT EVEN A MIRROR OR ANYTHING", - "I'M TELLING YOU! AND THE WORSE PART IS THAT HE DIDN'T EVEN APOLOGIZE, NOT EVEN ONCE", + "YOU DON'T KNOW HOW MUCH THAT EVIL DRASCULA HAS MADE ME SUFFER", + "FIRSTLY HE BROUGHT ME FLYING OVER HERE AND THEN PUT ME IN THIS DISGUSTING ROOM WITHOUT A MIRROR OR ANYTHING", + "I'M TELLING YOU! AND THE WORST PART IS THAT HE DIDN'T EVEN APOLOGIZE, NOT EVEN ONCE", // 20 "JHONNY HONEY, WHERE ARE YOU?", "I'M READY TO LEAVE DEAR", @@ -3876,7 +4139,7 @@ const char *_texte[][24] = { "THE TRUTH IS THAT I DON'T REALLY FEEL LIKE IT, BUT THANKS VERY MUCH ANYWAY SIR", // 10 "YEAH, IT'S YOU", - "WHY DO ALL ADVENTURE GAMES END UP WITH A SUNRISE OR A SUNSET?", + "WHY DO ALL ADVENTURE GAMES END WITH A SUNRISE OR A SUNSET?", "DO ALL THESE NAMES BELONG TO THE CREATORS OF THE GAME?", "AREN'T THEY ASHAMED TO BE SEEN BY EVERYBODY?", "JESUS, THAT EMILIO DE PAZ IS EVERYWHERE!!", @@ -3885,9 +4148,9 @@ const char *_texte[][24] = { "YES", "WELL, DON'T MAKE A FUSS ABOUT IT", "HEY WEREWOLF, BY THE WAY...", - "DIDN'T YOU FALL OFF A WINDOW AND GOT BADLY HURT", + "DIDN'T YOU FALL OFF A WINDOW AND GET BADLY HURT", // 20 - "IF AT LEAST IT WASN'T ALWAYS THE SAME ONES...", + "AT LEAST IT WASN'T ALWAYS THE SAME ONES...", "HE'S BEEN OUT FOUR TIMES ALREADY", "I'D LIKE TO BE A MODEL", "ALL RIGHT, AND WHAT ARE YOU GOING TO DO?", @@ -4023,22 +4286,22 @@ const char *_texti[][33] = { { // 0 "", - "MASTER, I THINK THIS IS NOT WORKING", + "MASTER, THIS IS NOT WORKING", "I AM POSITIVE, MASTER", "I'M SORRY MASTER", - "ARE YOU GOING TO BRING HERE ANOTHER CRAZY SCIENTIST? I'LL TELL YOU THAT THE LABORATORY IS ALREADY PACKED UP, AND BESIDES, THEY'RE ALL OUT OF DATE", + "ARE YOU GOING TO BRING ANOTHER CRAZY SCIENTIST HERE? THE LABORATORY IS ALREADY FULL UP, AND BESIDES, THEY'RE ALL OUT OF DATE", // 5 - "HUSH MASTER, THE FEMINIST COULD HEAR YOU", - "DAMNED IT!", + "HUSH MASTER, THE FEMINISTS COULD HEAR YOU", + "DAMN IT!", "I DIDN'T EXPECT YOU SO SOON, MASTER", - "QUITE BAD MASTER. THERE MUST BE SOME PROBLEMS WITH THE SATELLITE AND I JUST CAN'T RECEIVE ANYTHING. BESIDES THERE ARE SOME INTERFERENCES BECAUSE OF THE STORM", + "QUITE BAD MASTER. THERE MUST BE SOME PROBLEMS WITH THE SATELLITE AND I JUST CAN'T RECEIVE ANYTHING. BESIDES THERE IS SOME INTERFERENCE BECAUSE OF THE STORM", "WHAT DO I KNOW, MASTER?", // 10 "YES, MY MASTER", "MASTER", "DO YOU KNOW WHAT TIME IS IT?", "WHAT? OH, THAT SCARED ME!. YOU ARE THE \"NIGHT-CLEANING GUY\", RIGHT?", - "I'M IGOR, THE VALET. YOU CAN START WITH THE BALL ROOM. THERE'S BEEN A SUPER NATURAL ORGY YESTERDAY AND IT LOOKS LIKE SHIT", + "I'M IGOR, THE VALET. YOU CAN START WITH THE BALL ROOM. THERE'S BEEN A SUPER NATURAL ORGY IN THERE YESTERDAY AND IT LOOKS LIKE SHIT", // 15 "IF YOU NEED ANYTHING, JUST BUY IT", "IT'S THE TAX RETURN APPLICATION FORM, CAN'T YOU SEE IT?", @@ -4046,7 +4309,7 @@ const char *_texti[][33] = { "NO WAY! THEY MAKE ME LOOK UGLY", "OH, WELL. IT'S JUST LIKE A CRAZY PARTY THAT THE MASTER ORGANIZES WITH HIS FRIENDS EACH TIME SOME IDIOT COMES ALONG TRYING TO KILL HIM", // 20 - "THEY TAKE HIS EYES OUT. THEN, POUR SOME LEMON JUICE SO THAT IT ITCHES TO DEATH, AND THEN...", + "THEY TAKE HIS EYES OUT. THEN, POUR IN SOME LEMON JUICE SO THAT IT ITCHES TO DEATH, AND THEN...", "NO", "WHAT DO YOU MEAN WHY NOT? DO YOU KNOW WHAT TIME IT IS?", "YES, IT'S WINTER", @@ -4238,9 +4501,9 @@ const char *_textl[][32] = { // 0 "", "ARE YOU GOING TO LET OURSELVES BE GUIDED BY PRIMITIVE INSTINCTS JUST BECAUSE WE BELONG TO DIFFERENT RACES AND THE SOCIAL SITUATION IS TELLING US TO DO SO?", - "AREN'T WE TIED BY SENSE WHICH IS THE MOST POWERFUL WEAPON AS WELL AS THE MOST PRECIOUS GIFT?", + "AREN'T WE TIED BY SENSE? WHICH IS OUR MOST POWERFUL WEAPON AS WELL AS OUR MOST PRECIOUS GIFT?", "OH, IF WE ALL LET OUR THOUGHTS GUIDE OUR WAY IN LIFE WITHOUT LEAVING SOME ROOM FOR FEELINGS WHICH LET OUR PRE-EVOLUTIVE INSTINCTS COME OUT!", - "ANSWER ME, EPHEMERAL CREATURE. WOULDN'T WE ALL BE HAPPIER WITH THOSE EMOTIONAL BOUNDINGS?", + "ANSWER ME, EPHEMERAL CREATURE. WOULDN'T WE ALL BE HAPPIER WITH THOSE EMOTIONAL BINDINGS?", // 5 "YOU ARE NOT GETTING THROUGH", "THIS IS A VERY CLEAR EXAMPLE, YOU SEE?: YOU WANT TO GET THROUGH AND GO AHEAD WITH YOUR ADVENTURE, AND I WON'T LET YOU DO THAT", @@ -4249,7 +4512,7 @@ const char *_textl[][32] = { "WELL, THAT DEPENDS ON WHAT WE TAKE A RELATIONSHIP FOR. SOME AUTHORS DEFEND...", // 10 "PUKE! HUNTING AS A WAY TO SURVIVE IS AN INCOMPATIBLE ARCHAIC THING FOR A SUPERIOR BEING LIKE ME. BESIDES, I'VE BECOME A VEGETARIAN", - "IT JUST HAPPENS THAT I WAS ACTUALLY EATING A GUY AND I STARTED TO BETHINK AND GET TO THE ABOVE MENTIONED THOUGHT", + "IT JUST HAPPENS THAT I WAS ACTUALLY EATING A GUY AND I STARTED TO THINK AND GET TO THE ABOVE MENTIONED THOUGHT", "IT TOOK ME A LONG TIME TO QUIT OLD HABITS BUT AT LEAST MY IRASCIBLE SOUL BIT UP THE CONCUPISCIBLE ONE, AND EVER SINCE, I'VE NEVER EATEN MEAT AGAIN", "NOT EVEN THE PLEASURE OF SUCKING UP THE BONE, FEELING THE TASTE OF THE SKIN AND THAT SWEET TASTE OF MARROW...THAT JUST TAKES YOU TO HEAVENLY PLACES", "IT DOESN'T REALLY GET TO ME AT ALL", @@ -4578,28 +4841,28 @@ const char *_textt[][25] = { { // 0 "", - "WHAT HAPPENS, WHAT'S THE MATTER?", + "WHAT HAPPENED? WHAT'S THE MATTER?", "OK. ROOM 512. UPSTAIRS. THE KEY IS ON THE DOOR", "COUNT DRASCULA!!?", - "NO, NOTHING. THAT GUY HAS A BAD REPUTATION OVER HERE", + "NO, NOTHING. THAT GUY JUST HAS A BAD REPUTATION OVER HERE", // 5 - "WELL, THERE ARE ALL KINDS OF STORIES GOING AROUND ABOUT HIM, SOME SAY HE IS A VAMPIRE WHO KIDNAPS PEOPLE TO SUCK UP THEIR BLOOD", + "WELL, THERE ARE ALL KINDS OF STORIES GOING AROUND ABOUT HIM, SOME SAY HE IS A VAMPIRE WHO KIDNAPS PEOPLE TO SUCK THEIR BLOOD", "HOWEVER, SOME OTHERS SAY THAT HE IS JUST AN ORGAN-DEALER AND THAT IS THE REASON WHY THERE ARE BODY PARTS ALL OVER THE PLACE", "BUT OF COURSE, THOSE ARE JUST RUMORS. HE'S PROBABLY BOTH THINGS. BY THE WAY, WHY DO YOU WANT TO MEET HIM?", "NO, FORGET IT. I'M REALLY BUSY...", - "WELL, OK. BUT JUST BECAUSE I WANT TO DO IT, NOT BECAUSE YOU TELL ME TO", + "WELL, OK. BUT JUST BECAUSE I WANT TO DO IT, NOT BECAUSE YOU TOLD ME TO", // 10 "THEY'RE WINNING", "LEAVE ME ALONE, ALL RIGHT?", "OF COURSE. I'M NOT BLIND", - "THE TRADITION IN THIS VILLAGE IS TO FORGET ALL HARD FEELINGS WHENEVER THERE IS A GAME, SO AS TO CHEER UP THE LOCAL TEAM", + "THE TRADITION IN THIS VILLAGE IS TO FORGET ALL HARD FEELINGS WHENEVER THERE IS A GAME, TO CHEER UP THE LOCAL TEAM", "AND PLEASE, SHUT UP FOR GOD'S SAKE. I CAN'T HEAR ANYTHING!", // 15 "COME ON, LEAVE ME ALONE AND DON'T BOTHER ME ANYMORE", - "IT HAS JUST STARTED! AND SHUT UP!", + "IT HAS JUST STARTED! SHUT UP!", "OK, OK, I THOUGHT SOMETHING WAS GOING ON", - "IT DOESN'T MATTER, ANYWAY. SHE'LL PROBABLY BE DEAD BY NOW", - "HE JUST STARTED PLAYING CLASSIC MUSIC, AND I COULDN'T STAND IT", + "IT DOESN'T MATTER, ANYWAY. SHE IS PROBABLY DEAD BY NOW", + "HE JUST STARTED PLAYING CLASSICAL MUSIC, AND I COULDN'T STAND IT", // 20 "SINCE I'M PAYING HIM FOR PLAYING WHATEVER I WISH, I JUST FIRED HIM", "AND THEN, HE GOT FRESH WITH ME. JESUS!, HE LOOKED SO NICE AND INNOCENT...WHAT A HYPOCRITE!", @@ -4750,7 +5013,7 @@ const char *_textvb[][63] = { "IT'S TOO LATE NOW, YOU IDIOT!! IT ALWAYS IS", "I COULDN'T AGREE MORE", "ME, SCARED?", - "LISTEN HERE, DUDE. YOU'RE RIGHT NOW TALKING TO THE ONLY PERSON WHO KNOWS THE SECRET TO FIGHT AGAINST THE VAMPIRE", + "LISTEN HERE, DUDE. YOU'RE TALKING TO THE ONLY PERSON WHO KNOWS THE SECRET OF HOW TO FIGHT AGAINST THE VAMPIRE", "YOU NEED TO HAVE SPECIAL SKILLS TO FIGHT AGAINST A VAMPIRE. NOT EVERYBODY CAN DO IT", // 10 "YOU DON'T HAVE THEM", @@ -4765,7 +5028,7 @@ const char *_textvb[][63] = { "ALL RIGHT. LET'S GET TO IT", "YOU ARE USELESS. YOU SEE...?, JUST LIKE THE REST!!", // 20 - "JUST GIVE ME NOW THE MONEY YOU LOST AND GET OUT OF HERE", + "JUST GIVE ME THE MONEY, YOU LOST SO GET OUT OF HERE", "AND DON'T COME BACK UNTIL YOU ARE ABSOLUTELY READY", "WHAT DO YOU WANT NOW?", "I HAVE TO ADMIT IT. YOU REALLY GOT WHAT IT TAKES TO FIGHT AGAINST THE VAMPIRES", @@ -4774,38 +5037,38 @@ const char *_textvb[][63] = { "LEAVE ME ALONE NOW, I WANT TO GET SOME SLEEP", "WHENEVER YOU ARE READY TO FIGHT AGAINST THE VAMPIRES, JUST COME BACK AND I'LL HELP YOU OUT", "OH, THAT'S EASY. JUST USING THE LIGHT OF ONE CRUCIFIX IS ENOUGH TO DESTROY HIM", - "YOU HAVE TO BE EXTRA CAREFUL WITH DRASCULA, HIS FRISISNOTICS POWERS HAVE MADE OF HIM THE MOST POWERFUL VAMPIRE", - "YOU'D BE LOST IF IT WASN'T FOR THEY...", + "YOU HAVE TO BE EXTRA CAREFUL WITH DRASCULA, HIS FRISISNOTIC POWERS HAVE MADE OF HIM THE MOST POWERFUL VAMPIRE", + "YOU'D BE LOST IF IT WASN'T FOR THEM...", // 30 "...BREW!", "YEAH, YOU'RE RIGHT! I MIGHT HAVE SOME PROBLEMS WITH MY BACK IN THE FUTURE IF I KEEP ON SLEEPING THIS WAY", "I UNDERSTAND HE WAS A BETTER OPPONENT THAN ME, BUT YOU HAVE TO ADMIT THAT THE DISCOVERY I MADE ABOUT ANTI-VAMPIRE TECHNIQUES WAS WHAT ACTUALLY PROTECTED ME", - "I'VE FOUND THIS IMMUNIZING BREW THAT KEEPS YOU SAFE FROM ANY VAMPIRES' BITE OR AGAINST HIS FRISISNOTICS POWERS", + "I'VE FOUND THIS IMMUNIZING BREW THAT KEEPS YOU SAFE FROM ANY VAMPIRES' BITE OR AGAINST HIS FRISISNOTIC POWERS", "NO, NO, EXCUSE ME. I HAD IT ONCE BUT IT'S VERY DANGEROUS TO HAVE A BREW OF THAT TYPE. CAN YOU IMAGINE WHAT COULD HAPPEN IF A VAMPIRE GOT IT?", // 35 - "HE'D BE IMMUNIZED AGAINST GARLIC, THE SUNSHINE LIGHT... SO I HAD TO GET RID OF WHAT I DIN'T USE BY THE SCIENTIFIC METHOD OF THROWING IT IN THE LAVATORY", + "HE'D BE IMMUNIZED AGAINST GARLIC, AND THE SUNSLIGHT... SO I HAD TO GET RID OF WHAT I DIDN'T USE BY THE SCIENTIFIC METHOD OF THROWING IT IN THE LAVATORY", "DON'T WORRY, I REMEMBER EXACTLY HOW TO MAKE THAT BREW", - "I NEED GARLIC, BUT I ALREADY HAVE THEM. HOWEVER YOU'LL HAVE TO GET ME SOME WAX, BUBBLE GUM AND CIGARETTE PAPER OR PERHAPS A NAPKING OR SOMETHING ALIKE", + "I NEED GARLIC, BUT I ALREADY HAVE THAT. HOWEVER YOU'LL HAVE TO GET ME SOME WAX, BUBBLE GUM AND CIGARETTE PAPER OR PERHAPS A NAPKIN OR SOMETHING ALIKE", "OH...AND OF COURSE THE MOST IMPORTANT INGREDIENT. LEAVES FROM A VERY STRANGE PLANT CALLED FERNAN", - "IT'S A CLIMBING PLANT WHICH LEAVES HAVE MAGIC POWERS IF THEY'RE CUT WITH A GOLDEN SICKLE", + "IT'S A CLIMBING PLANT WHOSE LEAVES HAVE MAGIC POWERS IF THEY'RE CUT WITH A GOLDEN SICKLE", // 40 - "SO THAT AS SOON AS YOU HAVE THESE FIVE THINGS, JUST COME HERE AND I'LL MAKE THE BREW", + "SO AS SOON AS YOU HAVE THESE FIVE THINGS, JUST COME HERE AND I'LL MAKE THE BREW", "YOU'LL BE READY THEN TO FIGHT AGAINST DRASCULA", - "REMEMBER: WAX, NICOTINE, A PIECE OF BUBBLE GUM, A PAPER AND SOME FERNAN'S LEAVES CUT WITH A GOLDEN SICKLE", - "I TOLD YOU! IT WAS JUST BECAUSE OF THE BREW!", - "OH, ALL RIGHT. I'M GOING TO MAKE MYSELF A...THE BREW. JUST A MOMENT, OK?", + "REMEMBER: WAX, NICOTINE, A PIECE OF BUBBLE GUM, PAPER AND SOME FERNAN'S LEAVES CUT WITH A GOLDEN SICKLE", + "I TOLD YOU! IT WAS BECAUSE OF THE BREW!", + "OH, ALL RIGHT. I'M GOING TO MAKE MYSELF ...THE BREW. JUST A MOMENT, OK?", // 45 "IT'S A PROTECTING SPELL AGAINST VAMPIRES", - "I PUT IT THERE IN ORDER TO PRETEND THAT THE SKETCHER DIDN'T FORGET TO DRAW THE WINDOW YOU CAN SEE FROM OUTSIDE", + "I PUT IT THERE IN ORDER TO PRETEND THE ARTIST DIDN'T FORGET TO DRAW THE WINDOW YOU CAN SEE FROM OUTSIDE", "ALL RIGHT, THE FIRST THING YOU MUST KNOW IS THE WAY TO DRASCULA'S CASTLE", - "THERE IS A CAVERN THAT GETS YOU STRAIGHT FROM THE CASTLE. IGOR, THE CRAZY ELVIS' FUN, TAKES IT TO GET TO THE VILLAGE EACH MORNING", + "THERE IS A CAVERN THAT GETS YOU STRAIGHT FROM THE CASTLE. IGOR, THE CRAZY SERVANT', TAKES IT TO GET TO THE VILLAGE EACH MORNING", "BE CAREFUL THOUGH, THERE IS A VAMPIRE ALWAYS WATCHING OVER IT. YOU'LL HAVE TO GET RID OF HIM", // 50 "THERE IS AN OLD WELL RIGHT BY THE CEMETERY CHURCH", "IT WAS USED A LONG TIME AGO FOR WITCHCRAFT TRIALS", "THEY THREW THE WITCHES IN THE WELL. IF THEY DROWNED THEY WERE REAL WITCHES. IF THEY DIDN'T, THEY WEREN'T", "WE THREW ONE ONCE AND SHE DIDN'T DROWN, I GUESS SHE WASN'T A WITCH", - "ANYWAY. THERE IS YOUR BREW. HOWEVER, I ONLY GOT TO MAKE ENOUGH JUST FOR ONE PERSON", + "ANYWAY. THERE IS YOUR BREW. HOWEVER, I ONLY GOT TO MAKE ENOUGH FOR ONE PERSON", // 55 "YOU'D BETTER SMOKE IT RIGHT BEFORE YOU FIGHT AGAINST DRASCULA", "COME ON, RUN!", @@ -4813,9 +5076,9 @@ const char *_textvb[][63] = { "ARE YOU JOHN HACKER? I'M DOCTOR VON BRAUN", "LISTEN TO ME, THIS IS VERY IMPORTANT. IT'S ABOUT THE BREW", // 60 - "SHUT UP AND LET ME TALK. I JUST FOUND THIS BOOK ABOUT ANTI-VAMPIRE BREWS WARNING AGAINST MIXING THE JOINT WITH ANY ALCOHOLIC DRINK BEFORE YOU", - "ALCOHOL REACTS WHEN MIXED WITH BREW, SO THAT IT CANCELS OUT ITS EFFECTS JUST IN A FEW SECONDS", - "I'M SORRY, BUT I HAVE TO HANG UP RIGHT NOW. THE POLICE IS LOOKING FOR ME, THEY THINK I'M A PUSHER. STUPIDS!. ANYWAY, BYE AND GOOD LUCK SAVING THE WORLD!", + "SHUT UP AND LET ME TALK. I JUST FOUND THIS BOOK ABOUT ANTI-VAMPIRE BREWS WARNING AGAINST MIXING THE CIGARETTE WITH ANY ALCOHOLIC DRINK BEFORE YOU", + "ALCOHOL REACTS WHEN MIXED WITH BREW, SO THAT IT CANCELS OUT ITS EFFECTS IN A FEW SECONDS", + "I'M SORRY, BUT I HAVE TO HANG UP RIGHT NOW. THE POLICE ARE LOOKING FOR ME, THEY THINK I'M A DRUG PUSHER. IDIOTS!. ANYWAY, BYE AND GOOD LUCK SAVING THE WORLD!", }, { // 0 @@ -5169,10 +5432,10 @@ const char *_textsys[][4] = { const char *_texthis[][5] = { { "", - "A long time ago, it seems that Drascula killed Von Braun's wife, and then, as he intended to face the count, Von Braun started to investigate all he found vampires.", + "A long time ago, it seems that Drascula killed Von Braun's wife, and then, as he intended to face the count, Von Braun started to research all he could find on vampires.", "When he thought he was ready, he came up to the castle and had a very violent encounter with Drascula.", "Nobody knows exactly what happened there. Although Von Braun lost, Drascula could not kill him.", - "Von Braun felt humiliated by his defect, run away from the castle and has never dared to face Drascula ever again.", + "Von Braun felt humiliated by his defeat, he run away from the castle and has never dared to face Drascula again.", }, { "", @@ -5301,7 +5564,7 @@ const char *_textverbs[][6] = { }, { "mirar", - "cogar", + "coger", "abrir", "cerrar", "hablar", @@ -5358,3 +5621,5 @@ const char *_textmisc[][2] = { }; } // End of namespace Drascula + +#endif /* STATICDATA_H */ diff --git a/engines/drascula/talk.cpp b/engines/drascula/talk.cpp index d6f393aa2a..40c5d4a1ab 100644 --- a/engines/drascula/talk.cpp +++ b/engines/drascula/talk.cpp @@ -28,438 +28,317 @@ namespace Drascula { void DrasculaEngine::talkInit(const char *filename) { - if (hay_sb == 1) { - sku = new Common::File; - sku->open(filename); - if (!sku->isOpen()) { - error("no puedo abrir archivo de voz"); - } - ctvd_init(2); - ctvd_speaker(1); - ctvd_output(sku); - } -} - -void DrasculaEngine::talk_igor_dch(const char *said, const char *filename) { - int x_talk[8] = { 56, 82, 108, 134, 160, 186, 212, 238 }; - int cara; - int length = strlen(said); - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - color_abc(WHITE); - - talkInit(filename); - -bucless: - - cara = _rnd->getRandomNumber(7); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); - - pon_igor(); - pon_dr(); - copyBackground(x_igor + 17, y_igor, x_igor + 17, y_igor, 37, 24, dir_dibujo1, dir_zona_pantalla); - - copyRect(x_talk[cara], 148, x_igor + 17, y_igor, 25, 24, dir_hare_frente, dir_zona_pantalla); - - updateRefresh(); - - if (withVoices == 0) - centra_texto(said, x_igor + 26, y_igor); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - pause(3); + if (hay_sb == 1) + playFile(filename); +} - byte key = getscan(); - if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) - term_int = 1; +bool DrasculaEngine::isTalkFinished(int* length) { + byte key = getScan(); if (key != 0) - ctvd_stop(); + stopSound(); if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); + if (soundIsActive()) + return false; } else { length -= 2; if (length > 0) - goto bucless; + return false; } - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - pon_igor(); - pon_dr(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + return true; } -void DrasculaEngine::talk_dr_izq(const char *said, const char *filename) { - int x_talk[8] = { 1, 40, 79, 118, 157, 196, 235, 274 }; - int cara; +// talker types: +// 0: talk_igor_dch +// 1: talk_igor_front +// 2: talk_igor_door +// 3: talk_igor_seated +// 4: talk_igor_wig +void DrasculaEngine::talk_igor(int index, int talkerType) { + char filename[20]; + sprintf(filename, "I%i.als", index); + const char *said = _texti[_lang][index]; + int x_talk0[8] = { 56, 82, 108, 134, 160, 186, 212, 238 }; + int x_talk1[8] = { 56, 86, 116, 146, 176, 206, 236, 266 }; + int x_talk3[4] = { 80, 102, 124, 146 }; + int x_talk4[4] = { 119, 158, 197, 236 }; + int face; int length = strlen(said); - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - color_abc(RED); + color_abc(kColorWhite); talkInit(filename); -bucless: - - cara = _rnd->getRandomNumber(7); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); - - pon_igor(); - pon_dr(); - if (num_ejec == 6) - pon_hare(); - - copyBackground(x_dr, y_dr, x_dr, y_dr, 38, 31, dir_dibujo1, dir_zona_pantalla); - if (num_ejec == 6) - copyRect(x_talk[cara], 90, x_dr, y_dr, 38, 31, dir_dibujo2, dir_zona_pantalla); - else - copyRect(x_talk[cara], 90, x_dr, y_dr, 38, 31, dir_hare_fondo, dir_zona_pantalla); - - updateRefresh(); - - if (withVoices == 0) - centra_texto(said, x_dr + 19, y_dr); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - pause(3); + do { + if (talkerType == 0 || talkerType == 1) { + face = _rnd->getRandomNumber(7); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + updateRefresh_pre(); + } else if (talkerType == 3 || talkerType == 4) { + face = _rnd->getRandomNumber(3); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + updateRefresh_pre(); + } + + if (talkerType == 0) { + placeIgor(); + placeDrascula(); + copyBackground(igorX + 17, igorY, igorX + 17, igorY, 37, 24, drawSurface1, screenSurface); + copyRect(x_talk0[face], 148, igorX + 17, igorY, 25, 24, frontSurface, screenSurface); + updateRefresh(); + if (withVoices == 0) + centerText(said, igorX + 26, igorY); + updateScreen(); + pause(3); + } else if (talkerType == 1) { + if (currentChapter == 1 || currentChapter == 4) + placeIgor(); + if (currentChapter == 1) + placeDrascula(); + if (currentChapter == 1 || currentChapter == 6) + copyBackground(igorX, igorY, igorX, igorY, 29, 25, drawSurface1, screenSurface); + copyRect(x_talk1[face], 173, igorX, igorY, 29, 25, frontSurface, screenSurface); + updateRefresh(); + if (withVoices == 0) + centerText(said, igorX + 26, igorY); + updateScreen(); + pause(3); + } else if (talkerType == 2) { + updateRoom(); + if (withVoices == 0) + centerText(said, 87, 66); + updateScreen(); + } else if (talkerType == 3) { + copyBackground(x_talk3[face], 109, 207, 92, 21, 23, drawSurface3, screenSurface); + pon_hare(); + updateRefresh(); + if (withVoices == 0) + centerText(said, 221, 102); + + updateScreen(); + pause(3); + } else if (talkerType == 4) { + copyBackground(x_talk4[face], 78, 199, 94, 38, 27, drawSurface3, screenSurface); + pon_hare(); + updateRefresh(); + if (withVoices == 0) + centerText(said, 221, 102); + + updateScreen(); + pause(3); + } + } while (!isTalkFinished(&length)); - byte key = getscan(); - if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) - term_int = 1; - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; + if ((talkerType == 1 && currentChapter == 6) || + talkerType == 2 || talkerType == 3 || talkerType == 4) { + updateRoom(); } - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - pon_igor(); - pon_dr(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (talkerType == 0 || (talkerType == 1 && currentChapter == 1)) { + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + placeIgor(); + placeDrascula(); + } + updateScreen(); } -void DrasculaEngine::talk_dr_dch(const char *said, const char *filename) { +// Talker type 0: talk_dr_izq, 1: talk_dr_dch +void DrasculaEngine::talk_drascula(int index, int talkerType) { + const char *said = _textd[_lang][index]; + char filename[20]; + sprintf(filename, "d%i.als", index); int x_talk[8] = { 1, 40, 79, 118, 157, 196, 235, 274 }; - int cara; + int face; int length = strlen(said); + int offset = (talkerType == 0) ? 0 : 7; + int offset2 = (talkerType == 0) ? 90 : 58; - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - color_abc(RED); + color_abc(kColorRed); talkInit(filename); -bucless: + do { + face = _rnd->getRandomNumber(7); - cara = _rnd->getRandomNumber(7); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateRefresh_pre(); + updateRefresh_pre(); - pon_igor(); - pon_dr(); - if (num_ejec == 6) - pon_hare(); + placeIgor(); + placeDrascula(); + if (currentChapter == 6) + pon_hare(); - copyBackground(x_dr, y_dr, x_dr, y_dr, 45, 31, dir_dibujo1, dir_zona_pantalla); - if (num_ejec != 6) - copyRect(x_talk[cara], 58, x_dr + 7, y_dr, 38, 31, dir_hare_fondo, dir_zona_pantalla); - else - copyRect(x_talk[cara], 58, x_dr + 7, y_dr, 38, 31, dir_dibujo2, dir_zona_pantalla); + copyBackground(x_dr, y_dr, x_dr, y_dr, 38 + offset, 31, drawSurface1, screenSurface); + if (currentChapter == 6) + copyRect(x_talk[face], offset2, x_dr + offset, y_dr, 38, 31, drawSurface2, screenSurface); + else + copyRect(x_talk[face], offset2, x_dr + offset, y_dr, 38, 31, backSurface, screenSurface); - updateRefresh(); + updateRefresh(); - if (withVoices == 0) - centra_texto(said, x_dr + 19, y_dr); + if (withVoices == 0) + centerText(said, x_dr + 19, y_dr); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); - pause(3); + pause(3); - byte key = getscan(); - if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) - term_int = 1; - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } + } while (!isTalkFinished(&length)); + + if (talkerType == 0) + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + + if (talkerType == 1 && currentChapter == 6) + updateRoom(); - if (num_ejec == 6) - updateRoom(); + placeIgor(); + placeDrascula(); - pon_igor(); - pon_dr(); - if (num_ejec == 6) + if (talkerType == 1 && currentChapter == 6) pon_hare(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + + updateScreen(); } void DrasculaEngine::talk_solo(const char *said, const char *filename) { int length = strlen(said); - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - if (num_ejec == 1) + if (currentChapter == 1) color_abc(color_solo); - else if (num_ejec == 4) - color_abc(RED); + else if (currentChapter == 4) + color_abc(kColorRed); talkInit(filename); - if (num_ejec == 6) - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - -bucless: - - if (withVoices == 0) { - if (num_ejec == 1) - centra_texto(said, 156, 90); - else if (num_ejec == 6) - centra_texto(said, 213, 72); - else if (num_ejec == 5) - centra_texto(said, 173, 92); - } - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (currentChapter == 6) + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + + do { + if (withVoices == 0) { + if (currentChapter == 1) + centerText(said, 156, 90); + else if (currentChapter == 6) + centerText(said, 213, 72); + else if (currentChapter == 5) + centerText(said, 173, 92); + } + updateScreen(); + } while (!isTalkFinished(&length)); - byte key = getscan(); - if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) - term_int = 1; - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } - if (num_ejec == 6) { - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (currentChapter == 6) { + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + updateScreen(); } } -void DrasculaEngine::talk_igor_frente(const char *said, const char *filename) { - int x_talk[8] = { 56, 86, 116, 146, 176, 206, 236, 266 }; - int cara; - int length = strlen(said); - - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - color_abc(WHITE); - - talkInit(filename); - -bucless: - - cara = _rnd->getRandomNumber(7); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); - - if (num_ejec == 1 || num_ejec == 4) - pon_igor(); - if (num_ejec == 1) - pon_dr(); - if (num_ejec == 1 || num_ejec == 6) - copyBackground(x_igor, y_igor, x_igor, y_igor, 29, 25, dir_dibujo1, dir_zona_pantalla); - copyRect(x_talk[cara], 173, x_igor, y_igor, 29, 25, dir_hare_frente, dir_zona_pantalla); - - updateRefresh(); - - if (withVoices == 0) - centra_texto(said, x_igor + 26, y_igor); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - pause(3); - - byte key = getscan(); - if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) - term_int = 1; - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } - - if (num_ejec == 6) { - updateRoom(); - } +void DrasculaEngine::talk_bartender(int index, int talkerType) { + char filename[20]; + sprintf(filename, "t%i.als", index); + const char *said; - if (num_ejec == 1) { - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - pon_igor(); - pon_dr(); + // Line 82 is a special case + if (index != 82) + said = _textt[_lang][index]; + else { + sprintf(filename, "d%i.als", index); + said = _textd[_lang][index]; } - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); -} -void DrasculaEngine::talk_tabernero(const char *said, const char *filename) { int x_talk[9] = { 1, 23, 45, 67, 89, 111, 133, 155, 177 }; - int cara; + int face; int length = strlen(said); - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - color_abc(MAROON); + color_abc(kColorMaroon); talkInit(filename); -bucless: - - if (num_ejec == 1) { - if (musicStatus() == 0) - playMusic(roomMusic); - } else if (num_ejec == 2) { - if (musicStatus() == 0 && flags[11] == 0 && roomMusic != 0) - playMusic(roomMusic); - } - - cara = _rnd->getRandomNumber(8); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + do { + if (talkerType == 0) { + if (currentChapter == 1) { + if (musicStatus() == 0) + playMusic(roomMusic); + } else if (currentChapter == 2) { + if (musicStatus() == 0 && flags[11] == 0 && roomMusic != 0) + playMusic(roomMusic); + } + + face = _rnd->getRandomNumber(8); + } else { + face = _rnd->getRandomNumber(5); + } - updateRefresh_pre(); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); - copyBackground(x_talk[cara], 2, 121, 44, 21, 24, dir_hare_dch, dir_zona_pantalla); - pon_hare(); - updateRefresh(); + updateRefresh_pre(); - if (withVoices == 0) - centra_texto(said, 132, 45); + if (talkerType == 0) + copyBackground(x_talk[face], 2, 121, 44, 21, 24, extraSurface, screenSurface); + else + copyBackground(x_talk[face], 130, 151, 43, 21, 24, drawSurface3, screenSurface); + pon_hare(); + updateRefresh(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (withVoices == 0) + centerText(said, 132, 45); - pause(3); + updateScreen(); - byte key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete(sku); - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } + pause(3); + } while (!isTalkFinished(&length)); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); } void DrasculaEngine::talk_bj(int index) { - char name[20]; - sprintf(name, "BJ%i.als", index); - talk_bj(_textbj[_lang][index], name); -} - -void DrasculaEngine::talk_bj(const char *said, const char *filename) { + char filename[20]; + sprintf(filename, "BJ%i.als", index); + const char *said = _textbj[_lang][index]; int x_talk[5] = { 64, 92, 120, 148, 176 }; - int cara; + int face; int length = strlen(said); - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - color_abc(WHITE); + color_abc(kColorWhite); talkInit(filename); -bucless: - if (num_ejec != 5) { - cara = _rnd->getRandomNumber(4); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + do { + if (currentChapter != 5) { + face = _rnd->getRandomNumber(4); - updateRefresh_pre(); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); - copyBackground(x_bj + 2, y_bj - 1, x_bj + 2, y_bj - 1, 27, 40, - dir_dibujo1, dir_zona_pantalla); + updateRefresh_pre(); - copyRect(x_talk[cara], 99, x_bj + 2, y_bj - 1, 27, 40, - dir_dibujo3, dir_zona_pantalla); - pon_hare(); - updateRefresh(); + copyBackground(x_bj + 2, y_bj - 1, x_bj + 2, y_bj - 1, 27, 40, + drawSurface1, screenSurface); - if (withVoices == 0) - centra_texto(said, x_bj + 7, y_bj); + copyRect(x_talk[face], 99, x_bj + 2, y_bj - 1, 27, 40, + drawSurface3, screenSurface); + pon_hare(); + updateRefresh(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (withVoices == 0) + centerText(said, x_bj + 7, y_bj); - pause(3); - } else { - updateRoom(); + updateScreen(); - if (withVoices == 0) - centra_texto(said, 93, 80); + pause(3); + } else { + updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - } + if (withVoices == 0) + centerText(said, 93, 80); - byte key = getscan(); - if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) - term_int = 1; - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } + updateScreen(); + } + } while (!isTalkFinished(&length)); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); } void DrasculaEngine::talk(int index) { @@ -470,842 +349,555 @@ void DrasculaEngine::talk(int index) { void DrasculaEngine::talk(const char *said, const char *filename) { int suma_1_pixel = 0; - if (num_ejec != 2) + if (currentChapter != 2) suma_1_pixel = 1; int y_mask_talk = 170; int x_talk_dch[6] = { 1, 25, 49, 73, 97, 121 }; int x_talk_izq[6] = { 145, 169, 193, 217, 241, 265 }; - int cara; + int face; int length = strlen(said); - if (num_ejec == 6) { + if (currentChapter == 6) { if (flags[0] == 0 && roomNumber == 102) { - talk_pen(said, filename); + talk_pen(said, filename, 0); return; } if (flags[0] == 0 && roomNumber == 58) { - talk_pen2(said, filename); + talk_pen(said, filename, 1); return; } } - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - if (num_ejec != 2) { + if (currentChapter != 2) { if (factor_red[hare_y + alto_hare] == 100) suma_1_pixel = 0; } - if (num_ejec == 4) { + if (currentChapter == 4) { if (roomNumber == 24 || flags[29] == 0) { - color_abc(YELLOW); + color_abc(kColorYellow); } } else { - color_abc(YELLOW); + color_abc(kColorYellow); } talkInit(filename); -bucless: + do { + face = _rnd->getRandomNumber(5); - cara = _rnd->getRandomNumber(5); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + updateRefresh_pre(); + if (currentChapter == 2) + copyBackground(hare_x, hare_y, OBJWIDTH + 1, 0, ancho_hare, talkHeight - 1, screenSurface, drawSurface3); + else + copyBackground(hare_x, hare_y, OBJWIDTH + 1, 0, (int)(((float)ancho_hare / 100) * factor_red[hare_y + alto_hare]), + (int)(((float)(talkHeight - 1) / 100) * factor_red[hare_y + alto_hare]), + screenSurface, drawSurface3); - updateRefresh_pre(); - if (num_ejec == 2) - copyBackground(hare_x, hare_y, OBJWIDTH + 1, 0, ancho_hare, alto_talk - 1, dir_zona_pantalla, dir_dibujo3); - else - copyBackground(hare_x, hare_y, OBJWIDTH + 1, 0, (int)(((float)ancho_hare / 100) * factor_red[hare_y + alto_hare]), - (int)(((float)(alto_talk - 1) / 100) * factor_red[hare_y + alto_hare]), - dir_zona_pantalla, dir_dibujo3); - - pon_hare(); - - if (num_ejec == 2) { - if (!strcmp(fondo_y_menu, "99.alg") || !strcmp(fondo_y_menu, "994.alg")) - copyBackground(OBJWIDTH + 1, 0, hare_x, hare_y, ancho_hare, alto_talk - 1, dir_dibujo3, dir_zona_pantalla); - } else { - copyBackground(OBJWIDTH + 1, 0, hare_x, hare_y, (int)(((float)ancho_hare / 100) * factor_red[hare_y + alto_hare]), - (int)(((float)(alto_talk - 1) / 100) * factor_red[hare_y + alto_hare]), - dir_dibujo3, dir_zona_pantalla); - } + pon_hare(); - if (sentido_hare == 0) { - if (num_ejec == 2) - copyRect(x_talk_izq[cara], y_mask_talk, hare_x + 8, hare_y - 1, ancho_talk, alto_talk, - dir_hare_dch, dir_zona_pantalla); - else - reduce_hare_chico(x_talk_izq[cara], y_mask_talk, hare_x + (int)((8.0f / 100) * factor_red[hare_y + alto_hare]), - hare_y, ancho_talk, alto_talk, factor_red[hare_y + alto_hare], - dir_hare_dch, dir_zona_pantalla); + if (currentChapter == 2) { + if (!strcmp(menuBackground, "99.alg") || !strcmp(menuBackground, "994.alg")) + copyBackground(OBJWIDTH + 1, 0, hare_x, hare_y, ancho_hare, talkHeight - 1, drawSurface3, screenSurface); + } else { + copyBackground(OBJWIDTH + 1, 0, hare_x, hare_y, (int)(((float)ancho_hare / 100) * factor_red[hare_y + alto_hare]), + (int)(((float)(talkHeight - 1) / 100) * factor_red[hare_y + alto_hare]), + drawSurface3, screenSurface); + } - updateRefresh(); - } else if (sentido_hare == 1) { - if (num_ejec == 2) - copyRect(x_talk_dch[cara], y_mask_talk, hare_x + 12, hare_y, ancho_talk, alto_talk, - dir_hare_dch, dir_zona_pantalla); - else - reduce_hare_chico(x_talk_dch[cara], y_mask_talk, hare_x + (int)((12.0f / 100) * factor_red[hare_y + alto_hare]), - hare_y, ancho_talk, alto_talk, factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); - updateRefresh(); - } else if (sentido_hare == 2) { - if (num_ejec == 2) - copyRect(x_talk_izq[cara], y_mask_talk, hare_x + 12, hare_y, ancho_talk, alto_talk, - dir_hare_frente, dir_zona_pantalla); - else - reduce_hare_chico(x_talk_izq[cara], y_mask_talk, + if (sentido_hare == 0) { + if (currentChapter == 2) + copyRect(x_talk_izq[face], y_mask_talk, hare_x + 8, hare_y - 1, talkWidth, talkHeight, + extraSurface, screenSurface); + else + reduce_hare_chico(x_talk_izq[face], y_mask_talk, hare_x + (int)((8.0f / 100) * factor_red[hare_y + alto_hare]), + hare_y, talkWidth, talkHeight, factor_red[hare_y + alto_hare], + extraSurface, screenSurface); + + updateRefresh(); + } else if (sentido_hare == 1) { + if (currentChapter == 2) + copyRect(x_talk_dch[face], y_mask_talk, hare_x + 12, hare_y, talkWidth, talkHeight, + extraSurface, screenSurface); + else + reduce_hare_chico(x_talk_dch[face], y_mask_talk, hare_x + (int)((12.0f / 100) * factor_red[hare_y + alto_hare]), + hare_y, talkWidth, talkHeight, factor_red[hare_y + alto_hare], extraSurface, screenSurface); + updateRefresh(); + } else if (sentido_hare == 2) { + if (currentChapter == 2) + copyRect(x_talk_izq[face], y_mask_talk, hare_x + 12, hare_y, talkWidth, talkHeight, + frontSurface, screenSurface); + else + reduce_hare_chico(x_talk_izq[face], y_mask_talk, suma_1_pixel + hare_x + (int)((12.0f / 100) * factor_red[hare_y + alto_hare]), - hare_y, ancho_talk, alto_talk, factor_red[hare_y + alto_hare], - dir_hare_frente, dir_zona_pantalla); - updateRefresh(); - } else if (sentido_hare == 3) { - if (num_ejec == 2) - copyRect(x_talk_dch[cara], y_mask_talk, hare_x + 8, hare_y, ancho_talk, alto_talk, - dir_hare_frente, dir_zona_pantalla); - else - reduce_hare_chico(x_talk_dch[cara], y_mask_talk, + hare_y, talkWidth, talkHeight, factor_red[hare_y + alto_hare], + frontSurface, screenSurface); + updateRefresh(); + } else if (sentido_hare == 3) { + if (currentChapter == 2) + copyRect(x_talk_dch[face], y_mask_talk, hare_x + 8, hare_y, talkWidth, talkHeight, + frontSurface, screenSurface); + else + reduce_hare_chico(x_talk_dch[face], y_mask_talk, suma_1_pixel + hare_x + (int)((8.0f / 100) * factor_red[hare_y + alto_hare]), - hare_y, ancho_talk,alto_talk, factor_red[hare_y + alto_hare], - dir_hare_frente, dir_zona_pantalla); - updateRefresh(); - } - - if (withVoices == 0) - centra_texto(said, hare_x, hare_y); + hare_y, talkWidth,talkHeight, factor_red[hare_y + alto_hare], + frontSurface, screenSurface); + updateRefresh(); + } - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (withVoices == 0) + centerText(said, hare_x, hare_y); - pause(3); + updateScreen(); - byte key = getscan(); - if (num_ejec == 1 && key == Common::KEYCODE_ESCAPE) - term_int = 1; - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } + pause(3); + } while (!isTalkFinished(&length)); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); - if (num_ejec == 1) { - if (musicStatus() == 0 && flags[11] == 0 && corta_musica == 0) + if (currentChapter == 1) { + if (musicStatus() == 0 && flags[11] == 0 && musicStopped == 0) playMusic(roomMusic); } } -void DrasculaEngine::talk_pianista(const char *said, const char *filename) { +void DrasculaEngine::talk_pianist(int index) { + char filename[20]; + sprintf(filename, "P%i.als", index); + const char* said = _textp[_lang][index]; int x_talk[4] = { 97, 145, 193, 241 }; - int cara; + int face; int length = strlen(said); - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - color_abc(WHITE); + color_abc(kColorWhite); talkInit(filename); -bucless: + do { + face = _rnd->getRandomNumber(3); - cara = _rnd->getRandomNumber(3); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); - - copyBackground(x_talk[cara], 139, 228, 112, 47, 60, - dir_hare_dch, dir_zona_pantalla); - pon_hare(); - updateRefresh(); + updateRefresh_pre(); - if (withVoices == 0) - centra_texto(said, 221, 128); + copyBackground(x_talk[face], 139, 228, 112, 47, 60, + extraSurface, screenSurface); + pon_hare(); + updateRefresh(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (withVoices == 0) + centerText(said, 221, 128); - pause(3); + updateScreen(); - byte key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } + pause(3); + } while (!isTalkFinished(&length)); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); } -void DrasculaEngine::talk_borracho(const char *said, const char *filename) { +void DrasculaEngine::talk_drunk(int index) { + char filename[20]; + sprintf(filename, "B%i.als", index); + const char *said = _textb[_lang][index]; int x_talk[8] = { 1, 21, 41, 61, 81, 101, 121, 141 }; - int cara; + int face; int length = strlen(said); - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - if (num_ejec == 1) { - loadPic("an11y13.alg"); - decompressPic(dir_hare_frente, 1); + if (currentChapter == 1) { + loadPic("an11y13.alg", frontSurface, 1); } flags[13] = 1; -bebiendo: - - if (flags[12] == 1) { + while (flags[12] == 1) { updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - goto bebiendo; + updateScreen(); } - color_abc(DARK_GREEN); + color_abc(kColorDarkGreen); talkInit(filename); -bucless: + do { + face = _rnd->getRandomNumber(7); - cara = _rnd->getRandomNumber(7); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); - - copyBackground(x_talk[cara], 29, 177, 50, 19, 19, dir_hare_frente, dir_zona_pantalla); - pon_hare(); - updateRefresh(); + updateRefresh_pre(); - if (withVoices == 0) - centra_texto(said, 181, 54); + copyBackground(x_talk[face], 29, 177, 50, 19, 19, frontSurface, screenSurface); + pon_hare(); + updateRefresh(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (withVoices == 0) + centerText(said, 181, 54); - pause(3); + updateScreen(); - byte key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } + pause(3); + } while (!isTalkFinished(&length)); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); flags[13] = 0; - if (num_ejec == 1) { - loadPic("96.alg"); - decompressPic(dir_hare_frente, 1); + if (currentChapter == 1) { + loadPic("96.alg", frontSurface, 1); } - if (num_ejec == 1) { + if (currentChapter == 1) { if (musicStatus() == 0 && flags[11] == 0) playMusic(roomMusic); - } else if (num_ejec == 2) { + } else if (currentChapter == 2) { if (musicStatus() == 0 && flags[11] == 0 && roomMusic != 0) playMusic(roomMusic); } } void DrasculaEngine::talk_vb(int index) { - char name[20]; - sprintf(name, "VB%i.als", index); - talk_vb(_textvb[_lang][index], name); -} - -void DrasculaEngine::talk_vb(const char *said, const char *filename) { + char filename[20]; + sprintf(filename, "VB%i.als", index); + const char *said = _textvb[_lang][index]; int x_talk[6] = {1, 27, 53, 79, 105, 131}; - int cara; + int face; int length = strlen(said); - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - color_abc(VON_BRAUN); + color_abc(kColorBrown); talkInit(filename); - copyBackground(vb_x + 5, 64, OBJWIDTH + 1, 0, 25, 27, dir_dibujo1, dir_dibujo3); - -bucless: + copyBackground(vb_x + 5, 64, OBJWIDTH + 1, 0, 25, 27, drawSurface1, drawSurface3); - if (sentido_vb == 1) { - cara = _rnd->getRandomNumber(5); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + do { + if (sentido_vb == 1) { + face = _rnd->getRandomNumber(5); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); - pon_hare(); - pon_vb(); - - copyBackground(OBJWIDTH + 1, 0, vb_x + 5, 64, 25, 27, dir_dibujo3, dir_zona_pantalla); - copyRect(x_talk[cara], 34, vb_x + 5, 64, 25, 27, dir_hare_frente, dir_zona_pantalla); - updateRefresh(); - } + pon_hare(); + pon_vb(); - if (withVoices == 0) - centra_texto(said, vb_x, 66); + copyBackground(OBJWIDTH + 1, 0, vb_x + 5, 64, 25, 27, drawSurface3, screenSurface); + copyRect(x_talk[face], 34, vb_x + 5, 64, 25, 27, frontSurface, screenSurface); + updateRefresh(); + } - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (withVoices == 0) + centerText(said, vb_x, 66); - pause(3); + updateScreen(); - int key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } + pause(3); + } while (!isTalkFinished(&length)); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); if (musicStatus() == 0 && flags[11] == 0 && roomMusic != 0) playMusic(roomMusic); } void DrasculaEngine::talk_vbpuerta(int index) { - char name[20]; - sprintf(name, "VB%i.als", index); - talk_vb(_textvb[_lang][index], name); -} - -void DrasculaEngine::talk_vbpuerta(const char *said, const char *filename) { + char filename[20]; + sprintf(filename, "VB%i.als", index); + const char *said = _textvb[_lang][index]; int length = strlen(said); - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - color_abc(VON_BRAUN); + color_abc(kColorBrown); talkInit(filename); -bucless: + do { + updateRoom(); - updateRoom(); - if (withVoices == 0) - centra_texto(said, 150, 80); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (withVoices == 0) + centerText(said, 150, 80); - int key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } + updateScreen(); + } while (!isTalkFinished(&length)); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); if (musicStatus() == 0 && flags[11] == 0 && roomMusic != 0) playMusic(roomMusic); } -void DrasculaEngine::talk_ciego(const char *said, const char *filename, const char *sincronia) { - byte *num_cara; +void DrasculaEngine::talk_blind(int index) { + // Special case: a second array is used for sync here + // Also, the blind man's texts in the first array and his + // voice files start from 58, not 1 + char filename[20]; + sprintf(filename, "d%i.als", index + TEXTD_START - 1); + const char *said = _textd[_lang][index + TEXTD_START - 1]; + const char *sincronia = _textd1[_lang][index - 1]; + + byte *faceBuffer; int p = 0; - int pos_ciego[6]; + int pos_blind[6]; int length = strlen(said); - color_abc(VON_BRAUN); + color_abc(kColorBrown); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + updateScreen(); talkInit(filename); - pos_ciego[1] = 2; - pos_ciego[2] = 73; - pos_ciego[3] = 1; - pos_ciego[4] = 126; - pos_ciego[5] = 149; - -bucless: - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - pos_ciego[5] = 149; - char c = toupper(sincronia[p]); - - if (c == '0' || c == '2' || c == '4' || c == '6') - pos_ciego[0] = 1; - else - pos_ciego[0] = 132; - - if (c == '0') - num_cara = dir_dibujo3; - else if (c == '1') - num_cara = dir_dibujo3; - else if (c == '2') - num_cara = dir_hare_dch; - else if (c == '3') - num_cara = dir_hare_dch; - else if (c == '4') - num_cara = dir_hare_fondo; - else if (c == '5') - num_cara = dir_hare_fondo; - else { - num_cara = dir_hare_frente; - pos_ciego[5] = 146; - } + pos_blind[1] = 2; + pos_blind[2] = 73; + pos_blind[3] = 1; + pos_blind[4] = 126; + pos_blind[5] = 149; - copyRectClip( pos_ciego, num_cara, dir_zona_pantalla); + do { + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + pos_blind[5] = 149; + char c = toupper(sincronia[p]); - if (withVoices == 0) - centra_texto(said, 310, 71); + if (c == '0' || c == '2' || c == '4' || c == '6') + pos_blind[0] = 1; + else + pos_blind[0] = 132; + + if (c == '0' || c == '1') + faceBuffer = drawSurface3; + else if (c == '2' || c == '3') + faceBuffer = extraSurface; + else if (c == '4' || c == '5') + faceBuffer = backSurface; + else { + faceBuffer = frontSurface; + pos_blind[5] = 146; + } - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - pause(2); - p++; + copyRectClip( pos_blind, faceBuffer, screenSurface); - int key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } + if (withVoices == 0) + centerText(said, 310, 71); + + updateScreen(); + pause(2); + p++; + } while (!isTalkFinished(&length)); } void DrasculaEngine::talk_hacker(const char *said, const char *filename) { int length = strlen(said); - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + updateScreen(); - color_abc(YELLOW); + color_abc(kColorYellow); talkInit(filename); -bucless: - if (withVoices == 0) - centra_texto(said, 156, 170); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - int key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } - - key = 0; + do { + if (withVoices == 0) + centerText(said, 156, 170); + updateScreen(); + } while (!isTalkFinished(&length)); } -void DrasculaEngine::talk_lobo(const char *said, const char *filename) { +void DrasculaEngine::talk_wolf(int index) { + char filename[20]; + sprintf(filename, "L%i.als", index); + const char *said = _textl[_lang][index]; int x_talk[9] = {52, 79, 106, 133, 160, 187, 214, 241, 268}; - int cara; + int face; int length = strlen(said); - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - color_abc(RED); + color_abc(kColorRed); talkInit(filename); -bucless: - - cara = _rnd->getRandomNumber(8); + do { + face = _rnd->getRandomNumber(8); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); - updateRefresh_pre(); - - copyBackground(x_talk[cara], 136, 198, 81, 26, 24, dir_dibujo3, dir_zona_pantalla); - pon_hare(); - updateRefresh(); + updateRefresh_pre(); - if (withVoices == 0) - centra_texto(said, 203, 78); + copyBackground(x_talk[face], 136, 198, 81, 26, 24, drawSurface3, screenSurface); + pon_hare(); + updateRefresh(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (withVoices == 0) + centerText(said, 203, 78); - pause(3); + updateScreen(); - int key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } + pause(3); + } while (!isTalkFinished(&length)); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); } -void DrasculaEngine::talk_mus(const char *said, const char *filename) { +void DrasculaEngine::talk_mus(int index) { + char filename[20]; + sprintf(filename, "E%i.als", index); + const char *said = _texte[_lang][index]; int x_talk[8] = { 16, 35, 54, 73, 92, 111, 130, 149}; - int cara; + int face; int length = strlen(said); - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - color_abc(WHITE); + color_abc(kColorWhite); talkInit(filename); -bucless: - - cara = _rnd->getRandomNumber(7); + do { + face = _rnd->getRandomNumber(7); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); - updateRefresh_pre(); + updateRefresh_pre(); - copyBackground(x_talk[cara], 156, 190, 64, 18, 24, dir_dibujo3, dir_zona_pantalla); - pon_hare(); - updateRefresh(); + copyBackground(x_talk[face], 156, 190, 64, 18, 24, drawSurface3, screenSurface); + pon_hare(); + updateRefresh(); - if (withVoices == 0) - centra_texto(said, 197, 64); + if (withVoices == 0) + centerText(said, 197, 64); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); - pause(3); + pause(3); - int key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } + } while (!isTalkFinished(&length)); updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); } -void DrasculaEngine::talk_pen(const char *said, const char *filename) { +void DrasculaEngine::talk_pen(const char *said, const char *filename, int talkerType) { int x_talk[8] = {112, 138, 164, 190, 216, 242, 268, 294}; - int cara; + int x_talk2[5] = {122, 148, 174, 200, 226}; + int face; int length = strlen(said); flags[1] = 1; - updateRoom(); - copyRect(44, 145, 145, 105, 25, 29, dir_dibujo3, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - color_abc(YELLOW); - - talkInit(filename); - -bucless: - - cara = _rnd->getRandomNumber(7); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); - - copyRect(x_talk[cara], 145, 145, 105, 25, 29, dir_dibujo3, dir_zona_pantalla); - - updateRefresh(); - - if (withVoices == 0) - centra_texto(said, 160, 105); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - pause(3); - - int key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; + if (talkerType == 0) { + updateRoom(); + copyRect(44, 145, 145, 105, 25, 29, drawSurface3, screenSurface); + updateScreen(); } - flags[1] = 0; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateRefresh_pre(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); -} - -void DrasculaEngine::talk_pen2(const char *said, const char *filename) { - int x_talk[5]={122, 148, 174, 200, 226}; - int cara; - int length = strlen(said); - - flags[1] = 1; - - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - color_abc(YELLOW); + color_abc(kColorYellow); talkInit(filename); -bucless: - - cara = _rnd->getRandomNumber(4); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); + do { + if (talkerType == 0) + face = _rnd->getRandomNumber(7); + else + face = _rnd->getRandomNumber(4); - copyBackground(x_talk[cara], 171, 173, 116, 25, 28, dir_dibujo3, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + updateRefresh_pre(); - updateRefresh(); + if (talkerType == 0) + copyRect(x_talk[face], 145, 145, 105, 25, 29, drawSurface3, screenSurface); + else + copyBackground(x_talk2[face], 171, 173, 116, 25, 28, drawSurface3, screenSurface); - if (withVoices == 0) - centra_texto(said, 195, 107); + updateRefresh(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (withVoices == 0) { + if (talkerType == 0) + centerText(said, 160, 105); + else + centerText(said, 195, 107); + } - pause(3); + updateScreen(); - int key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } + pause(3); + } while (!isTalkFinished(&length)); flags[1] = 0; - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateRefresh_pre(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); -} - -void DrasculaEngine::talk_taber2(const char *said, const char *filename) { - int x_talk[6] = {1, 23, 45, 67, 89, 111}; - int cara; - int length = strlen(said); - - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - color_abc(MAROON); - - talkInit(filename); - -bucless: - - cara = _rnd->getRandomNumber(5); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); updateRefresh_pre(); - - copyBackground(x_talk[cara], 130, 151, 43, 21, 24, dir_dibujo3, dir_zona_pantalla); - pon_hare(); - updateRefresh(); - - if (withVoices == 0) - centra_texto(said, 132, 45); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - pause(3); - - int key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } - - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); -} - -void DrasculaEngine::talk_bj_cama(int index) { - char name[20]; - sprintf(name, "BJ%i.als", index); - talk_bj_cama(_textbj[_lang][index], name); + updateScreen(); } -void DrasculaEngine::talk_bj_cama(const char *said, const char *filename) { +void DrasculaEngine::talk_bj_bed(int index) { + char filename[20]; + sprintf(filename, "BJ%i.als", index); + const char *said = _textbj[_lang][index]; int x_talk[5] = {51, 101, 151, 201, 251}; - int cara; + int face; int length = strlen(said); - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - color_abc(WHITE); + color_abc(kColorWhite); talkInit(filename); -bucless: + do { + face = _rnd->getRandomNumber(4); - cara = _rnd->getRandomNumber(4); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); + updateRefresh_pre(); - copyBackground(65, 103, 65, 103, 49, 38, dir_dibujo1, dir_zona_pantalla); - copyRect(x_talk[cara], 105, 65, 103, 49, 38, dir_dibujo3, dir_zona_pantalla); - pon_hare(); - updateRefresh(); + copyBackground(65, 103, 65, 103, 49, 38, drawSurface1, screenSurface); + copyRect(x_talk[face], 105, 65, 103, 49, 38, drawSurface3, screenSurface); + pon_hare(); + updateRefresh(); - if (withVoices == 0) - centra_texto(said, 104, 102); + if (withVoices == 0) + centerText(said, 104, 102); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); - pause(3); + pause(3); + } while (!isTalkFinished(&length)); - int key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); } -void DrasculaEngine::talk_htel(const char *said, const char *filename) { - char *num_cara; +void DrasculaEngine::talk_htel(int index) { + char filename[20]; + sprintf(filename, "%i.als", index); + const char *said = _text[_lang][index]; + char *faceBuffer; int x_talk[3] = {1, 94, 187}; - int cara, pantalla; + int face, curScreen; int length = strlen(said); - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - color_abc(YELLOW); + color_abc(kColorYellow); talkInit(filename); -bucless: - - cara = _rnd->getRandomNumber(2); - pantalla = _rnd->getRandomNumber(2); + do { + face = _rnd->getRandomNumber(2); + curScreen = _rnd->getRandomNumber(2); - if (cara == 0 && pantalla == 0) - num_cara = (char *)dir_dibujo3; - else if (pantalla == 1) - num_cara = (char *)dir_hare_frente; - else - num_cara = (char *)dir_hare_fondo; - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + if (face == 0 && curScreen == 0) + faceBuffer = (char *)drawSurface3; + else if (curScreen == 1) + faceBuffer = (char *)frontSurface; + else + faceBuffer = (char *)backSurface; - copyBackground(x_talk[cara], 1, 45, 24, 92, 108, (byte *)num_cara, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); - if (withVoices == 0) - centra_texto(said, 90, 50); + copyBackground(x_talk[face], 1, 45, 24, 92, 108, (byte *)faceBuffer, screenSurface); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - pause(3); + if (withVoices == 0) + centerText(said, 90, 50); - int key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } + updateScreen(); + pause(3); + } while (!isTalkFinished(&length)); - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + updateScreen(); } void DrasculaEngine::talk_sinc(const char *said, const char *filename, const char *sincronia) { @@ -1313,12 +905,12 @@ void DrasculaEngine::talk_sinc(const char *said, const char *filename, const cha int y_mask_talk = 170; int x_talk_dch[6] = {1, 25, 49, 73, 97, 121}; int x_talk_izq[6] = {145, 169, 193, 217, 241, 265}; - int p, cara = 0; + int p, face = 0; int length = strlen(said); - color_abc(YELLOW); + color_abc(kColorYellow); - if (num_ejec == 1) { + if (currentChapter == 1) { if (factor_red[hare_y + alto_hare] == 100) suma_1_pixel = 0; } @@ -1327,282 +919,137 @@ void DrasculaEngine::talk_sinc(const char *said, const char *filename, const cha talkInit(filename); -bucless: - - if (sincronia[p] == '0') - cara = 0; - if (sincronia[p] == '1') - cara = 1; - if (sincronia[p] == '2') - cara = 2; - if (sincronia[p] == '3') - cara = 3; - if (sincronia[p] == '4') - cara = 4; - if (sincronia[p] == '5') - cara = 5; - if (sincronia[p] == '6') - cara = 6; - if (sincronia[p] == '7') - cara = 7; - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); + do { + face = atoi(&sincronia[p]); - updateRefresh_pre(); - if (num_ejec == 2) - copyBackground(hare_x, hare_y, OBJWIDTH + 1, 0, ancho_hare, alto_talk - 1, dir_zona_pantalla, dir_dibujo3); - else - copyBackground(hare_x, hare_y, OBJWIDTH + 1, 0, (int)(((float)ancho_hare / 100) * factor_red[hare_y + alto_hare]), - (int)(((float)(alto_talk - 1) / 100) * factor_red[hare_y + alto_hare]), dir_zona_pantalla, dir_dibujo3); - pon_hare(); - if (num_ejec == 2) { - if (alto_hare != 56) - copyBackground(OBJWIDTH + 1, 0, hare_x, hare_y, ancho_hare, alto_talk - 1, dir_dibujo3, dir_zona_pantalla); - } else - copyBackground(OBJWIDTH + 1, 0, hare_x, hare_y, (int)(((float)ancho_hare / 100) * factor_red[hare_y + alto_hare]), - (int)(((float)(alto_talk - 1) / 100) * factor_red[hare_y + alto_hare]), dir_dibujo3, dir_zona_pantalla); - - if (sentido_hare == 0) { - if (num_ejec == 2) - copyRect(x_talk_izq[cara], y_mask_talk, hare_x + 8, hare_y - 1, ancho_talk, alto_talk, dir_hare_dch, dir_zona_pantalla); - else - reduce_hare_chico(x_talk_izq[cara], y_mask_talk, (int)(hare_x + (8.0f / 100) * factor_red[hare_y + alto_hare]), - hare_y, ancho_talk, alto_talk, factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); - updateRefresh(); - } else if (sentido_hare == 1) { - if (num_ejec == 2) - copyRect(x_talk_dch[cara], y_mask_talk, hare_x + 12, hare_y, ancho_talk, alto_talk, dir_hare_dch, dir_zona_pantalla); - else - reduce_hare_chico(x_talk_dch[cara], y_mask_talk, (int)(hare_x + (12.0f / 100) * factor_red[hare_y + alto_hare]), - hare_y, ancho_talk, alto_talk, factor_red[hare_y + alto_hare], dir_hare_dch, dir_zona_pantalla); - updateRefresh(); - } else if (sentido_hare == 2) { - if (num_ejec == 2) - copyRect(x_talk_izq[cara], y_mask_talk, hare_x + 12, hare_y, ancho_talk, alto_talk, dir_hare_frente, dir_zona_pantalla); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + + updateRefresh_pre(); + if (currentChapter == 2) + copyBackground(hare_x, hare_y, OBJWIDTH + 1, 0, ancho_hare, talkHeight - 1, screenSurface, drawSurface3); else - reduce_hare_chico(x_talk_izq[cara], y_mask_talk, + copyBackground(hare_x, hare_y, OBJWIDTH + 1, 0, (int)(((float)ancho_hare / 100) * factor_red[hare_y + alto_hare]), + (int)(((float)(talkHeight - 1) / 100) * factor_red[hare_y + alto_hare]), screenSurface, drawSurface3); + pon_hare(); + if (currentChapter == 2) { + if (alto_hare != 56) + copyBackground(OBJWIDTH + 1, 0, hare_x, hare_y, ancho_hare, talkHeight - 1, drawSurface3, screenSurface); + } else + copyBackground(OBJWIDTH + 1, 0, hare_x, hare_y, (int)(((float)ancho_hare / 100) * factor_red[hare_y + alto_hare]), + (int)(((float)(talkHeight - 1) / 100) * factor_red[hare_y + alto_hare]), drawSurface3, screenSurface); + + if (sentido_hare == 0) { + if (currentChapter == 2) + copyRect(x_talk_izq[face], y_mask_talk, hare_x + 8, hare_y - 1, talkWidth, talkHeight, extraSurface, screenSurface); + else + reduce_hare_chico(x_talk_izq[face], y_mask_talk, (int)(hare_x + (8.0f / 100) * factor_red[hare_y + alto_hare]), + hare_y, talkWidth, talkHeight, factor_red[hare_y + alto_hare], extraSurface, screenSurface); + updateRefresh(); + } else if (sentido_hare == 1) { + if (currentChapter == 2) + copyRect(x_talk_dch[face], y_mask_talk, hare_x + 12, hare_y, talkWidth, talkHeight, extraSurface, screenSurface); + else + reduce_hare_chico(x_talk_dch[face], y_mask_talk, (int)(hare_x + (12.0f / 100) * factor_red[hare_y + alto_hare]), + hare_y, talkWidth, talkHeight, factor_red[hare_y + alto_hare], extraSurface, screenSurface); + updateRefresh(); + } else if (sentido_hare == 2) { + if (currentChapter == 2) + copyRect(x_talk_izq[face], y_mask_talk, hare_x + 12, hare_y, talkWidth, talkHeight, frontSurface, screenSurface); + else + reduce_hare_chico(x_talk_izq[face], y_mask_talk, (int)(suma_1_pixel + hare_x + (12.0f / 100) * factor_red[hare_y + alto_hare]), hare_y, - ancho_talk, alto_talk, factor_red[hare_y + alto_hare], dir_hare_frente, dir_zona_pantalla); - updateRefresh(); - } else if (sentido_hare == 3) { - if (num_ejec == 2) - copyRect(x_talk_dch[cara], y_mask_talk, hare_x + 8, hare_y, ancho_talk, alto_talk, dir_hare_frente, dir_zona_pantalla); - else - reduce_hare_chico(x_talk_dch[cara], y_mask_talk, + talkWidth, talkHeight, factor_red[hare_y + alto_hare], frontSurface, screenSurface); + updateRefresh(); + } else if (sentido_hare == 3) { + if (currentChapter == 2) + copyRect(x_talk_dch[face], y_mask_talk, hare_x + 8, hare_y, talkWidth, talkHeight, frontSurface, screenSurface); + else + reduce_hare_chico(x_talk_dch[face], y_mask_talk, (int)(suma_1_pixel + hare_x + (8.0f / 100) * factor_red[hare_y + alto_hare]), hare_y, - ancho_talk, alto_talk, factor_red[hare_y + alto_hare], dir_hare_frente, dir_zona_pantalla); - updateRefresh(); - } - - if (withVoices == 0) - centra_texto(said, hare_x, hare_y); + talkWidth, talkHeight, factor_red[hare_y + alto_hare], frontSurface, screenSurface); + updateRefresh(); + } - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (withVoices == 0) + centerText(said, hare_x, hare_y); - p++; - pause(3); + updateScreen(); - int key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } + p++; + pause(3); + } while (!isTalkFinished(&length)); - if (num_ejec == 1 && musicStatus() == 0 && flags[11] == 0) + if (currentChapter == 1 && musicStatus() == 0 && flags[11] == 0) playMusic(roomMusic); - if (num_ejec == 2 && musicStatus() == 0 && flags[11] == 0 && roomMusic != 0) + if (currentChapter == 2 && musicStatus() == 0 && flags[11] == 0 && roomMusic != 0) playMusic(roomMusic); } -void DrasculaEngine::talk_baul(const char *said, const char *filename) { - int cara = 0, cara_antes; +void DrasculaEngine::talk_baul(int index) { + char filename[20]; + sprintf(filename, "d%i.als", index); + const char *said = _text[_lang][index]; + int face = 0, cara_antes; int length = strlen(said); - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - cara_antes = flags[19]; - color_abc(MAROON); + color_abc(kColorMaroon); talkInit(filename); -bucless: + do { + face = (face == 1) ? 0 : 1; - if (cara == 1) - cara = 0; - else - cara = 1; - - flags[19] = cara; - updateRoom(); - - if (withVoices == 0) - centra_texto(said, 263, 69); + flags[19] = face; + updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (withVoices == 0) + centerText(said, 263, 69); - pause(4); + updateScreen(); - int key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } + pause(4); + } while (!isTalkFinished(&length)); flags[19] = cara_antes; updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + updateScreen(); } -void DrasculaEngine::talk_igorpuerta(const char *said, const char *filename) { +void DrasculaEngine::talk_dr_grande(int index) { + char filename[20]; + sprintf(filename, "D%i.als", index); + const char *said = _textd[_lang][index]; + int x_talk[4] = {47, 93, 139, 185}; + int face; + int l = 0; int length = strlen(said); - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - color_abc(WHITE); - - talkInit(filename); - -bucless: - - updateRoom(); - if (withVoices == 0) - centra_texto(said, 87, 66); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - int key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } - - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); -} - -void DrasculaEngine::talk_igor_sentado(const char *said, const char *filename) { - int x_talk[4] = { 80, 102, 124, 146 }; - int cara; - int length = strlen(said); - - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - color_abc(WHITE); - - talkInit(filename); - -bucless: - - cara = _rnd->getRandomNumber(3); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); - - copyBackground(x_talk[cara], 109, 207, 92, 21, 23, dir_dibujo3, dir_zona_pantalla); - pon_hare(); - updateRefresh(); - - if (withVoices == 0) - centra_texto(said, 221, 102); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); - - pause(3); - - int key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1) { - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } - - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); -} - -void DrasculaEngine::talk_igor_peluca(const char *said, const char *filename) { - int x_talk[4] = {119, 158, 197, 236}; - int cara = 0; - int length = strlen(said); - - _rnd->setSeed((unsigned int)_system->getMillis() / 2); - - color_abc(WHITE); + color_abc(kColorRed); talkInit(filename); -bucless: - - _rnd->getRandomNumber(3); - - copyBackground(0, 0, 0, 0, 320, 200, dir_dibujo1, dir_zona_pantalla); - - updateRefresh_pre(); - - copyBackground(x_talk[cara], 78, 199, 94, 38, 27, dir_dibujo3, dir_zona_pantalla); - pon_hare(); - updateRefresh(); + do { + face = _rnd->getRandomNumber(3); + copyBackground(0, 0, 0, 0, 320, 200, drawSurface1, screenSurface); + copyBackground(interf_x[l] + 24, interf_y[l], 0, 45, 39, 31, drawSurface2, screenSurface); + copyBackground(x_talk[face], 1, 171, 68, 45, 48, drawSurface2, screenSurface); + l++; + if (l == 7) + l = 0; - if (withVoices == 0) - centra_texto(said, 221, 102); - - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + if (withVoices == 0) + centerText(said, 191, 69); - pause(3); + updateScreen(); - int key = getscan(); - if (key != 0) - ctvd_stop(); - if (hay_sb == 1){ - if (LookForFree() != 0) - goto bucless; - delete sku; - sku = NULL; - ctvd_terminate(); - } else { - length -= 2; - if (length > 0) - goto bucless; - } + pause(3); - updateRoom(); - updateScreen(0, 0, 0, 0, 320, 200, dir_zona_pantalla); + byte key = getScan(); + if (key == Common::KEYCODE_ESCAPE) + term_int = 1; + } while (!isTalkFinished(&length)); } } // End of namespace Drascula diff --git a/engines/gob/draw_v1.cpp b/engines/gob/draw_v1.cpp index 9a78769d41..b5bc56b6f5 100644 --- a/engines/gob/draw_v1.cpp +++ b/engines/gob/draw_v1.cpp @@ -32,6 +32,7 @@ #include "gob/util.h" #include "gob/game.h" #include "gob/scenery.h" +#include "gob/inter.h" #include "gob/sound/sound.h" namespace Gob { diff --git a/engines/gob/draw_v2.cpp b/engines/gob/draw_v2.cpp index 8c12079b83..378ff0dcdf 100644 --- a/engines/gob/draw_v2.cpp +++ b/engines/gob/draw_v2.cpp @@ -32,6 +32,7 @@ #include "gob/util.h" #include "gob/game.h" #include "gob/scenery.h" +#include "gob/inter.h" #include "gob/video.h" namespace Gob { diff --git a/engines/gob/game.cpp b/engines/gob/game.cpp index 9bdcae567d..73fa820fa0 100644 --- a/engines/gob/game.cpp +++ b/engines/gob/game.cpp @@ -350,7 +350,7 @@ int16 Game::checkKeys(int16 *pMouseX, int16 *pMouseY, _vm->_util->processInput(true); - if (_vm->_mult->_multData && _vm->_global->_inter_variables && + if (_vm->_mult->_multData && _vm->_inter->_variables && (VAR(58) != 0)) { if (_vm->_mult->_multData->frameStart != (int) VAR(58) - 1) _vm->_mult->_multData->frameStart++; @@ -480,8 +480,7 @@ void Game::totSub(int8 flags, const char *newTotFile) { _extTableArray[_backupedCount] = _extTable; _extHandleArray[_backupedCount] = _extHandle; _imFileDataArray[_backupedCount] = _imFileData; - _variablesArray[_backupedCount] = _vm->_global->_inter_variables; - _variablesSizesArray[_backupedCount] = _vm->_global->_inter_variablesSizes; + _variablesArray[_backupedCount] = _vm->_inter->_variables; strcpy(_curTotFileArray[_backupedCount], _curTotFile); curBackupPos = _curBackupPos; @@ -491,10 +490,8 @@ void Game::totSub(int8 flags, const char *newTotFile) { _totTextData = 0; _totFileData = 0; _totResourceTable = 0; - if (flags & 1) { - _vm->_global->_inter_variables = 0; - _vm->_global->_inter_variablesSizes = 0; - } + if (flags & 1) + _vm->_inter->_variables = 0; strncpy0(_curTotFile, newTotFile, 9); strcat(_curTotFile, ".TOT"); @@ -514,9 +511,8 @@ void Game::totSub(int8 flags, const char *newTotFile) { popCollisions(); - if ((flags & 1) && _vm->_global->_inter_variables) { - delete[] _vm->_global->_inter_variables; - delete[] _vm->_global->_inter_variablesSizes; + if ((flags & 1) && _vm->_inter->_variables) { + _vm->_inter->delocateVars(); } _backupedCount--; @@ -530,8 +526,7 @@ void Game::totSub(int8 flags, const char *newTotFile) { _extTable = _extTableArray[_backupedCount]; _extHandle = _extHandleArray[_backupedCount]; _imFileData = _imFileDataArray[_backupedCount]; - _vm->_global->_inter_variables = _variablesArray[_backupedCount]; - _vm->_global->_inter_variablesSizes = _variablesSizesArray[_backupedCount]; + _vm->_inter->_variables = _variablesArray[_backupedCount]; strcpy(_curTotFile, _curTotFileArray[_backupedCount]); strcpy(_curExtFile, _curTotFile); _curExtFile[strlen(_curExtFile) - 4] = '\0'; @@ -563,8 +558,7 @@ void Game::switchTotSub(int16 index, int16 skipPlay) { _extTableArray[_backupedCount] = _extTable; _extHandleArray[_backupedCount] = _extHandle; _imFileDataArray[_backupedCount] = _imFileData; - _variablesArray[_backupedCount] = _vm->_global->_inter_variables; - _variablesSizesArray[_backupedCount] = _vm->_global->_inter_variablesSizes; + _variablesArray[_backupedCount] = _vm->_inter->_variables; strcpy(_curTotFileArray[_backupedCount], _curTotFile); _backupedCount++; } @@ -580,8 +574,7 @@ void Game::switchTotSub(int16 index, int16 skipPlay) { _imFileData = _imFileDataArray[_curBackupPos]; _extTable = _extTableArray[_curBackupPos]; _extHandle = _extHandleArray[_curBackupPos]; - _vm->_global->_inter_variables = _variablesArray[_curBackupPos]; - _vm->_global->_inter_variablesSizes = _variablesSizesArray[_curBackupPos]; + _vm->_inter->_variables = _variablesArray[_curBackupPos]; strcpy(_curTotFile, _curTotFileArray[_curBackupPos]); strcpy(_curExtFile, _curTotFile); _curExtFile[strlen(_curExtFile) - 4] = '\0'; @@ -608,8 +601,7 @@ void Game::switchTotSub(int16 index, int16 skipPlay) { _extTable = _extTableArray[_curBackupPos]; _extHandle = _extHandleArray[_curBackupPos]; _imFileData = _imFileDataArray[_curBackupPos]; - _vm->_global->_inter_variables = _variablesArray[_curBackupPos]; - _vm->_global->_inter_variablesSizes = _variablesSizesArray[_curBackupPos]; + _vm->_inter->_variables = _variablesArray[_curBackupPos]; strcpy(_curTotFile, _curTotFileArray[_curBackupPos]); strcpy(_curExtFile, _curTotFile); _curExtFile[strlen(_curExtFile) - 4] = '\0'; diff --git a/engines/gob/game.h b/engines/gob/game.h index bca55cd4dc..15f6ab963a 100644 --- a/engines/gob/game.h +++ b/engines/gob/game.h @@ -26,6 +26,8 @@ #ifndef GOB_GAME_H #define GOB_GAME_H +#include "gob/variables.h" + namespace Gob { class Game { @@ -200,9 +202,8 @@ protected: ExtTable *_extTableArray[5]; int16 _extHandleArray[5]; byte *_imFileDataArray[5]; - byte *_variablesArray[5]; + Variables *_variablesArray[5]; char _curTotFileArray[5][14]; - byte *_variablesSizesArray[5]; GobEngine *_vm; diff --git a/engines/gob/game_v1.cpp b/engines/gob/game_v1.cpp index 435decd9f2..66deea8ec4 100644 --- a/engines/gob/game_v1.cpp +++ b/engines/gob/game_v1.cpp @@ -166,12 +166,8 @@ void Game_v1::playTot(int16 skipPlay) { _vm->_global->_inter_animDataSize = READ_LE_UINT16(_totFileData + 0x38); - if (!_vm->_global->_inter_variables) { - variablesCount = READ_LE_UINT16(_totFileData + 0x2C); - _vm->_global->_inter_variables = new byte[variablesCount * 4]; - _vm->_global->_inter_variablesSizes = new byte[variablesCount * 4]; - _vm->_global->clearVars(variablesCount); - } + if (!_vm->_inter->_variables) + _vm->_inter->allocateVars(READ_LE_UINT16(_totFileData + 0x2C)); _vm->_global->_inter_execPtr = _totFileData; _vm->_global->_inter_execPtr += READ_LE_UINT32(_totFileData + 0x64); diff --git a/engines/gob/game_v2.cpp b/engines/gob/game_v2.cpp index e783f5bfb5..adf75176ab 100644 --- a/engines/gob/game_v2.cpp +++ b/engines/gob/game_v2.cpp @@ -54,7 +54,6 @@ void Game_v2::playTot(int16 skipPlay) { int16 _captureCounter; int16 breakFrom; int16 nestLevel; - int32 variablesCount; int32 totSize; byte *filePtr; byte *savedIP; @@ -72,7 +71,7 @@ void Game_v2::playTot(int16 skipPlay) { if (skipPlay <= 0) { while (!_vm->_quitRequested) { - if (_vm->_global->_inter_variables) + if (_vm->_inter->_variables) _vm->_draw->animateCursor(4); if (skipPlay != -1) { @@ -204,12 +203,8 @@ void Game_v2::playTot(int16 skipPlay) { _vm->_global->_inter_animDataSize = READ_LE_UINT16(_totFileData + 0x38); - if (!_vm->_global->_inter_variables) { - variablesCount = READ_LE_UINT16(_totFileData + 0x2C); - _vm->_global->_inter_variables = new byte[variablesCount * 4]; - _vm->_global->_inter_variablesSizes = new byte[variablesCount * 4]; - _vm->_global->clearVars(variablesCount); - } + if (!_vm->_inter->_variables) + _vm->_inter->allocateVars(READ_LE_UINT16(_totFileData + 0x2C)); _vm->_global->_inter_execPtr = _totFileData; _vm->_global->_inter_execPtr += @@ -1408,7 +1403,7 @@ int16 Game_v2::inputArea(int16 xPos, int16 yPos, int16 width, int16 height, flag = 1; - if (_vm->_global->_inter_variables) + if (_vm->_inter->_variables) WRITE_VAR(56, pos); while (1) { diff --git a/engines/gob/global.cpp b/engines/gob/global.cpp index 1445601017..acca5564dd 100644 --- a/engines/gob/global.cpp +++ b/engines/gob/global.cpp @@ -123,8 +123,6 @@ Global::Global(GobEngine *vm) : _vm(vm) { _inter_resStr[0] = 0; _inter_resVal = 0; - _inter_variablesSizes = 0; - _inter_variables = 0; _inter_execPtr = 0; _inter_animDataSize = 10; diff --git a/engines/gob/global.h b/engines/gob/global.h index 45c179d277..32651cf15d 100644 --- a/engines/gob/global.h +++ b/engines/gob/global.h @@ -123,8 +123,6 @@ public: char _inter_resStr[200]; int32 _inter_resVal; - byte *_inter_variablesSizes; // 0: single byte, 1: two bytes, 3: four bytes - byte *_inter_variables; byte *_inter_execPtr; int16 _inter_animDataSize; @@ -134,73 +132,11 @@ public: // Can be 1, 2 or 3 for normal, double and triple speed, respectively uint8 _speedFactor; - void clearVars(uint32 count) { - uint32 size = count * 4; - - memset(_inter_variables, 0, size); - memset(_inter_variablesSizes, 0, size); - for (uint32 i = 0; i < size; i += 4) - _inter_variablesSizes[i] = 3; - } - - void writeVarSizeStr(uint32 offset, uint32 len) { - uint32 i; - uint32 inVar; - uint32 varOff; - - inVar = offset % 4; - varOff = (offset >> 2) << 2; - for (i = 0; i < 4; i++) { - if (_inter_variablesSizes[varOff + i] == 3) - _inter_variablesSizes[varOff + i] = 0; - else if ((inVar == (i+1)) && (_inter_variablesSizes[varOff + i] == 1)) - _inter_variablesSizes[varOff + i] = 0; - } - memset(_inter_variablesSizes + offset, 0, len); - } - - void writeVar(uint32 offset, uint32 val) { - WRITE_UINT32(_inter_variables + offset, val); - writeVarSize(offset, 3); - } - void writeVar(uint32 offset, uint16 val) { - WRITE_UINT16(_inter_variables + offset, val); - writeVarSize(offset, 1); - } - void writeVar(uint32 offset, uint8 val) { - (*(uint8 *)(_inter_variables + offset)) = val; - writeVarSize(offset, 0); - } - void writeVar(uint32 offset, const char *str) { - writeVarSizeStr(offset, strlen(str)); - strcpy((char *) (_inter_variables + offset), str); - } - Global(GobEngine *vm); ~Global(); protected: GobEngine *_vm; - - void writeVarSize(uint32 offset, byte n) { - uint32 i; - uint32 inVar; - uint32 varOff; - - inVar = offset % 4; - varOff = (offset >> 2) << 2; - for (i = 0; i < 4; i++) { - if (_inter_variablesSizes[varOff + i] == 3) - _inter_variablesSizes[varOff + i] = 0; - else if ((inVar == (i+1)) && (_inter_variablesSizes[varOff + i] == 1)) - _inter_variablesSizes[varOff + i] = 0; - } - - _inter_variablesSizes[offset] = n; - for (; n > 0; n--) - _inter_variablesSizes[offset + n] = 0; - } - }; } // End of namespace Gob diff --git a/engines/gob/gob.h b/engines/gob/gob.h index efc9718098..ae2b53bc31 100644 --- a/engines/gob/gob.h +++ b/engines/gob/gob.h @@ -52,29 +52,32 @@ class Scenery; class Util; class SaveLoad; -#define VARP(offs) (_vm->_global->_inter_variables + (offs)) -#define WRITE_VARO_UINT32(offs, val) _vm->_global->writeVar(offs, (uint32) (val)) -#define WRITE_VARO_UINT16(offs, val) _vm->_global->writeVar(offs, (uint16) (val)) -#define WRITE_VARO_UINT8(offs, val) _vm->_global->writeVar(offs, (uint8) (val)) -#define WRITE_VARO_STR(offs, str) _vm->_global->writeVar(offs, (const char *) (str)) -#define WRITE_VAR_UINT32(var, val) WRITE_VARO_UINT32((var) << 2, (val)) -#define WRITE_VAR_UINT16(var, val) WRITE_VARO_UINT16((var) << 2, (val)) -#define WRITE_VAR_UINT8(var, val) WRITE_VARO_UINT8((var) << 2, (val)) -#define WRITE_VAR_STR(var, str) WRITE_VARO_STR((var) << 2, (str)) -#define READ_VARO_UINT32(offs) READ_UINT32(VARP(offs)) -#define READ_VARO_UINT16(offs) READ_UINT16(VARP(offs)) -#define READ_VARO_UINT8(offs) (*((uint8 *) VARP(offs))) -#define READ_VAR_UINT32(var) READ_VARO_UINT32((var) << 2) -#define READ_VAR_UINT16(var) READ_VARO_UINT16((var) << 2) -#define READ_VAR_UINT8(var) READ_VARO_UINT8((var) << 2) -#define GET_VARO_STR(offs) ((char *) VARP(offs)) -#define GET_VAR_STR(var) GET_VARO_STR((var) << 2) - -#define WRITE_VAR_OFFSET(offs, val) WRITE_VARO_UINT32((offs), (val)) -#define WRITE_VAR(var, val) WRITE_VAR_UINT32((var), (val)) -#define VAR_OFFSET(offs) READ_VARO_UINT32(offs) -#define VAR(var) READ_VAR_UINT32(var) -#define VAR_ADDRESS(var) ((uint32 *) VARP((var) << 2)) +#define WRITE_VAR_UINT32(var, val) _vm->_inter->_variables->writeVar32(var, val) +#define WRITE_VAR_UINT16(var, val) _vm->_inter->_variables->writeVar16(var, val) +#define WRITE_VAR_UINT8(var, val) _vm->_inter->_variables->writeVar8(var, val) +#define WRITE_VAR_STR(var, str) _vm->_inter->_variables->writeVarString(var, str) +#define WRITE_VARO_UINT32(off, val) _vm->_inter->_variables->writeOff32(off, val) +#define WRITE_VARO_UINT16(off, val) _vm->_inter->_variables->writeOff16(off, val) +#define WRITE_VARO_UINT8(off, val) _vm->_inter->_variables->writeOff8(off, val) +#define WRITE_VARO_STR(off, str) _vm->_inter->_variables->writeOffString(off, str) +#define READ_VAR_UINT32(var) _vm->_inter->_variables->readVar32(var) +#define READ_VAR_UINT16(var) _vm->_inter->_variables->readVar16(var) +#define READ_VAR_UINT8(var) _vm->_inter->_variables->readVar8(var) +#define READ_VARO_UINT32(off) _vm->_inter->_variables->readOff32(off) +#define READ_VARO_UINT16(off) _vm->_inter->_variables->readOff16(off) +#define READ_VARO_UINT8(off) _vm->_inter->_variables->readOff8(off) +#define GET_VAR_STR(var) _vm->_inter->_variables->getAddressVarString(var, 0) +#define GET_VARO_STR(off) _vm->_inter->_variables->getAddressOffString(off, 0) +#define GET_VAR_FSTR(var) _vm->_inter->_variables->getAddressVarString(var) +#define GET_VARO_FSTR(off) _vm->_inter->_variables->getAddressOffString(off) + +#define VAR_ADDRESS(var) _vm->_inter->_variables->getAddressVar32(var) + +#define WRITE_VAR_OFFSET(off, val) WRITE_VARO_UINT32((off), (val)) +#define WRITE_VAR(var, val) WRITE_VAR_UINT32((var), (val)) +#define VAR_OFFSET(off) READ_VARO_UINT32(off) +#define VAR(var) READ_VAR_UINT32(var) + enum GameType { kGameTypeNone = 0, diff --git a/engines/gob/goblin.cpp b/engines/gob/goblin.cpp index d3857e2066..e7aed0790e 100644 --- a/engines/gob/goblin.cpp +++ b/engines/gob/goblin.cpp @@ -32,6 +32,7 @@ #include "gob/map.h" #include "gob/mult.h" #include "gob/scenery.h" +#include "gob/inter.h" #include "gob/sound/sound.h" namespace Gob { diff --git a/engines/gob/goblin_v2.cpp b/engines/gob/goblin_v2.cpp index 93c4c74ecc..9144e35070 100644 --- a/engines/gob/goblin_v2.cpp +++ b/engines/gob/goblin_v2.cpp @@ -33,6 +33,7 @@ #include "gob/map.h" #include "gob/mult.h" #include "gob/scenery.h" +#include "gob/inter.h" namespace Gob { diff --git a/engines/gob/goblin_v4.cpp b/engines/gob/goblin_v4.cpp index 167946e30d..1df5aab606 100644 --- a/engines/gob/goblin_v4.cpp +++ b/engines/gob/goblin_v4.cpp @@ -29,6 +29,7 @@ #include "gob/mult.h" #include "gob/map.h" #include "gob/scenery.h" +#include "gob/inter.h" namespace Gob { diff --git a/engines/gob/init.cpp b/engines/gob/init.cpp index b1e31b34c2..c2f8b48626 100644 --- a/engines/gob/init.cpp +++ b/engines/gob/init.cpp @@ -33,6 +33,7 @@ #include "gob/draw.h" #include "gob/game.h" #include "gob/palanim.h" +#include "gob/inter.h" #include "gob/video.h" #include "gob/videoplayer.h" #include "gob/sound/sound.h" @@ -62,7 +63,6 @@ void Init::initGame(const char *totName) { char *infPtr; char *infEnd; char buffer[128]; - int32 varsCount; initVideo(); @@ -90,8 +90,6 @@ void Init::initGame(const char *totName) { _vm->_game->_totTextData = 0; _vm->_game->_totFileData = 0; _vm->_game->_totResourceTable = 0; - _vm->_global->_inter_variables = 0; - _vm->_global->_inter_variablesSizes = 0; _palDesc = new Video::PalDesc; _vm->validateVideoMode(_vm->_global->_videoMode); @@ -157,14 +155,10 @@ void Init::initGame(const char *totName) { DataStream *stream = _vm->_dataIO->openAsStream(handle, true); stream->seek(0x2C); - varsCount = stream->readUint16LE(); + _vm->_inter->allocateVars(stream->readUint16LE()); delete stream; - _vm->_global->_inter_variables = new byte[varsCount * 4]; - _vm->_global->_inter_variablesSizes = new byte[varsCount * 4]; - _vm->_global->clearVars(varsCount); - strcpy(_vm->_game->_curTotFile, buffer); _vm->_sound->cdTest(1, "GOB"); @@ -214,8 +208,6 @@ void Init::initGame(const char *totName) { _vm->_sound->cdStop(); _vm->_sound->cdUnloadLIC(); - delete[] _vm->_global->_inter_variables; - delete[] _vm->_global->_inter_variablesSizes; delete[] _vm->_game->_totFileData; if (_vm->_game->_totTextData) { if (_vm->_game->_totTextData->items) diff --git a/engines/gob/inter.cpp b/engines/gob/inter.cpp index 9e5005f443..9c39653a1d 100644 --- a/engines/gob/inter.cpp +++ b/engines/gob/inter.cpp @@ -60,6 +60,12 @@ Inter::Inter(GobEngine *vm) : _vm(vm) { _pastePos = 0; _noBusyWait = false; + + _variables = 0; +} + +Inter::~Inter() { + delocateVars(); } void Inter::initControlVars(char full) { @@ -279,4 +285,18 @@ void Inter::callSub(int16 retFlag) { _terminate = 1; } +void Inter::allocateVars(uint32 count) { + if ((_vm->getPlatform() == Common::kPlatformAmiga) || + (_vm->getPlatform() == Common::kPlatformMacintosh) || + (_vm->getPlatform() == Common::kPlatformAtariST)) + _variables = new VariablesBE(count * 4); + else + _variables = new VariablesLE(count * 4); +} + +void Inter::delocateVars() { + delete _variables; + _variables = 0; +} + } // End of namespace Gob diff --git a/engines/gob/inter.h b/engines/gob/inter.h index e43cb4e891..60b3974d6d 100644 --- a/engines/gob/inter.h +++ b/engines/gob/inter.h @@ -27,6 +27,7 @@ #define GOB_INTER_H #include "gob/goblin.h" +#include "gob/variables.h" namespace Gob { @@ -48,6 +49,8 @@ public: uint32 _soundEndTimeKey; int16 _soundStopVal; + Variables *_variables; + void initControlVars(char full); int16 load16(); char evalExpr(int16 *pRes); @@ -59,11 +62,14 @@ public: void funcBlock(int16 retFlag); void callSub(int16 retFlag); + void allocateVars(uint32 count); + void delocateVars(); + virtual int16 loadSound(int16 slot) = 0; virtual void animPalette() = 0; Inter(GobEngine *vm); - virtual ~Inter() {} + virtual ~Inter(); protected: struct OpFuncParams { @@ -83,7 +89,7 @@ protected: int16 _animPalHighIndex[8]; int16 _animPalDir[8]; - char _pasteBuf[300]; + byte _pasteBuf[300]; byte _pasteSizeBuf[300]; int16 _pastePos; diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp index a809a44b40..e2b8d65112 100644 --- a/engines/gob/inter_v1.cpp +++ b/engines/gob/inter_v1.cpp @@ -929,16 +929,16 @@ void Inter_v1::o1_initMult() { _vm->_mult->_objCount * sizeof(Mult::Mult_Object)); for (int i = 0; i < _vm->_mult->_objCount; i++) { - _vm->_mult->_objects[i].pPosX = - (int32 *)(_vm->_global->_inter_variables + - i * 4 + (posXVar / 4) * 4); - _vm->_mult->_objects[i].pPosY = - (int32 *)(_vm->_global->_inter_variables + - i * 4 + (posYVar / 4) * 4); + uint32 offPosX = i * 4 + (posXVar / 4) * 4; + uint32 offPosY = i * 4 + (posYVar / 4) * 4; + uint32 offAnim = animDataVar + i * 4 * _vm->_global->_inter_animDataSize; + + _vm->_mult->_objects[i].pPosX = (int32 *) _variables->getAddressOff32(offPosX); + _vm->_mult->_objects[i].pPosY = (int32 *) _variables->getAddressOff32(offPosY); _vm->_mult->_objects[i].pAnimData = - (Mult::Mult_AnimData *) (_vm->_global->_inter_variables + - animDataVar + i * 4 * _vm->_global->_inter_animDataSize); + (Mult::Mult_AnimData *) _variables->getAddressOff8(offAnim, + _vm->_global->_inter_animDataSize); _vm->_mult->_objects[i].pAnimData->isStatic = 1; _vm->_mult->_objects[i].tick = 0; @@ -2069,8 +2069,7 @@ bool Inter_v1::o1_prepareStr(OpFuncParams ¶ms) { int16 strVar; strVar = _vm->_parse->parseVarIndex(); - _vm->_util->prepareStr(GET_VARO_STR(strVar)); - _vm->_global->writeVarSizeStr(strVar, strlen(GET_VARO_STR(strVar))); + _vm->_util->prepareStr(GET_VARO_FSTR(strVar)); return false; } @@ -2081,8 +2080,9 @@ bool Inter_v1::o1_insertStr(OpFuncParams ¶ms) { strVar = _vm->_parse->parseVarIndex(); evalExpr(0); pos = _vm->_parse->parseValExpr(); - _vm->_util->insertStr(_vm->_global->_inter_resStr, GET_VARO_STR(strVar), pos); - _vm->_global->writeVarSizeStr(strVar, strlen(GET_VARO_STR(strVar))); + + char *str = GET_VARO_FSTR(strVar); + _vm->_util->insertStr(_vm->_global->_inter_resStr, str, pos); return false; } @@ -2222,7 +2222,7 @@ bool Inter_v1::o1_readData(OpFuncParams ¶ms) { if (((dataVar >> 2) == 59) && (size == 4)) WRITE_VAR(59, stream->readUint32LE()); else - retSize = stream->read(_vm->_global->_inter_variables + dataVar, size); + retSize = stream->read((byte *) _variables->getAddressOff8(dataVar, size), size); if (retSize == size) WRITE_VAR(1, 0); diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp index e442ec4eca..d8c33fcce6 100644 --- a/engines/gob/inter_v2.cpp +++ b/engines/gob/inter_v2.cpp @@ -903,19 +903,16 @@ void Inter_v2::o2_initMult() { _vm->_mult->_objCount * sizeof(Mult::Mult_Object)); for (int i = 0; i < _vm->_mult->_objCount; i++) { - _vm->_mult->_objects[i].pPosX = - (int32 *)(_vm->_global->_inter_variables + - i * 4 + (posXVar / 4) * 4); - _vm->_mult->_objects[i].pPosY = - (int32 *)(_vm->_global->_inter_variables + - i * 4 + (posYVar / 4) * 4); + uint32 offPosX = i * 4 + (posXVar / 4) * 4; + uint32 offPosY = i * 4 + (posYVar / 4) * 4; + uint32 offAnim = animDataVar + i * 4 * _vm->_global->_inter_animDataSize; + + _vm->_mult->_objects[i].pPosX = (int32 *) _variables->getAddressOff32(offPosX); + _vm->_mult->_objects[i].pPosY = (int32 *) _variables->getAddressOff32(offPosY); _vm->_mult->_objects[i].pAnimData = - (Mult::Mult_AnimData *) (_vm->_global->_inter_variables + - animDataVar + i * 4 * _vm->_global->_inter_animDataSize); - memset(_vm->_global->_inter_variablesSizes + - i * 4 * _vm->_global->_inter_animDataSize, 0, - _vm->_global->_inter_animDataSize); + (Mult::Mult_AnimData *) _variables->getAddressOff8(offAnim, + _vm->_global->_inter_animDataSize); _vm->_mult->_objects[i].pAnimData->isStatic = 1; _vm->_mult->_objects[i].tick = 0; @@ -1186,10 +1183,7 @@ void Inter_v2::o2_copyVars() { varOff = _vm->_parse->parseVarIndex(); _vm->_global->_inter_execPtr++; - memcpy(_pasteBuf + _pastePos, _vm->_global->_inter_variables + varOff, - _vm->_global->_inter_animDataSize * 4); - memcpy(_pasteSizeBuf + _pastePos, - _vm->_global->_inter_variablesSizes + varOff, + _variables->copyTo(varOff, _pasteBuf + _pastePos, _pasteSizeBuf + _pastePos, _vm->_global->_inter_animDataSize * 4); _pastePos += _vm->_global->_inter_animDataSize * 4; @@ -1199,6 +1193,7 @@ void Inter_v2::o2_copyVars() { } else { if (evalExpr(&varOff) == 20) _vm->_global->_inter_resVal = 0; + memcpy(_pasteBuf + _pastePos, &_vm->_global->_inter_resVal, 4); memcpy(_pasteSizeBuf + _pastePos, &_vm->_global->_inter_resVal, 4); _pastePos += 4; @@ -1222,8 +1217,7 @@ void Inter_v2::o2_pasteVars() { assert(sizeV == sizeS); _pastePos -= sizeV; - memcpy(_vm->_global->_inter_variables + varOff, _pasteBuf + _pastePos, sizeV); - memcpy(_vm->_global->_inter_variablesSizes + varOff, _pasteSizeBuf + _pastePos, sizeS); + _variables->copyFrom(varOff, _pasteBuf + _pastePos, _pasteSizeBuf + _pastePos, sizeV); } } @@ -1558,7 +1552,7 @@ void Inter_v2::o2_playImd() { startFrame, lastFrame, palCmd, palStart, palEnd, flags); if ((imd[0] != 0) && !_vm->_vidPlayer->primaryOpen(imd, x, y, flags)) { - WRITE_VAR(11, -1); + WRITE_VAR(11, (uint32) -1); return; } @@ -1972,8 +1966,7 @@ bool Inter_v2::o2_readData(OpFuncParams ¶ms) { size = READ_LE_UINT32(_vm->_game->_totFileData + 0x2C) * 4; } - buf = _vm->_global->_inter_variables + dataVar; - memset(_vm->_global->_inter_variablesSizes + dataVar, 0, size); + buf = _variables->getAddressOff8(dataVar, size); if (_vm->_global->_inter_resStr[0] == 0) { WRITE_VAR(1, size); diff --git a/engines/gob/inter_v4.cpp b/engines/gob/inter_v4.cpp index fd90b731a2..fb895dd5b2 100644 --- a/engines/gob/inter_v4.cpp +++ b/engines/gob/inter_v4.cpp @@ -642,9 +642,8 @@ void Inter_v4::setupOpcodes() { } void Inter_v4::executeDrawOpcode(byte i) { - debugC(1, kDebugDrawOp, "opcodeDraw %d [0x%X] (%s) - %s, %d", - i, i, getOpcodeDrawDesc(i), - _vm->_game->_curTotFile, uint(_vm->_global->_inter_execPtr - _vm->_game->_totFileData)); + debugC(1, kDebugDrawOp, "opcodeDraw %d [0x%X] (%s)", + i, i, getOpcodeDrawDesc(i)); OpcodeDrawProcV4 op = _opcodesDrawV4[i].proc; @@ -655,9 +654,10 @@ void Inter_v4::executeDrawOpcode(byte i) { } bool Inter_v4::executeFuncOpcode(byte i, byte j, OpFuncParams ¶ms) { - debugC(1, kDebugFuncOp, "opcodeFunc %d.%d [0x%X.0x%X] (%s) - %s, %d", - i, j, i, j, getOpcodeFuncDesc(i, j), - _vm->_game->_curTotFile, uint(_vm->_global->_inter_execPtr - _vm->_game->_totFileData)); + debugC(1, kDebugFuncOp, "opcodeFunc %d.%d [0x%X.0x%X] (%s) - %s, %d, %d", + i, j, i, j, getOpcodeFuncDesc(i, j), _vm->_game->_curTotFile, + (uint) (_vm->_global->_inter_execPtr - _vm->_game->_totFileData), + (uint) (_vm->_global->_inter_execPtr - _vm->_game->_totFileData - params.counter - 4)); if ((i > 4) || (j > 15)) { warning("unimplemented opcodeFunc: %d.%d", i, j); @@ -675,9 +675,8 @@ bool Inter_v4::executeFuncOpcode(byte i, byte j, OpFuncParams ¶ms) { } void Inter_v4::executeGoblinOpcode(int i, OpGobParams ¶ms) { - debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s) - %s, %d", - i, i, getOpcodeGoblinDesc(i), - _vm->_game->_curTotFile, uint(_vm->_global->_inter_execPtr - _vm->_game->_totFileData)); + debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)", + i, i, getOpcodeGoblinDesc(i)); OpcodeGoblinProcV4 op = NULL; @@ -884,7 +883,7 @@ void Inter_v4::o4_playVmdOrMusic() { } if ((fileName[0] != 0) && !_vm->_vidPlayer->primaryOpen(fileName, x, y, flags)) { - WRITE_VAR(11, -1); + WRITE_VAR(11, (uint32) -1); return; } diff --git a/engines/gob/map_v2.cpp b/engines/gob/map_v2.cpp index 668b4d2e97..bd9f5b3efc 100644 --- a/engines/gob/map_v2.cpp +++ b/engines/gob/map_v2.cpp @@ -56,12 +56,12 @@ void Map_v2::loadMapObjects(const char *avjFile) { uint32 passPos; var = _vm->_parse->parseVarIndex(); - variables = _vm->_global->_inter_variables + var; + variables = _vm->_inter->_variables->getAddressOff8(var, 0); id = _vm->_inter->load16(); if (id == -1) { - _passMap = (int8 *)(_vm->_global->_inter_variables + var); + _passMap = (int8 *) _vm->_inter->_variables->getAddressOff8(var, 0); return; } @@ -104,18 +104,17 @@ void Map_v2::loadMapObjects(const char *avjFile) { // In the original asm, this writes byte-wise into the variables-array tmpPos = mapData.pos(); mapData.seek(passPos); - if (variables != _vm->_global->_inter_variables) { - byte *sizes; + if ((variables != 0) && + (variables != _vm->_inter->_variables->getAddressOff8(0, 0))) { _passMap = (int8 *) variables; mapHeight = _screenHeight / _tilesHeight; mapWidth = _screenWidth / _tilesWidth; - sizes = _vm->_global->_inter_variablesSizes + - (((byte *) _passMap) - _vm->_global->_inter_variables); + for (int i = 0; i < mapHeight; i++) { for (int j = 0; j < mapWidth; j++) setPass(j, i, mapData.readSByte()); - memset(sizes + i * _passWidth, 0, mapWidth); + _vm->_inter->_variables->getAddressOff8(var + i * _passWidth, mapWidth); } } mapData.seek(tmpPos); diff --git a/engines/gob/map_v4.cpp b/engines/gob/map_v4.cpp index a3c3222213..3a74c4b6aa 100644 --- a/engines/gob/map_v4.cpp +++ b/engines/gob/map_v4.cpp @@ -54,7 +54,7 @@ void Map_v4::loadMapObjects(const char *avjFile) { uint32 passPos; var = _vm->_parse->parseVarIndex(); - variables = _vm->_global->_inter_variables + var; + variables = _vm->_inter->_variables->getAddressOff8(var, 0); id = _vm->_inter->load16(); @@ -62,7 +62,7 @@ void Map_v4::loadMapObjects(const char *avjFile) { warning("Woodruff Stub: loadMapObjects ID >= 65520"); return; } else if (id == -1) { - _passMap = (int8 *)(_vm->_global->_inter_variables + var); + _passMap = (int8 *) _vm->_inter->_variables->getAddressOff8(var, 0); return; } @@ -120,18 +120,17 @@ void Map_v4::loadMapObjects(const char *avjFile) { // In the original asm, this writes byte-wise into the variables-array tmpPos = mapData.pos(); mapData.seek(passPos); - if (variables != _vm->_global->_inter_variables) { - byte *sizes; + if ((variables != 0) && + (variables != _vm->_inter->_variables->getAddressOff8(0, 0))) { _passMap = (int8 *) variables; mapHeight = _screenHeight / _tilesHeight; mapWidth = _screenWidth / _tilesWidth; - sizes = _vm->_global->_inter_variablesSizes + - (((byte *) _passMap) - _vm->_global->_inter_variables); + for (int i = 0; i < mapHeight; i++) { for (int j = 0; j < mapWidth; j++) setPass(j, i, mapData.readSByte()); - memset(sizes + i * _passWidth, 0, mapWidth); + _vm->_inter->_variables->getAddressOff8(var + i * _passWidth, mapWidth); } } mapData.seek(tmpPos); diff --git a/engines/gob/module.mk b/engines/gob/module.mk index c95391cedc..45048a0899 100644 --- a/engines/gob/module.mk +++ b/engines/gob/module.mk @@ -49,6 +49,7 @@ MODULE_OBJS := \ scenery_v1.o \ scenery_v2.o \ util.o \ + variables.o \ video.o \ video_v1.o \ video_v2.o \ diff --git a/engines/gob/mult.cpp b/engines/gob/mult.cpp index bc9fe4dc11..3d6a7942f9 100644 --- a/engines/gob/mult.cpp +++ b/engines/gob/mult.cpp @@ -35,6 +35,7 @@ #include "gob/scenery.h" #include "gob/video.h" #include "gob/videoplayer.h" +#include "gob/inter.h" #include "gob/sound/sound.h" namespace Gob { diff --git a/engines/gob/parse.cpp b/engines/gob/parse.cpp index 5d7cef0341..ad1f53bb6f 100644 --- a/engines/gob/parse.cpp +++ b/engines/gob/parse.cpp @@ -44,7 +44,7 @@ int32 Parse::encodePtr(byte *ptr, int type) { offset = ptr - _vm->_game->_totFileData; break; case kInterVar: - offset = ptr - _vm->_global->_inter_variables; + offset = ptr - ((byte *) _vm->_inter->_variables->getAddressOff8(0, 0)); break; case kResStr: offset = ptr - ((byte *) _vm->_global->_inter_resStr); @@ -64,7 +64,7 @@ byte *Parse::decodePtr(int32 n) { ptr = _vm->_game->_totFileData; break; case kInterVar: - ptr = _vm->_global->_inter_variables; + ptr = (byte *) _vm->_inter->_variables->getAddressOff8(0, 0); break; case kResStr: ptr = (byte *) _vm->_global->_inter_resStr; diff --git a/engines/gob/parse_v1.cpp b/engines/gob/parse_v1.cpp index f18f63de4f..3c5f90c068 100644 --- a/engines/gob/parse_v1.cpp +++ b/engines/gob/parse_v1.cpp @@ -375,7 +375,7 @@ int16 Parse_v1::parseExpr(byte stopToken, byte *arg_2) { case 25: *operPtr = 22; temp = _vm->_inter->load16() * 4; - *valPtr = encodePtr(_vm->_global->_inter_variables + temp, + *valPtr = encodePtr(_vm->_inter->_variables->getAddressOff8(temp, 0), kInterVar); if (*_vm->_global->_inter_execPtr == 13) { _vm->_global->_inter_execPtr++; @@ -403,8 +403,8 @@ int16 Parse_v1::parseExpr(byte stopToken, byte *arg_2) { *valPtr = VAR(temp + offset); break; } - *valPtr = encodePtr(_vm->_global->_inter_variables + - temp * 4 + offset * _vm->_global->_inter_animDataSize * 4, + *valPtr = encodePtr(_vm->_inter->_variables->getAddressOff8( + temp * 4 + offset * _vm->_global->_inter_animDataSize * 4, 0), kInterVar); if (*_vm->_global->_inter_execPtr == 13) { _vm->_global->_inter_execPtr++; diff --git a/engines/gob/parse_v2.cpp b/engines/gob/parse_v2.cpp index 463a3870ee..a2e6b8fb37 100644 --- a/engines/gob/parse_v2.cpp +++ b/engines/gob/parse_v2.cpp @@ -408,8 +408,8 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) { else if (operation == 27) *valPtr = (int16) READ_VARO_UINT16(temp * 2 + offset * 2); else if (operation == 28) { - *valPtr = encodePtr(_vm->_global->_inter_variables + - temp * 4 + offset * _vm->_global->_inter_animDataSize * 4, + *valPtr = encodePtr(_vm->_inter->_variables->getAddressOff8( + temp * 4 + offset * _vm->_global->_inter_animDataSize * 4, 0), kInterVar); if (*_vm->_global->_inter_execPtr == 13) { _vm->_global->_inter_execPtr++; @@ -467,7 +467,7 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) { case 25: *operPtr = 22; temp = _vm->_inter->load16() * 4; - *valPtr = encodePtr(_vm->_global->_inter_variables + temp, kInterVar); + *valPtr = encodePtr(_vm->_inter->_variables->getAddressOff8(temp, 0), kInterVar); if (*_vm->_global->_inter_execPtr == 13) { _vm->_global->_inter_execPtr++; temp += parseValExpr(12); diff --git a/engines/gob/saveload.cpp b/engines/gob/saveload.cpp index 50f41db47e..2788716858 100644 --- a/engines/gob/saveload.cpp +++ b/engines/gob/saveload.cpp @@ -160,6 +160,60 @@ PlainSave::~PlainSave() { } bool PlainSave::save(int16 dataVar, int32 size, int32 offset, const char *name, + const Variables *variables) { + + if ((size <= 0) || (offset != 0)) { + warning("Invalid size (%d) or offset (%d)", size, offset); + return false; + } + + byte *vars = new byte[size]; + byte *varSizes = new byte[size]; + + if (!variables->copyTo(dataVar, vars, varSizes, size)) { + delete[] vars; + delete[] varSizes; + warning("dataVar (%d) or size (%d) out of range", dataVar, size); + return false; + } + + bool result = save(0, size, offset, name, vars, varSizes); + + delete[] vars; + delete[] varSizes; + + return result; +} + +bool PlainSave::load(int16 dataVar, int32 size, int32 offset, const char *name, + Variables *variables) { + + if ((size <= 0) || (offset != 0)) { + warning("Invalid size (%d) or offset (%d)", size, offset); + return false; + } + + byte *vars = new byte[size]; + byte *varSizes = new byte[size]; + + bool result = load(0, size, offset, name, vars, varSizes); + + if (result && variables) { + if (!variables->copyFrom(dataVar, vars, varSizes, size)) { + delete[] vars; + delete[] varSizes; + warning("dataVar (%d) or size (%d) out of range", dataVar, size); + return false; + } + } + + delete[] vars; + delete[] varSizes; + + return result; +} + +bool PlainSave::save(int16 dataVar, int32 size, int32 offset, const char *name, const byte *variables, const byte *variableSizes) const { if ((size <= 0) || (offset != 0)) { @@ -286,6 +340,64 @@ void StagedSave::assertMode(Mode mode, const char *name) { } bool StagedSave::save(int16 dataVar, int32 size, int32 offset, const char *name, + const Variables *variables) { + + if ((dataVar < 0) || (size <= 0) || (offset < 0)) { + warning("Invalid dataVar (%d), size (%d) or offset (%d)", dataVar, size, offset); + return false; + } + + byte *vars = 0, *varSizes = 0; + + if (variables) { + vars = new byte[size]; + varSizes = new byte[size]; + + if (!variables->copyTo(dataVar, vars, varSizes, size)) { + delete[] vars; + delete[] varSizes; + warning("dataVar (%d) or size (%d) out of range", dataVar, size); + return false; + } + } + + bool result = save(0, size, offset, name, vars, varSizes); + + delete[] vars; + delete[] varSizes; + + return result; +} + +bool StagedSave::load(int16 dataVar, int32 size, int32 offset, const char *name, + Variables *variables) { + + if ((dataVar < 0) || (size <= 0) || (offset < 0)) { + warning("Invalid dataVar (%d), size (%d) or offset (%d)", dataVar, size, offset); + return false; + } + + byte *vars = new byte[size]; + byte *varSizes = new byte[size]; + + bool result = load(0, size, offset, name, vars, varSizes); + + if (result && variables) { + if (!variables->copyFrom(dataVar, vars, varSizes, size)) { + delete[] vars; + delete[] varSizes; + warning("dataVar (%d) or size (%d) out of range", dataVar, size); + return false; + } + } + + delete[] vars; + delete[] varSizes; + + return result; +} + +bool StagedSave::save(int16 dataVar, int32 size, int32 offset, const char *name, const byte *variables, const byte *variableSizes) { if ((dataVar < 0) || (size <= 0) || (offset < 0)) { diff --git a/engines/gob/saveload.h b/engines/gob/saveload.h index 6c5ffe3bbe..29f7ee2594 100644 --- a/engines/gob/saveload.h +++ b/engines/gob/saveload.h @@ -30,6 +30,7 @@ #include "common/stream.h" #include "gob/video.h" +#include "gob/variables.h" namespace Gob { @@ -68,6 +69,11 @@ public: ~PlainSave(); bool save(int16 dataVar, int32 size, int32 offset, const char *name, + const Variables *variables); + bool load(int16 dataVar, int32 size, int32 offset, const char *name, + Variables *variables); + + bool save(int16 dataVar, int32 size, int32 offset, const char *name, const byte *variables, const byte *variableSizes) const; bool load(int16 dataVar, int32 size, int32 offset, const char *name, byte *variables, byte *variableSizes) const; @@ -81,6 +87,11 @@ public: void addStage(int32 size, bool endianed = true); bool save(int16 dataVar, int32 size, int32 offset, const char *name, + const Variables *variables); + bool load(int16 dataVar, int32 size, int32 offset, const char *name, + Variables *variables); + + bool save(int16 dataVar, int32 size, int32 offset, const char *name, const byte *variables, const byte *variableSizes); bool load(int16 dataVar, int32 size, int32 offset, const char *name, byte *variables, byte *variableSizes); diff --git a/engines/gob/saveload_v2.cpp b/engines/gob/saveload_v2.cpp index 153b6dc2cd..a92fe8cf01 100644 --- a/engines/gob/saveload_v2.cpp +++ b/engines/gob/saveload_v2.cpp @@ -31,6 +31,7 @@ #include "gob/global.h" #include "gob/game.h" #include "gob/draw.h" +#include "gob/inter.h" namespace Gob { @@ -209,9 +210,8 @@ bool SaveLoad_v2::loadGame(SaveFile &saveFile, return false; } - SaveLoad::buildIndex(_vm->_global->_inter_variables + dataVar, + SaveLoad::buildIndex(_vm->_inter->_variables->getAddressOff8(dataVar, 600), saveFile.destName, 15, 40); - memset(_vm->_global->_inter_variablesSizes + dataVar, 0, 600); } else { int slot = getSlot(offset); @@ -227,8 +227,7 @@ bool SaveLoad_v2::loadGame(SaveFile &saveFile, return false; } - if (!_save.load(dataVar, size, 40, saveFile.destName, - _vm->_global->_inter_variables, _vm->_global->_inter_variablesSizes)) + if (!_save.load(dataVar, size, 40, saveFile.destName, _vm->_inter->_variables)) return false; } @@ -269,8 +268,7 @@ bool SaveLoad_v2::loadNotes(SaveFile &saveFile, debugC(2, kDebugSaveLoad, "Loading the notes"); - return _notes.load(dataVar, size, offset, saveFile.destName, - _vm->_global->_inter_variables, _vm->_global->_inter_variablesSizes); + return _notes.load(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables); } bool SaveLoad_v2::saveGame(SaveFile &saveFile, @@ -289,7 +287,7 @@ bool SaveLoad_v2::saveGame(SaveFile &saveFile, return false; } - memcpy(_indexBuffer, _vm->_global->_inter_variables + dataVar, 600); + _vm->_inter->_variables->copyTo(dataVar, _indexBuffer, 0, 600); _hasIndex = true; } else { @@ -318,8 +316,7 @@ bool SaveLoad_v2::saveGame(SaveFile &saveFile, if(!_save.save(0, 40, 0, saveFile.destName, _indexBuffer + (slot * 40), sizes)) return false; - if (!_save.save(dataVar, size, 40, saveFile.destName, - _vm->_global->_inter_variables, _vm->_global->_inter_variablesSizes)) + if (!_save.save(dataVar, size, 40, saveFile.destName, _vm->_inter->_variables)) return false; } @@ -353,8 +350,7 @@ bool SaveLoad_v2::saveNotes(SaveFile &saveFile, debugC(2, kDebugSaveLoad, "Saving the notes"); - return _notes.save(dataVar, size, offset, saveFile.destName, - _vm->_global->_inter_variables, _vm->_global->_inter_variablesSizes); + return _notes.save(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables); return false; } diff --git a/engines/gob/saveload_v3.cpp b/engines/gob/saveload_v3.cpp index d8eadd5677..67879db3d1 100644 --- a/engines/gob/saveload_v3.cpp +++ b/engines/gob/saveload_v3.cpp @@ -31,6 +31,7 @@ #include "gob/global.h" #include "gob/game.h" #include "gob/draw.h" +#include "gob/inter.h" namespace Gob { @@ -279,10 +280,8 @@ bool SaveLoad_v3::loadGame(SaveFile &saveFile, return false; } - memcpy(_vm->_global->_inter_variables + dataVar, - _propBuffer + offset, size); - memcpy(_vm->_global->_inter_variablesSizes + dataVar, - _propBuffer + offset + 500, size); + _vm->_inter->_variables->copyFrom(dataVar, + _propBuffer + offset, _propBuffer + offset + 500, size); } else if (offset == 500) { debugC(3, kDebugSaveLoad, "Loading save index"); @@ -294,9 +293,8 @@ bool SaveLoad_v3::loadGame(SaveFile &saveFile, int slot = saveFile.slot; - SaveLoad::buildIndex(_vm->_global->_inter_variables + dataVar, + SaveLoad::buildIndex(_vm->_inter->_variables->getAddressOff8(dataVar, 1200), saveFile.destName, 30, 40, 1000); - memset(_vm->_global->_inter_variablesSizes + dataVar, 0, 1200); setCurrentSlot(saveFile.destName, slot); @@ -314,8 +312,7 @@ bool SaveLoad_v3::loadGame(SaveFile &saveFile, return false; } - if (!_save.load(dataVar, size, 540, saveFile.destName, - _vm->_global->_inter_variables, _vm->_global->_inter_variablesSizes)) + if (!_save.load(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables)) return false; } @@ -356,8 +353,7 @@ bool SaveLoad_v3::loadNotes(SaveFile &saveFile, debugC(2, kDebugSaveLoad, "Loading the notes"); - return _notes.load(dataVar, size, offset, saveFile.destName, - _vm->_global->_inter_variables, _vm->_global->_inter_variablesSizes); + return _notes.load(dataVar, size, offset, saveFile.destName, _vm->_inter->_variables); } bool SaveLoad_v3::loadScreenshot(SaveFile &saveFile, @@ -383,8 +379,7 @@ bool SaveLoad_v3::loadScreenshot(SaveFile &saveFile, buildScreenshotIndex(buffer, saveFile.destName, 30); setCurrentSlot(saveFile.destName, slot); - memcpy(_vm->_global->_inter_variables + dataVar, buffer, 40); - memset(_vm->_global->_inter_variablesSizes + dataVar, 0, 40); + memcpy(_vm->_inter->_variables->getAddressOff8(dataVar, 40), buffer, 40); } else { saveFile.slot = (offset - _screenshotOffset) / _screenshotSize; @@ -453,10 +448,8 @@ bool SaveLoad_v3::saveGame(SaveFile &saveFile, return false; } - memcpy(_propBuffer + offset, - _vm->_global->_inter_variables + dataVar, size); - memcpy(_propBuffer + offset + 500, - _vm->_global->_inter_variablesSizes + dataVar, size); + _vm->_inter->_variables->copyTo(dataVar, + _propBuffer + offset, _propBuffer + offset + 500, size); } else if (offset == 500) { debugC(3, kDebugSaveLoad, "Saving save index"); @@ -466,7 +459,7 @@ bool SaveLoad_v3::saveGame(SaveFile &saveFile, return false; } - memcpy(_indexBuffer, _vm->_global->_inter_variables + dataVar, size); + _vm->_inter->_variables->copyTo(dataVar, _indexBuffer, 0, size); _hasIndex = true; } else { @@ -496,8 +489,7 @@ bool SaveLoad_v3::saveGame(SaveFile &saveFile, if(!_save.save(0, 40, 500, saveFile.destName, _indexBuffer + (saveFile.slot * 40), 0)) return false; - if (!_save.save(dataVar, size, 540, saveFile.destName, - _vm->_global->_inter_variables, _vm->_global->_inter_variablesSizes)) + if (!_save.save(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables)) return false; } @@ -531,8 +523,7 @@ bool SaveLoad_v3::saveNotes(SaveFile &saveFile, debugC(2, kDebugSaveLoad, "Saving the notes"); - return _notes.save(dataVar, size - 160, offset, saveFile.destName, - _vm->_global->_inter_variables, _vm->_global->_inter_variablesSizes); + return _notes.save(dataVar, size - 160, offset, saveFile.destName, _vm->_inter->_variables); return false; } diff --git a/engines/gob/saveload_v4.cpp b/engines/gob/saveload_v4.cpp index 9b46bb26ac..a6548dd82d 100644 --- a/engines/gob/saveload_v4.cpp +++ b/engines/gob/saveload_v4.cpp @@ -27,8 +27,8 @@ #include "gob/gob.h" #include "gob/saveload.h" -#include "gob/global.h" #include "gob/game.h" +#include "gob/inter.h" namespace Gob { @@ -247,8 +247,8 @@ bool SaveLoad_v4::loadScreenProps(SaveFile &saveFile, debugC(3, kDebugSaveLoad, "Loading screen properties (%d, %d, %d)", dataVar, size, offset); - memcpy(_vm->_global->_inter_variables + dataVar, _screenProps + offset, size); - memcpy(_vm->_global->_inter_variablesSizes + dataVar, _screenProps + 256000 + offset, size); + _vm->_inter->_variables->copyFrom(dataVar, + _screenProps + offset, _screenProps + 256000 + offset, size); return true; } @@ -269,10 +269,8 @@ bool SaveLoad_v4::loadGame(SaveFile &saveFile, return false; } - memcpy(_vm->_global->_inter_variables + dataVar, - _propBuffer + offset, size); - memcpy(_vm->_global->_inter_variablesSizes + dataVar, - _propBuffer + offset + 500, size); + _vm->_inter->_variables->copyFrom(dataVar, + _propBuffer + offset, _propBuffer + offset + 500, size); } else if (offset == 500) { debugC(3, kDebugSaveLoad, "Loading save index"); @@ -282,9 +280,8 @@ bool SaveLoad_v4::loadGame(SaveFile &saveFile, return false; } - SaveLoad::buildIndex(_vm->_global->_inter_variables + dataVar, + SaveLoad::buildIndex(_vm->_inter->_variables->getAddressOff8(dataVar, 1200), saveFile.destName, 30, 40, 1000); - memset(_vm->_global->_inter_variablesSizes + dataVar, 0, 1200); } else { int slot = getSlot(offset); @@ -300,8 +297,7 @@ bool SaveLoad_v4::loadGame(SaveFile &saveFile, return false; } - if (!_save.load(dataVar, size, 540, saveFile.destName, - _vm->_global->_inter_variables, _vm->_global->_inter_variablesSizes)) + if (!_save.load(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables)) return false; } @@ -340,8 +336,8 @@ bool SaveLoad_v4::saveScreenProps(SaveFile &saveFile, debugC(3, kDebugSaveLoad, "Saving screen properties (%d, %d, %d)", dataVar, size, offset); - memcpy(_screenProps + offset, _vm->_global->_inter_variables + dataVar, size); - memcpy(_screenProps + 256000 + offset, _vm->_global->_inter_variablesSizes + dataVar, size); + _vm->_inter->_variables->copyTo(dataVar, + _screenProps + offset, _screenProps + 256000 + offset, size); return true; } @@ -362,10 +358,8 @@ bool SaveLoad_v4::saveGame(SaveFile &saveFile, return false; } - memcpy(_propBuffer + offset, - _vm->_global->_inter_variables + dataVar, size); - memcpy(_propBuffer + offset + 500, - _vm->_global->_inter_variablesSizes + dataVar, size); + _vm->_inter->_variables->copyTo(dataVar, + _propBuffer + offset, _propBuffer + offset + 500, size); } else if (offset == 500) { debugC(3, kDebugSaveLoad, "Saving save index"); @@ -375,7 +369,7 @@ bool SaveLoad_v4::saveGame(SaveFile &saveFile, return false; } - memcpy(_indexBuffer, _vm->_global->_inter_variables + dataVar, size); + _vm->_inter->_variables->copyTo(dataVar, _indexBuffer, 0, size); _hasIndex = true; } else { @@ -405,8 +399,7 @@ bool SaveLoad_v4::saveGame(SaveFile &saveFile, if(!_save.save(0, 40, 500, saveFile.destName, _indexBuffer + (slot * 40), 0)) return false; - if (!_save.save(dataVar, size, 540, saveFile.destName, - _vm->_global->_inter_variables, _vm->_global->_inter_variablesSizes)) + if (!_save.save(dataVar, size, 540, saveFile.destName, _vm->_inter->_variables)) return false; } diff --git a/engines/gob/sound/sound.cpp b/engines/gob/sound/sound.cpp index a90afe0e27..2d2bf8e043 100644 --- a/engines/gob/sound/sound.cpp +++ b/engines/gob/sound/sound.cpp @@ -29,6 +29,7 @@ #include "gob/util.h" #include "gob/dataio.h" #include "gob/game.h" +#include "gob/inter.h" namespace Gob { @@ -370,7 +371,7 @@ void Sound::blasterWaitEndPlay(bool interruptible, bool stopComp) { while (_blaster->isPlaying() && !_vm->_quitRequested) { if (interruptible && (_vm->_util->checkKey() == 0x11B)) { - WRITE_VAR(57, -1); + WRITE_VAR(57, (uint32) -1); return; } _vm->_util->longDelay(200); diff --git a/engines/gob/variables.cpp b/engines/gob/variables.cpp new file mode 100644 index 0000000000..0eea2f6547 --- /dev/null +++ b/engines/gob/variables.cpp @@ -0,0 +1,311 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "common/endian.h" + +#include "gob/gob.h" +#include "gob/variables.h" + +namespace Gob { + +Variables::Variables(uint32 size) { + _size = size; + + _vars = new byte[_size]; + _sizes = new byte[_size]; + + clear(); +} + +Variables::~Variables() { + delete[] _vars; + delete[] _sizes; +} + +void Variables::clear() { + memset(_vars, 0, _size); + + // All variables are 32 bit wide per default + memset(_sizes, 0, _size); + for (uint32 i = 0; i < _size; i += 4) + _sizes[i] = kSize32; +} + +void Variables::clearSize(uint32 offset) { + uint32 inVar = offset % 4; + uint32 varOff = (offset >> 2) << 2; + + // Clearing out the old size + for (uint32 i = 0; i < 4; i++) { + if (_sizes[varOff + i] == kSize32) + _sizes[varOff + i] = kSize8; + else if ((inVar == (i + 1)) && (_sizes[varOff + i] == kSize16)) + _sizes[varOff + i] = kSize8; + } +} + +void Variables::writeSize(uint32 offset, byte n) { + clearSize(offset); + + _sizes[offset] = n; + // Setting following bytes of size to 8 bit, for easy clearing out afterwards + for (; n > 0; n--) + _sizes[offset + n] = kSize8; +} + +void Variables::writeSizeString(uint32 offset, uint32 length) { + clearSize(offset); + + memset(_sizes + offset, kSize8, length); +} + +void Variables::writeVar8(uint32 var, uint8 value) { + writeOff8(var * 4, value); +} + +void Variables::writeVar16(uint32 var, uint16 value) { + writeOff16(var * 4, value); +} + +void Variables::writeVar32(uint32 var, uint32 value) { + writeOff32(var * 4, value); +} + +void Variables::writeVarString(uint32 var, const char *value) { + writeOffString(var * 4, value); +} + +void Variables::writeOff8(uint32 offset, uint8 value) { + write8(_vars + offset, value); + writeSize(offset, kSize8); +} + +void Variables::writeOff16(uint32 offset, uint16 value) { + write16(_vars + offset, value); + writeSize(offset, kSize16); +} + +void Variables::writeOff32(uint32 offset, uint32 value) { + write32(_vars + offset, value); + writeSize(offset, kSize32); +} + +void Variables::writeOffString(uint32 offset, const char *value) { + strcpy((char *) (_vars + offset), value); + writeSizeString(offset, strlen(value)); +} + +uint8 Variables::readVar8(uint32 var) const { + return readOff8(var * 4); +} + +uint16 Variables::readVar16(uint32 var) const { + return readOff16(var * 4); +} + +uint32 Variables::readVar32(uint32 var) const { + return readOff32(var * 4); +} + +void Variables::readVarString(uint32 var, char *value, uint32 length) { + readOffString(var * 4, value, length); +} + +uint8 Variables::readOff8(uint32 offset) const { + return read8(_vars + offset); +} + +uint16 Variables::readOff16(uint32 offset) const { + return read16(_vars + offset); +} + +uint32 Variables::readOff32(uint32 offset) const { + return read32(_vars + offset); +} + +void Variables::readOffString(uint32 offset, char *value, uint32 length) { + strncpy0(value, (const char *) (_vars + offset), length - 1); +} + +const uint8 *Variables::getAddressVar8(uint32 var) const { + return getAddressOff8(var * 4); +} + +uint8 *Variables::getAddressVar8(uint32 var, uint32 n) { + return getAddressOff8(var * 4, n); +} + +const uint16 *Variables::getAddressVar16(uint32 var) const { + return getAddressOff16(var * 4); +} + +uint16 *Variables::getAddressVar16(uint32 var, uint32 n) { + return getAddressOff16(var * 4, n); +} + +const uint32 *Variables::getAddressVar32(uint32 var) const { + return getAddressOff32(var * 4); +} + +uint32 *Variables::getAddressVar32(uint32 var, uint32 n) { + return getAddressOff32(var * 4, n); +} + +const char *Variables::getAddressVarString(uint32 var) const { + return getAddressOffString(var * 4); +} + +char *Variables::getAddressVarString(uint32 var, uint32 n) { + return getAddressOffString(var * 4, n); +} + +const uint8 *Variables::getAddressOff8(uint32 offset) const { + return ((const uint8 *) (_vars + offset)); +} + +uint8 *Variables::getAddressOff8(uint32 offset, uint32 n) { + for (uint32 i = 0; i < n; i++) + writeSize(offset + i, kSize8); + + return ((uint8 *) (_vars + offset)); +} + +const uint16 *Variables::getAddressOff16(uint32 offset) const { + return ((const uint16 *) (_vars + offset)); +} + +uint16 *Variables::getAddressOff16(uint32 offset, uint32 n) { + for (uint32 i = 0; i < n; i++) + writeSize(offset + i * 2, kSize16); + + return ((uint16 *) (_vars + offset)); +} + +const uint32 *Variables::getAddressOff32(uint32 offset) const { + return ((const uint32 *) (_vars + offset)); +} + +uint32 *Variables::getAddressOff32(uint32 offset, uint32 n) { + for (uint32 i = 0; i < n; i++) + writeSize(offset + i * 4, kSize32); + + return ((uint32 *) (_vars + offset)); +} + +const char *Variables::getAddressOffString(uint32 offset) const { + return ((const char *) (_vars + offset)); +} + +char *Variables::getAddressOffString(uint32 offset, uint32 n) { + writeSizeString(offset, (n == 0xFFFFFFFF) ? strlen((char *) (_vars + offset)) : n); + + return ((char *) (_vars + offset)); +} + +bool Variables::copyTo(uint32 offset, byte *variables, byte *sizes, uint32 n) const { + if ((offset + n) > _size) + return false; + + if (variables) + memcpy(variables, _vars + offset, n); + if (sizes) + memcpy(sizes, _sizes + offset, n); + + return true; +} + +bool Variables::copyFrom(uint32 offset, const byte *variables, const byte *sizes, uint32 n) { + if (((offset + n) > _size) || !variables || !sizes) + return false; + + memcpy(_vars + offset, variables, n); + memcpy(_sizes + offset, sizes, n); + + return true; +} + + +VariablesLE::VariablesLE(uint32 size) : Variables(size) { +} + +VariablesLE::~VariablesLE() { +} + +void VariablesLE::write8(byte *buf, uint8 data) const { + *buf = (byte) data; +} + +void VariablesLE::write16(byte *buf, uint16 data) const { + WRITE_LE_UINT16(buf, data); +} + +void VariablesLE::write32(byte *buf, uint32 data) const { + WRITE_LE_UINT32(buf, data); +} + +uint8 VariablesLE::read8(const byte *buf) const { + return (uint8) *buf; +} + +uint16 VariablesLE::read16(const byte *buf) const { + return READ_LE_UINT16(buf); +} + +uint32 VariablesLE::read32(const byte *buf) const { + return READ_LE_UINT32(buf); +} + + +VariablesBE::VariablesBE(uint32 size) : Variables(size) { +} + +VariablesBE::~VariablesBE() { +} + +void VariablesBE::write8(byte *buf, uint8 data) const { + *buf = (byte) data; +} + +void VariablesBE::write16(byte *buf, uint16 data) const { + WRITE_BE_UINT16(buf, data); +} + +void VariablesBE::write32(byte *buf, uint32 data) const { + WRITE_BE_UINT32(buf, data); +} + +uint8 VariablesBE::read8(const byte *buf) const { + return (uint8) *buf; +} + +uint16 VariablesBE::read16(const byte *buf) const { + return READ_BE_UINT16(buf); +} + +uint32 VariablesBE::read32(const byte *buf) const { + return READ_BE_UINT32(buf); +} + +} // End of namespace Gob diff --git a/engines/gob/variables.h b/engines/gob/variables.h new file mode 100644 index 0000000000..5989ed38ee --- /dev/null +++ b/engines/gob/variables.h @@ -0,0 +1,147 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef GOB_VARIABLES_H +#define GOB_VARIABLES_H + +namespace Gob { + +class Variables { +public: + Variables(uint32 size); + virtual ~Variables(); + + void writeVar8(uint32 var, uint8 value); + void writeVar16(uint32 var, uint16 value); + void writeVar32(uint32 var, uint32 value); + + void writeVarString(uint32 var, const char *value); + + void writeOff8(uint32 offset, uint8 value); + void writeOff16(uint32 offset, uint16 value); + void writeOff32(uint32 offset, uint32 value); + + void writeOffString(uint32 offset, const char *value); + + uint8 readVar8(uint32 var) const; + uint16 readVar16(uint32 var) const; + uint32 readVar32(uint32 var) const; + + void readVarString(uint32 var, char *value, uint32 length); + + uint8 readOff8(uint32 offset) const; + uint16 readOff16(uint32 offset) const; + uint32 readOff32(uint32 offset) const; + + void readOffString(uint32 offset, char *value, uint32 length); + + + const uint8 *getAddressVar8(uint32 var) const; + uint8 *getAddressVar8(uint32 var, uint32 n = 1); + + const uint16 *getAddressVar16(uint32 var) const; + uint16 *getAddressVar16(uint32 var, uint32 n = 1); + + const uint32 *getAddressVar32(uint32 var) const; + uint32 *getAddressVar32(uint32 var, uint32 n = 1); + + const char *getAddressVarString(uint32 var) const; + char *getAddressVarString(uint32 var, uint32 n = 0xFFFFFFFF); + + const uint8 *getAddressOff8(uint32 offset) const; + uint8 *getAddressOff8(uint32 offset, uint32 n = 1); + + const uint16 *getAddressOff16(uint32 offset) const; + uint16 *getAddressOff16(uint32 offset, uint32 n = 1); + + const uint32 *getAddressOff32(uint32 offset) const; + uint32 *getAddressOff32(uint32 offset, uint32 n = 1); + + const char *getAddressOffString(uint32 offset) const; + char *getAddressOffString(uint32 offset, uint32 n = 0xFFFFFFFF); + + + bool copyTo(uint32 offset, byte *variables, byte *sizes, uint32 n) const; + bool copyFrom(uint32 offset, const byte *variables, const byte *sizes, uint32 n); + +protected: + virtual void write8(byte *buf, uint8 data) const = 0; + virtual void write16(byte *buf, uint16 data) const = 0; + virtual void write32(byte *buf, uint32 data) const = 0; + + virtual uint8 read8(const byte *buf) const = 0; + virtual uint16 read16(const byte *buf) const = 0; + virtual uint32 read32(const byte *buf) const = 0; + +private: + // Basically the number of additional bytes occupied + static const byte kSize8 = 0; + static const byte kSize16 = 1; + static const byte kSize32 = 3; + + uint32 _size; + + byte *_vars; + byte *_sizes; + + void clear(); + void clearSize(uint32 offset); + void writeSize(uint32 offset, byte n); + void writeSizeString(uint32 offset, uint32 length); +}; + +class VariablesLE : public Variables { +public: + VariablesLE(uint32 size); + ~VariablesLE(); + +protected: + void write8(byte *buf, uint8 data) const; + void write16(byte *buf, uint16 data) const; + void write32(byte *buf, uint32 data) const; + + uint8 read8(const byte *buf) const; + uint16 read16(const byte *buf) const; + uint32 read32(const byte *buf) const; +}; + +class VariablesBE : public Variables { +public: + VariablesBE(uint32 size); + ~VariablesBE(); + +protected: + void write8(byte *buf, uint8 data) const; + void write16(byte *buf, uint16 data) const; + void write32(byte *buf, uint32 data) const; + + uint8 read8(const byte *buf) const; + uint16 read16(const byte *buf) const; + uint32 read32(const byte *buf) const; +}; + +} // End of namespace Gob + +#endif // GOB_VARIABLES_H diff --git a/engines/gob/videoplayer.cpp b/engines/gob/videoplayer.cpp index 4a337d48b4..909d39a63b 100644 --- a/engines/gob/videoplayer.cpp +++ b/engines/gob/videoplayer.cpp @@ -614,15 +614,15 @@ void VideoPlayer::writeVideoInfo(const char *videoFile, int16 varX, int16 varY, WRITE_VAR_OFFSET(varY, y); WRITE_VAR_OFFSET(varFrames, _primaryVideo->getVideo()->getFramesCount()); WRITE_VAR_OFFSET(varWidth, width); - WRITE_VARO_UINT16(varHeight & 0xFFFFFFFC, height); + WRITE_VAR_OFFSET(varHeight, height); primaryClose(); } else { - WRITE_VAR_OFFSET(varX, -1); - WRITE_VAR_OFFSET(varY, -1); - WRITE_VAR_OFFSET(varFrames, -1); - WRITE_VAR_OFFSET(varWidth, -1); - WRITE_VAR_OFFSET(varHeight, -1); + WRITE_VAR_OFFSET(varX, (uint32) -1); + WRITE_VAR_OFFSET(varY, (uint32) -1); + WRITE_VAR_OFFSET(varFrames, (uint32) -1); + WRITE_VAR_OFFSET(varWidth, (uint32) -1); + WRITE_VAR_OFFSET(varHeight, (uint32) -1); } } diff --git a/engines/kyra/detection.cpp b/engines/kyra/detection.cpp index a3ca2f829e..344121b503 100644 --- a/engines/kyra/detection.cpp +++ b/engines/kyra/detection.cpp @@ -282,7 +282,7 @@ const KYRAGameDescription adGameDescs[] = { AD_ENTRY1("GEMCUT.PAK", "d8327fc4b7a72b23c900fa13aef4093a"), Common::IT_ITA, Common::kPlatformPC, - Common::ADGF_NO_FLAGS + Common::ADGF_CD }, KYRA1_CD_FLAGS }, diff --git a/engines/kyra/kyra_hof.cpp b/engines/kyra/kyra_hof.cpp index 9c5548c1f7..57f0dcc24a 100644 --- a/engines/kyra/kyra_hof.cpp +++ b/engines/kyra/kyra_hof.cpp @@ -206,7 +206,12 @@ void KyraEngine_HoF::pauseEngineIntern(bool pause) { _activeWSA[x].nextFrame += pausedTime; } - // TODO: item animation, idle animation, tim player, etc + _nextIdleAnim += pausedTime; + + for (int x = 0; x < _itemAnimDataSize; x++) + _activeItemAnim[x].nextFrame += pausedTime; + + _tim->refreshTimersAfterPause(pausedTime); } } @@ -287,8 +292,6 @@ int KyraEngine_HoF::go() { if (_menuChoice != 4) { // load just the pak files needed for ingame _res->loadPakFile(StaticResource::staticDataFilename()); - if (_flags.useInstallerPackage) - _res->loadPakFile("WESTWOOD.001"); if (_flags.platform == Common::kPlatformPC && _flags.isTalkie) _res->loadFileList("FILEDATA.FDT"); else diff --git a/engines/kyra/resource.cpp b/engines/kyra/resource.cpp index 6b38a0f907..46c73c9d3b 100644 --- a/engines/kyra/resource.cpp +++ b/engines/kyra/resource.cpp @@ -32,8 +32,6 @@ #include "kyra/resource.h" -#define INS_CACHE_THRESHOLD 300000 // all files with file size greater than this will be cached - namespace Kyra { Resource::Resource(KyraEngine_v1 *vm) : _loaders(), _map(), _vm(vm) { @@ -43,9 +41,13 @@ Resource::Resource(KyraEngine_v1 *vm) : _loaders(), _map(), _vm(vm) { Resource::~Resource() { _map.clear(); _loaders.clear(); + + clearCompFileList(); + _compLoaders.clear(); } bool Resource::reset() { + clearCompFileList(); unloadAllPakFiles(); FilesystemNode dir(ConfMan.get("path")); @@ -69,7 +71,7 @@ bool Resource::reset() { loadPakFile("CHAPTER1.VRM"); } else if (_vm->game() == GI_KYRA2) { if (_vm->gameFlags().useInstallerPackage) - loadPakFile("WESTWOOD.001"); + tryLoadCompFiles(); // mouse pointer, fonts, etc. required for initializing if (_vm->gameFlags().isDemo && !_vm->gameFlags().isTalkie) { @@ -89,6 +91,7 @@ bool Resource::reset() { } else if (_vm->game() == GI_KYRA3) { if (_vm->gameFlags().useInstallerPackage) loadPakFile("WESTWOOD.001"); + // Add default file directories Common::File::addDefaultDirectory(ConfMan.get("path") + "malcolm"); Common::File::addDefaultDirectory(ConfMan.get("path") + "MALCOLM"); @@ -153,6 +156,7 @@ bool Resource::loadPakFile(const Common::String &filename) { const ResArchiveLoader *loader = getLoader(iter->_value.type); if (!loader) { + assert(loader); error("no archive loader for file '%s' found which is of type %d", filename.c_str(), iter->_value.type); return false; } @@ -264,6 +268,13 @@ void Resource::unloadPakFile(const Common::String &filename) { } } +void Resource::clearCompFileList() { + for (CompFileMap::iterator i = _compFiles.begin(); i != _compFiles.end(); ++i) + delete[] i->_value.data; + + _compFiles.clear(); +} + bool Resource::isInPakList(const Common::String &filename) { if (!isAccessable(filename)) return false; @@ -304,6 +315,8 @@ bool Resource::exists(const char *file, bool errorOutOnFail) { } uint32 Resource::getFileSize(const char *file) { + CompFileMap::iterator compEntry; + if (Common::File::exists(file)) { Common::File f; if (f.open(file)) @@ -325,12 +338,14 @@ bool Resource::loadFileToBuf(const char *file, void *buf, uint32 maxSize) { return false; memset(buf, 0, maxSize); - stream->read(buf, stream->size()); + stream->read(buf, (maxSize <= stream->size()) ? maxSize : stream->size()); delete stream; return true; } Common::SeekableReadStream *Resource::getFileStream(const Common::String &file) { + CompFileMap::iterator compEntry; + if (Common::File::exists(file)) { Common::File *stream = new Common::File(); if (!stream->open(file)) { @@ -339,6 +354,8 @@ Common::SeekableReadStream *Resource::getFileStream(const Common::String &file) error("Couldn't open file '%s'", file.c_str()); } return stream; + } else if ((compEntry = _compFiles.find(file)) != _compFiles.end()) { + return new Common::MemoryReadStream(compEntry->_value.data, compEntry->_value.size, false); } else { if (!isAccessable(file)) return 0; @@ -387,19 +404,35 @@ bool Resource::isAccessable(const Common::String &file) { } void Resource::checkFile(const Common::String &file) { - if (_map.find(file) == _map.end() && Common::File::exists(file)) { - Common::File temp; - if (temp.open(file)) { + if (_map.find(file) == _map.end()) { + CompFileMap::const_iterator iter; + + if (Common::File::exists(file)) { + Common::File temp; + if (temp.open(file)) { + ResFileEntry entry; + entry.parent = ""; + entry.size = temp.size(); + entry.mounted = file.compareToIgnoreCase(StaticResource::staticDataFilename()) != 0; + entry.preload = false; + entry.prot = false; + entry.type = ResFileEntry::kAutoDetect; + entry.offset = 0; + _map[file] = entry; + temp.close(); + + detectFileTypes(); + } + } else if ((iter = _compFiles.find(file)) != _compFiles.end()) { ResFileEntry entry; entry.parent = ""; - entry.size = temp.size(); - entry.mounted = file.compareToIgnoreCase(StaticResource::staticDataFilename()) != 0; + entry.size = iter->_value.size; + entry.mounted = false; entry.preload = false; entry.prot = false; entry.type = ResFileEntry::kAutoDetect; entry.offset = 0; _map[file] = entry; - temp.close(); detectFileTypes(); } @@ -436,6 +469,13 @@ void Resource::detectFileTypes() { } } +void Resource::tryLoadCompFiles() { + for (CCompLoaderIterator i = _compLoaders.begin(); i != _compLoaders.end(); ++i) { + if ((*i)->checkForFiles()) + (*i)->loadFile(_compFiles); + } +} + #pragma mark - #pragma mark - ResFileLodaer #pragma mark - @@ -582,7 +622,7 @@ Common::SeekableReadStream *ResLoaderPak::loadFileFromArchive(const Common::Stri return stream; } -class ResLoaderInsKyra : public ResArchiveLoader { +class ResLoaderInsMalcolm : public ResArchiveLoader { public: bool checkFilename(Common::String filename) const; bool isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const; @@ -590,29 +630,172 @@ public: Common::SeekableReadStream *loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const; ResFileEntry::kType getType() const { - return ResFileEntry::kInsKyra; + return ResFileEntry::kInsMal; } }; -bool ResLoaderInsKyra::checkFilename(Common::String filename) const { - return false; +bool ResLoaderInsMalcolm::checkFilename(Common::String filename) const { + filename.toUppercase(); + if (!filename.hasSuffix(".001")) + return false; + return true; +} + +bool ResLoaderInsMalcolm::isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const { + stream.seek(3); + uint32 size = stream.readUint32LE(); + + if (size+7 > stream.size()) + return false; + + stream.seek(size+5, SEEK_SET); + uint8 buffer[2]; + stream.read(&buffer, 2); + + return (buffer[0] == 0x0D && buffer[1] == 0x0A); +} + +bool ResLoaderInsMalcolm::loadFile(const Common::String &filename, Common::SeekableReadStream &stream, FileList &files) const { + Common::List<Common::String> filenames; + + // thanks to eriktorbjorn for this code (a bit modified though) + stream.seek(3, SEEK_SET); + + // first file is the index table + uint32 size = stream.readUint32LE(); + Common::String temp = ""; + + for (uint32 i = 0; i < size; ++i) { + byte c = stream.readByte(); + + if (c == '\\') { + temp = ""; + } else if (c == 0x0D) { + // line endings are CRLF + c = stream.readByte(); + assert(c == 0x0A); + ++i; + + filenames.push_back(temp); + } else { + temp += (char)c; + } + } + + stream.seek(3, SEEK_SET); + + for (Common::List<Common::String>::iterator file = filenames.begin(); file != filenames.end(); ++file) { + ResFileEntry entry; + entry.parent = filename; + entry.type = ResFileEntry::kAutoDetect; + entry.mounted = false; + entry.preload = false; + entry.prot = false; + entry.size = stream.readUint32LE(); + entry.offset = stream.pos(); + stream.seek(entry.size, SEEK_CUR); + files.push_back(File(*file, entry)); + } + + return true; +} + +Common::SeekableReadStream *ResLoaderInsMalcolm::loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const { + assert(archive); + + archive->seek(entry.offset, SEEK_SET); + Common::SeekableSubReadStream *stream = new Common::SeekableSubReadStream(archive, entry.offset, entry.offset + entry.size, true); + assert(stream); + return stream; +} + +class ResLoaderTlk : public ResArchiveLoader { +public: + bool checkFilename(Common::String filename) const; + bool isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const; + bool loadFile(const Common::String &filename, Common::SeekableReadStream &stream, FileList &files) const; + Common::SeekableReadStream *loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const; + + ResFileEntry::kType getType() const { + return ResFileEntry::kTlk; + } + +private: + static bool sortTlkFileList(const File &l, const File &r); + static FileList::const_iterator nextFile(const FileList &list, FileList::const_iterator iter); +}; + +bool ResLoaderTlk::checkFilename(Common::String filename) const { + filename.toUppercase(); + return (filename.hasSuffix(".TLK")); } -bool ResLoaderInsKyra::isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const { +bool ResLoaderTlk::isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const { + uint16 entries = stream.readUint16LE(); + uint32 entryTableSize = (entries * 8); + + if (entryTableSize + 2 > stream.size()) + return false; + + uint32 offset = 0; + + for (uint i = 0; i < entries; ++i) { + stream.readUint32LE(); + offset = stream.readUint32LE(); + + if (offset > stream.size()) + return false; + } + return true; } -bool ResLoaderInsKyra::loadFile(const Common::String &filename, Common::SeekableReadStream &stream, FileList &files) const { +bool ResLoaderTlk::loadFile(const Common::String &filename, Common::SeekableReadStream &stream, FileList &files) const { + uint16 entries = stream.readUint16LE(); + + for (uint i = 0; i < entries; ++i) { + ResFileEntry entry; + entry.parent = filename; + entry.type = ResFileEntry::kAutoDetect; + entry.mounted = false; + entry.preload = false; + entry.prot = false; + + uint32 resFilename = stream.readUint32LE(); + uint32 resOffset = stream.readUint32LE(); + + entry.offset = resOffset+4; + + char realFilename[20]; + snprintf(realFilename, 20, "%u.AUD", resFilename); + + uint32 curOffset = stream.pos(); + stream.seek(resOffset, SEEK_SET); + entry.size = stream.readUint32LE(); + stream.seek(curOffset, SEEK_SET); + + files.push_back(FileList::value_type(realFilename, entry)); + } + return true; } -Common::SeekableReadStream *ResLoaderInsKyra::loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const { - return 0; +Common::SeekableReadStream *ResLoaderTlk::loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const { + assert(archive); + + archive->seek(entry.offset, SEEK_SET); + Common::SeekableSubReadStream *stream = new Common::SeekableSubReadStream(archive, entry.offset, entry.offset + entry.size, true); + assert(stream); + return stream; } +#pragma mark - +#pragma mark - CompFileLoader +#pragma mark - + class FileExpanderSource { public: - FileExpanderSource(const uint8 *data) : _dataPtr(data), _bitsLeft(8), _key(0), _index(0) {} + FileExpanderSource(const uint8 *data, int dataSize) : _dataPtr(data), _endofBuffer(data + dataSize), _bitsLeft(8), _key(0), _index(0) {} ~FileExpanderSource() {} void advSrcRefresh(); @@ -628,6 +811,7 @@ public: private: const uint8 *_dataPtr; + const uint8 *_endofBuffer; uint16 _key; int8 _bitsLeft; uint8 _index; @@ -636,7 +820,8 @@ private: void FileExpanderSource::advSrcBitsBy1() { _key >>= 1; if (!--_bitsLeft) { - _key = ((*_dataPtr++) << 8 ) | (_key & 0xff); + if (_dataPtr < _endofBuffer) + _key = ((*_dataPtr++) << 8 ) | (_key & 0xff); _bitsLeft = 8; } } @@ -648,7 +833,8 @@ void FileExpanderSource::advSrcBitsByIndex(uint8 newIndex) { _key >>= (_index + _bitsLeft); _index = -_bitsLeft; _bitsLeft = 8 - _index; - _key = (*_dataPtr++ << 8) | (_key & 0xff); + if (_dataPtr < _endofBuffer) + _key = (*_dataPtr++ << 8) | (_key & 0xff); } _key >>= _index; } @@ -692,12 +878,14 @@ uint16 FileExpanderSource::keyMaskedAlign(uint16 val) { int16 b = ((_bitsLeft << 8) | _index) - 1; _bitsLeft = b >> 8; _index = b & 0xff; - return (((val & 3) + 4) << _index) + 0x101 + getKeyMasked(_index); + uint16 res = (((val & 3) + 4) << _index) + 0x101; + return res + getKeyMasked(_index); } void FileExpanderSource::advSrcRefresh() { _key = READ_LE_UINT16(_dataPtr); - _dataPtr += 2; + if (_dataPtr < _endofBuffer - 1) + _dataPtr += 2; _bitsLeft = 8; } @@ -754,7 +942,7 @@ bool FileExpander::process(uint8 *dst, const uint8 *src, uint32 outsize, uint32 bool needrefresh = true; bool postprocess = false; - _src = new FileExpanderSource(src); + _src = new FileExpanderSource(src, compressedSize); while (d < dst + outsize) { @@ -859,7 +1047,8 @@ bool FileExpander::process(uint8 *dst, const uint8 *src, uint32 outsize, uint32 _src->advSrcBitsByIndex(offset < 0 ? calcCmdAndIndex(_tables[5], offset) : _tables[1][offset]); if ((offset & 0xff) >= 4) { uint8 newIndex = ((offset & 0xff) >> 1) - 1; - offset = (((offset & 1) + 2) << newIndex) + _src->getKeyMasked(newIndex); + offset = (((offset & 1) + 2) << newIndex); + offset += _src->getKeyMasked(newIndex); } uint8 *s2 = d - 1 - offset; @@ -1021,120 +1210,45 @@ uint8 FileExpander::calcCmdAndIndex(const uint8 *tbl, int16 ¶) { return newIndex; } -class FileCache { +class CompLoaderInsHof : public CompArchiveLoader { public: - FileCache() : _size(0) {} - ~FileCache() {} - - void add(ResFileEntry entry, const uint8 *data); - bool getData(ResFileEntry entry, uint8 *dst); - void flush(); + bool checkForFiles() const; + bool loadFile(CompFileMap &loadTo) const; private: - struct FileCacheEntry { - ResFileEntry entry; - const uint8 *data; + struct Archive { + Common::String filename; + uint32 firstFile; + uint32 startOffset; + uint32 lastFile; + uint32 endOffset; + uint32 totalSize; }; - - Common::List<FileCacheEntry> _cachedFileList; - uint32 _size; -}; - -void FileCache::add(ResFileEntry entry, const uint8 *data) { - FileCacheEntry fileCacheEntry; - fileCacheEntry.entry.compressedSize = entry.compressedSize; - fileCacheEntry.entry.mounted = entry.mounted; - fileCacheEntry.entry.offset = entry.offset; - fileCacheEntry.entry.parent = entry.parent; - fileCacheEntry.entry.preload = entry.preload; - fileCacheEntry.entry.prot = entry.prot; - fileCacheEntry.entry.size = entry.size; - fileCacheEntry.entry.type = entry.type; - fileCacheEntry.entry.fileIndex = entry.fileIndex; - uint8 *dst = new uint8[entry.size]; - assert(dst); - memcpy(dst, data, entry.size); - fileCacheEntry.data = dst; - _cachedFileList.push_back(fileCacheEntry); - _size += entry.size; -} - -bool FileCache::getData(ResFileEntry entry, uint8 *dst) { - for (Common::List<FileCacheEntry>::const_iterator c = _cachedFileList.begin(); c != _cachedFileList.end(); ++c) { - if (c->entry.offset == entry.offset && c->entry.compressedSize == entry.compressedSize && - c->entry.fileIndex == entry.fileIndex && c->entry.size == entry.size) { - memcpy(dst, c->data, c->entry.size); - return true; - } - } - return false; -} - -void FileCache::flush() { - debug(1, "total amount of cache memory used: %d", _size); - for (Common::List<FileCacheEntry>::const_iterator c = _cachedFileList.begin(); c != _cachedFileList.end(); ++c) - delete[] c->data; - _cachedFileList.clear(); - _size = 0; -} - -class ResLoaderInsHof : public ResArchiveLoader { -public: - ResLoaderInsHof() {} - ~ResLoaderInsHof() { _fileCache.flush(); } - - bool checkFilename(Common::String filename) const; - bool isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const; - bool loadFile(const Common::String &filename, Common::SeekableReadStream &stream, FileList &files) const; - Common::SeekableReadStream *loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const; - - ResFileEntry::kType getType() const { - return ResFileEntry::kInsHof; - } -private: - mutable FileCache _fileCache; }; -bool ResLoaderInsHof::checkFilename(Common::String filename) const { - filename.toUppercase(); - if (!filename.hasSuffix(".001")) - return false; - filename.insertChar('2', filename.size() - 1); - filename.deleteLastChar(); - if (!Common::File::exists(filename)) - return false; - return true; -} - -bool ResLoaderInsHof::isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const { - uint8 fileId = stream.readByte(); - uint32 size = stream.readUint32LE(); - - if (size < stream.size() + 1) - return false; - - return (fileId == 1); +bool CompLoaderInsHof::checkForFiles() const { + return (Common::File::exists("WESTWOOD.001") && Common::File::exists("WESTWOOD.002")); } -bool ResLoaderInsHof::loadFile(const Common::String &filename, Common::SeekableReadStream &stream, FileList &files) const { +bool CompLoaderInsHof::loadFile(CompFileMap &loadTo) const { Common::File tmpFile; uint32 pos = 0; uint32 bytesleft = 0; bool startFile = true; - Common::String filenameBase(filename.c_str(), 10); + Common::String filenameBase = "WESTWOOD."; Common::String filenameTemp; char filenameExt[4]; while (filenameBase.lastChar() != '.') filenameBase.deleteLastChar(); - InsHofArchive newArchive; + Archive newArchive; - Common::List<InsHofArchive> archives; + Common::List<Archive> archives; - for (int8 currentFile = 1; currentFile; currentFile++) { + for (int8 currentFile = 1; currentFile; currentFile++) { sprintf(filenameExt, "%03d", currentFile); filenameTemp = filenameBase + Common::String(filenameExt); @@ -1189,14 +1303,23 @@ bool ResLoaderInsHof::loadFile(const Common::String &filename, Common::SeekableR } } - ResFileEntry newEntry; + FileExpander exp; + CompFileEntry newEntry; + uint32 insize = 0; + uint32 outsize = 0; + uint8 *inbuffer = 0; + uint8 *outbuffer = 0; + uint32 inPart1 = 0; + uint32 inPart2 = 0; + Common::String entryStr; + pos = 0; const uint32 kExecSize = 0x0bba; const uint32 kHeaderSize = 30; const uint32 kHeaderSize2 = 46; - for (Common::List<InsHofArchive>::iterator a = archives.begin(); a != archives.end(); ++a) { + for (Common::List<Archive>::iterator a = archives.begin(); a != archives.end(); ++a) { startFile = true; for (uint32 i = a->firstFile; i != (a->lastFile + 1); i++) { sprintf(filenameExt, "%03d", i); @@ -1218,7 +1341,18 @@ bool ResLoaderInsHof::loadFile(const Common::String &filename, Common::SeekableR continue; } } else { - pos ++; + if (inPart2) { + tmpFile.seek(1); + tmpFile.read(inbuffer + inPart1, inPart2); + inPart2 = 0; + exp.process(outbuffer, inbuffer, outsize, insize); + delete[] inbuffer; + inbuffer = 0; + newEntry.data = outbuffer; + newEntry.size = outsize; + loadTo[entryStr] = newEntry; + } + pos++; } while (pos < size) { @@ -1258,23 +1392,42 @@ bool ResLoaderInsHof::loadFile(const Common::String &filename, Common::SeekableR if (id == 0x04034B50) { if (hdr[8] != 8) error("compression type not implemented"); - newEntry.compressedSize = READ_LE_UINT32(hdr + 18); - newEntry.size = READ_LE_UINT32(hdr + 22); + insize = READ_LE_UINT32(hdr + 18); + outsize = READ_LE_UINT32(hdr + 22); uint16 filestrlen = READ_LE_UINT16(hdr + 26); *(hdr + 30 + filestrlen) = 0; + entryStr = Common::String((const char *)(hdr + 30)); pos += (kHeaderSize + filestrlen - m); + tmpFile.seek(pos); + + outbuffer = new uint8[outsize]; + if (!outbuffer) + error("Out of memory: Can't uncompress installer files"); - newEntry.parent = filename; - newEntry.offset = pos; - newEntry.type = ResFileEntry::kAutoDetect; - newEntry.mounted = false; - newEntry.preload = false; - newEntry.prot = false; - newEntry.fileIndex = i; - files.push_back(File(Common::String((const char *)(hdr + 30)), newEntry)); + if (!inbuffer) { + inbuffer = new uint8[insize]; + if (!inbuffer) + error("Out of memory: Can't uncompress installer files"); + } - pos += newEntry.compressedSize; + if ((pos + insize) > size) { + // this is for files that are split between two archive files + inPart1 = size - pos; + inPart2 = insize - inPart1; + tmpFile.read(inbuffer, inPart1); + } else { + tmpFile.read(inbuffer, insize); + inPart2 = 0; + exp.process(outbuffer, inbuffer, outsize, insize); + delete[] inbuffer; + inbuffer = 0; + newEntry.data = outbuffer; + newEntry.size = outsize; + loadTo[entryStr] = newEntry; + } + + pos += insize; if (pos > size) { pos -= size; break; @@ -1288,247 +1441,18 @@ bool ResLoaderInsHof::loadFile(const Common::String &filename, Common::SeekableR } } - archives.clear(); - - return true; -} - -Common::SeekableReadStream *ResLoaderInsHof::loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const { - if (archive) { - delete archive; - archive = 0; - } - - uint8 *outbuffer = (uint8 *)malloc(entry.size); - assert(outbuffer); - - if (!_fileCache.getData(entry, outbuffer)) { - Common::File tmpFile; - char filename[13]; - sprintf(filename, "WESTWOOD.%03d", entry.fileIndex); - - if (!tmpFile.open(filename)) { - free(outbuffer); - return 0; - } - - tmpFile.seek(entry.offset); - - uint8 *inbuffer = new uint8[entry.compressedSize]; - assert(inbuffer); - - if ((entry.offset + entry.compressedSize) > tmpFile.size()) { - // this is for files that are split between two archive files - uint32 a = tmpFile.size() - entry.offset; - uint32 b = entry.compressedSize - a; - - tmpFile.read(inbuffer, a); - tmpFile.close(); - - filename[strlen(filename) - 1]++; - - if (!tmpFile.open(filename)) - return 0; - tmpFile.seek(1); - tmpFile.read(inbuffer + a, b); - } else { - tmpFile.read(inbuffer, entry.compressedSize); - } - - tmpFile.close(); - - FileExpander().process(outbuffer, inbuffer, entry.size, entry.compressedSize); - delete[] inbuffer; - - if (entry.size > INS_CACHE_THRESHOLD) - _fileCache.add(entry, outbuffer); - } - - Common::MemoryReadStream *stream = new Common::MemoryReadStream(outbuffer, entry.size, true); - assert(stream); - - return stream; -} - -class ResLoaderInsMalcolm : public ResArchiveLoader { -public: - bool checkFilename(Common::String filename) const; - bool isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const; - bool loadFile(const Common::String &filename, Common::SeekableReadStream &stream, FileList &files) const; - Common::SeekableReadStream *loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const; - - ResFileEntry::kType getType() const { - return ResFileEntry::kInsMal; - } -}; - -bool ResLoaderInsMalcolm::checkFilename(Common::String filename) const { - filename.toUppercase(); - if (!filename.hasSuffix(".001")) - return false; - filename.insertChar('2', filename.size() - 1); - filename.deleteLastChar(); - if (Common::File::exists(filename)) - return false; - return true; -} - -bool ResLoaderInsMalcolm::isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const { - stream.seek(3); - uint32 size = stream.readUint32LE(); - - if (size+7 > stream.size()) - return false; - - stream.seek(size+5, SEEK_SET); - uint8 buffer[2]; - stream.read(&buffer, 2); - - return (buffer[0] == 0x0D && buffer[1] == 0x0A); -} - -bool ResLoaderInsMalcolm::loadFile(const Common::String &filename, Common::SeekableReadStream &stream, FileList &files) const { - Common::List<Common::String> filenames; - - // thanks to eriktorbjorn for this code (a bit modified though) - stream.seek(3, SEEK_SET); - - // first file is the index table - uint32 size = stream.readUint32LE(); - Common::String temp = ""; - - for (uint32 i = 0; i < size; ++i) { - byte c = stream.readByte(); - - if (c == '\\') { - temp = ""; - } else if (c == 0x0D) { - // line endings are CRLF - c = stream.readByte(); - assert(c == 0x0A); - ++i; - - filenames.push_back(temp); - } else { - temp += (char)c; - } - } - - stream.seek(3, SEEK_SET); - - for (Common::List<Common::String>::iterator file = filenames.begin(); file != filenames.end(); ++file) { - ResFileEntry entry; - entry.parent = filename; - entry.type = ResFileEntry::kAutoDetect; - entry.mounted = false; - entry.preload = false; - entry.prot = false; - entry.size = stream.readUint32LE(); - entry.offset = stream.pos(); - stream.seek(entry.size, SEEK_CUR); - files.push_back(File(*file, entry)); - } - + archives.clear(); return true; } -Common::SeekableReadStream *ResLoaderInsMalcolm::loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const { - assert(archive); - - archive->seek(entry.offset, SEEK_SET); - Common::SeekableSubReadStream *stream = new Common::SeekableSubReadStream(archive, entry.offset, entry.offset + entry.size, true); - assert(stream); - return stream; -} - -class ResLoaderTlk : public ResArchiveLoader { -public: - bool checkFilename(Common::String filename) const; - bool isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const; - bool loadFile(const Common::String &filename, Common::SeekableReadStream &stream, FileList &files) const; - Common::SeekableReadStream *loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const; - - ResFileEntry::kType getType() const { - return ResFileEntry::kTlk; - } - -private: - static bool sortTlkFileList(const File &l, const File &r); - static FileList::const_iterator nextFile(const FileList &list, FileList::const_iterator iter); -}; - -bool ResLoaderTlk::checkFilename(Common::String filename) const { - filename.toUppercase(); - return (filename.hasSuffix(".TLK")); -} - -bool ResLoaderTlk::isLoadable(const Common::String &filename, Common::SeekableReadStream &stream) const { - uint16 entries = stream.readUint16LE(); - uint32 entryTableSize = (entries * 8); - - if (entryTableSize + 2 > stream.size()) - return false; - - uint32 offset = 0; - - for (uint i = 0; i < entries; ++i) { - stream.readUint32LE(); - offset = stream.readUint32LE(); - - if (offset > stream.size()) - return false; - } - - return true; -} - -bool ResLoaderTlk::loadFile(const Common::String &filename, Common::SeekableReadStream &stream, FileList &files) const { - uint16 entries = stream.readUint16LE(); - - for (uint i = 0; i < entries; ++i) { - ResFileEntry entry; - entry.parent = filename; - entry.type = ResFileEntry::kAutoDetect; - entry.mounted = false; - entry.preload = false; - entry.prot = false; - - uint32 resFilename = stream.readUint32LE(); - uint32 resOffset = stream.readUint32LE(); - - entry.offset = resOffset+4; - - char realFilename[20]; - snprintf(realFilename, 20, "%u.AUD", resFilename); - - uint32 curOffset = stream.pos(); - stream.seek(resOffset, SEEK_SET); - entry.size = stream.readUint32LE(); - stream.seek(curOffset, SEEK_SET); - - files.push_back(FileList::value_type(realFilename, entry)); - } - - return true; -} - -Common::SeekableReadStream *ResLoaderTlk::loadFileFromArchive(const Common::String &file, Common::SeekableReadStream *archive, const ResFileEntry entry) const { - assert(archive); - - archive->seek(entry.offset, SEEK_SET); - Common::SeekableSubReadStream *stream = new Common::SeekableSubReadStream(archive, entry.offset, entry.offset + entry.size, true); - assert(stream); - return stream; -} - #pragma mark - void Resource::initializeLoaders() { _loaders.push_back(LoaderList::value_type(new ResLoaderPak())); - _loaders.push_back(LoaderList::value_type(new ResLoaderInsKyra())); - _loaders.push_back(LoaderList::value_type(new ResLoaderInsHof())); _loaders.push_back(LoaderList::value_type(new ResLoaderInsMalcolm())); _loaders.push_back(LoaderList::value_type(new ResLoaderTlk())); + + _compLoaders.push_back(CompLoaderList::value_type(new CompLoaderInsHof())); } const ResArchiveLoader *Resource::getLoader(ResFileEntry::kType type) const { @@ -1542,3 +1466,4 @@ const ResArchiveLoader *Resource::getLoader(ResFileEntry::kType type) const { } // end of namespace Kyra + diff --git a/engines/kyra/resource.h b/engines/kyra/resource.h index 90405690a4..167ccd7943 100644 --- a/engines/kyra/resource.h +++ b/engines/kyra/resource.h @@ -41,15 +41,6 @@ namespace Kyra { -struct InsHofArchive { - Common::String filename; - uint32 firstFile; - uint32 startOffset; - uint32 lastFile; - uint32 endOffset; - uint32 totalSize; -}; - struct ResFileEntry { Common::String parent; uint32 size; @@ -61,20 +52,21 @@ struct ResFileEntry { enum kType { kRaw = 0, kPak = 1, - kInsKyra = 2, - kInsHof = 3, - kInsMal = 4, - kTlk = 5, + kInsMal = 2, + kTlk = 3, kAutoDetect }; kType type; uint32 offset; +}; - int fileIndex; - uint32 compressedSize; +struct CompFileEntry { + uint32 size; + uint8 *data; }; typedef Common::HashMap<Common::String, ResFileEntry, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> ResFileMap; +typedef Common::HashMap<Common::String, CompFileEntry, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo> CompFileMap; class Resource; class ResArchiveLoader { @@ -100,6 +92,14 @@ public: protected: }; +class CompArchiveLoader { +public: + virtual ~CompArchiveLoader() {} + + virtual bool checkForFiles() const = 0; + virtual bool loadFile(CompFileMap &loadTo) const = 0; +}; + class Resource { public: Resource(KyraEngine_v1 *vm); @@ -136,6 +136,15 @@ protected: LoaderList _loaders; ResFileMap _map; + typedef Common::List<Common::SharedPtr<CompArchiveLoader> > CompLoaderList; + typedef CompLoaderList::iterator CompLoaderIterator; + typedef CompLoaderList::const_iterator CCompLoaderIterator; + CompLoaderList _compLoaders; + CompFileMap _compFiles; + + void tryLoadCompFiles(); + void clearCompFileList(); + KyraEngine_v1 *_vm; }; @@ -376,3 +385,4 @@ private: + diff --git a/engines/kyra/script_tim.cpp b/engines/kyra/script_tim.cpp index 66390047b4..4ad6464424 100644 --- a/engines/kyra/script_tim.cpp +++ b/engines/kyra/script_tim.cpp @@ -118,7 +118,8 @@ TIM *TIMInterpreter::load(const char *filename, const Common::Array<const TIMOpc for (uint i = 0; i < avtlChunkSize; ++i) tim->avtl[i] = READ_LE_UINT16(tim->avtl + i); - for (int i = 0; i < 10; ++i) + int num = (avtlChunkSize < TIM::kCountFuncs) ? avtlChunkSize : (int)TIM::kCountFuncs; + for (int i = 0; i < num; ++i) tim->func[i].avtl = tim->avtl + tim->avtl[i]; return tim; @@ -145,7 +146,7 @@ void TIMInterpreter::exec(TIM *tim, bool loop) { } do { - for (_currentFunc = 0; _currentFunc < 10; ++_currentFunc) { + for (_currentFunc = 0; _currentFunc < TIM::kCountFuncs; ++_currentFunc) { TIM::Function &cur = _currentTim->func[_currentFunc]; if (_currentTim->procFunc != -1) @@ -184,6 +185,18 @@ void TIMInterpreter::exec(TIM *tim, bool loop) { } while (loop); } +void TIMInterpreter::refreshTimersAfterPause(uint32 elapsedTime) { + if (!_currentTim) + return; + + for (int i = 0; i < TIM::kCountFuncs; i++) { + if (_currentTim->func[i].lastTime) + _currentTim->func[i].lastTime += elapsedTime; + if (_currentTim->func[i].nextTime) + _currentTim->func[i].nextTime += elapsedTime; + } +} + int TIMInterpreter::execCommand(int cmd, const uint16 *param) { if (cmd < 0 || cmd >= _commandsSize) { warning("Calling unimplemented TIM command %d", cmd); @@ -206,7 +219,7 @@ int TIMInterpreter::cmd_initFunc0(const uint16 *param) { } int TIMInterpreter::cmd_stopCurFunc(const uint16 *param) { - if (_currentFunc < 10) + if (_currentFunc < TIM::kCountFuncs) _currentTim->func[_currentFunc].ip = 0; if (!_currentFunc) _finished = true; @@ -215,7 +228,7 @@ int TIMInterpreter::cmd_stopCurFunc(const uint16 *param) { int TIMInterpreter::cmd_initFunc(const uint16 *param) { uint16 func = *param; - assert(func < 10); + assert(func < TIM::kCountFuncs); if (_currentTim->func[func].avtl) _currentTim->func[func].ip = _currentTim->func[func].avtl; else @@ -225,13 +238,13 @@ int TIMInterpreter::cmd_initFunc(const uint16 *param) { int TIMInterpreter::cmd_stopFunc(const uint16 *param) { uint16 func = *param; - assert(func < 10); + assert(func < TIM::kCountFuncs); _currentTim->func[func].ip = 0; return 1; } int TIMInterpreter::cmd_resetAllRuntimes(const uint16 *param) { - for (int i = 0; i < 10; ++i) { + for (int i = 0; i < TIM::kCountFuncs; ++i) { if (_currentTim->func[i].ip) _currentTim->func[i].nextTime = _system->getMillis(); } @@ -255,7 +268,7 @@ int TIMInterpreter::cmd_execOpcode(const uint16 *param) { int TIMInterpreter::cmd_initFuncNow(const uint16 *param) { uint16 func = *param; - assert(func < 10); + assert(func < TIM::kCountFuncs); _currentTim->func[func].ip = _currentTim->func[func].avtl; _currentTim->func[func].lastTime = _currentTim->func[func].nextTime = _system->getMillis(); return 1; @@ -263,7 +276,7 @@ int TIMInterpreter::cmd_initFuncNow(const uint16 *param) { int TIMInterpreter::cmd_stopFuncNow(const uint16 *param) { uint16 func = *param; - assert(func < 10); + assert(func < TIM::kCountFuncs); _currentTim->func[func].ip = 0; _currentTim->func[func].lastTime = _currentTim->func[func].nextTime = _system->getMillis(); return 1; diff --git a/engines/kyra/script_tim.h b/engines/kyra/script_tim.h index 957bffcc3c..cd715ff4ef 100644 --- a/engines/kyra/script_tim.h +++ b/engines/kyra/script_tim.h @@ -40,6 +40,10 @@ struct TIM { int16 procFunc; uint16 procParam; + enum { + kCountFuncs = 10 + }; + struct Function { const uint16 *ip; @@ -47,7 +51,7 @@ struct TIM { uint32 nextTime; const uint16 *avtl; - } func[10]; + } func[kCountFuncs]; uint16 *avtl; uint8 *text; @@ -69,6 +73,7 @@ public: void stopCurFunc() { if (_currentTim) cmd_stopCurFunc(0); } void play(const char *filename); + void refreshTimersAfterPause(uint32 elapsedTime); private: KyraEngine_v1 *_vm; OSystem *_system; diff --git a/engines/kyra/sequences_hof.cpp b/engines/kyra/sequences_hof.cpp index 0751fc15db..169c319347 100644 --- a/engines/kyra/sequences_hof.cpp +++ b/engines/kyra/sequences_hof.cpp @@ -300,6 +300,8 @@ void KyraEngine_HoF::seq_playSequences(int startSeq, int endSeq) { _eventList.clear(); seqNum = kSequenceFirates; } + } else if (seqNum == kSequenceDemoFisher && !(_abortIntroFlag || skipFlag())) { + seqNum = kSequenceDemoVirgin; } if (_menuChoice) { @@ -2651,8 +2653,6 @@ void KyraEngine_HoF::seq_init() { _res->unloadAllPakFiles(); _res->loadPakFile(StaticResource::staticDataFilename()); - if (_flags.useInstallerPackage) - _res->loadPakFile("WESTWOOD.001"); _res->loadFileList(_sequencePakList, _sequencePakListSize); int numShp = -1; diff --git a/engines/made/database.cpp b/engines/made/database.cpp index f7fce52b21..4616b63252 100644 --- a/engines/made/database.cpp +++ b/engines/made/database.cpp @@ -47,7 +47,79 @@ Object::~Object() { delete[] _objData; } -int Object::loadVersion2(Common::SeekableReadStream &source) { +const char *Object::getString() { + if (getClass() == 0x7FFF) + return (const char*)getData(); + else + return NULL; +} + +void Object::setString(const char *str) { + if (getClass() == 0x7FFF) { + char *objStr = (char*)getData(); + if (str) + strncpy(objStr, str, getSize()); + else + objStr[0] = '\0'; + } +} + +bool Object::isObject() { + return getClass() < 0x7FFE; +} + +bool Object::isVector() { + return getClass() == 0x7FFF; +} + +int16 Object::getVectorSize() { + if (getClass() == 0x7FFF || getClass() == 0x7FFE) { + return getSize(); + } else if (getClass() < 0x7FFE) { + return getCount1() + getCount2(); + } else { + // should never reach here + error("Unknown object class"); + return 0; + } +} + +int16 Object::getVectorItem(int16 index) { + if (getClass() == 0x7FFF) { + byte *vector = (byte*)getData(); + return vector[index]; + } else if (getClass() == 0x7FFE) { + int16 *vector = (int16*)getData(); + return READ_LE_UINT16(&vector[index]); + } else if (getClass() < 0x7FFE) { + int16 *vector = (int16*)getData(); + return READ_LE_UINT16(&vector[index]); + } else { + // should never reach here + error("Unknown object class"); + return 0; + } +} + +void Object::setVectorItem(int16 index, int16 value) { + if (getClass() == 0x7FFF) { + byte *vector = (byte*)getData(); + vector[index] = value; + } else if (getClass() <= 0x7FFE) { + int16 *vector = (int16*)getData(); + WRITE_LE_UINT16(&vector[index], value); + } +} + +void Object::dump(const char *filename) { + /* + FILE *o = fopen(filename, "wb"); + fwrite(_objData, _objSize, 1, o); + fclose(o); + */ +} + +int ObjectV2::load(Common::SeekableReadStream &source) { if (_freeData && _objData) delete[] _objData; @@ -67,22 +139,51 @@ int Object::loadVersion2(Common::SeekableReadStream &source) { byte count2 = header[3]; _objSize = (count1 + count2) * 2; } - _objSize += 6; + _objSize += 4; _objData = new byte[_objSize]; - WRITE_LE_UINT16(_objData, 1); - memcpy(_objData + 2, header, 4); - source.read(_objData + 6, _objSize - 6); + memcpy(_objData, header, 4); + source.read(_objData + 4, _objSize - 4); + + return _objSize; - return _objSize - 2; +} +int ObjectV2::load(byte *source) { + // Not implemented/used for version 2 objects + return 0; } -int Object::saveVersion2(Common::WriteStream &dest) { - dest.write(_objData + 2, _objSize - 2); +int ObjectV2::save(Common::WriteStream &dest) { + dest.write(_objData, _objSize); return 0; } -int Object::loadVersion3(Common::SeekableReadStream &source) { +uint16 ObjectV2::getFlags() { + return 1; +} + +uint16 ObjectV2::getClass() { + return READ_LE_UINT16(_objData); +} + +uint16 ObjectV2::getSize() { + return READ_LE_UINT16(_objData + 2); +} + +byte ObjectV2::getCount1() { + return _objData[2]; +} + +byte ObjectV2::getCount2() { + return _objData[3]; +} + +byte *ObjectV2::getData() { + return _objData + 4; +} + +int ObjectV3::load(Common::SeekableReadStream &source) { + _freeData = true; source.readUint16LE(); // skip flags uint16 type = source.readUint16LE(); @@ -100,9 +201,10 @@ int Object::loadVersion3(Common::SeekableReadStream &source) { _objData = new byte[_objSize]; source.read(_objData, _objSize); return _objSize; + } -int Object::loadVersion3(byte *source) { +int ObjectV3::load(byte *source) { _objData = source; _freeData = false; if (getClass() < 0x7FFE) { @@ -114,111 +216,43 @@ int Object::loadVersion3(byte *source) { return _objSize; } -uint16 Object::getFlags() const { +int ObjectV3::save(Common::WriteStream &dest) { + // Not implemented/used for version 3 objects + return 0; +} + +uint16 ObjectV3::getFlags() { return READ_LE_UINT16(_objData); } -uint16 Object::getClass() const { +uint16 ObjectV3::getClass() { return READ_LE_UINT16(_objData + 2); } -uint16 Object::getSize() const { +uint16 ObjectV3::getSize() { return READ_LE_UINT16(_objData + 4); } -byte Object::getCount1() const { +byte ObjectV3::getCount1() { return _objData[4]; } -byte Object::getCount2() const { +byte ObjectV3::getCount2() { return _objData[5]; } -byte *Object::getData() { +byte *ObjectV3::getData() { return _objData + 6; } -const char *Object::getString() { - if (getClass() == 0x7FFF) - return (const char*)getData(); - else - return NULL; -} - -void Object::setString(const char *str) { - if (getClass() == 0x7FFF) { - char *objStr = (char*)getData(); - if (str) - strncpy(objStr, str, getSize()); - else - objStr[0] = '\0'; - } -} - -bool Object::isObject() { - return getClass() < 0x7FFE; -} - -bool Object::isVector() { - return getClass() == 0x7FFF; -} - -int16 Object::getVectorSize() { - if (getClass() == 0x7FFF || getClass() == 0x7FFE) { - return getSize(); - } else if (getClass() < 0x7FFE) { - return getCount1() + getCount2(); - } else { - // should never reach here - error("Unknown object class"); - return 0; - } -} - -int16 Object::getVectorItem(int16 index) { - if (getClass() == 0x7FFF) { - byte *vector = (byte*)getData(); - return vector[index]; - } else if (getClass() == 0x7FFE) { - int16 *vector = (int16*)getData(); - return READ_LE_UINT16(&vector[index]); - } else if (getClass() < 0x7FFE) { - int16 *vector = (int16*)getData(); - return READ_LE_UINT16(&vector[index]); - } else { - // should never reach here - error("Unknown object class"); - return 0; - } -} - -void Object::setVectorItem(int16 index, int16 value) { - if (getClass() == 0x7FFF) { - byte *vector = (byte*)getData(); - vector[index] = value; - } else if (getClass() <= 0x7FFE) { - int16 *vector = (int16*)getData(); - WRITE_LE_UINT16(&vector[index], value); - } -} -void Object::dump(const char *filename) { - /* - FILE *o = fopen(filename, "wb"); - fwrite(_objData, _objSize, 1, o); - fclose(o); - */ -} GameDatabase::GameDatabase(MadeEngine *vm) : _vm(vm) { - _gameText = NULL; } GameDatabase::~GameDatabase() { if (_gameState) delete[] _gameState; - if (_gameText) - delete[] _gameText; } void GameDatabase::open(const char *filename) { @@ -239,19 +273,85 @@ void GameDatabase::openFromRed(const char *redFilename, const char *filename) { delete fileS; } -void GameDatabase::load(Common::SeekableReadStream &sourceS) { +int16 GameDatabase::getVar(int16 index) { + return (int16)READ_LE_UINT16(_gameState + index * 2); +} + +void GameDatabase::setVar(int16 index, int16 value) { + WRITE_LE_UINT16(_gameState + index * 2, value); +} + +const char *GameDatabase::getObjectString(int16 index) { + Object *obj = getObject(index); + if (obj) + return obj->getString(); + else + return ""; +} + +void GameDatabase::setObjectString(int16 index, const char *str) { + Object *obj = getObject(index); + if (obj) + obj->setString(str); +} + +int16 GameDatabase::getObjectProperty(int16 objectIndex, int16 propertyId) { + + if (objectIndex == 0) + return 0; + + int16 propertyFlag; + int16 *property = getObjectPropertyPtr(objectIndex, propertyId, propertyFlag); + + if (property) { + return (int16)READ_LE_UINT16(property); + } else { + return 0; + } + +} + +int16 GameDatabase::setObjectProperty(int16 objectIndex, int16 propertyId, int16 value) { - if (_vm->getGameID() == GID_MANHOLE || _vm->getGameID() == GID_LGOP2) { - debug(2, "loading version 2 dat"); - loadVersion2(sourceS); - } else if (_vm->getGameID() == GID_RTZ) { - debug(2, "loading version 3 dat"); - loadVersion3(sourceS); + if (objectIndex == 0) + return 0; + + int16 propertyFlag; + int16 *property = getObjectPropertyPtr(objectIndex, propertyId, propertyFlag); + + if (property) { + if (propertyFlag == 1) { + WRITE_LE_UINT16(property, value); + } else { + warning("GameDatabase::setObjectProperty(%04X, %04X, %04X) Trying to set constant property\n", + objectIndex, propertyId, value); + } + return value; + } else { + return 0; } } -void GameDatabase::loadVersion2(Common::SeekableReadStream &sourceS) { +void GameDatabase::dumpObject(int16 index) { + Object *obj = getObject(index); + char fn[512]; + sprintf(fn, "obj%04X.0", index); + obj->dump(fn); +} + + +/* GameDatabaseV2 */ + +GameDatabaseV2::GameDatabaseV2(MadeEngine *vm) : GameDatabase(vm), _gameText(NULL) { +} + +GameDatabaseV2::~GameDatabaseV2() { + if (_gameText) + delete[] _gameText; +} + +void GameDatabaseV2::load(Common::SeekableReadStream &sourceS) { // TODO: Read/verifiy header @@ -285,8 +385,8 @@ void GameDatabase::loadVersion2(Common::SeekableReadStream &sourceS) { sourceS.seek(objectsOffs); for (uint32 i = 0; i < objectCount; i++) { - Object *obj = new Object(); - int objSize = obj->loadVersion2(sourceS); + Object *obj = new ObjectV2(); + int objSize = obj->load(sourceS); // objects are aligned on 2-byte-boundaries, skip unused bytes sourceS.skip(objSize % 2); _objects.push_back(obj); @@ -294,176 +394,43 @@ void GameDatabase::loadVersion2(Common::SeekableReadStream &sourceS) { } -void GameDatabase::loadVersion3(Common::SeekableReadStream &sourceS) { - - // TODO: Read/verifiy header - - sourceS.seek(0x1E); - - uint32 objectIndexOffs = sourceS.readUint32LE(); - uint16 objectCount = sourceS.readUint16LE(); - uint32 gameStateOffs = sourceS.readUint32LE(); - _gameStateSize = sourceS.readUint32LE(); - uint32 objectsOffs = sourceS.readUint32LE(); - uint32 objectsSize = sourceS.readUint32LE(); - _mainCodeObjectIndex = sourceS.readUint16LE(); - - debug(2, "objectIndexOffs = %08X; objectCount = %d; gameStateOffs = %08X; gameStateSize = %d; objectsOffs = %08X; objectsSize = %d\n", objectIndexOffs, objectCount, gameStateOffs, _gameStateSize, objectsOffs, objectsSize); - - _gameState = new byte[_gameStateSize]; - sourceS.seek(gameStateOffs); - sourceS.read(_gameState, _gameStateSize); - - Common::Array<uint32> objectOffsets; - sourceS.seek(objectIndexOffs); - for (uint32 i = 0; i < objectCount; i++) - objectOffsets.push_back(sourceS.readUint32LE()); - - for (uint32 i = 0; i < objectCount; i++) { - Object *obj = new Object(); - - // The LSB indicates if it's a constant or variable object. - // Constant objects are loaded from disk, while variable objects exist - // in the _gameState buffer. - - //debug(2, "obj(%04X) ofs = %08X\n", i, objectOffsets[i]); - - if (objectOffsets[i] & 1) { - //debug(2, "-> const %08X\n", objectsOffs + objectOffsets[i] - 1); - sourceS.seek(objectsOffs + objectOffsets[i] - 1); - obj->loadVersion3(sourceS); - } else { - //debug(2, "-> var\n"); - obj->loadVersion3(_gameState + objectOffsets[i]); - } - _objects.push_back(obj); - } - -} - -bool GameDatabase::getSavegameDescription(const char *filename, Common::String &description) { - - Common::InSaveFile *in; - - if (!(in = g_system->getSavefileManager()->openForLoading(filename))) { - return false; - } - - char desc[64]; - - in->skip(4); // TODO: Verify marker 'SGAM' - in->skip(4); // TODO: Verify size - in->skip(2); // TODO: Verify version - in->read(desc, 64); - description = desc; - - delete in; - - return true; - +bool GameDatabaseV2::getSavegameDescription(const char *filename, Common::String &description) { + // Not used in version 2 games + return false; } -int16 GameDatabase::savegame(const char *filename, const char *description, int16 version) { - +int16 GameDatabaseV2::savegame(const char *filename, const char *description, int16 version) { Common::OutSaveFile *out; int16 result = 0; - if (!(out = g_system->getSavefileManager()->openForSaving(filename))) { warning("Can't create file '%s', game not saved", filename); return 6; } - - switch (_vm->_engineVersion) { - case 2: - result = savegameV2(out, description, version); - break; - case 3: - result = savegameV3(out, description, version); - break; - default: - error("GameDatabase::savegame() Unknown engine version"); - } - + // Variable 0 is not saved + out->write(_gameState + 2, _gameStateSize - 2); + for (uint i = 0; i < _objects.size(); i++) + _objects[i]->save(*out); delete out; - return result; - } -int16 GameDatabase::loadgame(const char *filename, int16 version) { - +int16 GameDatabaseV2::loadgame(const char *filename, int16 version) { Common::InSaveFile *in; int16 result = 0; - if (!(in = g_system->getSavefileManager()->openForLoading(filename))) { warning("Can't open file '%s', game not loaded", filename); return 1; } - - switch (_vm->_engineVersion) { - case 2: - result = loadgameV2(in, version); - break; - case 3: - result = loadgameV3(in, version); - break; - default: - error("GameDatabase::loadgame() Unknown engine version"); + // Variable 0 is not loaded + in->read(_gameState + 2, _gameStateSize - 2); + for (uint i = 0; i < _objects.size(); i++) { + _objects[i]->load(*in); } - delete in; - return result; - -} - -int16 GameDatabase::savegameV2(Common::OutSaveFile *out, const char *description, int16 version) { - // Variable 0 is not saved - out->write(_gameState + 2, _gameStateSize - 2); - for (uint i = 0; i < _objects.size(); i++) - _objects[i]->saveVersion2(*out); - return 0; -} - -int16 GameDatabase::loadgameV2(Common::InSaveFile *in, int16 version) { - // Variable 0 is not loaded - in->read(_gameState + 2, _gameStateSize - 2); - for (uint i = 0; i < _objects.size(); i++) - _objects[i]->loadVersion2(*in); - return 0; -} - -int16 GameDatabase::savegameV3(Common::OutSaveFile *out, const char *description, int16 version) { - uint32 size = 4 + 4 + 2 + _gameStateSize; - char desc[64]; - strncpy(desc, description, 64); - out->writeUint32BE(MKID_BE('SGAM')); - out->writeUint32LE(size); - out->writeUint16LE(version); - out->write(desc, 64); - out->write(_gameState, _gameStateSize); - return 0; -} - -int16 GameDatabase::loadgameV3(Common::InSaveFile *in, int16 version) { - //uint32 expectedSize = 4 + 4 + 2 + _gameStateSize; - in->skip(4); // TODO: Verify marker 'SGAM' - in->skip(4); // TODO: Verify size - in->skip(2); // TODO: Verify version - in->skip(64); // skip savegame description - in->read(_gameState, _gameStateSize); - return 0; -} - -int16 GameDatabase::getVar(int16 index) { - return (int16)READ_LE_UINT16(_gameState + index * 2); -} - -void GameDatabase::setVar(int16 index, int16 value) { - WRITE_LE_UINT16(_gameState + index * 2, value); } -int16 *GameDatabase::getObjectPropertyPtrV2(int16 objectIndex, int16 propertyId, int16 &propertyFlag) { +int16 *GameDatabaseV2::getObjectPropertyPtr(int16 objectIndex, int16 propertyId, int16 &propertyFlag) { Object *obj = getObject(objectIndex); int16 *prop = (int16*)obj->getData(); @@ -486,14 +453,11 @@ int16 *GameDatabase::getObjectPropertyPtrV2(int16 objectIndex, int16 propertyId, // Now check in the object hierarchy of the given object int16 parentObjectIndex = obj->getClass(); if (parentObjectIndex == 0) { - debug(2, "GameDatabase::getObjectPropertyPtrV2() NULL(1)"); return NULL; } while (parentObjectIndex != 0) { - //debug(2, "parentObjectIndex = %04X\n", parentObjectIndex); - obj = getObject(parentObjectIndex); prop = (int16*)obj->getData(); @@ -525,12 +489,115 @@ int16 *GameDatabase::getObjectPropertyPtrV2(int16 objectIndex, int16 propertyId, } - debug(2, "GameDatabase::getObjectPropertyPtrV2() NULL(2)"); return NULL; } -int16 *GameDatabase::getObjectPropertyPtrV3(int16 objectIndex, int16 propertyId, int16 &propertyFlag) { +const char *GameDatabaseV2::getString(uint16 offset) { + return (const char*)&_gameText[offset * 4]; +} + + +/* GameDatabaseV3 */ + +GameDatabaseV3::GameDatabaseV3(MadeEngine *vm) : GameDatabase(vm) { +} + +void GameDatabaseV3::load(Common::SeekableReadStream &sourceS) { + + // TODO: Read/verifiy header + + sourceS.seek(0x1E); + + uint32 objectIndexOffs = sourceS.readUint32LE(); + uint16 objectCount = sourceS.readUint16LE(); + uint32 gameStateOffs = sourceS.readUint32LE(); + _gameStateSize = sourceS.readUint32LE(); + uint32 objectsOffs = sourceS.readUint32LE(); + uint32 objectsSize = sourceS.readUint32LE(); + _mainCodeObjectIndex = sourceS.readUint16LE(); + + debug(2, "objectIndexOffs = %08X; objectCount = %d; gameStateOffs = %08X; gameStateSize = %d; objectsOffs = %08X; objectsSize = %d\n", objectIndexOffs, objectCount, gameStateOffs, _gameStateSize, objectsOffs, objectsSize); + + _gameState = new byte[_gameStateSize]; + sourceS.seek(gameStateOffs); + sourceS.read(_gameState, _gameStateSize); + + Common::Array<uint32> objectOffsets; + sourceS.seek(objectIndexOffs); + for (uint32 i = 0; i < objectCount; i++) + objectOffsets.push_back(sourceS.readUint32LE()); + + for (uint32 i = 0; i < objectCount; i++) { + Object *obj = new ObjectV3(); + + // The LSB indicates if it's a constant or variable object. + // Constant objects are loaded from disk, while variable objects exist + // in the _gameState buffer. + + if (objectOffsets[i] & 1) { + sourceS.seek(objectsOffs + objectOffsets[i] - 1); + obj->load(sourceS); + } else { + obj->load(_gameState + objectOffsets[i]); + } + _objects.push_back(obj); + } + +} + +bool GameDatabaseV3::getSavegameDescription(const char *filename, Common::String &description) { + Common::InSaveFile *in; + char desc[64]; + if (!(in = g_system->getSavefileManager()->openForLoading(filename))) { + return false; + } + in->skip(4); // TODO: Verify marker 'SGAM' + in->skip(4); // TODO: Verify size + in->skip(2); // TODO: Verify version + in->read(desc, 64); + description = desc; + delete in; + return true; +} + +int16 GameDatabaseV3::savegame(const char *filename, const char *description, int16 version) { + Common::OutSaveFile *out; + char desc[64]; + int16 result = 0; + uint32 size = 4 + 4 + 2 + _gameStateSize; + if (!(out = g_system->getSavefileManager()->openForSaving(filename))) { + warning("Can't create file '%s', game not saved", filename); + return 6; + } + strncpy(desc, description, 64); + out->writeUint32BE(MKID_BE('SGAM')); + out->writeUint32LE(size); + out->writeUint16LE(version); + out->write(desc, 64); + out->write(_gameState, _gameStateSize); + delete out; + return result; +} + +int16 GameDatabaseV3::loadgame(const char *filename, int16 version) { + Common::InSaveFile *in; + int16 result = 0; + //uint32 expectedSize = 4 + 4 + 2 + _gameStateSize; + if (!(in = g_system->getSavefileManager()->openForLoading(filename))) { + warning("Can't open file '%s', game not loaded", filename); + return 1; + } + in->skip(4); // TODO: Verify marker 'SGAM' + in->skip(4); // TODO: Verify size + in->skip(2); // TODO: Verify version + in->skip(64); // skip savegame description + in->read(_gameState, _gameStateSize); + delete in; + return result; +} + +int16 *GameDatabaseV3::getObjectPropertyPtr(int16 objectIndex, int16 propertyId, int16 &propertyFlag) { Object *obj = getObject(objectIndex); int16 *prop = (int16*)obj->getData(); @@ -558,14 +625,11 @@ int16 *GameDatabase::getObjectPropertyPtrV3(int16 objectIndex, int16 propertyId, // Now check in the object hierarchy of the given object int16 parentObjectIndex = obj->getClass(); if (parentObjectIndex == 0) { - //debug(2, "! NULL(np)\n"); return NULL; } while (parentObjectIndex != 0) { - //debug(2, "parentObjectIndex = %04X\n", parentObjectIndex); - obj = getObject(parentObjectIndex); prop = (int16*)obj->getData(); @@ -607,70 +671,13 @@ int16 *GameDatabase::getObjectPropertyPtrV3(int16 objectIndex, int16 propertyId, } - //debug(2, "! NULL(nf)\n"); return NULL; - -} - -int16 *GameDatabase::getObjectPropertyPtr(int16 objectIndex, int16 propertyId, int16 &propertyFlag) { - switch (_vm->_engineVersion) { - case 2: - return getObjectPropertyPtrV2(objectIndex, propertyId, propertyFlag); - case 3: - return getObjectPropertyPtrV3(objectIndex, propertyId, propertyFlag); - default: - error("GameDatabase::getObjectPropertyPtr() Unknown engine version"); - return NULL; - } -} - -int16 GameDatabase::getObjectProperty(int16 objectIndex, int16 propertyId) { - - if (objectIndex == 0) - return 0; - - int16 propertyFlag; - int16 *property = getObjectPropertyPtr(objectIndex, propertyId, propertyFlag); - if (property) { - return (int16)READ_LE_UINT16(property); - } else { - return 0; - } - } -int16 GameDatabase::setObjectProperty(int16 objectIndex, int16 propertyId, int16 value) { - - if (objectIndex == 0) - return 0; - - int16 propertyFlag; - int16 *property = getObjectPropertyPtr(objectIndex, propertyId, propertyFlag); - - if (property) { - if (propertyFlag == 1) { - WRITE_LE_UINT16(property, value); - } else { - warning("GameDatabase::setObjectProperty(%04X, %04X, %04X) Trying to set constant property\n", - objectIndex, propertyId, value); - } - return value; - } else { - return 0; - } - -} - -const char *GameDatabase::getString(uint16 offset) { - return (const char*)&_gameText[offset * 4]; -} - -void GameDatabase::dumpObject(int16 index) { - Object *obj = getObject(index); - char fn[512]; - sprintf(fn, "obj%04X.0", index); - obj->dump(fn); +const char *GameDatabaseV3::getString(uint16 offset) { + // Not used in version 3 games + return NULL; } } // End of namespace Made diff --git a/engines/made/database.h b/engines/made/database.h index 0924200374..476439c1e2 100644 --- a/engines/made/database.h +++ b/engines/made/database.h @@ -40,29 +40,25 @@ namespace Made { class Object { public: Object(); - ~Object(); + virtual ~Object(); + + virtual int load(Common::SeekableReadStream &source) = 0; + virtual int load(byte *source) = 0; + virtual int save(Common::WriteStream &dest) = 0; + virtual uint16 getFlags() = 0; + virtual uint16 getClass() = 0; + virtual uint16 getSize() = 0; + virtual byte getCount1() = 0; + virtual byte getCount2() = 0; + virtual byte *getData() = 0; + virtual bool isConstant() = 0; - int loadVersion2(Common::SeekableReadStream &source); - int saveVersion2(Common::WriteStream &dest); - - int loadVersion3(Common::SeekableReadStream &source); - int loadVersion3(byte *source); - - uint16 getFlags() const; - uint16 getClass() const; - uint16 getSize() const; - - byte getCount1() const; - byte getCount2() const; - - byte *getData(); const char *getString(); void setString(const char *str); bool isObject(); bool isVector(); - bool isConstant() const { return !(getFlags() & 1); } - + int16 getVectorSize(); int16 getVectorItem(int16 index); void setVectorItem(int16 index, int16 value); @@ -75,20 +71,52 @@ protected: byte *_objData; }; +class ObjectV2 : public Object { +public: + int load(Common::SeekableReadStream &source); + int load(byte *source); + int save(Common::WriteStream &dest); + uint16 getFlags(); + uint16 getClass(); + uint16 getSize(); + byte getCount1(); + byte getCount2(); + byte *getData(); + + bool isConstant() { + return false; + } + +}; + +class ObjectV3 : public Object { +public: + int load(Common::SeekableReadStream &source); + int load(byte *source); + int save(Common::WriteStream &dest); + uint16 getFlags(); + uint16 getClass(); + uint16 getSize(); + byte getCount1(); + byte getCount2(); + byte *getData(); + + bool isConstant() { + return !(getFlags() & 1); + } + +}; + class GameDatabase { public: GameDatabase(MadeEngine *vm); - ~GameDatabase(); + virtual ~GameDatabase(); void open(const char *filename); void openFromRed(const char *redFilename, const char *filename); - bool getSavegameDescription(const char *filename, Common::String &description); - int16 savegame(const char *filename, const char *description, int16 version); - int16 loadgame(const char *filename, int16 version); - - Object *getObject(int16 index) const { + Object *getObject(int16 index) const { if (index >= 1) return _objects[index - 1]; else @@ -101,32 +129,55 @@ public: int16 getVar(int16 index); void setVar(int16 index, int16 value); - - int16 *getObjectPropertyPtrV2(int16 objectIndex, int16 propertyId, int16 &propertyFlag); - int16 *getObjectPropertyPtrV3(int16 objectIndex, int16 propertyId, int16 &propertyFlag); - int16 *getObjectPropertyPtr(int16 objectIndex, int16 propertyId, int16 &propertyFlag); - + + const char *getObjectString(int16 index); + void setObjectString(int16 index, const char *str); + + virtual int16 *getObjectPropertyPtr(int16 objectIndex, int16 propertyId, int16 &propertyFlag) = 0; + virtual const char *getString(uint16 offset) = 0; + virtual bool getSavegameDescription(const char *filename, Common::String &description) = 0; + virtual int16 savegame(const char *filename, const char *description, int16 version) = 0; + virtual int16 loadgame(const char *filename, int16 version) = 0; + int16 getObjectProperty(int16 objectIndex, int16 propertyId); int16 setObjectProperty(int16 objectIndex, int16 propertyId, int16 value); - - const char *getString(uint16 offset); void dumpObject(int16 index); - + protected: MadeEngine *_vm; Common::Array<Object*> _objects; byte *_gameState; uint32 _gameStateSize; - char *_gameText; int16 _mainCodeObjectIndex; + virtual void load(Common::SeekableReadStream &sourceS) = 0; +}; + +class GameDatabaseV2 : public GameDatabase { +public: + GameDatabaseV2(MadeEngine *vm); + ~GameDatabaseV2(); + int16 *getObjectPropertyPtr(int16 objectIndex, int16 propertyId, int16 &propertyFlag); + const char *getString(uint16 offset); + bool getSavegameDescription(const char *filename, Common::String &description); + int16 savegame(const char *filename, const char *description, int16 version); + int16 loadgame(const char *filename, int16 version); +protected: + char *_gameText; + void load(Common::SeekableReadStream &sourceS); +}; + +class GameDatabaseV3 : public GameDatabase { +public: + GameDatabaseV3(MadeEngine *vm); + int16 *getObjectPropertyPtr(int16 objectIndex, int16 propertyId, int16 &propertyFlag); + const char *getString(uint16 offset); + bool getSavegameDescription(const char *filename, Common::String &description); + int16 savegame(const char *filename, const char *description, int16 version); + int16 loadgame(const char *filename, int16 version); +protected: + char *_gameText; void load(Common::SeekableReadStream &sourceS); - void loadVersion2(Common::SeekableReadStream &sourceS); - void loadVersion3(Common::SeekableReadStream &sourceS); - int16 savegameV2(Common::OutSaveFile *out, const char *description, int16 version); - int16 loadgameV2(Common::InSaveFile *in, int16 version); - int16 savegameV3(Common::OutSaveFile *out, const char *description, int16 version); - int16 loadgameV3(Common::InSaveFile *in, int16 version); }; } // End of namespace Made diff --git a/engines/made/made.cpp b/engines/made/made.cpp index 92efb881e2..09a9a85ec6 100644 --- a/engines/made/made.cpp +++ b/engines/made/made.cpp @@ -86,7 +86,15 @@ MadeEngine::MadeEngine(OSystem *syst, const MadeGameDescription *gameDesc) : Eng _pmvPlayer = new PmvPlayer(this, _mixer); _res = new ProjectReader(); _screen = new Screen(this); - _dat = new GameDatabase(this); + + if (getGameID() == GID_LGOP2 || getGameID() == GID_MANHOLE) { + _dat = new GameDatabaseV2(this); + } else if (getGameID() == GID_RTZ) { + _dat = new GameDatabaseV3(this); + } else { + error("Unknown GameID"); + } + _script = new ScriptInterpreter(this); int midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); @@ -272,6 +280,7 @@ int MadeEngine::go() { // NOTE: Disabled again since it causes major graphics errors. //_system->setFeatureState(OSystem::kFeatureAutoComputeDirtyRects, true); + _autoStopSound = false; _eventNum = _eventKey = _eventMouseX = _eventMouseY = 0; #ifdef DUMP_SCRIPTS diff --git a/engines/made/made.h b/engines/made/made.h index 5ee3828557..f7e3354c4d 100644 --- a/engines/made/made.h +++ b/engines/made/made.h @@ -108,7 +108,10 @@ public: uint16 _eventNum; int _eventMouseX, _eventMouseY; uint16 _eventKey; + int _soundRate; + bool _autoStopSound; + int _musicVolume; // 2 = LGOP2, Manhole N&E diff --git a/engines/made/screen.cpp b/engines/made/screen.cpp index 754a45016c..cecd0c8968 100644 --- a/engines/made/screen.cpp +++ b/engines/made/screen.cpp @@ -328,7 +328,7 @@ void Screen::drawSpriteChannels(const ClipInfo &clipInfo, int16 includeStateMask break; case 4: // drawMenuText - // TODO + // Never used in any game break; default: @@ -430,7 +430,7 @@ uint16 Screen::drawSprite(uint16 flexIndex, int16 x, int16 y) { uint16 Screen::placeSprite(uint16 channelIndex, uint16 flexIndex, int16 x, int16 y) { - debug(2, "placeSprite(%d, %04X, %d, %d)\n", channelIndex, flexIndex, x, y); fflush(stdout); + debug(2, "placeSprite(%d, %04X, %d, %d)\n", channelIndex, flexIndex, x, y); if (channelIndex < 1 || channelIndex >= 100) return 0; @@ -819,7 +819,13 @@ int16 Screen::addToSpriteList(int16 index, int16 xofs, int16 yofs) { } SpriteListItem Screen::getFromSpriteList(int16 index) { - return _spriteList[index - 1]; + if (((uint) index) > _spriteList.size()) { + SpriteListItem emptyItem; + emptyItem.index = 0; + return emptyItem; + } else { + return _spriteList[index - 1]; + } } void Screen::clearSpriteList() { diff --git a/engines/made/screen.h b/engines/made/screen.h index 20085bebdc..92f3512954 100644 --- a/engines/made/screen.h +++ b/engines/made/screen.h @@ -136,6 +136,11 @@ public: _textY = y; } + void homeText() { + _textX = _textRect.left; + _textY = _textRect.top; + } + uint16 updateChannel(uint16 channelIndex); void deleteChannel(uint16 channelIndex); int16 getChannelType(uint16 channelIndex); @@ -149,6 +154,7 @@ public: void clearChannels(); uint16 drawFlex(uint16 flexIndex, int16 x, int16 y, int16 flipX, int16 flipY, int16 mask, const ClipInfo &clipInfo); + void drawAnimFrame(uint16 animIndex, int16 x, int16 y, int16 frameNum, int16 flipX, int16 flipY, const ClipInfo &clipInfo); uint16 drawPic(uint16 index, int16 x, int16 y, int16 flipX, int16 flipY); diff --git a/engines/made/screenfx.cpp b/engines/made/screenfx.cpp index b65c3db60c..ee96af601a 100644 --- a/engines/made/screenfx.cpp +++ b/engines/made/screenfx.cpp @@ -76,10 +76,18 @@ void ScreenEffects::run(int16 effectNum, Graphics::Surface *surface, byte *palet vfx10(surface, palette, newPalette, colorCount); break; + case 11: // "Screen wipe in", right to left + vfx11(surface, palette, newPalette, colorCount); + break; + case 12: // "Screen wipe in", top to bottom vfx12(surface, palette, newPalette, colorCount); break; + case 13: // "Screen wipe in", bottom to top + vfx13(surface, palette, newPalette, colorCount); + break; + case 14: // "Screen open" effect vfx14(surface, palette, newPalette, colorCount); break; @@ -256,6 +264,16 @@ void ScreenEffects::vfx10(Graphics::Surface *surface, byte *palette, byte *newPa setPalette(palette); } +// "Screen wipe in", right to left +void ScreenEffects::vfx11(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) { + for (int x = 312; x > -56; x -= 8) { + copyFxRect(surface, x, 0, x + 64, 200); + setBlendedPalette(palette, newPalette, colorCount, x + 56, 368); + _screen->updateScreenAndWait(25); + } + setPalette(palette); +} + // "Screen wipe in", top to bottom void ScreenEffects::vfx12(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) { for (int y = -70; y < 312; y += 10) { @@ -266,6 +284,16 @@ void ScreenEffects::vfx12(Graphics::Surface *surface, byte *palette, byte *newPa setPalette(palette); } +// "Screen wipe in", bottom to top +void ScreenEffects::vfx13(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) { + for (int y = 312; y > -70; y -= 10) { + copyFxRect(surface, 0, y, 320, y + 80); + setBlendedPalette(palette, newPalette, colorCount, y + 70, 260); + _screen->updateScreenAndWait(25); + } + setPalette(palette); +} + // "Screen open" effect void ScreenEffects::vfx14(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount) { int16 x = 8, y = 5; diff --git a/engines/made/screenfx.h b/engines/made/screenfx.h index 1c36b3e1f1..e5023621ae 100644 --- a/engines/made/screenfx.h +++ b/engines/made/screenfx.h @@ -57,7 +57,9 @@ private: void vfx02(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount); void vfx09(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount); void vfx10(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount); + void vfx11(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount); void vfx12(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount); + void vfx13(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount); void vfx14(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount); void vfx15(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount); void vfx17(Graphics::Surface *surface, byte *palette, byte *newPalette, int colorCount); diff --git a/engines/made/scriptfuncs.cpp b/engines/made/scriptfuncs.cpp index f67b7c89c6..8e06c2e8bf 100644 --- a/engines/made/scriptfuncs.cpp +++ b/engines/made/scriptfuncs.cpp @@ -183,13 +183,15 @@ int16 ScriptFunctions::sfDrawPicture(int16 argc, int16 *argv) { } int16 ScriptFunctions::sfClearScreen(int16 argc, int16 *argv) { + if (_vm->_autoStopSound) { + _vm->_mixer->stopHandle(_audioStreamHandle); + _vm->_autoStopSound = false; + } _vm->_screen->clearScreen(); return 0; } int16 ScriptFunctions::sfShowPage(int16 argc, int16 *argv) { - if (_vm->getGameID() != GID_RTZ) - _vm->_mixer->stopHandle(_audioStreamHandle); _vm->_screen->show(); return 0; } @@ -221,21 +223,17 @@ int16 ScriptFunctions::sfSetVisualEffect(int16 argc, int16 *argv) { } int16 ScriptFunctions::sfPlaySound(int16 argc, int16 *argv) { - int soundNum = argv[0]; - bool loop = false; - + int16 soundNum = argv[0]; + _vm->_autoStopSound = false; + _vm->_mixer->stopHandle(_audioStreamHandle); if (argc > 1) { soundNum = argv[1]; - loop = (argv[0] == 1); + _vm->_autoStopSound = (argv[0] == 1); } - if (soundNum > 0) { - if (!_vm->_mixer->isSoundHandleActive(_audioStreamHandle)) { - _vm->_mixer->playInputStream(Audio::Mixer::kPlainSoundType, &_audioStreamHandle, - _vm->_res->getSound(soundNum)->getAudioStream(_vm->_soundRate, loop)); - } + _vm->_mixer->playInputStream(Audio::Mixer::kPlainSoundType, &_audioStreamHandle, + _vm->_res->getSound(soundNum)->getAudioStream(_vm->_soundRate, false)); } - return 0; } @@ -269,10 +267,11 @@ int16 ScriptFunctions::sfIsMusicPlaying(int16 argc, int16 *argv) { } int16 ScriptFunctions::sfSetTextPos(int16 argc, int16 *argv) { - // TODO: Used in Manhole:NE - warning("Unimplemented opcode: sfSetTextPos"); + // Used in Manhole:NE + //warning("Unimplemented opcode: sfSetTextPos"); // This seems to be some kind of low-level opcode. // The original engine calls int 10h to set the VGA cursor position. + // Since this seems to be used for debugging purposes only it's left out. return 0; } @@ -407,8 +406,7 @@ int16 ScriptFunctions::sfDrawText(int16 argc, int16 *argv) { const char *text = NULL; if (_vm->getGameID() == GID_RTZ) { - Object *obj = _vm->_dat->getObject(argv[argc - 1]); - text = obj->getString(); + text = _vm->_dat->getObjectString(argv[argc - 1]); } if (_vm->getGameID() == GID_LGOP2 || _vm->getGameID() == GID_MANHOLE) { text = _vm->_dat->getString(argv[argc - 1]); } @@ -442,8 +440,7 @@ int16 ScriptFunctions::sfDrawText(int16 argc, int16 *argv) { } int16 ScriptFunctions::sfHomeText(int16 argc, int16 *argv) { - // TODO: Used in LGOP2 - warning("Unimplemented opcode: sfHomeText"); + _vm->_screen->homeText(); return 0; } @@ -535,14 +532,17 @@ int16 ScriptFunctions::sfSoundPlaying(int16 argc, int16 *argv) { int16 ScriptFunctions::sfStopSound(int16 argc, int16 *argv) { _vm->_mixer->stopHandle(_audioStreamHandle); + _vm->_autoStopSound = false; return 0; } int16 ScriptFunctions::sfPlayVoice(int16 argc, int16 *argv) { - if (argv[0] > 0) { - _vm->_mixer->stopHandle(_audioStreamHandle); + int16 soundNum = argv[0]; + _vm->_mixer->stopHandle(_audioStreamHandle); + if (soundNum > 0) { _vm->_mixer->playInputStream(Audio::Mixer::kPlainSoundType, &_audioStreamHandle, - _vm->_res->getSound(argv[0])->getAudioStream(_vm->_soundRate, false)); + _vm->_res->getSound(soundNum)->getAudioStream(_vm->_soundRate, false)); + _vm->_autoStopSound = true; } return 0; } @@ -577,8 +577,7 @@ int16 ScriptFunctions::sfPlayCdSegment(int16 argc, int16 *argv) { } int16 ScriptFunctions::sfPrintf(int16 argc, int16 *argv) { - Object *obj = _vm->_dat->getObject(argv[argc - 1]); - const char *text = obj->getString(); + const char *text = _vm->_dat->getObjectString(argv[argc - 1]); debug(4, "--> text = %s", text); return 0; } @@ -613,15 +612,14 @@ int16 ScriptFunctions::sfAnimText(int16 argc, int16 *argv) { int16 ScriptFunctions::sfGetTextWidth(int16 argc, int16 *argv) { int16 width = 0; if (argv[1] > 0) { - Object *obj = _vm->_dat->getObject(argv[1]); - const char *text = obj->getString(); + const char *text = _vm->_dat->getObjectString(argv[1]); width = _vm->_screen->getTextWidth(argv[0], text); } return width; } int16 ScriptFunctions::sfPlayMovie(int16 argc, int16 *argv) { - const char *movieName = _vm->_dat->getObject(argv[1])->getString(); + const char *movieName = _vm->_dat->getObjectString(argv[1]); _vm->_system->showMouse(false); _vm->_pmvPlayer->play(movieName); _vm->_system->showMouse(true); @@ -662,8 +660,10 @@ int16 ScriptFunctions::sfSetMusicVolume(int16 argc, int16 *argv) { } int16 ScriptFunctions::sfRestartEvents(int16 argc, int16 *argv) { - // TODO: Used in RTZ - warning("Unimplemented opcode: sfRestartEvents"); + // Used in RTZ + //warning("Unimplemented opcode: sfRestartEvents"); + // This is used to reset the event recording/queue. + // Since we don't use either it's left out. return 0; } @@ -764,9 +764,7 @@ int16 ScriptFunctions::sfSetSoundRate(int16 argc, int16 *argv) { } int16 ScriptFunctions::sfDrawAnimPic(int16 argc, int16 *argv) { - // TODO: Used in RTZ - warning("Unimplemented opcode: sfDrawAnimPic"); - return 0; + return _vm->_screen->drawAnimPic(argv[5], argv[4], argv[3], argv[2], argv[1], argv[0]); } int16 ScriptFunctions::sfLoadAnim(int16 argc, int16 *argv) { @@ -793,11 +791,12 @@ int16 ScriptFunctions::sfReadMenu(int16 argc, int16 *argv) { if (menu) { const char *text = menu->getString(textIndex); debug(4, "objectIndex = %04X; text = %s\n", objectIndex, text); - Object *obj = _vm->_dat->getObject(objectIndex); - obj->setString(text); + _vm->_dat->setObjectString(objectIndex, text); _vm->_res->freeResource(menu); if (text) length = strlen(text); + } else { + _vm->_dat->setObjectString(objectIndex, ""); } return length; } @@ -835,11 +834,8 @@ int16 ScriptFunctions::sfSaveGame(int16 argc, int16 *argv) { if (saveNum > 999) return 6; - Object *obj = _vm->_dat->getObject(descObjectIndex); - const char *description = obj->getString(); - + const char *description = _vm->_dat->getObjectString(descObjectIndex); Common::String filename = _vm->getSavegameFilename(saveNum); - return _vm->_dat->savegame(filename.c_str(), description, version); } @@ -853,7 +849,6 @@ int16 ScriptFunctions::sfLoadGame(int16 argc, int16 *argv) { return 1; Common::String filename = _vm->getSavegameFilename(saveNum); - return _vm->_dat->loadgame(filename.c_str(), version); } @@ -870,13 +865,11 @@ int16 ScriptFunctions::sfGetGameDescription(int16 argc, int16 *argv) { Common::String filename = _vm->getSavegameFilename(saveNum); - Object *obj = _vm->_dat->getObject(descObjectIndex); - if (_vm->_dat->getSavegameDescription(filename.c_str(), description)) { - obj->setString(description.c_str()); + _vm->_dat->setObjectString(descObjectIndex, description.c_str()); return 0; } else { - obj->setString(""); + _vm->_dat->setObjectString(descObjectIndex, ""); return 1; } diff --git a/engines/parallaction/exec_br.cpp b/engines/parallaction/exec_br.cpp index 07ed3f5d78..2aeec6358d 100644 --- a/engines/parallaction/exec_br.cpp +++ b/engines/parallaction/exec_br.cpp @@ -62,11 +62,13 @@ namespace Parallaction { -typedef OpcodeImpl<Parallaction_br> OpcodeV2; -#define COMMAND_OPCODE(op) OpcodeV2(this, &Parallaction_br::cmdOp_##op) +#define SetOpcodeTable(x) table = &x; + +typedef Common::Functor0Mem<void, Parallaction_br> OpcodeV2; +#define COMMAND_OPCODE(op) table->push_back(new OpcodeV2(this, &Parallaction_br::cmdOp_##op)) #define DECLARE_COMMAND_OPCODE(op) void Parallaction_br::cmdOp_##op() -#define INSTRUCTION_OPCODE(op) OpcodeV2(this, &Parallaction_br::instOp_##op) +#define INSTRUCTION_OPCODE(op) table->push_back(new OpcodeV2(this, &Parallaction_br::instOp_##op)) #define DECLARE_INSTRUCTION_OPCODE(op) void Parallaction_br::instOp_##op() void Parallaction_br::setupSubtitles(char *s, char *s2, int y) { @@ -498,95 +500,85 @@ DECLARE_INSTRUCTION_OPCODE(endscript) { void Parallaction_br::initOpcodes() { - static const OpcodeV2 op1[] = { - COMMAND_OPCODE(invalid), - COMMAND_OPCODE(set), - COMMAND_OPCODE(clear), - COMMAND_OPCODE(start), - COMMAND_OPCODE(speak), - COMMAND_OPCODE(get), - COMMAND_OPCODE(location), - COMMAND_OPCODE(open), - COMMAND_OPCODE(close), - COMMAND_OPCODE(on), - COMMAND_OPCODE(off), - COMMAND_OPCODE(call), - COMMAND_OPCODE(toggle), - COMMAND_OPCODE(drop), - COMMAND_OPCODE(quit), - COMMAND_OPCODE(move), - COMMAND_OPCODE(stop), - COMMAND_OPCODE(character), - COMMAND_OPCODE(followme), - COMMAND_OPCODE(onmouse), - COMMAND_OPCODE(offmouse), - COMMAND_OPCODE(add), - COMMAND_OPCODE(leave), - COMMAND_OPCODE(inc), - COMMAND_OPCODE(dec), - COMMAND_OPCODE(ifeq), - COMMAND_OPCODE(iflt), - COMMAND_OPCODE(ifgt), - COMMAND_OPCODE(let), - COMMAND_OPCODE(music), - COMMAND_OPCODE(fix), - COMMAND_OPCODE(unfix), - COMMAND_OPCODE(zeta), - COMMAND_OPCODE(scroll), - COMMAND_OPCODE(swap), - COMMAND_OPCODE(give), - COMMAND_OPCODE(text), - COMMAND_OPCODE(part), - COMMAND_OPCODE(testsfx), - COMMAND_OPCODE(ret), - COMMAND_OPCODE(onsave), - COMMAND_OPCODE(offsave) - }; - - uint i; - for (i = 0; i < ARRAYSIZE(op1); i++) - _commandOpcodes.push_back(&op1[i]); - - - static const OpcodeV2 op2[] = { - INSTRUCTION_OPCODE(invalid), - INSTRUCTION_OPCODE(on), - INSTRUCTION_OPCODE(off), - INSTRUCTION_OPCODE(set), // x - INSTRUCTION_OPCODE(set), // y - INSTRUCTION_OPCODE(set), // z - INSTRUCTION_OPCODE(set), // f - INSTRUCTION_OPCODE(loop), - INSTRUCTION_OPCODE(endloop), - INSTRUCTION_OPCODE(null), // show - INSTRUCTION_OPCODE(inc), - INSTRUCTION_OPCODE(inc), // dec - INSTRUCTION_OPCODE(set), - INSTRUCTION_OPCODE(put), - INSTRUCTION_OPCODE(call), - INSTRUCTION_OPCODE(wait), - INSTRUCTION_OPCODE(start), - INSTRUCTION_OPCODE(process), - INSTRUCTION_OPCODE(move), - INSTRUCTION_OPCODE(color), - INSTRUCTION_OPCODE(process), // sound - INSTRUCTION_OPCODE(mask), - INSTRUCTION_OPCODE(print), - INSTRUCTION_OPCODE(text), - INSTRUCTION_OPCODE(inc), // mul - INSTRUCTION_OPCODE(inc), // div - INSTRUCTION_OPCODE(ifeq), - INSTRUCTION_OPCODE(iflt), - INSTRUCTION_OPCODE(ifgt), - INSTRUCTION_OPCODE(endif), - INSTRUCTION_OPCODE(stop), - INSTRUCTION_OPCODE(endscript) - }; - - for (i = 0; i < ARRAYSIZE(op2); i++) - _instructionOpcodes.push_back(&op2[i]); - - + Common::Array<const Opcode*> *table = 0; + + SetOpcodeTable(_commandOpcodes); + COMMAND_OPCODE(invalid); + COMMAND_OPCODE(set); + COMMAND_OPCODE(clear); + COMMAND_OPCODE(start); + COMMAND_OPCODE(speak); + COMMAND_OPCODE(get); + COMMAND_OPCODE(location); + COMMAND_OPCODE(open); + COMMAND_OPCODE(close); + COMMAND_OPCODE(on); + COMMAND_OPCODE(off); + COMMAND_OPCODE(call); + COMMAND_OPCODE(toggle); + COMMAND_OPCODE(drop); + COMMAND_OPCODE(quit); + COMMAND_OPCODE(move); + COMMAND_OPCODE(stop); + COMMAND_OPCODE(character); + COMMAND_OPCODE(followme); + COMMAND_OPCODE(onmouse); + COMMAND_OPCODE(offmouse); + COMMAND_OPCODE(add); + COMMAND_OPCODE(leave); + COMMAND_OPCODE(inc); + COMMAND_OPCODE(dec); + COMMAND_OPCODE(ifeq); + COMMAND_OPCODE(iflt); + COMMAND_OPCODE(ifgt); + COMMAND_OPCODE(let); + COMMAND_OPCODE(music); + COMMAND_OPCODE(fix); + COMMAND_OPCODE(unfix); + COMMAND_OPCODE(zeta); + COMMAND_OPCODE(scroll); + COMMAND_OPCODE(swap); + COMMAND_OPCODE(give); + COMMAND_OPCODE(text); + COMMAND_OPCODE(part); + COMMAND_OPCODE(testsfx); + COMMAND_OPCODE(ret); + COMMAND_OPCODE(onsave); + COMMAND_OPCODE(offsave); + + SetOpcodeTable(_instructionOpcodes); + INSTRUCTION_OPCODE(invalid); + INSTRUCTION_OPCODE(on); + INSTRUCTION_OPCODE(off); + INSTRUCTION_OPCODE(set); // x + INSTRUCTION_OPCODE(set); // y + INSTRUCTION_OPCODE(set); // z + INSTRUCTION_OPCODE(set); // f + INSTRUCTION_OPCODE(loop); + INSTRUCTION_OPCODE(endloop); + INSTRUCTION_OPCODE(null); // show + INSTRUCTION_OPCODE(inc); + INSTRUCTION_OPCODE(inc); // dec + INSTRUCTION_OPCODE(set); + INSTRUCTION_OPCODE(put); + INSTRUCTION_OPCODE(call); + INSTRUCTION_OPCODE(wait); + INSTRUCTION_OPCODE(start); + INSTRUCTION_OPCODE(process); + INSTRUCTION_OPCODE(move); + INSTRUCTION_OPCODE(color); + INSTRUCTION_OPCODE(process); // sound + INSTRUCTION_OPCODE(mask); + INSTRUCTION_OPCODE(print); + INSTRUCTION_OPCODE(text); + INSTRUCTION_OPCODE(inc); // mul + INSTRUCTION_OPCODE(inc); // div + INSTRUCTION_OPCODE(ifeq); + INSTRUCTION_OPCODE(iflt); + INSTRUCTION_OPCODE(ifgt); + INSTRUCTION_OPCODE(endif); + INSTRUCTION_OPCODE(stop); + INSTRUCTION_OPCODE(endscript); } #if 0 diff --git a/engines/parallaction/exec_ns.cpp b/engines/parallaction/exec_ns.cpp index f7c3b895c2..bd2d54c0a0 100644 --- a/engines/parallaction/exec_ns.cpp +++ b/engines/parallaction/exec_ns.cpp @@ -50,12 +50,13 @@ namespace Parallaction { #define INST_MOVE 18 #define INST_ENDSCRIPT 19 +#define SetOpcodeTable(x) table = &x; -typedef OpcodeImpl<Parallaction_ns> OpcodeV1; -#define COMMAND_OPCODE(op) OpcodeV1(this, &Parallaction_ns::cmdOp_##op) +typedef Common::Functor0Mem<void, Parallaction_ns> OpcodeV2; +#define COMMAND_OPCODE(op) table->push_back(new OpcodeV2(this, &Parallaction_ns::cmdOp_##op)) #define DECLARE_COMMAND_OPCODE(op) void Parallaction_ns::cmdOp_##op() -#define INSTRUCTION_OPCODE(op) OpcodeV1(this, &Parallaction_ns::instOp_##op) +#define INSTRUCTION_OPCODE(op) table->push_back(new OpcodeV2(this, &Parallaction_ns::instOp_##op)) #define DECLARE_INSTRUCTION_OPCODE(op) void Parallaction_ns::instOp_##op() @@ -655,56 +656,48 @@ ZonePtr Parallaction::hitZone(uint32 type, uint16 x, uint16 y) { void Parallaction_ns::initOpcodes() { - static const OpcodeV1 op1[] = { - INSTRUCTION_OPCODE(invalid), - INSTRUCTION_OPCODE(on), - INSTRUCTION_OPCODE(off), - INSTRUCTION_OPCODE(set), // x - INSTRUCTION_OPCODE(set), // y - INSTRUCTION_OPCODE(set), // z - INSTRUCTION_OPCODE(set), // f - INSTRUCTION_OPCODE(loop), - INSTRUCTION_OPCODE(endloop), - INSTRUCTION_OPCODE(null), - INSTRUCTION_OPCODE(inc), - INSTRUCTION_OPCODE(inc), // dec - INSTRUCTION_OPCODE(set), - INSTRUCTION_OPCODE(put), - INSTRUCTION_OPCODE(call), - INSTRUCTION_OPCODE(wait), - INSTRUCTION_OPCODE(start), - INSTRUCTION_OPCODE(sound), - INSTRUCTION_OPCODE(move), - INSTRUCTION_OPCODE(endscript) - }; - - uint i; - for (i = 0; i < ARRAYSIZE(op1); i++) - _instructionOpcodes.push_back(&op1[i]); - - static const OpcodeV1 op3[] = { - COMMAND_OPCODE(invalid), - COMMAND_OPCODE(set), - COMMAND_OPCODE(clear), - COMMAND_OPCODE(start), - COMMAND_OPCODE(speak), - COMMAND_OPCODE(get), - COMMAND_OPCODE(location), - COMMAND_OPCODE(open), - COMMAND_OPCODE(close), - COMMAND_OPCODE(on), - COMMAND_OPCODE(off), - COMMAND_OPCODE(call), - COMMAND_OPCODE(toggle), - COMMAND_OPCODE(drop), - COMMAND_OPCODE(quit), - COMMAND_OPCODE(move), - COMMAND_OPCODE(stop) - }; - - for (i = 0; i < ARRAYSIZE(op3); i++) - _commandOpcodes.push_back(&op3[i]); - + Common::Array<const Opcode*> *table = 0; + + SetOpcodeTable(_instructionOpcodes); + INSTRUCTION_OPCODE(invalid); + INSTRUCTION_OPCODE(on); + INSTRUCTION_OPCODE(off); + INSTRUCTION_OPCODE(set); // x + INSTRUCTION_OPCODE(set); // y + INSTRUCTION_OPCODE(set); // z + INSTRUCTION_OPCODE(set); // f + INSTRUCTION_OPCODE(loop); + INSTRUCTION_OPCODE(endloop); + INSTRUCTION_OPCODE(null); + INSTRUCTION_OPCODE(inc); + INSTRUCTION_OPCODE(inc); // dec + INSTRUCTION_OPCODE(set); + INSTRUCTION_OPCODE(put); + INSTRUCTION_OPCODE(call); + INSTRUCTION_OPCODE(wait); + INSTRUCTION_OPCODE(start); + INSTRUCTION_OPCODE(sound); + INSTRUCTION_OPCODE(move); + INSTRUCTION_OPCODE(endscript); + + SetOpcodeTable(_commandOpcodes); + COMMAND_OPCODE(invalid); + COMMAND_OPCODE(set); + COMMAND_OPCODE(clear); + COMMAND_OPCODE(start); + COMMAND_OPCODE(speak); + COMMAND_OPCODE(get); + COMMAND_OPCODE(location); + COMMAND_OPCODE(open); + COMMAND_OPCODE(close); + COMMAND_OPCODE(on); + COMMAND_OPCODE(off); + COMMAND_OPCODE(call); + COMMAND_OPCODE(toggle); + COMMAND_OPCODE(drop); + COMMAND_OPCODE(quit); + COMMAND_OPCODE(move); + COMMAND_OPCODE(stop); } diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h index f639185580..3117424373 100644 --- a/engines/parallaction/parallaction.h +++ b/engines/parallaction/parallaction.h @@ -522,8 +522,9 @@ private: void initCursors(); void initParsers(); - static byte _mouseArrow[256]; - Frames *_mouseComposedArrow; + static byte _resMouseArrow[256]; + byte *_mouseArrow; + Frames *_mouseComposedArrow; static const Callable _dosCallables[25]; static const Callable _amigaCallables[25]; diff --git a/engines/parallaction/parallaction_ns.cpp b/engines/parallaction/parallaction_ns.cpp index 8254a85a34..74003ee78b 100644 --- a/engines/parallaction/parallaction_ns.cpp +++ b/engines/parallaction/parallaction_ns.cpp @@ -172,18 +172,8 @@ void Parallaction_ns::freeFonts() { } void Parallaction_ns::initCursors() { - _mouseComposedArrow = _disk->loadPointer("pointer"); - - byte temp[MOUSEARROW_WIDTH*MOUSEARROW_HEIGHT]; - memcpy(temp, _mouseArrow, MOUSEARROW_WIDTH*MOUSEARROW_HEIGHT); - - uint16 k = 0; - for (uint16 i = 0; i < 4; i++) { - for (uint16 j = 0; j < 64; j++) _mouseArrow[k++] = temp[i + j * 4]; - } - - return; + _mouseArrow = _resMouseArrow; } void Parallaction_ns::setArrowCursor() { diff --git a/engines/parallaction/parser.h b/engines/parallaction/parser.h index e8de07822e..79e9cc7df0 100644 --- a/engines/parallaction/parser.h +++ b/engines/parallaction/parser.h @@ -60,31 +60,7 @@ public: }; - -class Opcode { - -public: - virtual void operator()() const = 0; - virtual ~Opcode() { } -}; - -template <class T> -class OpcodeImpl : public Opcode { - - typedef void (T::*Fn)(); - - T* _instance; - Fn _fn; - -public: - OpcodeImpl(T* instance, const Fn &fn) : _instance(instance), _fn(fn) { } - - void operator()() const { - (_instance->*_fn)(); - } - -}; - +typedef Common::Functor0<void> Opcode; typedef Common::Array<const Opcode*> OpcodeSet; @@ -233,6 +209,11 @@ protected: uint _numForwardedCommands; void init(); + void clearSet(OpcodeSet &opcodes) { + for (Common::Array<const Opcode*>::iterator i = opcodes.begin(); i != opcodes.end(); ++i) + delete *i; + opcodes.clear(); + } public: LocationParser_ns(Parallaction_ns *vm) : _vm(vm) { @@ -248,6 +229,13 @@ public: delete _locationAnimStmt; delete _zoneTypeNames; delete _zoneFlagNames; + + delete _parser; + + clearSet(_commandParsers); + clearSet(_locationAnimParsers); + clearSet(_locationZoneParsers); + clearSet(_locationParsers); } void parse(Script *script); @@ -361,6 +349,11 @@ protected: virtual void parseRValue(ScriptVar &var, const char *str); void init(); + void clearSet(OpcodeSet &opcodes) { + for (Common::Array<const Opcode*>::iterator i = opcodes.begin(); i != opcodes.end(); ++i) + delete *i; + opcodes.clear(); + } public: ProgramParser_ns(Parallaction_ns *vm) : _vm(vm) { @@ -369,6 +362,7 @@ public: virtual ~ProgramParser_ns() { delete _instructionNames; + clearSet(_instructionParsers); } void parse(Script *script, ProgramPtr program); @@ -400,6 +394,8 @@ public: virtual ~ProgramParser_br() { delete _instructionNames; + delete _parser; + } }; diff --git a/engines/parallaction/parser_br.cpp b/engines/parallaction/parser_br.cpp index d9dd2ef5c8..cebda4b5ed 100644 --- a/engines/parallaction/parser_br.cpp +++ b/engines/parallaction/parser_br.cpp @@ -288,6 +288,20 @@ const char *_instructionNamesRes_br[] = { }; +#define SetOpcodeTable(x) table = &x; + +typedef Common::Functor0Mem<void, ProgramParser_br> OpcodeV1; +#define INSTRUCTION_PARSER(sig) table->push_back(new OpcodeV1(this, &ProgramParser_br::instParse_##sig)) + +typedef Common::Functor0Mem<void, LocationParser_br> OpcodeV2; +#define ZONE_PARSER(sig) table->push_back(new OpcodeV2(this, &LocationParser_br::locZoneParse_##sig)) +#define ANIM_PARSER(sig) table->push_back(new OpcodeV2(this, &LocationParser_br::locAnimParse_##sig)) +#define LOCATION_PARSER(sig) table->push_back(new OpcodeV2(this, &LocationParser_br::locParse_##sig)) +#define COMMAND_PARSER(sig) table->push_back(new OpcodeV2(this, &LocationParser_br::cmdParse_##sig)) + +#define WARNING_PARSER(sig) table->push_back(new OpcodeV2(this, &LocationParser_br::warning_##sig)) + + #define DECLARE_ZONE_PARSER(sig) void LocationParser_br::locZoneParse_##sig() #define DECLARE_ANIM_PARSER(sig) void LocationParser_br::locAnimParse_##sig() #define DECLARE_COMMAND_PARSER(sig) void LocationParser_br::cmdParse_##sig() @@ -940,16 +954,6 @@ void ProgramParser_br::parseRValue(ScriptVar &v, const char *str) { } -typedef OpcodeImpl<LocationParser_br> OpcodeV2; -#define ZONE_PARSER(sig) OpcodeV2(this, &LocationParser_br::locZoneParse_##sig) -#define ANIM_PARSER(sig) OpcodeV2(this, &LocationParser_br::locAnimParse_##sig) -#define LOCATION_PARSER(sig) OpcodeV2(this, &LocationParser_br::locParse_##sig) -#define COMMAND_PARSER(sig) OpcodeV2(this, &LocationParser_br::cmdParse_##sig) -#define WARNING_PARSER(sig) OpcodeV2(this, &LocationParser_br::warning_##sig) - -typedef OpcodeImpl<ProgramParser_br> OpcodeV3; -#define INSTRUCTION_PARSER(sig) OpcodeV3(this, &ProgramParser_br::instParse_##sig) - void LocationParser_br::init() { @@ -963,118 +967,101 @@ void LocationParser_br::init() { _locationZoneStmt = new Table(ARRAYSIZE(_locationZoneStmtRes_br), _locationZoneStmtRes_br); _locationAnimStmt = new Table(ARRAYSIZE(_locationAnimStmtRes_br), _locationAnimStmtRes_br); - - int i; - - static const OpcodeV2 op2[] = { - WARNING_PARSER(unexpected), - COMMAND_PARSER(flags), // set - COMMAND_PARSER(flags), // clear - COMMAND_PARSER(zone), // start - COMMAND_PARSER(zone), // speak - COMMAND_PARSER(zone), // get - COMMAND_PARSER(location), - COMMAND_PARSER(zone), // open - COMMAND_PARSER(zone), // close - COMMAND_PARSER(zone), // on - COMMAND_PARSER(zone), // off - COMMAND_PARSER(call), - COMMAND_PARSER(flags), // toggle - COMMAND_PARSER(drop), - COMMAND_PARSER(simple), // quit - COMMAND_PARSER(move), - COMMAND_PARSER(zone), // stop - COMMAND_PARSER(string), // character - COMMAND_PARSER(string), // followme - COMMAND_PARSER(simple), // onmouse - COMMAND_PARSER(simple), // offmouse - COMMAND_PARSER(drop), // add - COMMAND_PARSER(zone), // leave - COMMAND_PARSER(math), // inc - COMMAND_PARSER(math), // dec - COMMAND_PARSER(test), // test - WARNING_PARSER(unexpected), - WARNING_PARSER(unexpected), - COMMAND_PARSER(math), // let - COMMAND_PARSER(music), - COMMAND_PARSER(zone), // fix - COMMAND_PARSER(zone), // unfix - COMMAND_PARSER(zeta), - COMMAND_PARSER(unary), // scroll - COMMAND_PARSER(string), // swap - COMMAND_PARSER(give), - COMMAND_PARSER(text), - COMMAND_PARSER(unary), // part - WARNING_PARSER(unexpected), - COMMAND_PARSER(simple), // return - COMMAND_PARSER(simple), // onsave - COMMAND_PARSER(simple), // offsave - COMMAND_PARSER(endcommands), // endcommands - COMMAND_PARSER(ifchar), - COMMAND_PARSER(endif) - }; - - for (i = 0; i < ARRAYSIZE(op2); i++) - _commandParsers.push_back(&op2[i]); - - static const OpcodeV2 op4[] = { - WARNING_PARSER(unexpected), - LOCATION_PARSER(character), - LOCATION_PARSER(endlocation), - LOCATION_PARSER(ifchar), - LOCATION_PARSER(null), // endif - LOCATION_PARSER(location), - LOCATION_PARSER(mask), - LOCATION_PARSER(path), - LOCATION_PARSER(null), // disk - LOCATION_PARSER(localflags), - LOCATION_PARSER(commands), - LOCATION_PARSER(escape), - LOCATION_PARSER(acommands), - LOCATION_PARSER(flags), - LOCATION_PARSER(comment), - LOCATION_PARSER(endcomment), - LOCATION_PARSER(zone), - LOCATION_PARSER(animation), - LOCATION_PARSER(zeta), - LOCATION_PARSER(music), - LOCATION_PARSER(sound) - }; - - for (i = 0; i < ARRAYSIZE(op4); i++) - _locationParsers.push_back(&op4[i]); - - static const OpcodeV2 op5[] = { - WARNING_PARSER(unexpected), - ZONE_PARSER(endzone), - ZONE_PARSER(limits), - ZONE_PARSER(moveto), - ZONE_PARSER(type), - ZONE_PARSER(commands), - ZONE_PARSER(label), - ZONE_PARSER(flags) - }; - - for (i = 0; i < ARRAYSIZE(op5); i++) - _locationZoneParsers.push_back(&op5[i]); - - static const OpcodeV2 op6[] = { - WARNING_PARSER(unexpected), - ANIM_PARSER(endanimation), - ANIM_PARSER(endanimation), // endzone - ANIM_PARSER(script), - ANIM_PARSER(commands), - ANIM_PARSER(type), - ANIM_PARSER(label), - ANIM_PARSER(flags), - ANIM_PARSER(file), - ANIM_PARSER(position), - ANIM_PARSER(moveto) - }; - - for (i = 0; i < ARRAYSIZE(op6); i++) - _locationAnimParsers.push_back(&op6[i]); - + Common::Array<const Opcode*> *table = 0; + + SetOpcodeTable(_commandParsers); + WARNING_PARSER(unexpected); + COMMAND_PARSER(flags); // set + COMMAND_PARSER(flags); // clear + COMMAND_PARSER(zone); // start + COMMAND_PARSER(zone); // speak + COMMAND_PARSER(zone); // get + COMMAND_PARSER(location); + COMMAND_PARSER(zone); // open + COMMAND_PARSER(zone); // close + COMMAND_PARSER(zone); // on + COMMAND_PARSER(zone); // off + COMMAND_PARSER(call); + COMMAND_PARSER(flags); // toggle + COMMAND_PARSER(drop); + COMMAND_PARSER(simple); // quit + COMMAND_PARSER(move); + COMMAND_PARSER(zone); // stop + COMMAND_PARSER(string); // character + COMMAND_PARSER(string); // followme + COMMAND_PARSER(simple); // onmouse + COMMAND_PARSER(simple); // offmouse + COMMAND_PARSER(drop); // add + COMMAND_PARSER(zone); // leave + COMMAND_PARSER(math); // inc + COMMAND_PARSER(math); // dec + COMMAND_PARSER(test); // test + WARNING_PARSER(unexpected); + WARNING_PARSER(unexpected); + COMMAND_PARSER(math); // let + COMMAND_PARSER(music); + COMMAND_PARSER(zone); // fix + COMMAND_PARSER(zone); // unfix + COMMAND_PARSER(zeta); + COMMAND_PARSER(unary); // scroll + COMMAND_PARSER(string); // swap + COMMAND_PARSER(give); + COMMAND_PARSER(text); + COMMAND_PARSER(unary); // part + WARNING_PARSER(unexpected); + COMMAND_PARSER(simple); // return + COMMAND_PARSER(simple); // onsave + COMMAND_PARSER(simple); // offsave + COMMAND_PARSER(endcommands); // endcommands + COMMAND_PARSER(ifchar); + COMMAND_PARSER(endif); + + SetOpcodeTable(_locationParsers); + WARNING_PARSER(unexpected); + LOCATION_PARSER(character); + LOCATION_PARSER(endlocation); + LOCATION_PARSER(ifchar); + LOCATION_PARSER(null); // endif + LOCATION_PARSER(location); + LOCATION_PARSER(mask); + LOCATION_PARSER(path); + LOCATION_PARSER(null); // disk + LOCATION_PARSER(localflags); + LOCATION_PARSER(commands); + LOCATION_PARSER(escape); + LOCATION_PARSER(acommands); + LOCATION_PARSER(flags); + LOCATION_PARSER(comment); + LOCATION_PARSER(endcomment); + LOCATION_PARSER(zone); + LOCATION_PARSER(animation); + LOCATION_PARSER(zeta); + LOCATION_PARSER(music); + LOCATION_PARSER(sound); + + SetOpcodeTable(_locationZoneParsers); + WARNING_PARSER(unexpected); + ZONE_PARSER(endzone); + ZONE_PARSER(limits); + ZONE_PARSER(moveto); + ZONE_PARSER(type); + ZONE_PARSER(commands); + ZONE_PARSER(label); + ZONE_PARSER(flags); + + + SetOpcodeTable(_locationAnimParsers); + WARNING_PARSER(unexpected); + ANIM_PARSER(endanimation); + ANIM_PARSER(endanimation); // endzone + ANIM_PARSER(script); + ANIM_PARSER(commands); + ANIM_PARSER(type); + ANIM_PARSER(label); + ANIM_PARSER(flags); + ANIM_PARSER(file); + ANIM_PARSER(position); + ANIM_PARSER(moveto); } void ProgramParser_br::init() { @@ -1083,45 +1070,41 @@ void ProgramParser_br::init() { _instructionNames = new Table(ARRAYSIZE(_instructionNamesRes_br), _instructionNamesRes_br); - static const OpcodeV3 op0[] = { - INSTRUCTION_PARSER(defLocal), // invalid opcode -> local definition - INSTRUCTION_PARSER(zone), // on - INSTRUCTION_PARSER(zone), // off - INSTRUCTION_PARSER(x), - INSTRUCTION_PARSER(y), - INSTRUCTION_PARSER(z), - INSTRUCTION_PARSER(f), - INSTRUCTION_PARSER(loop), - INSTRUCTION_PARSER(null), // endloop - INSTRUCTION_PARSER(null), // show - INSTRUCTION_PARSER(inc), - INSTRUCTION_PARSER(inc), // dec - INSTRUCTION_PARSER(set), - INSTRUCTION_PARSER(put), - INSTRUCTION_PARSER(call), - INSTRUCTION_PARSER(null), // wait - INSTRUCTION_PARSER(zone), // start - INSTRUCTION_PARSER(zone), // process - INSTRUCTION_PARSER(move), - INSTRUCTION_PARSER(color), - INSTRUCTION_PARSER(zone), // sound - INSTRUCTION_PARSER(mask), - INSTRUCTION_PARSER(print), - INSTRUCTION_PARSER(text), - INSTRUCTION_PARSER(inc), // mul - INSTRUCTION_PARSER(inc), // div - INSTRUCTION_PARSER(if_op), - INSTRUCTION_PARSER(null), - INSTRUCTION_PARSER(null), - INSTRUCTION_PARSER(endif), - INSTRUCTION_PARSER(zone), // stop - INSTRUCTION_PARSER(endscript) - }; - - uint i; - for (i = 0; i < ARRAYSIZE(op0); i++) - _instructionParsers.push_back(&op0[i]); - + Common::Array<const Opcode*> *table = 0; + + SetOpcodeTable(_instructionParsers); + INSTRUCTION_PARSER(defLocal); // invalid opcode -> local definition + INSTRUCTION_PARSER(zone); // on + INSTRUCTION_PARSER(zone); // off + INSTRUCTION_PARSER(x); + INSTRUCTION_PARSER(y); + INSTRUCTION_PARSER(z); + INSTRUCTION_PARSER(f); + INSTRUCTION_PARSER(loop); + INSTRUCTION_PARSER(null); // endloop + INSTRUCTION_PARSER(null); // show + INSTRUCTION_PARSER(inc); + INSTRUCTION_PARSER(inc); // dec + INSTRUCTION_PARSER(set); + INSTRUCTION_PARSER(put); + INSTRUCTION_PARSER(call); + INSTRUCTION_PARSER(null); // wait + INSTRUCTION_PARSER(zone); // start + INSTRUCTION_PARSER(zone); // process + INSTRUCTION_PARSER(move); + INSTRUCTION_PARSER(color); + INSTRUCTION_PARSER(zone); // sound + INSTRUCTION_PARSER(mask); + INSTRUCTION_PARSER(print); + INSTRUCTION_PARSER(text); + INSTRUCTION_PARSER(inc); // mul + INSTRUCTION_PARSER(inc); // div + INSTRUCTION_PARSER(if_op); + INSTRUCTION_PARSER(null); + INSTRUCTION_PARSER(null); + INSTRUCTION_PARSER(endif); + INSTRUCTION_PARSER(zone); // stop + INSTRUCTION_PARSER(endscript); } void LocationParser_br::parse(Script *script) { diff --git a/engines/parallaction/parser_ns.cpp b/engines/parallaction/parser_ns.cpp index 4966d46ad3..96a4fced71 100644 --- a/engines/parallaction/parser_ns.cpp +++ b/engines/parallaction/parser_ns.cpp @@ -1146,7 +1146,7 @@ void LocationParser_ns::parseWalkNodes(WalkNodeList &list) { return; } - +/* typedef OpcodeImpl<ProgramParser_ns> OpcodeV1; #define INSTRUCTION_PARSER(sig) OpcodeV1(this, &ProgramParser_ns::instParse_##sig) @@ -1157,6 +1157,23 @@ typedef OpcodeImpl<LocationParser_ns> OpcodeV2; #define COMMAND_PARSER(sig) OpcodeV2(this, &LocationParser_ns::cmdParse_##sig) #define WARNING_PARSER(sig) OpcodeV2(this, &LocationParser_br::warning_##sig) +*/ + +#define SetOpcodeTable(x) table = &x; + + +typedef Common::Functor0Mem<void, ProgramParser_ns> OpcodeV1; +#define SetOpcodeTable(x) table = &x; +#define INSTRUCTION_PARSER(sig) table->push_back(new OpcodeV1(this, &ProgramParser_ns::instParse_##sig)) + +typedef Common::Functor0Mem<void, LocationParser_ns> OpcodeV2; +#define ZONE_PARSER(sig) table->push_back(new OpcodeV2(this, &LocationParser_ns::locZoneParse_##sig)) +#define ANIM_PARSER(sig) table->push_back(new OpcodeV2(this, &LocationParser_ns::locAnimParse_##sig)) +#define LOCATION_PARSER(sig) table->push_back(new OpcodeV2(this, &LocationParser_ns::locParse_##sig)) +#define COMMAND_PARSER(sig) table->push_back(new OpcodeV2(this, &LocationParser_ns::cmdParse_##sig)) + +#define WARNING_PARSER(sig) table->push_back(new OpcodeV2(this, &LocationParser_br::warning_##sig)) + void LocationParser_ns::init() { @@ -1169,85 +1186,67 @@ void LocationParser_ns::init() { _locationZoneStmt = new Table(ARRAYSIZE(_locationZoneStmtRes_ns), _locationZoneStmtRes_ns); _locationAnimStmt = new Table(ARRAYSIZE(_locationAnimStmtRes_ns), _locationAnimStmtRes_ns); - uint i; - - static const OpcodeV2 op2[] = { - WARNING_PARSER(unexpected), - COMMAND_PARSER(flags), // set - COMMAND_PARSER(flags), // clear - COMMAND_PARSER(zone), // start - COMMAND_PARSER(zone), // speak - COMMAND_PARSER(zone), // get - COMMAND_PARSER(location), // location - COMMAND_PARSER(zone), // open - COMMAND_PARSER(zone), // close - COMMAND_PARSER(zone), // on - COMMAND_PARSER(zone), // off - COMMAND_PARSER(call), // call - COMMAND_PARSER(flags), // toggle - COMMAND_PARSER(drop), // drop - COMMAND_PARSER(simple), // quit - COMMAND_PARSER(move), // move - COMMAND_PARSER(zone), // stop - COMMAND_PARSER(endcommands), // endcommands - COMMAND_PARSER(endcommands) // endzone - }; - - for (i = 0; i < ARRAYSIZE(op2); i++) - _commandParsers.push_back(&op2[i]); - - - static const OpcodeV2 op4[] = { - WARNING_PARSER(unexpected), - LOCATION_PARSER(endlocation), - LOCATION_PARSER(location), - LOCATION_PARSER(disk), - LOCATION_PARSER(nodes), - LOCATION_PARSER(zone), - LOCATION_PARSER(animation), - LOCATION_PARSER(localflags), - LOCATION_PARSER(commands), - LOCATION_PARSER(acommands), - LOCATION_PARSER(flags), - LOCATION_PARSER(comment), - LOCATION_PARSER(endcomment), - LOCATION_PARSER(sound), - LOCATION_PARSER(music) - }; - - for (i = 0; i < ARRAYSIZE(op4); i++) - _locationParsers.push_back(&op4[i]); - - static const OpcodeV2 op5[] = { - WARNING_PARSER(unexpected), - ZONE_PARSER(limits), - ZONE_PARSER(moveto), - ZONE_PARSER(type), - ZONE_PARSER(commands), - ZONE_PARSER(label), - ZONE_PARSER(flags), - ZONE_PARSER(endzone) - }; - - for (i = 0; i < ARRAYSIZE(op5); i++) - _locationZoneParsers.push_back(&op5[i]); - - static const OpcodeV2 op6[] = { - WARNING_PARSER(unexpected), - ANIM_PARSER(script), - ANIM_PARSER(commands), - ANIM_PARSER(type), - ANIM_PARSER(label), - ANIM_PARSER(flags), - ANIM_PARSER(file), - ANIM_PARSER(position), - ANIM_PARSER(moveto), - ANIM_PARSER(endanimation) - }; - - for (i = 0; i < ARRAYSIZE(op6); i++) - _locationAnimParsers.push_back(&op6[i]); - + Common::Array<const Opcode*> *table = 0; + + SetOpcodeTable(_commandParsers); + WARNING_PARSER(unexpected); + COMMAND_PARSER(flags); // set + COMMAND_PARSER(flags); // clear + COMMAND_PARSER(zone); // start + COMMAND_PARSER(zone); // speak + COMMAND_PARSER(zone); // get + COMMAND_PARSER(location); // location + COMMAND_PARSER(zone); // open + COMMAND_PARSER(zone); // close + COMMAND_PARSER(zone); // on + COMMAND_PARSER(zone); // off + COMMAND_PARSER(call); // call + COMMAND_PARSER(flags); // toggle + COMMAND_PARSER(drop); // drop + COMMAND_PARSER(simple); // quit + COMMAND_PARSER(move); // move + COMMAND_PARSER(zone); // stop + COMMAND_PARSER(endcommands); // endcommands + COMMAND_PARSER(endcommands); // endzone + + SetOpcodeTable(_locationParsers); + WARNING_PARSER(unexpected); + LOCATION_PARSER(endlocation); + LOCATION_PARSER(location); + LOCATION_PARSER(disk); + LOCATION_PARSER(nodes); + LOCATION_PARSER(zone); + LOCATION_PARSER(animation); + LOCATION_PARSER(localflags); + LOCATION_PARSER(commands); + LOCATION_PARSER(acommands); + LOCATION_PARSER(flags); + LOCATION_PARSER(comment); + LOCATION_PARSER(endcomment); + LOCATION_PARSER(sound); + LOCATION_PARSER(music); + + SetOpcodeTable(_locationZoneParsers); + WARNING_PARSER(unexpected); + ZONE_PARSER(limits); + ZONE_PARSER(moveto); + ZONE_PARSER(type); + ZONE_PARSER(commands); + ZONE_PARSER(label); + ZONE_PARSER(flags); + ZONE_PARSER(endzone); + + SetOpcodeTable(_locationAnimParsers); + WARNING_PARSER(unexpected); + ANIM_PARSER(script); + ANIM_PARSER(commands); + ANIM_PARSER(type); + ANIM_PARSER(label); + ANIM_PARSER(flags); + ANIM_PARSER(file); + ANIM_PARSER(position); + ANIM_PARSER(moveto); + ANIM_PARSER(endanimation); } @@ -1257,32 +1256,28 @@ void ProgramParser_ns::init() { _instructionNames = new Table(ARRAYSIZE(_instructionNamesRes_ns), _instructionNamesRes_ns); - static const OpcodeV1 op0[] = { - INSTRUCTION_PARSER(defLocal), // invalid opcode -> local definition - INSTRUCTION_PARSER(animation), // on - INSTRUCTION_PARSER(animation), // off - INSTRUCTION_PARSER(x), - INSTRUCTION_PARSER(y), - INSTRUCTION_PARSER(z), - INSTRUCTION_PARSER(f), - INSTRUCTION_PARSER(loop), - INSTRUCTION_PARSER(null), // endloop - INSTRUCTION_PARSER(null), // show - INSTRUCTION_PARSER(inc), - INSTRUCTION_PARSER(inc), // dec - INSTRUCTION_PARSER(set), - INSTRUCTION_PARSER(put), - INSTRUCTION_PARSER(call), - INSTRUCTION_PARSER(null), // wait - INSTRUCTION_PARSER(animation), // start - INSTRUCTION_PARSER(sound), - INSTRUCTION_PARSER(move), - INSTRUCTION_PARSER(endscript) - }; - - for (uint i = 0; i < ARRAYSIZE(op0); i++) - _instructionParsers.push_back(&op0[i]); - + Common::Array<const Opcode*> *table = 0; + SetOpcodeTable(_instructionParsers); + INSTRUCTION_PARSER(defLocal); // invalid opcode -> local definition + INSTRUCTION_PARSER(animation); // on + INSTRUCTION_PARSER(animation); // off + INSTRUCTION_PARSER(x); + INSTRUCTION_PARSER(y); + INSTRUCTION_PARSER(z); + INSTRUCTION_PARSER(f); + INSTRUCTION_PARSER(loop); + INSTRUCTION_PARSER(null); // endloop + INSTRUCTION_PARSER(null); // show + INSTRUCTION_PARSER(inc); + INSTRUCTION_PARSER(inc); // dec + INSTRUCTION_PARSER(set); + INSTRUCTION_PARSER(put); + INSTRUCTION_PARSER(call); + INSTRUCTION_PARSER(null); // wait + INSTRUCTION_PARSER(animation); // start + INSTRUCTION_PARSER(sound); + INSTRUCTION_PARSER(move); + INSTRUCTION_PARSER(endscript); } // diff --git a/engines/parallaction/staticres.cpp b/engines/parallaction/staticres.cpp index 18021db9a1..2c5cf281dd 100644 --- a/engines/parallaction/staticres.cpp +++ b/engines/parallaction/staticres.cpp @@ -29,23 +29,23 @@ namespace Parallaction { -byte Parallaction_ns::_mouseArrow[256] = { - 0x12, 0x11, 0x11, 0x11, 0x13, 0x12, 0x12, 0x12, 0x13, 0x12, 0x12, 0x11, 0x13, 0x12, 0x12, 0x00, - 0x13, 0x12, 0x12, 0x11, 0x13, 0x12, 0x12, 0x12, 0x13, 0x12, 0x12, 0x12, 0x13, 0x12, 0x12, 0x12, - 0x13, 0x12, 0x12, 0x12, 0x13, 0x12, 0x12, 0x12, 0x13, 0x12, 0x12, 0x13, 0x13, 0x13, 0x12, 0x00, - 0x13, 0x00, 0x12, 0x00, 0x13, 0x00, 0x12, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x11, 0x12, 0x12, 0x12, 0x00, 0x12, 0x12, 0x12, 0x00, - 0x12, 0x12, 0x12, 0x00, 0x12, 0x12, 0x12, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, - 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x12, 0x12, 0x12, 0x00, 0x12, 0x12, 0x12, 0x00, - 0x13, 0x13, 0x12, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x00, 0x12, 0x12, 0x12, 0x00, 0x12, 0x12, 0x12, 0x00, - 0x12, 0x12, 0x12, 0x00, 0x12, 0x12, 0x12, 0x00, 0x12, 0x12, 0x12, 0x11, 0x12, 0x12, 0x12, 0x12, - 0x12, 0x12, 0x12, 0x13, 0x12, 0x12, 0x12, 0x00, 0x12, 0x12, 0x12, 0x00, 0x13, 0x12, 0x12, 0x00, - 0x00, 0x12, 0x13, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x11, 0x11, 0x11, 0x00, 0x12, 0x12, 0x12, 0x00, 0x12, 0x12, 0x12, 0x00, 0x12, 0x12, 0x11, 0x00, - 0x12, 0x12, 0x12, 0x00, 0x12, 0x12, 0x12, 0x00, 0x12, 0x12, 0x12, 0x00, 0x12, 0x12, 0x12, 0x11, - 0x12, 0x12, 0x12, 0x00, 0x12, 0x12, 0x12, 0x00, 0x13, 0x12, 0x12, 0x00, 0x00, 0x12, 0x13, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +byte Parallaction_ns::_resMouseArrow[256] = { + 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x00, 0x00, + 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x00, 0x00, 0x00, + 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x00, 0x00, 0x00, + 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x00, 0x00, + 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x00, + 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x00, + 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x00, 0x00, + 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x00, 0x00, 0x00, + 0x11, 0x12, 0x12, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x12, 0x11, 0x00, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x00, 0x00, 0x00, 0x11, 0x12, 0x12, 0x12, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x12, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; diff --git a/engines/scumm/detection_tables.h b/engines/scumm/detection_tables.h index 474707ec55..324cc91e78 100644 --- a/engines/scumm/detection_tables.h +++ b/engines/scumm/detection_tables.h @@ -89,7 +89,8 @@ static const PlainGameDescriptor gameDescriptions[] = { { "baseball2001", "Backyard Baseball 2001" }, { "Baseball2003", "Backyard Baseball 2003" }, { "basketball", "Backyard Basketball" }, - { "BluesABCTime", "Blue's ABC Time" }, + { "Blues123Time", "Blue's 123 Time Activities" }, + { "BluesABCTime", "Blue's ABC Time Activities" }, { "BluesBirthday", "Blue's Birthday Adventure" }, { "catalog", "Humongous Interactive Catalog" }, { "chase", "SPY Fox in Cheese Chase" }, @@ -116,7 +117,7 @@ static const PlainGameDescriptor gameDescriptions[] = { { "PuttsFunShop", "Putt-Putt's One-Stop Fun Shop" }, { "putttime", "Putt-Putt Travels Through Time" }, { "puttzoo", "Putt-Putt Saves the Zoo" }, - { "readdemo", "Blue's Reading Time Activities (Demo)" }, + { "readtime", "Blue's Reading Time Activities" }, { "SamsFunShop", "Pajama Sam's One-Stop Fun Shop" }, { "soccer", "Backyard Soccer" }, { "Soccer2004", "Backyard Soccer 2004" }, @@ -285,8 +286,7 @@ static const GameSettings gameVariantsTable[] = { {"dog", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK}, {"maze", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK}, - {"water", "", 0, GID_WATER, 6, 80, MDT_NONE, GF_USE_KEY, UNK}, - {"water", "HE 99", 0, GID_WATER, 6, 99, MDT_NONE, GF_USE_KEY, UNK}, + {"water", "", 0, GID_HEGAME, 6, 80, MDT_NONE, GF_USE_KEY, UNK}, // condMaskCode value changed in setUserCondition & setTalkCondition {"putttime", "", 0, GID_HEGAME, 6, 85, MDT_NONE, GF_USE_KEY, UNK}, @@ -319,6 +319,7 @@ static const GameSettings gameVariantsTable[] = { {"soccer", "", 0, GID_SOCCER, 6, 98, MDT_NONE, GF_USE_KEY, UNK}, // Global scripts increased to 2048 + {"blues123time", "", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK}, {"freddi4", "", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_USE_KEY | GF_HE_985, UNK}, {"freddi4", "unenc", 0, GID_HEGAME, 6, 98, MDT_NONE, GF_HE_985, UNK}, @@ -353,7 +354,7 @@ static const GameSettings gameVariantsTable[] = { // Uses smacker in external files, for testing only {"arttime", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK}, - {"readdemo", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK}, + {"readtime", 0, 0, GID_HEGAME, 6, 99, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK}, {"football2002", 0, 0, GID_FOOTBALL, 6, 100, MDT_NONE, GF_USE_KEY | GF_16BIT_COLOR, UNK}, @@ -511,6 +512,9 @@ static const GameFilenamePattern gameFilenamesTable[] = { { "basketball", "basketball", kGenHEPC, UNK_LANG, UNK, 0 }, { "basketball", "Basketball", kGenHEMac, UNK_LANG, Common::kPlatformMacintosh, 0 }, + { "blues123time", "Blues123time", kGenHEPC, UNK_LANG, UNK, 0 }, + { "blues123time", "Blue's 123 Time", kGenHEMac, UNK_LANG, Common::kPlatformMacintosh, 0 }, + { "bluesabctime", "bluesabctime", kGenHEPC, UNK_LANG, UNK, 0 }, { "bluesabctime", "BluesABCTimeDemo", kGenHEPC, UNK_LANG, UNK, 0 }, { "bluesabctime", "BluesABCTimeDemo", kGenHEMac, UNK_LANG, Common::kPlatformMacintosh, 0 }, @@ -752,8 +756,9 @@ static const GameFilenamePattern gameFilenamesTable[] = { { "puttzoo", "zoodemo", kGenHEPC, UNK_LANG, UNK, 0 }, { "puttzoo", "Zoo Demo", kGenHEMac, UNK_LANG, Common::kPlatformMacintosh, 0 }, - { "readdemo", "readDemo", kGenHEPC, UNK_LANG, UNK, 0 }, - { "readdemo", "Blues-ReadingTime Demo", kGenHEMac, UNK_LANG, Common::kPlatformMacintosh, 0 }, + { "readtime", "Blue's Reading Time", kGenHEPC, UNK_LANG, UNK, 0 }, + { "readtime", "readDemo", kGenHEPC, UNK_LANG, UNK, 0 }, + { "readtime", "Blues-ReadingTime Demo", kGenHEMac, UNK_LANG, Common::kPlatformMacintosh, 0 }, { "SamsFunShop", "SamsFunShop", kGenHEPC, UNK_LANG, UNK, 0 }, { "SamsFunShop", "Sam's FunShop", kGenHEMac, UNK_LANG, Common::kPlatformMacintosh, 0 }, diff --git a/engines/scumm/scumm-md5.h b/engines/scumm/scumm-md5.h index a95fe790b2..62d777aa33 100644 --- a/engines/scumm/scumm-md5.h +++ b/engines/scumm/scumm-md5.h @@ -1,5 +1,5 @@ /* - This file was generated by the md5table tool on Sat May 24 00:59:21 2008 + This file was generated by the md5table tool on Mon Jun 02 08:37:50 2008 DO NOT EDIT MANUALLY! */ @@ -287,6 +287,7 @@ static const MD5Table md5table[] = { { "7020931d5a2be0a49d68e7a1882363e4", "zak", "V1", "V1", 1896, Common::EN_ANY, Common::kPlatformPC }, { "70b0719ac3a5b47ae233c561823d5b96", "puttzoo", "", "", -1, Common::NL_NLD, Common::kPlatformMacintosh }, { "71523b539491527d9860f4407faf0411", "monkey", "Demo", "EGA Demo", 7607, Common::EN_ANY, Common::kPlatformPC }, + { "71d384e7676c53d513ddd333eae1d82c", "Blues123time", "", "", -1, Common::EN_ANY, Common::kPlatformUnknown }, { "71fe97c3108678cf604f14abe342341b", "spyfox2", "", "", -1, Common::NL_NLD, Common::kPlatformWindows }, { "7222f260253f325c21fcfa68b5bfab67", "spyfox2", "", "Demo", -1, Common::EN_USA, Common::kPlatformUnknown }, { "72ac6bc980d5101c2142189d746bd62f", "spyfox", "HE 99", "", -1, Common::RU_RUS, Common::kPlatformWindows }, @@ -363,6 +364,7 @@ static const MD5Table md5table[] = { { "92fc0073a4cf259ff36070ecb8628ba8", "thinkerk", "", "", -1, Common::EN_USA, Common::kPlatformUnknown }, { "94aaedbb8f26d71ed3ad6dd34490e29e", "tentacle", "", "Floppy", -1, Common::FR_FRA, Common::kPlatformPC }, { "94db6519da85b8d08c976d8e9a858ea7", "baseball", "HE CUP", "Preview", 10044774, Common::UNK_LANG, Common::kPlatformUnknown }, + { "95818b178d473c989ac753574e8892aa", "readtime", "", "Demo", -1, Common::EN_ANY, Common::kPlatformUnknown }, { "95b3806e043be08668c54c3ffe98650f", "BluesABCTime", "", "", -1, Common::EN_ANY, Common::kPlatformUnknown }, { "96a3069a3c63caa7329588ce1fef41ee", "spyozon", "", "", -1, Common::RU_RUS, Common::kPlatformUnknown }, { "9708cf716ed8bcc9ff3fcfc69413b746", "puttputt", "HE 61", "", -1, Common::EN_ANY, Common::kPlatformPC }, @@ -476,6 +478,7 @@ static const MD5Table md5table[] = { { "cf8d13446ec6cb6222287a925fd47c1d", "baseball", "", "", -1, Common::EN_ANY, Common::kPlatformUnknown }, { "cf8ef3a1fb483c5c4b1c584d1167b2c4", "freddi", "HE 73", "", -1, Common::DE_DEU, Common::kPlatformWindows }, { "cf90b4db5486ef798db78fe6fbf897e5", "pajama3", "", "Demo", -1, Common::EN_USA, Common::kPlatformWindows }, + { "d00ffc8c32d17e575fd985d435d2eb88", "arttime", "", "Demo", -1, Common::EN_ANY, Common::kPlatformUnknown }, { "d0549508a06bbb9f99ed19c9e97891f3", "football2002", "", "", -1, Common::EN_ANY, Common::kPlatformUnknown }, { "d06fbe28818fef7bfc45c2cdf0c0849d", "zak", "V2", "V2", -1, Common::DE_DEU, Common::kPlatformPC }, { "d0ad929def3e9cfe39dea55bd12098d4", "puttcircus", "", "", -1, Common::FR_FRA, Common::kPlatformWindows }, diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h index 26b6aa6e2f..20824ffe74 100644 --- a/engines/scumm/scumm.h +++ b/engines/scumm/scumm.h @@ -221,7 +221,6 @@ enum ScummGameId { GID_FBEAR, GID_FUNPACK, GID_FREDDI3, - GID_WATER, GID_PUTTRACE, GID_FUNSHOP, // Used for all three funshops GID_FOOTBALL, diff --git a/engines/scumm/string.cpp b/engines/scumm/string.cpp index 81ffaa89ba..f039e2ca23 100644 --- a/engines/scumm/string.cpp +++ b/engines/scumm/string.cpp @@ -1481,9 +1481,9 @@ void ScummEngine_v7::translateText(const byte *text, byte *trans_buff) { text = (const byte *)"/NEW.009/glowing crystals"; else if (!strcmp((const char *)text, "pit")) text = (const byte *)"/NEW.010/pit"; - else if (!strcmp((const char *)text, "/NEWTON.032/")) + else if (!strcmp((const char *)text, "You wish.")) text = (const byte *)"/NEW.011/You wish."; - else if (!strcmp((const char *)text, "/NEWTON.034/")) + else if (!strcmp((const char *)text, "In your dreams.")) text = (const byte *)"/NEW.012/In your dreams"; else if (!strcmp((const char *)text, "left")) text = (const byte *)"/CATHPLAT.068/left"; diff --git a/engines/scumm/verbs.cpp b/engines/scumm/verbs.cpp index cf4711f6a2..0a61d10166 100644 --- a/engines/scumm/verbs.cpp +++ b/engines/scumm/verbs.cpp @@ -567,8 +567,8 @@ void ScummEngine::checkExecVerbs() { _mouseAndKeyboardStat = numpad[_mouseAndKeyboardStat - '0']; } - if (_game.platform == Common::kPlatformFMTowns && (_game.id == GID_ZAK || _game.id == GID_INDY3)) { - // HACK: In the FM-Towns games Indy3 and Zak the most significant bit is set for special keys + if (_game.platform == Common::kPlatformFMTowns && _game.version == 3) { + // HACK: In the FM-Towns games Indy3, Loom and Zak the most significant bit is set for special keys // like F5 (=0x8005) or joystick buttons (mask 0xFE00, e.g. SELECT=0xFE40 for the save/load menu). // Hence the distinction with (_mouseAndKeyboardStat < MBS_MAX_KEY) between mouse- and key-events is not applicable // to this games, so we have to remap the special keys here. diff --git a/engines/sword1/control.cpp b/engines/sword1/control.cpp index 71e25fc56f..980e0b4f9f 100644 --- a/engines/sword1/control.cpp +++ b/engines/sword1/control.cpp @@ -1225,7 +1225,7 @@ const uint8 Control::_languageStrings[8 * 20][43] = { "Testo", "Fatto", "OK", - "Annula", + "Annulla", "Musica", "Parlato", "Fx", diff --git a/engines/sword2/palette.cpp b/engines/sword2/palette.cpp index 1b9cd28d25..81f93c77ae 100644 --- a/engines/sword2/palette.cpp +++ b/engines/sword2/palette.cpp @@ -156,22 +156,17 @@ void Screen::setPalette(int16 startEntry, int16 noEntries, byte *colourTable, ui memcpy(&_palette[4 * startEntry], colourTable, noEntries * 4); if (fadeNow == RDPAL_INSTANT) { - _vm->_system->setPalette(_palette, startEntry, noEntries); + setSystemPalette(_palette, startEntry, noEntries); setNeedFullRedraw(); } } -void Screen::dimPalette() { - byte *p = _palette; - - for (int i = 0; i < 256; i++) { - p[i * 4 + 0] /= 2; - p[i * 4 + 1] /= 2; - p[i * 4 + 2] /= 2; +void Screen::dimPalette(bool dim) { + if (dim != _dimPalette) { + _dimPalette = dim; + setSystemPalette(_palette, 0, 256); + setNeedFullRedraw(); } - - _vm->_system->setPalette(p, 0, 256); - setNeedFullRedraw(); } /** @@ -269,8 +264,24 @@ void Screen::fadeServer() { } } - _vm->_system->setPalette(newPalette, 0, 256); + setSystemPalette(newPalette, 0, 256); setNeedFullRedraw(); } +void Screen::setSystemPalette(const byte *colors, uint start, uint num) { + const byte *palette; + + if (_dimPalette) { + byte pal[256 * 4]; + + for (uint i = start * 4; i < 4 * (start + num); i++) + pal[i] = colors[i] / 2; + + palette = pal; + } else + palette = colors; + + _vm->_system->setPalette(palette, start, num); +} + } // End of namespace Sword2 diff --git a/engines/sword2/screen.cpp b/engines/sword2/screen.cpp index 1f6eb1b22d..fdabb3ee6f 100644 --- a/engines/sword2/screen.cpp +++ b/engines/sword2/screen.cpp @@ -97,6 +97,8 @@ Screen::Screen(Sword2Engine *vm, int16 width, int16 height) { _renderAverageTime = 60; _layer = 0; + + _dimPalette = false; } Screen::~Screen() { diff --git a/engines/sword2/screen.h b/engines/sword2/screen.h index d59a6ef3df..93cc5e40ce 100644 --- a/engines/sword2/screen.h +++ b/engines/sword2/screen.h @@ -350,6 +350,8 @@ private: uint16 _layer; + bool _dimPalette; + public: Screen(Sword2Engine *vm, int16 width, int16 height); ~Screen(); @@ -400,11 +402,12 @@ public: void setFullPalette(int32 palRes); void setPalette(int16 startEntry, int16 noEntries, byte *palette, uint8 setNow); + void setSystemPalette(const byte *colors, uint start, uint num); uint8 quickMatch(uint8 r, uint8 g, uint8 b); int32 fadeUp(float time = 0.75); int32 fadeDown(float time = 0.75); uint8 getFadeStatus(); - void dimPalette(); + void dimPalette(bool dim); void waitForFade(); void fadeServer(); diff --git a/engines/sword2/sword2.cpp b/engines/sword2/sword2.cpp index 26fd598d9d..7331d1f761 100644 --- a/engines/sword2/sword2.cpp +++ b/engines/sword2/sword2.cpp @@ -225,7 +225,6 @@ Sword2Engine::Sword2Engine(OSystem *syst) : Engine(syst) { #endif _gamePaused = false; - _graphicsLevelFudged = false; _gameCycle = 0; _gameSpeed = 1; @@ -701,22 +700,14 @@ void Sword2Engine::pauseEngineIntern(bool pause) { _sound->pauseAllSound(); _mouse->pauseEngine(true); - // If render level is at max, turn it down because palette- - // matching won't work when the palette is dimmed. - - if (_screen->getRenderLevel() == 3) { - _screen->setRenderLevel(2); - _graphicsLevelFudged = true; - } - #ifdef SWORD2_DEBUG // Don't dim it if we're single-stepping through frames // dim the palette during the pause if (!_stepOneCycle) - _screen->dimPalette(); + _screen->dimPalette(true); #else - _screen->dimPalette(); + _screen->dimPalette(true); #endif _gamePaused = true; @@ -724,14 +715,7 @@ void Sword2Engine::pauseEngineIntern(bool pause) { _mouse->pauseEngine(false); _sound->unpauseAllSound(); - // Put back game screen palette; see screen.cpp - _screen->setFullPalette(-1); - - // If graphics level at max, turn up again - if (_graphicsLevelFudged) { - _screen->setRenderLevel(3); - _graphicsLevelFudged = false; - } + _screen->dimPalette(false); _gamePaused = false; diff --git a/engines/sword2/sword2.h b/engines/sword2/sword2.h index ba59772a71..05c5d7fa47 100644 --- a/engines/sword2/sword2.h +++ b/engines/sword2/sword2.h @@ -207,7 +207,6 @@ public: uint32 findBufferSize(); bool _gamePaused; - bool _graphicsLevelFudged; void startGame(); void gameCycle(); diff --git a/sound/audiostream.cpp b/sound/audiostream.cpp index 4454a09fe6..588c49ebec 100644 --- a/sound/audiostream.cpp +++ b/sound/audiostream.cpp @@ -134,17 +134,19 @@ public: : _ptr(ptr), _end(ptr+len), _loopPtr(0), _loopEnd(0), _rate(rate), _playtime(calculatePlayTime(rate, len / (is16Bit ? 2 : 1) / (stereo ? 2 : 1))) { // Verify the buffer sizes are sane - if (is16Bit && stereo) + if (is16Bit && stereo) { assert((len & 3) == 0 && (loopLen & 3) == 0); - else if (is16Bit || stereo) + } else if (is16Bit || stereo) { assert((len & 1) == 0 && (loopLen & 1) == 0); + } if (loopLen) { _loopPtr = _ptr + loopOffset; _loopEnd = _loopPtr + loopLen; } - if (stereo) // Stereo requires even sized data + if (stereo) { // Stereo requires even sized data assert(len % 2 == 0); + } _origPtr = autoFreeMemory ? ptr : 0; } @@ -329,10 +331,11 @@ void AppendableMemoryStream<stereo, is16Bit, isUnsigned, isLE>::queueBuffer(byte Common::StackLock lock(_mutex); // Verify the buffer size is sane - if (is16Bit && stereo) + if (is16Bit && stereo) { assert((size & 3) == 0); - else if (is16Bit || stereo) + } else if (is16Bit || stereo) { assert((size & 1) == 0); + } // Verify that the stream has not yet been finalized (by a call to finish()) assert(!_finalized); diff --git a/tools/scumm-md5.txt b/tools/scumm-md5.txt index 6e1a42a99d..721c43b568 100644 --- a/tools/scumm-md5.txt +++ b/tools/scumm-md5.txt @@ -410,7 +410,10 @@ thinkerk Big Thinkers Kindergarten 695fe0b3963333b7e15b37514db3c745 29789 us All - Demo - khalek, sev -BluesABCTime Blue's ABC Time +Blues123time Blue's 123 Time Activities + 71d384e7676c53d513ddd333eae1d82c -1 en All - - - Vasyl Tsvirkunov + +BluesABCTime Blue's ABC Time Activities 95b3806e043be08668c54c3ffe98650f -1 en All - - - sev 7ddeaf52c8b9a50551ce0aa2ac811d07 -1 en All - Demo - khalek, sev @@ -419,6 +422,7 @@ BluesABCTime Blue's ABC Time arttime Blue's Art Time Activities 6269b8fbf51a353e5b501e4ad98cdc67 -1 en Windows - - - killiandor + d00ffc8c32d17e575fd985d435d2eb88 -1 en All - Demo - Kirben BluesBirthday Blue's Birthday Adventure 99128b6a5bdd9831d9682fb8b5cbf8d4 -1 en All - - - knifethrower @@ -428,6 +432,9 @@ BluesBirthday Blue's Birthday Adventure dbf4d59d70b826733f379f998354d350 -1 en All - Demo - Kirben fa30c4a7a806629626269b6dcab59a15 7819264 All All HE CUP Preview - sev +readtime Blue's Reading Time Activities + 95818b178d473c989ac753574e8892aa -1 en All - Demo - Kirben + fbear Fatty Bear's Birthday Surprise 5b08000a9c47b2887df6506ac767ca68 -1 en 3DO HE 61 - - sev 3824e60cdf639d22f6df92a03dc4b131 7732 en DOS HE 61 - - khalek |