diff options
-rw-r--r-- | backends/platform/ds/arm9/makefile.in | 350 | ||||
-rw-r--r-- | backends/platform/symbian/res/scummvm.cer | 21 | ||||
-rw-r--r-- | backends/platform/symbian/res/scummvm.key | 15 | ||||
-rw-r--r-- | backends/platform/wince/README-WinCE.txt | 616 | ||||
-rw-r--r-- | common/keyboard.h | 266 | ||||
-rw-r--r-- | dists/pred.dic | 7986 | ||||
-rwxr-xr-x | dists/slackware/scummvm.SlackBuild.in | 58 | ||||
-rw-r--r-- | engines/agi/wagparser.cpp | 229 | ||||
-rw-r--r-- | engines/agi/wagparser.h | 288 | ||||
-rw-r--r-- | engines/lure/fights.cpp | 583 | ||||
-rw-r--r-- | engines/lure/fights.h | 111 | ||||
-rw-r--r-- | engines/lure/sound.cpp | 37 | ||||
-rw-r--r-- | engines/lure/sound.h | 41 | ||||
-rw-r--r-- | sound/rate_arm.cpp | 431 | ||||
-rw-r--r-- | sound/rate_arm_asm.s | 692 |
15 files changed, 11724 insertions, 0 deletions
diff --git a/backends/platform/ds/arm9/makefile.in b/backends/platform/ds/arm9/makefile.in new file mode 100644 index 0000000000..e7a7da4a59 --- /dev/null +++ b/backends/platform/ds/arm9/makefile.in @@ -0,0 +1,350 @@ +#BUILD_PLUGINS = 1 +#libndsdir = $(DEVKITPRO)/libnds +libndsdir = /home/neil/devkitpro/libnds + +# Select the build you want by uncommenting one of the following lines: + +DS_BUILD_A = 1 +#DS_BUILD_B = 1 +#DS_BUILD_C = 1 +#DS_BUILD_D = 1 + +# Uncomment the following line to build in support for MP3 audio +# using libmad: +USE_MAD = 1 + +# Uncomment the following line to enable support for the +# ace DS Debugger (remembering to make the same change in the arm7 makefile): +#USE_DEBUGGER = 1 +# NOTE: The header and libs for the debugger is assumed to be in the libnds +# folder. + +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' + + +ifdef DS_BUILD_A + DEFINES = -DDS_SCUMM_BUILD -DDS_BUILD_A + LOGO = logoa.bmp + DISABLE_HE = 1 + #DISABLE_SCUMM = 1 + DISABLE_SCUMM_7_8 = 1 + DISABLE_AGOS = 1 + DISABLE_SKY = 1 + DISABLE_SWORD1 = 1 + DISABLE_SWORD2 = 1 + DISABLE_QUEEN = 1 + DISABLE_SAGA = 1 + DISABLE_KYRA = 1 + DISABLE_GOB = 1 + DISABLE_LURE = 1 + DISABLE_CINE = 1 + DISABLE_AGI = 1 + DISABLE_TOUCHE = 1 + DISABLE_PARALLACTION = 1 + BUILD=scummvm-A +endif + +ifdef DS_BUILD_B + DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_B + LOGO = logob.bmp + DISABLE_HE = 1 + DISABLE_SCUMM = 1 + DISABLE_SCUMM_7_8 = 1 + DISABLE_AGOS = 1 + #DISABLE_SKY = 1 + DISABLE_SWORD1 = 1 + DISABLE_SWORD2 = 1 + #DISABLE_QUEEN = 1 + DISABLE_SAGA = 1 + DISABLE_KYRA = 1 + DISABLE_GOB = 1 + DISABLE_LURE = 1 + DISABLE_CINE = 1 + DISABLE_AGI = 1 + DISABLE_TOUCHE = 1 + DISABLE_PARALLACTION = 1 + BUILD=scummvm-B +endif + +ifdef DS_BUILD_C + DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_C + LOGO = logoc.bmp + DISABLE_HE = 1 + DISABLE_SCUMM = 1 + DISABLE_SCUMM_7_8 = 1 + #DISABLE_AGOS = 1 + DISABLE_SKY = 1 + DISABLE_SWORD1 = 1 + DISABLE_SWORD2 = 1 + DISABLE_QUEEN = 1 + DISABLE_SAGA = 1 + #DISABLE_KYRA = 1 + #DISABLE_GOB = 1 + DISABLE_LURE = 1 + DISABLE_CINE = 1 + DISABLE_AGI = 1 + DISABLE_TOUCHE = 1 + DISABLE_PARALLACTION = 1 + BUILD=scummvm-C +endif + +ifdef DS_BUILD_D + DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_D + LOGO = logoc.bmp + DISABLE_HE = 1 + DISABLE_SCUMM = 1 + DISABLE_SCUMM_7_8 = 1 + DISABLE_AGOS = 1 + DISABLE_SKY = 1 + DISABLE_SWORD1 = 1 + DISABLE_SWORD2 = 1 + DISABLE_QUEEN = 1 + DISABLE_SAGA = 1 + DISABLE_KYRA = 1 + DISABLE_GOB = 1 + DISABLE_LURE = 1 + #DISABLE_CINE = 1 + #DISABLE_AGI = 1 + DISABLE_TOUCHE = 1 + DISABLE_PARALLACTION = 1 + BUILD=scummvm-A +endif + + +ARM7BIN := -7 $(CURDIR)/../../arm7/arm7.bin +ICON := -b ../../../logo.bmp "ScummVM;By Neil Millstone;" + +CC = arm-eabi-gcc +CXX = arm-eabi-g++ + +CFLAGS = -Wno-multichar -Wall -Os\ + -Wno-multichar -mcpu=arm9tdmi -mtune=arm9tdmi \ + -mcpu=arm9tdmi -mtune=arm9tdmi -fomit-frame-pointer\ + -ffast-math -mthumb-interwork + +ifdef USE_DEBUGGER + DEFINES += -DUSE_DEBUGGER + CFLAGS += -g +endif + +CXXFLAGS= $(CFLAGS) -Wno-non-virtual-dtor -Wno-non-virtual-dtor \ + -fno-exceptions -fno-rtti + +ASFLAGS = -mcpu=arm9tdmi -mthumb-interwork +DEFINES += -D__DS__ -DNDS -DARM9 -DNONSTANDARD_PORT -DDISABLE_FANCY_THEMES -DDISABLE_DEFAULT_SAVEFILEMANAGER +ifdef USE_MAD + DEFINES += -DUSE_MAD +endif + + +LDFLAGS = -specs=ds_arm9.specs -mthumb-interwork -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\ + -I$(portdir)/source/libcartreset + + +LIBS = -lm -L$(libndsdir)/lib -L$(portdir)/lib -lnds9 +ifdef USE_MAD + LIBS += -lmad +endif +ifdef USE_DEBUGGER + LIBS += -ldsdebugger -ldswifi9 +endif + +#-Lscumm -lscumm -Lbase -lbase -Lcommon -lcommon -Lgraphics -lgraphics -Lgui -lgui -Lsound -lsound +EXECUTABLE = scummvm.elf +PLUGIN_PREFIX = +PLUGIN_SUFFIX = .plg +PLUGIN_EXTRA_DEPS = plugin.x plugin.syms scummvm.elf +PLUGIN_LDFLAGS = -nostartfiles -Wl,-q,-Tplugin.x,--just-symbols,scummvm.elf,--retain-symbols-file,plugin.syms -L$(ronindir)/lib +MKDIR = mkdir -p +RM = rm -f +RM_REC = rm -rf +AR = arm-eabi-ar cru +RANLIB = arm-eabi-ranlib +OBJCOPY = arm-eabi-objcopy +AS = arm-eabi-as +HAVE_GCC3 = true +DISABLE_SCALERS = true + +ifdef BUILD_PLUGINS +DEFINES += -DDYNAMIC_MODULES +PRE_OBJS_FLAGS = -Wl,--whole-archive +POST_OBJS_FLAGS = -Wl,--no-whole-archive +endif + +PORT_OBJS := $(portdir)/source/blitters.o $(portdir)/source/cdaudio.o $(portdir)/source/dsmain.o \ + $(portdir)/../../../fs/ds/ds-fs.o $(portdir)/source/gbampsave.o $(portdir)/source/scummhelp.o\ + $(portdir)/source/osystem_ds.o $(portdir)/source/portdefs.o $(portdir)/source/ramsave.o\ + $(portdir)/source/scummconsole.o $(portdir)/source/touchkeyboard.o $(portdir)/source/zipreader.o\ + $(portdir)/source/dsoptions.o $(portdir)/source/keys.o + +DATA_OBJS := $(portdir)/data/icons.o $(portdir)/data/keyboard.o $(portdir)/data/keyboard_pal.o $(portdir)/data/default_font.o + + +COMPRESSOR_OBJS := $(portdir)/source/compressor/lz.o + +FAT_OBJS := $(portdir)/source/fat/disc_io.o $(portdir)/source/fat/gba_nds_fat.o\ + $(portdir)/source/fat/io_fcsr.o $(portdir)/source/fat/io_m3cf.o\ + $(portdir)/source/fat/io_mpcf.o $(portdir)/source/fat/io_sccf.o\ + $(portdir)/source/fat/io_m3sd.o\ + $(portdir)/source/fat/io_nmmc.o $(portdir)/source/fat/io_scsd.o \ + $(portdir)/source/fat/io_scsd_asm.o \ + $(portdir)/source/fat/io_njsd.o \ + $(portdir)/source/fat/io_mmcf.o \ + $(portdir)/source/fat/io_sd_common.o \ + $(portdir)/source/fat/io_m3_common.o \ + $(portdir)/source/fat/io_dldi.o \ + $(portdir)/source/fat/m3sd.o + + +# $(portdir)/source/fat/io_cf_common.o $(portdir)/source/fat/io_m3_common.o\ +# $(portdir)/source/fat/io_sd_common.o $(portdir)/source/fat/io_scsd_s.o \ +# $(portdir)/source/fat/io_sc_common.o $(portdir)/source/fat/io_sd_common.o + +LIBCARTRESET_OBJS := $(portdir)/source/libcartreset/cartreset.o + + + +OBJS := $(DATA_OBJS) $(LIBCARTRESET_OBJS) $(PORT_OBJS) $(COMPRESSOR_OBJS) $(FAT_OBJS) + + + +MODULE_DIRS += . + +ndsall: + @[ -d $(BUILD) ] || mkdir -p $(BUILD) + make -C ./$(BUILD) -f ../makefile scummvm.nds + +include $(srcdir)/Makefile.common + +clean: + $(RM) $(OBJS) $(EXECUTABLE) + rm -fr $(BUILD) + +plugin_dist : + find . -name '*.plg' | while read p; do \ + sh-elf-strip -g -o "`basename \"$$p\" | tr '[:lower:]' '[:upper:]'`" "$$p"; \ + done + +dist : SCUMMVM.BIN plugins plugin_dist + + +#--------------------------------------------------------------------------------- +# canned command sequence for binary data +#--------------------------------------------------------------------------------- +#define bin2o +# bin2s $< | $(AS) -mthumb -mthumb-interwork -o $(@) +# echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_raw_end[];" > `(echo $(<F) | tr . _)`.h +# echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_raw[];" >> `(echo $(<F) | tr . _)`.h +# echo "extern const u32" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_raw_size";" >> `(echo $(<F) | tr . _)`.h +#endef + + +define bin2o + bin2s $< | $(AS) -mthumb -mthumb-interwork -o $(@) + echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end[];" > `(echo $(<F) | tr . _)`.h + echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"[];" >> `(echo $(<F) | tr . _)`.h + echo "extern const u32" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size";" >> `(echo $(<F) | tr . _)`.h +endef + + +#define bin2o +# @echo $(*) +# cp $(<) $(*).tmp +# $(OBJCOPY) -I binary -O elf32-littlearm -B arm \ +# --rename-section .data=.rodata \ +# --redefine-sym _binary_$(subst .,_,$(subst /,_,$(*)))_tmp_start=$(notdir $*)\ +# --redefine-sym _binary_$(subst .,_,$(subst /,_,$(*)))_tmp_end=$(notdir $*)_end\ +# $(*).tmp $(@) +# echo "extern const u8" $(notdir $*)"[] __attribute__ ((aligned (4)));" > $(*).h +# echo "extern const u32" $(notdir $(*))_size[]";" >> $(*).h +# +# echo $(*).h +# rm $(*).tmp +#endef + +############## +# Replacement rule for the one in makefile.common +############## +ifndef HAVE_GCC3 +# If you use GCC, disable the above and enable this for intelligent +# dependency tracking. +.cpp.o: + $(MKDIR) $(*D)/$(DEPDIR) + $(CXX) -Wp,-MMD,"$(*D)/$(DEPDIR)/$(*F).d2" $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $*.o +# $(ECHO) "$(*D)/" > $(*D)/$(DEPDIR)/$(*F).d + $(CAT) "$(*D)/$(DEPDIR)/$(*F).d2" >> "$(*D)/$(DEPDIR)/$(*F).d" + $(RM) "$(*D)/$(DEPDIR)/$(*F).d2" +else +# If you even have GCC 3.x, you can use this build rule, which is safer; the above +# rule can get you into a bad state if you Ctrl-C at the wrong moment. +# Also, with this GCC inserts additional dummy rules for the involved headers, +# which ensures a smooth compilation even if said headers become obsolete. +.cpp.o: + $(MKDIR) $(*D)/$(DEPDIR) +# $(CXX) -Wp,-MMD,"$(*D)/$(DEPDIR)/$(*F).d",-MQ,"$@",-MP $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $*.o + $(CXX) -MMD -MF "$(*D)/$(DEPDIR)/$(*F).d" $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $*.o +endif + + +#--------------------------------------------------------------------------------- + +#--------------------------------------------------------------------------------- +%.o : %.pcx +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +#--------------------------------------------------------------------------------- +%.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +#--------------------------------------------------------------------------------- +%.o : %.raw +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +#--------------------------------------------------------------------------------- +%.o : %.pal +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +#--------------------------------------------------------------------------------- +%.o : %.map +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +#--------------------------------------------------------------------------------- +%.o : %.mdl +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +#--------------------------------------------------------------------------------- +%.nds: %.bin + @echo ndstool -c $@ -9 scummvm.bin $(ARM7BIN) -b ../../$(LOGO) "$(shell basename $@);ScummVM @VERSION@;DS Port" + ndstool -c $@ -9 scummvm.bin $(ARM7BIN) -b ../../$(LOGO) "$(shell basename $@);ScummVM @VERSION@;DS Port" + dsbuild $@ -l ../ndsloader.bin + + padbin 16 $(basename $@).ds.gba + +#--------------------------------------------------------------------------------- +%.bin: %.elf + $(OBJCOPY) -S scummvm.elf scummvm-stripped.elf + $(OBJCOPY) -O binary scummvm-stripped.elf scummvm.bin + +#%.o: %.s +# $(MKDIR) $(*D)/$(DEPDIR) +# $(CXX) -Wp,-MMD,"$(*D)/$(DEPDIR)/$(*F).d",-MQ,"$@",-MP $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $*.o + diff --git a/backends/platform/symbian/res/scummvm.cer b/backends/platform/symbian/res/scummvm.cer new file mode 100644 index 0000000000..70b765e6b4 --- /dev/null +++ b/backends/platform/symbian/res/scummvm.cer @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDXTCCAxqgAwIBAgIBADALBgcqhkjOOAQDBQAwgZIxEDAOBgNVBAoTB1NjdW1t +Vk0xfjB8BgNVBAMTdVNjdW1tVk0gUzYwdjM3OThiOTk0MDg2OTFhZThlZWM2N2Zl +NGUxYmZjOTQ1YTI0YjRmYjZmMTlmMGJiNzE2N2FjYWEwYzBlNjc0OTM3MmEyY2Qw +YjNiMmY5MWRmMGQyNTQwZjdlYzc0YzllNzhhYWJlMzkwZTAeFw0wNzA2MTAxOTQ4 +NTJaFw0wODA2MDkxOTQ4NTJaMIGSMRAwDgYDVQQKEwdTY3VtbVZNMX4wfAYDVQQD +E3VTY3VtbVZNIFM2MHYzNzk4Yjk5NDA4NjkxYWU4ZWVjNjdmZTRlMWJmYzk0NWEy +NGI0ZmI2ZjE5ZjBiYjcxNjdhY2FhMGMwZTY3NDkzNzJhMmNkMGIzYjJmOTFkZjBk +MjU0MGY3ZWM3NGM5ZTc4YWFiZTM5MGUwggG3MIIBKwYHKoZIzjgEATCCAR4CgYEA +ydXBoDldKAiq3DmfGPwReY9qHEMEh4AyuK5N4M7PvCSYUWU6sWp9PQJ1DDXOm54o +k8IicM9/dmNdQVAGah2Oi5wizbaYV3HkFufLQOQdaOFg7uclJKp+4cnPsG8lz4DS +j6o9kRxANZ9vJgE7qxWG5HnEPNm/l0mDbyWbtbAT//sCFQDCZT2JjR+U+o2orfUL +tcojrwdLSQKBgGdx5eoIaGOxIXgP7ttNdL+7qOYMJD2wI93o5eRiLOaTme276pr3 +oYv3VVRZJa6UXD298b705ia/XQqO6KA9QJgPMjJnwD/8ydcZyZqmX6sNpv6dc7AN +y/6BJN6DO0xUc9BTkQr4cYBhfkc1mYTBzxOj7bi4aATBjcCXzDXXyT2bA4GFAAKB +gQCXsapLABnAVfz60pOQt+Kcl3x+/Rz+vXoItLg3O8cVjooi/q0uaaXF/AnO2njb +lLHbQX3zmv/+tvD2PSyFtgNgscyTf/EECqWMK94Lb0/Jw1rvdNO86eWzsW7UzArF +5KjJbUn64+PTSU8m7GTqGN4NFh6yFBk//Z2ljy+Zt0WZBDALBgcqhkjOOAQDBQAD +MAAwLQIUJUCWx57QyGsiPM5w5qvX3ZYF0/kCFQC47QWyrzi4dr2y2iDNWsln7La4 +Qw== +-----END CERTIFICATE----- diff --git a/backends/platform/symbian/res/scummvm.key b/backends/platform/symbian/res/scummvm.key new file mode 100644 index 0000000000..62e3d3858c --- /dev/null +++ b/backends/platform/symbian/res/scummvm.key @@ -0,0 +1,15 @@ +-----BEGIN DSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,AA4358B4EE40C19C + +OyPKZgptp6jQoGEckxKO4fHS9IL72F0rHduv4qguYHdKeyjREgWDN6+/QhI3SQWu +9bch/oyo/mhO6ZcLjOukBVaygYNw8VTnuEUITmPPrLo7Hcrs12y5jr6MCJ1XBho8 +K0eBwJpqEYFlRZcGqLhJVcPbREEZAOY522MsnT4V3Sa2yerK0AWMSXSTjWRPVxlo +RdqB7vdU/zp3FZvV1gXp+aAOb0WoUbZZYo5r4JnHS+6DGHJfWtXucz4VhcrYxLa8 +xNE3WvTvnIyudG1Yc4J5pl0fpS7wBHQHFtqv2ncRWhY49r9RNR6bfMLZULZj8mwo +QRYkUeaAkdEkTiYlVl/KQ1i3Hh1qupaQwxF/WqCtfbvLA6KlzYLllTnGwsRHujid +f97fGt1z8uWGtzDWQzKW3nY0I2psAA/bCYwL88G1aOPEyp4Ql1lkyxRm4Tw7Zu5M +pF09dAgkFVvPH5Bn7o05ZS9ruNhF5K/5QNg3WTVDhZEqkqiXWRGXaEhc6ZfoK/+H +ne1d3+QfKEX8rxAtjX1hVNkNG1ivmIExpa45wUmSE2pOIj31ny0gK1tCv4mdgEDL +elR3M/oAw0BdxBn9LqmDaQ== +-----END DSA PRIVATE KEY----- diff --git a/backends/platform/wince/README-WinCE.txt b/backends/platform/wince/README-WinCE.txt new file mode 100644 index 0000000000..856afd45ab --- /dev/null +++ b/backends/platform/wince/README-WinCE.txt @@ -0,0 +1,616 @@ +ScummVM Windows CE FAQ +Last updated: $Date: 2007-06-11 02:38:33 -0600 (Mon, 11 Jun 2007) $ +Release version: 0.10.0 +------------------------------------------------------------------------ + +New in this version +------------------- + +0.10.0: +Major improvements have taken place in this version, mostly for behind- +the-scenes stuff. First, we have migrated to GCC for building the Windows +CE port. This helped take care of some obscure compiler bugs which were +in there for quite a long time. It has also lead to efficient code +generation due to GCC's advanced capabilities and consequently increased +runtime speed. The second important change was the overhaul of the SDL +library port. The benefits from this are twofold: The real-time code paths +have been optimized, including contributed ARM assembly code for critical +functions. Further, the screen display and mouse/keyboard input code has +been partially rewritten to allow for increased compatibility across all +devices. +Due to the update of keyboard handling code, the keycodes have changed +slightly. Running this version of ScummVM will overwrite your key bindings +with the new defaults. See the section on how to play on Smartphones and +Pocket PCs below for the new default keybindings. + +------------------------------------------------------------------------ + +This document is intended to give common answers to specific ScummVM +issues on Windows CE, in 3 sections + * "General questions" : browse this section to get started and see + general issues + * "Game specific questions" : lists some common game specific issues + * "Support and links" : how to get support if you're still puzzled + +------------------------------------------------------------------------ +General questions +------------------------------------------------------------------------ + +Which devices are supported ? +----------------------------- + +Official build +-------------- + +The official build is based on the ARM architecture and should work with any +Pocket PC 2000, Pocket PC 2002, Pocket PC 2003, Pocket PC 2003 SE, Smartphone +2002, Smartphone 2003 or Windows Mobile based device. + +Support for old ARM architectures (Handheld PCs, Palm Size PCs) and other CPUs +(MIPS, SH3) is discontinued. Feel free to generate builds for these +architectures and contact us to include them on ScummVM website. + +Games supported +--------------- + +The Windows CE port of ScummVM supports all available game engines. + +ScummVM distinguishes devices based on two characteristics: Type and resolution. +Supported types of devices are Smartphones (usually no stylus) and Pocket PCs +(stylus). The supported resolutions are 176x220 (Smartphone), 240x240 (QVGA +square), 240x320 (QVGA), 320x240 (QVGA landscape), 480x640 (VGA). Devices with +resolutions larger than VGA should also be supported with automatic screen +centering. + +* Low resolution Smartphones (176x220) + +Support is only provided for all 320x200 or 320x240 games. The font can get +hard to read (you should prefer talkie games, or wear glasses :-P) +Games with 640x480 resolution such as COMI or BSWORD cannot be scaled down +to this resolution and still be playable. + +* QVGA square devices (240x240) + +Only 320x200 or 320x240 games are supported due to lack of downsampling scaler. + +* QVGA Pocket PCs or Smartphones (240x320 or 320x240) + +All games are playable in these devices. Landscape devices may not be able to +rotate the screen around. + +* VGA (640x480) or higher Pocket PCs + +All non VGA games should work properly on these devices. They can be resized +with different scalers. Moreover, VGA games will be displayed in true VGA mode. + +Partial / Discontinued support +------------------------------ + +Support for the following devices is not complete, not working properly or +discontinued because the device is now obsolete. Feel free to contribute and +improve the port for your favorite device, or use the last release built with +the previous port architecture (0.5.1) which was less resource hungry and +supported more exotic devices. + +* "Paletted" devices (non "true color") + +These devices will be supported through the GDI layer which will slow down the +games a lot. You can try to disable the music/sound effects to get a better +game experience. + +* "Mono" devices + +I don't even think anything will be displayed on these devices :) you can try +and report your success ... + +* MIPS/SH3 devices with QVGA resolution (240x320), "true color" + +Some devices may be a bit too slow, especially if direct screen access (GAPI) +is not supported on these devices. + +* ARM/MIPS/SH3 devices with VGA resolution (640x480) (Palm Size PC / Handheld + PC platform) + +True VGA games will probably be too slow to run properly on these devices even +if they can support them ... + +* ARM/MIPS/SH3 devices with desktop resolution (800x600) (Handheld PC platform) + +No, there will never be ANY scaler supporting 800x600 resolution, because +320x200 games CANNOT be resized to a 800x600 by a simple operation. + +And the device will probably be too slow to perform any kind of graphic +transform anyway :) + +How do I install ScummVM for Windows CE ? +----------------------------------------- + +Simple! Unpack the release package on your desktop pc, then copy all its contents +to a folder on your device. Typically, you should at least have scummvm.exe, +modern.ini and modern.zip in the same directory. Finally, upload your beloved games +and fire it up :-) + +Some devices (like Pocket PC 2000) require GAPI to be present. + +How do I install a game ? +------------------------- + +You'll at least need to copy all the data files from your game, in a +sub-directory of your game directory. + +You'll need to put the data files in a directory named after ScummVM game +name (see "Supported Games" section in ScummVM readme) for the games having +"generic" data files (.LFL files). Recent games can be put in any directory. + +You can compress the multimedia files (sound/video) as described in the +ScummVM readme. + +You can compress the audio tracks of Loom or Monkey Island 1 as described in +the ScummVM readme. If you are running these games on a slow device with Ogg +Vorbis compression, it's recommended to sample the files to 11 kHz (this sample +rate is not supported by other versions of ScummVM). + +If you need more details, you can check SirDave's mini-manual online available +at: http://forums.scummvm.org/viewtopic.php?t=936 +and at: http://www.pocketmatrix.com/forums/viewtopic.php?t=8606 + +How do I run a game ? +--------------------- + +If it's the first time you're running ScummVM for Windows CE, have installed or +removed games, you need to rescan your game directory. + * Select Add Game, tap the root directory of your games, and tap "Yes" to begin + an automatic scan of the installed games. + +Usually all games are detected and you can start playing right away. If your +game is not detected check its directory name and your data files. + +To play a game, tap on its name then tap the "Start" button or double tap its +name. + +How do I play a game on a Pocket PC or Handheld PC device ? +----------------------------------------------------------- + +The stylus is your mouse cursor, and a tap is a left mouse button click. + +As the Pocket PC lacks some keys, a toolbar is displayed at the bottom of the +screen to make the most common functions just a tap away + * The disk icon opens ScummVM options menu to save your game, or change your + current game settings (depends on the game) + * The movie icon skips a non interactive sequence, the current dialog or + behaves like the ESC key on a regular keyboard (depends on the game) + * The sound icon turns all sound effects and music off and on + * The key icon allow you to map a key action to a device button + * The monkey icon switches between portrait, landscape and inverse landscape + mode (depends on the display drivers) + +You can map additional actions on your device hardware buttons using the +"Options" / "Key" menu in the ScummVM options menu. To associate an action to +a key, tap the action, then the "Map" button and press the hardware key. +The following actions are available : + + * Pause : pause the game + * Save : open ScummVM option menu + * Quit : quit ScummVM (without saving, be careful when using it) + * Skip : skip a non interactive sequence, the current dialog or + behaves like the ESC key on a regular keyboard + * Hide : hide or display the toolbar + * Keyboard : hide or display the virtual keyboard + * Sound : turns all sound effects and music off and on + * Right click : acts as a right mouse button click + * Cursor : hide or display the mouse cursor + * Free look : go in or out of free-look mode. In this mode, you can tap + the screen to look for interesting locations without walking. + * Zoom up : magnify the upper part of the screen for 640x480 games + rendered on a QVGA device. + * Zoom down : magnify the lower part of the screen for 640x480 games + rendered on a QVGA device. + * Multi Function : this key performs a different function depending on the game + : Full Throttle -> win an action sequence (cheat) + : Fate of Atlantis -> sucker punch (cheat) + : Bargon -> F1 (start the game) + : All AGI games -> bring up the predictive input dialog + * Bind keys : map a key action to a device button + * Up,Down,Left : + Right, : emulate mouse/stylus behavior + Left Click : + +The default key bindings for Pocket PCs are (note that not all keys are mapped): + * Up, Down, Left, Right : (dpad) arrow keys + * Left Click : softkey A + +If you start a game when a Right click mapping is necessary, ScummVM will ask +you to map one of your hardware key to this action before playing. Just press +the key you want to map if you see this message. + +Notes: +- THE TOOLBAR CAN BE CYCLED BY DOUBLE TAPPING (SEE BELOW) +- YOU MUST HIDE THE TOOLBAR TO SCROLL THROUGH THE INVENTORY IN ZAK +- YOU MUST DISPLAY THE KEYBOARD TO FIGHT IN INDIANA JONES 3 +- YOU MUST MAP THE RIGHT CLICK ACTION TO PLAY SEVERAL GAMES + +How do I hide the toolbar ? +--------------------------- + +Note: THIS IS A VERY USEFUL AND SOMETIMES NECESSARY SHORTCUT + +Double tapping the stylus at the top of the screen will switch between a +visible toolbar panel, a virtual keyboard, and hiding panel. If any part of +the screen is obscured by the toolbar (like the load/save game dialogs) you can +use the invisible panel mode to get to it. For 320x200 games on QVGA Pocket +PCs, when the panel is hidden the game screen is resized to 320x240 (aspect +ratio correction) for better gaming experience. + +How do I play a game on a Smartphone device ? +--------------------------------------------- + +On non-stylus devices, the mouse cursor is emulated via a set of keys. +The cursor will move faster if you keep the key down. You can tweak this +behaviour in the configuration file described below. + +Here is +the list of available actions for Smartphones: + + * Up,Down,Left : + Right, : emulate mouse/stylus behavior + Left Click : + Right Click : + * Save : open ScummVM option menu + * Skip : skip a non interactive sequence, the current dialog or + behaves like the ESC key on a regular keyboard + * Zone : switch between the 3 different mouse zones + * Multi Function : this key performs a different function depending on the game + : Full Throttle -> win an action sequence (cheat) + : Fate of Atlantis -> sucker punch (cheat) + : Bargon -> F1 (start the game) + : All AGI games -> bring up the predictive input dialog + * Bind keys : map a key action to a device button + * Keyboard : hide or display the virtual keyboard + * Rotate : rotate the screen (also rotates dpad keys) + * Quit : quit ScummVM (without saving, be careful when using it) + +The "Zone" key is a *very* valuable addition allowing you to jump quickly +between three screen zones : the game zone, the verbs zone and the inventory +zone. When you switch to a zone the cursor will be reset to its former location +in this zone. + +The default key map for these actions is: + + * Up, Down, Left, Right : (dpad) arrow keys + * Left Click : softkey A + * Right Click : softkey B + * Save : call/talk + * Skip : back + * Zone : 9 + * Multi Function : 8 + * Bind keys : end call + * Keyboard : (dpad) enter + * Rotate : 5 + * Quit : 0 + +You can change the key mapping at any time by bringing up the key mapping menu +(Bind keys action). + +How do I tweak the configuration of ScummVM ? +--------------------------------------------- + +See the section regarding the configuration file (scummvm.ini) in ScummVM +README file - the same keywords apply. + +Some parameters are specific to this port : + +Game specific sections (f.e. [monkey2]) - performance options + + * high_sample_rate bool Desktop quality (22 kHz) sound output if set. + 11 kHz otherwise. The default is 11 kHz. + If you have a fast device, you can set this to + true to enjoy better sound effects and music. + * FM_high_quality bool Desktop quality FM synthesis if set. Lower + quality otherwise. The default is low quality. + You can change this if you have a fast device. + * sound_thread_priority int Set the priority of the sound thread (0, 1, 2). + Depending on the release, this is set to 1 + internally (above normal). If you get sound + stuttering try setting this to a higher value. + Set to 0 if your device is fast enough or if + you prefer better audio/video synchronization. + * Smush_force_redraw int Force a Smush frame redraw every X missed + frames. Mainly used for Full Throttle action + sequences. Setting it lower gives more + priority to screen redraws. Setting it higher + gives more priority to stylus/keyboard input. + The default is 30. + +Game specific sections (f.e. [monkey2]) - game options + + * landscape int 0: Portrait, 1: Landscape, 2: Inverse Landscape + You can also use this in the [scummvm] section + in QVGA Pocket PCs to display the launcher in + landscape, for example, at startup. + +[scummvm] section - keys definition + +You usually do not wish to modify these values directly, as they are set +by the option dialog, and are only given here for reference. + + * action_mapping_version int Mapping version linked to ScummVM version. + * action_mapping string Hex codes describing the key associated to + each different action. + * debuglevel int Debug Level 1 is used by the WinCE port + for reporting diagnostic output in the + scummvm_stdout.txt and scummvm.stderr.txt + files in the current working directory. + +[scummvm] section - mouse emulation tuning + +You can tweak these parameters to customize how the cursor is handled. + + * repeatTrigger int Number of milliseconds a key must be held to + consider being repeated. + * repeatX int Number of key repeat events before changing + horizontal cursor behaviour. + * stepX1 int Horizontal cursor offset value when the key is + not repeated. + * stepX2 int Horizontal cursor offset value when the key is + repeated less than repeatX. + * stepX3 int Horizontal cursor offset value when the key is + repeated more than repeatX. + * repeatY int Number of key repeat events before changing + vertical cursor behaviour. + * stepY1 int Vertical cursor offset value when the key is + not repeated. + * stepY2 int Horizontal cursor offset value when the key is + repeated less than repeatY. + * stepY3 int Vertical cursor offset value when the key is + repeated more than repeatY. + +------------------------------------------------------------------------ +Game specific questions +------------------------------------------------------------------------ + +--------------- +-- All Games -- +--------------- + +I need to press a special key +----------------------------- + +Bring up the virtual keyboard. On Smartphones take a look at the Keyboard action above. +On Pocket PCs it's easier to double-tap at the top of the screen. + +The panel is obscuring the playfield area +----------------------------------------- + +Double tap at the top of the screen to hide it. As an aside, the aspect ratio +correction scaler will kick in if the game/device combo is appropriate. + +How do I name my save games ? +----------------------------- + +Use the virtual keyboard (Keyboard action). + +ScummVM is stuck for some reason +-------------------------------- + +Bind and use the quit action to quit. + +I cannot rotate the screen to landscape/inverse landscape +--------------------------------------------------------- + +Depending on the video driver, ScummVM may opt to not provide such functionality. +In general, when ScummVM starts in normal "portrait" orientation, the device driver +reports better display characteristics and you should consider launching from portrait. + +I'm having problems. Is there diagnostic output available ? +----------------------------------------------------------- + +Insert a line in the [scummvm] section of scummvm.ini with the following: +debuglevel=1 +Run ScummVM. When it closes scummvm_stdout.txt and scummvm_stderr.txt files will be +available at the program directory (see section above). + +ScummVM crashes and returns to desktop +-------------------------------------- + +File a bug report including diagnostic output (see previous question). + +-------------------------- +-- Beneath a Steel Sky -- +-------------------------- + +Introduction movie is too slow or never ends ... +------------------------------------------------- + +Skip it :) + +How can I open the inventory in Beneath a Steel Sky ? +--------------------------------------------------- + +Tap the top of the screen. Check your stylus calibration if you still cannot +open it. + +How can I use an item in Beneath a Steel Sky ? +---------------------------------------------- + +You need to map the right click button (see the General Questions section). + +---------------------------- +-- Curse of Monkey Island -- +---------------------------- + +How can I open the inventory in Curse of Monkey Island ? +------------------------------------------------------ + +You need to map the right click button (see the General Questions section). + +I'm experiencing random crashes ... +------------------------------------ + +This game has high memory requirements, and may crash sometimes on low +memory devices. Continue your game with the latest automatically saved +game and everything should be fine. +You can consider removing the music and voice files (VOXDISK.BUN, MUSDISK.BUN) +to lower these requirements. + +Sound synchronization is lost in Curse of Monkey Island videos +-------------------------------------------------------------- + +Use a faster device :-( + +-------------------- +-- Full Throttle -- +-------------------- + +I'm experiencing random crashes ... +------------------------------------ + +This game has high memory requirements, and may crash sometimes on low +memory devices. Continue your game with the latest automatically saved +game and everything should be fine. +You can consider removing the voice file (MONSTER.SOU) and disable the +music to lower these requirements. + +---------------------------------------- +-- Indiana Jones and the Last Crusade -- +---------------------------------------- + +How can I fight in Indiana Jones and the Last Crusade ? +----------------------------------------------------- + +You need to map the keyboard button (see the General Questions section). + +--------------- +-- Sam & Max -- +--------------- + +How can I change the current action ? +------------------------------------- + +You need to map the right click button (see the General Questions section). + +How can I exit a mini game ? +---------------------------- + +Use the skip toolbar icon (see the General Questions section). + +------------------- +-- Simon 1 and 2 -- +------------------- + +How can I save or quit in Simon ? +-------------------------------- + +"Use" (use the use verb :p) the postcard. The ScummVM option dialog is disabled +in Simon games. + +On Smartphone, you'll need to push the Action button (center of the pad) to +quit the game. + +------------- +-- The Dig -- +------------- + +I'm experiencing random crashes ... +------------------------------------ + +This game has high memory requirements, and may crash sometimes on low +memory devices. Continue your game with the latest automatically saved +game and everything should be fine. +You can consider removing the music and voice files (VOXDISK.BUN, MUSDISK.BUN) +to lower these requirements. + +-------------------- +-- Zak Mc Kracken -- +-------------------- + +How can I scroll through my inventory items in Zak Mc Kracken ? +--------------------------------------------------------------- + +You need to map the hide toolbar button (see the General Questions section) or +double tap at the top of the screen (from 0.8.0+) + +------------------------ +-- Broken Sword 1 & 2 -- +------------------------ + +I've installed the movies pack but they are not playing/they are slow +--------------------------------------------------------------------- + +MPEG 2 playback takes too much memory in the current release, and may prevent +movies from playing in VGA mode. Consider changing to the DXA cutscene pack +which is many times faster. + +--------------- +-- Gobliiins -- +--------------- + +How do I enter a code ? +----------------------- + +Use the virtual keyboard. + +------------------- +-- Bargon Attack -- +------------------- + +How do I start the game (F1 : Game, F2 : Demo) +---------------------------------------------- + +Use the Multi Function action. + +---------------------- +-- AGI engine games -- +---------------------- + +Do you expect me to play these games on keyboard less devices ? +--------------------------------------------------------------- + +Sure we do :-) +If you want to get some mileage on your stylus you can use the virtual keyboard. +There is a very useful alternative though, the AGI engine's predictive input dialog. +It requires a dictionary to be present. Just tap on the command line or use the +Multi Function action to bring it up. On Smartphones, when the dialog is shown +all key mapping is disabled temporarily (including mouse emulation). Input is +performed either by pressing the phone's numeric keypad keys and dpad enter to +close the dialog, or by navigating the buttons using the dpad arrows and pressing +with dpad enter. Check the main Readme file for more information on this. + +------------------------------------------------------------------------ +Support +------------------------------------------------------------------------ + +Help, I've read everything and ... +----------------------------------- + +Luckily, as there is a huge variety of Windows CE devices, a specific forum +is dedicated to this ScummVM port. You can ask your question on the WinCE +ScummVM forum available at http://forums.scummvm.org/viewforum.php?f=6 + +Some older questions and very nice tutorials are still available on the historic +PocketMatrix forum at http://www.pocketmatrix.com/forums/viewforum.php?f=20 +where the community is always glad to help and have dealt with all the bugs for +many years now :) + +I think I found a bug, ScummVM crashes in ... +--------------------------------------------- + +See the "Reporting Bugs" section in ScummVM readme. + +If you have a Pocket PC or Handheld PC, be sure to include its resolution (obtained +on the second dialog displayed on the "About" menu) in your bug report. + +If you cannot reproduce this bug on another ScummVM version, you can cross +post your bug report on ScummVM forums. + +I want to compile my own ScummVM for Windows CE +----------------------------------------------- + +Take a look at: +http://wiki.scummvm.org/index.php/Compiling_ScummVM/Windows_CE + + +------------------------------------------------------------------------ +Good Luck and Happy Adventuring! +The ScummVM team. +http://www.scummvm.org/ +------------------------------------------------------------------------ diff --git a/common/keyboard.h b/common/keyboard.h new file mode 100644 index 0000000000..dfc47af1ce --- /dev/null +++ b/common/keyboard.h @@ -0,0 +1,266 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/common/keyboard.h $ + * $Id: keyboard.h 27654 2007-06-23 10:06:39Z fingolfin $ + * + */ + +#ifndef COMMON_KEYBOARD_H +#define COMMON_KEYBOARD_H + +#include "common/scummsys.h" + +namespace Common { + +enum KeyCode { + KEYCODE_INVALID = 0, + + KEYCODE_BACKSPACE = 8, + KEYCODE_TAB = 9, + KEYCODE_CLEAR = 12, + KEYCODE_RETURN = 13, + KEYCODE_PAUSE = 19, + KEYCODE_ESCAPE = 27, + KEYCODE_SPACE = 32, + KEYCODE_EXCLAIM = 33, + KEYCODE_QUOTEDBL = 34, + KEYCODE_HASH = 35, + KEYCODE_DOLLAR = 36, + KEYCODE_AMPERSAND = 38, + KEYCODE_QUOTE = 39, + KEYCODE_LEFTPAREN = 40, + KEYCODE_RIGHTPAREN = 41, + KEYCODE_ASTERISK = 42, + KEYCODE_PLUS = 43, + KEYCODE_COMMA = 44, + KEYCODE_MINUS = 45, + KEYCODE_PERIOD = 46, + KEYCODE_SLASH = 47, + KEYCODE_0 = 48, + KEYCODE_1 = 49, + KEYCODE_2 = 50, + KEYCODE_3 = 51, + KEYCODE_4 = 52, + KEYCODE_5 = 53, + KEYCODE_6 = 54, + KEYCODE_7 = 55, + KEYCODE_8 = 56, + KEYCODE_9 = 57, + KEYCODE_COLON = 58, + KEYCODE_SEMICOLON = 59, + KEYCODE_LESS = 60, + KEYCODE_EQUALS = 61, + KEYCODE_GREATER = 62, + KEYCODE_QUESTION = 63, + KEYCODE_AT = 64, + + KEYCODE_LEFTBRACKET = 91, + KEYCODE_BACKSLASH = 92, + KEYCODE_RIGHTBRACKET= 93, + KEYCODE_CARET = 94, + KEYCODE_UNDERSCORE = 95, + KEYCODE_BACKQUOTE = 96, + KEYCODE_a = 97, + KEYCODE_b = 98, + KEYCODE_c = 99, + KEYCODE_d = 100, + KEYCODE_e = 101, + KEYCODE_f = 102, + KEYCODE_g = 103, + KEYCODE_h = 104, + KEYCODE_i = 105, + KEYCODE_j = 106, + KEYCODE_k = 107, + KEYCODE_l = 108, + KEYCODE_m = 109, + KEYCODE_n = 110, + KEYCODE_o = 111, + KEYCODE_p = 112, + KEYCODE_q = 113, + KEYCODE_r = 114, + KEYCODE_s = 115, + KEYCODE_t = 116, + KEYCODE_u = 117, + KEYCODE_v = 118, + KEYCODE_w = 119, + KEYCODE_x = 120, + KEYCODE_y = 121, + KEYCODE_z = 122, + KEYCODE_DELETE = 127, + + // Numeric keypad + KEYCODE_KP0 = 256, + KEYCODE_KP1 = 257, + KEYCODE_KP2 = 258, + KEYCODE_KP3 = 259, + KEYCODE_KP4 = 260, + KEYCODE_KP5 = 261, + KEYCODE_KP6 = 262, + KEYCODE_KP7 = 263, + KEYCODE_KP8 = 264, + KEYCODE_KP9 = 265, + KEYCODE_KP_PERIOD = 266, + KEYCODE_KP_DIVIDE = 267, + KEYCODE_KP_MULTIPLY = 268, + KEYCODE_KP_MINUS = 269, + KEYCODE_KP_PLUS = 270, + KEYCODE_KP_ENTER = 271, + KEYCODE_KP_EQUALS = 272, + + // Arrows + Home/End pad + KEYCODE_UP = 273, + KEYCODE_DOWN = 274, + KEYCODE_RIGHT = 275, + KEYCODE_LEFT = 276, + KEYCODE_INSERT = 277, + KEYCODE_HOME = 278, + KEYCODE_END = 279, + KEYCODE_PAGEUP = 280, + KEYCODE_PAGEDOWN = 281, + + // Function keys + KEYCODE_F1 = 282, + KEYCODE_F2 = 283, + KEYCODE_F3 = 284, + KEYCODE_F4 = 285, + KEYCODE_F5 = 286, + KEYCODE_F6 = 287, + KEYCODE_F7 = 288, + KEYCODE_F8 = 289, + KEYCODE_F9 = 290, + KEYCODE_F10 = 291, + KEYCODE_F11 = 292, + KEYCODE_F12 = 293, + KEYCODE_F13 = 294, + KEYCODE_F14 = 295, + KEYCODE_F15 = 296, + + // Key state modifier keys + KEYCODE_NUMLOCK = 300, + KEYCODE_CAPSLOCK = 301, + KEYCODE_SCROLLOCK = 302, + KEYCODE_RSHIFT = 303, + KEYCODE_LSHIFT = 304, + KEYCODE_RCTRL = 305, + KEYCODE_LCTRL = 306, + KEYCODE_RALT = 307, + KEYCODE_LALT = 308, + KEYCODE_RMETA = 309, + KEYCODE_LMETA = 310, + KEYCODE_LSUPER = 311, // Left "Windows" key + KEYCODE_RSUPER = 312, // Right "Windows" key + KEYCODE_MODE = 313, // "Alt Gr" key + KEYCODE_COMPOSE = 314, // Multi-key compose key + + // Miscellaneous function keys + KEYCODE_HELP = 315, + KEYCODE_PRINT = 316, + KEYCODE_SYSREQ = 317, + KEYCODE_BREAK = 318, + KEYCODE_MENU = 319, + KEYCODE_POWER = 320, // Power Macintosh power key + KEYCODE_EURO = 321, // Some european keyboards + KEYCODE_UNDO = 322 // Atari keyboard has Undo +}; + +/** + * List of certan special and some fake 'ascii' values used in keyboard events. + * The values for the function keys listed here are based on what certain SCUMM + * games expect in their scripts. + * @todo Get rid of the function key values, and instead enforce that engines use + * the keycode value to handle these. + */ +enum { + ASCII_BACKSPACE = 8, + ASCII_TAB = 9, + ASCII_RETURN = 13, + ASCII_ESCAPE = 27, + ASCII_SPACE = 32, + + ASCII_F1 = 315, + ASCII_F2 = 316, + ASCII_F3 = 317, + ASCII_F4 = 318, + ASCII_F5 = 319, + ASCII_F6 = 320, + ASCII_F7 = 321, + ASCII_F8 = 322, + ASCII_F9 = 323, + ASCII_F10 = 324, + ASCII_F11 = 325, + ASCII_F12 = 326 +}; + +/** + * Keyboard modifier flags, used for Event::kbd::flags. + */ +enum { + KBD_CTRL = 1 << 0, + KBD_ALT = 1 << 1, + KBD_SHIFT = 1 << 2 +}; + +/** + * Keyboard status, as used in the Event struct. + */ +struct KeyState { + /** + * Abstract key code (will be the same for any given key regardless + * of modifiers being held at the same time. + * For example, this is the same for both 'A' and Shift-'A'. + * @todo Document which values are to be used for non-ASCII keys + * like F1-F10. For now, let's just say that our primary backend + * is the SDL one, and it uses the values SDL uses... so until + * we fix this, your best bet is to get a copy of SDL_keysym.h + * and look at that, if you want to find out a key code. + */ + KeyCode keycode; + + /** + * ASCII-value of the pressed key (if any). + * This depends on modifiers, i.e. pressing the 'A' key results in + * different values here depending on the status of shift, alt and + * caps lock. + */ + uint16 ascii; + + /** + * Status of the modifier keys. Bits are set in this for each + * pressed modifier + * @see KBD_CTRL, KBD_ALT, KBD_SHIFT + */ + byte flags; + + KeyState(KeyCode kc = KEYCODE_INVALID, uint16 asc = 0, byte f = 0) { + keycode = kc; + ascii = asc ? asc : (uint16)kc; + flags = f; + } + + void reset() { + keycode = KEYCODE_INVALID; + ascii = flags = 0; + } +}; + +} // End of namespace Common + +#endif diff --git a/dists/pred.dic b/dists/pred.dic new file mode 100644 index 0000000000..131aeff9ef --- /dev/null +++ b/dists/pred.dic @@ -0,0 +1,7986 @@ +222 cab +2222243 cabbage +222243 cabbie +222253 babble +22229 cabby +2223 babe +2223537283 accelerate +22237 babes +222377 access +222378 accept +22243368 accident +2224336825 accidental +22246 cabin +2224638 cabinet +22246387 cabinets +222467 cabins +2225 back +2225224 backbag +22253 cable +22253667 backdoor +222537 cables +22257433 backside +22257666 backroom +222578243 backstage +222587 backup +2225877 backups +2226366 abandon +222636633 abandoned +222652337 accolades +22266 bacon +222665 acamol +222673466 accordion +222674669 cacophony +222678 accost +2226868 account +2226868268 accountant +22283742 bacteria +22284 cacti +222844 cactii +2228685283 accumulate +222887 cactus +2229 baby +22293655 babydoll +22297 babys +223 abe bad cad +2232837 cadaver +22328377 cadavers +2233 cafe +22333463 caffeine +223343 caddie +223383742 cafeteria +22343 badge +2234522 cadilac +22345522 cadillac +223666 badoom +2238 abet +223828466 abduction +22382867 abductor +223828677 abductors +224 bag cag +2243 acid cage +22433 caged +2243676547 acidopolis +22437 cages +2243837 acheter +2244243 baggage +224433 bagged +224443 baggie +2245 bail +2245489 ability +2245568 caillou +22455689 cailloux +22467 bains +2247 bags +2247473 bagpipe +224773 caisse +2247737 caisses +2248 bait +22483 bague +224833 baited +2248546 caitlin +2248596 caitlyn +2252623 balance +2252669 balcony +2252852867 calculator +2253 bake cake calf able +22536327 calendar +22536337 calender +22537 baker cakes +225379 bakery +2254226 caliban +22543 calif +2254367642 california +2255 ball call +2255268463 ballantine +2255464 calling +22557 balls calls +225576468 ballpoint +2256 calm +225837 calves +2258787233 balustrade +226 can +22624 bambi +22625 canal +226262 banana +2262627 bananas +226279 canary +2263 band cane +2263262 bandana +22632662 bandanna +22633 abode +2263352272 candelabra +2263423 candice +226348 bandit +2263487 bandits +22635 camel +226353 candle +2263532272 candleabra +226353465337 candleholder +2263534653377 candleholders +2263537 candles +22635378425 candlestick +226372 camera +2263727 cameras +22639 candy +2264 bang +226463 canine +22647837 banister canister +226478377 banisters canisters +2265 bank +226537 banker +22656683 banknote +226637 banner +2266377 banners +2266462253 abominable +226666 cannon +2266667 cannons +226679 canopy +2267 camp cans +22673473 campfire +22676 acorn +226767 acorns +22678 abort +226787 campus +226827 canvas +22683 above +2268336 canteen +226837 banter +22687842 acoustic +22688 about +226966 canyon +2269667 canyons +227 bar bas cap car +22722227 barabbas +22722232272 abracadabra +2272233 cascade +22722337 cascades +2272277 carcass +227227737 carcasses +227233 barbed +22723738867 carberettor +22724247 barchair +227242477 barchairs +2272426 abraham +22724267 abrahams +22727466 abrasion +2272826 caravan +2272873867 carburetor +22728738867 carburettor +2273 barf base cape card care case +22732255 baseball +22734625 cardinal +22736368 basement +22736574 bardolph +22737 cards cases +22737568 cardslot +227377 caress +227382537 caretaker +2274 bash cash +2274224 cashbag +2274246 bargain +22743 barge +2274347 casheir +2274437 cashier +22746 basin cargo +227464 casing +2274652 cashola +227466 casino +2274662842 cashomatic +2275 bark cask +2275337 barkeep +227533737 barkeeper +227538 basket casket +2275382255 basketball +2275387 baskets +227539 barley +227546 carlin +227567 carlos +22756884 carlotti +22757 casks +2275866 carlton +22758667 carltons +2276 barn +2276243 barmaid carnage +227625 carnal +227626 barman +227636 barmen +227648673 carnivore +2276486737 carnivores +22765 carol +227657 carols +22766 baron +227677 across +22769637 barowner +2277 bars bass cars +227735 barrel +2277355 barrell +2277357 barrels +227738 carpet +2277387 carpets +227742233 barricade +22774243 carriage +2277437 barrier carrier +22774373 barriere +22774377 barriers +2277678 carport +227768 carrot +2277687 carrots +2277853 capsule +22778537 capsules +22778665 barstool +227786657 barstools +22779 carry +2278 bart cart cast +2278246 captain +22782467 captains +2278273 bastard +22783 carte carve +227836337 bartender +227837 carter +2278464 carving +22784647 carvings +2278473 acquire +227847625 baptismal +2278478 baptist +227853 castle +2278537 castles +2278626 bartman +227866 carton +227867 captor +22787 carts +227874343 cartridge +2278743437 cartridges +2278873 capture +22797325 carwreck +228 act bat cat +228226627 catacombs +22824 catch +2282437 catcher +22824464 catching +2283 cave +228346 cavein +2283626 caveman +2283636 cavemen +22837 bates caves +228376 cavern +2284 bath +22843 bathe +228433725 cathedral +228466 action +22847 baths +22847666 bathroom +22848283 activate +228482867 activator +22848437 cavities +2284882 bathtub +228489 cavity +22853766 cauldron +228548837 catlitter +228626 batman +228627 catnap +228646466 batminion +22866 baton +228662453 batmobile +228667 batons +2287 bats cats +22873 abuse cause +228737 causer +228768733 abtsotree +2287842 acustic +22882457 cattails +2288283 actuate +22882867 actuator +228837437 batteries +2288379 battery +228853 battle cattle +2289255 catwalk +229 bay +2293667 baydoor +22936677 baydoors +2296638 bayonet +2297 bays +22977 abyss +23 cd be +23224 beach +232266 beacon +2322873 because +23237 beads +23242 adaga +23245 cecil +2325 beck +232537 beaker +2325377 beakers +23259 becky +2326 adam beam bean +232637 beamer +232663 become +23267 adams beams beans +232678255 beanstalk +2327 bear +23273 beard cease +232737 beards +2327464 bearing +23277 bears +23277546 bearskin +23278 beast +23278626 beastman +232787 beasts +2328 beat +232837 beaver +2328377 beavers +232884385 beautiful +232887 beatup +233 add bed bee +2332426237 bedchamber +233273 befare +2333 beef +23337263 bedframe +2334243 affiche +23347628483 affirmative +23348466 addition +23349 affix +2336 been +23366 addon +233667 addons +233673 before +2337 beds beep beer bees +23372273 beercase +233722737 beercases +2337377 address +233742 cedric +2337433 bedside +2337464 beeping +23376224463 beermachine +2337666 bedroom +23377 beeps +233777323 bedspread +233846836 beethoven +233853 beetle +234 beg +234284687 behaviour +234323 behead +23436684 behemoth +234366847 behemoths +23437483 adhesive +234427 beggar +2344277 beggars +234437 begger +2344377 beggers +23446 begin +234463 behind +2345464 ceiling +23454647 ceilings +23464 being +234647 beings +234653 behold +234663 begone +2349 afix +235 ael cel +23522368 adjacent +235327283 celebrate +235378425 celestial +235433 belief +235436 aelien +2355 bell cell +235527 cellar +23557 cells +235574663 cellphone +23558527 cellular +23559 belly +2356644647 belongings +23568 belov +23569 below +2358 belt +23587 belts +235878 adjust +2358786368 adjustment +236 bem ben +23624 bench +2362437 benches +236247 benchs +2363 bend +2363284 beneath +236368 cement +23638279 cemetary +23638379 cemetery +2364647837 administer +23646478728483 administrative +23648 admit +23652646 benjamin +23653 adolf +2365372368 adolescent +23664 benni +23668274 cenotaph +23669 benny +236697 bennys +2367 bems +23673 adore +236746 bensin +23676 adorn +236766 benson +2368 bent cent +236837 center +2368373653 centerfold +2368725 central +236873 centre +2368786 centrum +2368873 centure +237 cds +237225 cdrack +23723787 cerberus +2372642 ceramic +237325 cereal +2373257 cereals +237433 beside +23745263 bergland +2376 afro +23762736 bernardo +23764726 aerogram +237675263 aeroplane +237743 berrie +2377437 berries +23779 berry +2378246 certain +2378328 cerveau +23783553 cervelle +23784 berth +2378423 cervice +23784279 bestiary +23784342283 certificate +237843422837 certificates +237869 bestow +238 bet +238242 betcha +2382437 betcher +2382629 betamax +238368873 adventure +23837 after +23837243 beverage +2383759 beverly +238376666 afternoon +2383774283 aftershave +238378473 advertise +2383784736368 advertisement +23837847363687 advertisements +23837847464 advertising +238378476368 advertisment +2383784936368 advertizement +238423 advice +2389336 between +2423 chad +2424 bich +24246 again chain +242467 chains +24246729 chainsaw +2424678 against +24247 chair +242473 chaise +2424737 chaises +242477 chairs +24253 bible +242538 chalet +2425423 chalice +24255 chalk +2425525683 chalkcloud +2425526273 chalkboard +242623 chance +2426237 chamber +2426273 chambre +2426335437 chandelier +242643 change +2426433 changed +24264464 changing +2426625 channal +2426635 channel +24266357 channels +242672463 champagne +24268 chant +2427 chap char +242722837 character +24272625 charcoal +242727645 charbroil +24273 chase +242735 chapel +242743 charge +2427433 charged +2427437 charger +24274464 charging +2427468 chariot +24275363 charlene +2427537 charles +24275377 charless +2427539 charley +24276 charm chasm +242766 charon +242767 chasms +24277 chaps +24278 chart +2427837 charter +242787 charts +2428 chat +24287738837 chaussettes +242883 chauve +2428837 chatter +2429253 bicycle +24292537 bicycles +243 aid +24323 ahead +24325 check +2432576468 checkpoint +24327 cheap +24328 cheat +243287 cheats +2433 biff chef +243357 cheeks +24337 cheer chefs +243373 cheese +243373253874437 cheesebleurgher +243373287437 cheeseburger +24337532337 cheerleader +243375323377 cheerleaders +2435464 cieling +243546464 cielining +24364225 chemical +243642257 chemicals +24366 bidon +24368 agent +24373 biere +24377 chess +24377437 cherries +2437774323 chesspiece +243779 cherry +2437792662 cherrybomb +24377926627 cherrybombs +24378 chest +243787 chests +243795 cheryl +2439 chew +243933 chewed +2439464 chewing +244 agi big cig +244236 chicen +24425 chick +2442536 chicken +2442536534 chickenleg +24425367 chickens +244257 chicks +244268866 bigbottom +24427 cigar +24427324 bigbrech +244273883 cigarette +2442738837 cigarettes +244277 cigars +24433 chief +24436 chien +2444263 agigame +244437 bigger +244443 ciggie +2444437 ciggies +24449 ciggy +244497 ciggys +24453 child +244536 chiken +244537367 childrens +24455 chill +244554 chilli +2445546 chillin +2446 chin +24462 china +24463 chime +2446369 chimeny +2446373 chinese +24465 chink +2446639 chimney +24468 chiot +2447 chip cigs +244735 chisel +24476865 chipmunk +24477 chips +2448 chit +24482428 chitchat +2453 bike +24537 biker bikes +24537225 bikerack +245464 biking bikini +2455 bill +245526273 billboard +2455273 billard +24552737 billards +24553653 billfold +245542737 billiards +2455427382253 billiardtable +24557 bills +24559 billy +24568 bijou +246 aim bin +24626 bimbo +246265283 chocolate +246265283777323 chocolatespread +2463 bind +246337 cinder +2463464 binding +24634647 bindings +246362 cinema +24637 binds +24639 cindy +246423 choice +24658646372368 bioluminescent +246628527 binocular +2466285277 binoculars +24667 chomp +246673 choose +24667377 chompers +2467 bins chop +24673 chore +24677 chops +2467737 chopper +24677377 choppers +2469 chow +247 air +24724 birch +247253 circle +2472667737767 aircompressor +24727238 aircraft +2472848 circuit +247288426273 circutiboard +2473 bird +24732243 birdcage +24733333 birdfeed +247336368 agreement +247345837 airfilter +24736378 birdnest +24737 birds +24737333 birdseed +247373337 birdseeds +247376378 birdsnest +24739 birdy +2474 biri +24747 chris +247477 chriss +2474779 chrissy +247478 christ +24747867437 christopher +247478674377 christophers +24753 aisle +2475625 airlock +2476 biro +2476275 airmask +24775263 airplane +2477678 airport +2477867 airpump +2478265 airtank +2478376 cistern +24784 birth +24784329 birthday +248 bit +248229 chubby +24825 chuck +2482553 chuckle +248259 chucky +24828466 citation +2483 ague bite +24837 bites +2484 chug +2484946 citizin +24865 chunk +2487 bits +248724 church +24876 churn +248787 citrus +24883 chute +248837 bitter +2489 city +2492773 bizarre +2493 agwe +252 bla +2522 blab +25225 black +2522526273 blackboard +25225464 blacking +252255225 blackjack +2522576484 blacksmith +2522867 albator +25228767 albatros +25233 blade +2523337 bladder +25242 alaga +252466 albino +25252926 alakazam +2526 clam +2526237 clamber +2526437 clanger +2526465 alcohol +252646542 alcoholic +25265 blank +2526538 blanket +25265387 blankets +25267 clams +252674355 clamshell +252683 alcove +2527 clap +2527463 clarine +25274772 clarissa +252747727 clarissas +25275 clark +25276 alarm +25277 class +252776283 classmate +2527762837 classmates +252777666 classroom +25278 blast +2527837 blaster +25278377 blasters +2528342 claudia +25283427 claudias +2528437 clavier +25286 album +25287 claus +2528837 clatter +25289 blatz +2529 ajax claw clay +25293 blaze +25297 claws +2529768 claypot +253 ale cle +253224 bleach +25325 ckeck +25326 clean +2532633 cleaned +25326464 cleaning +2532673 cleanse +25327 clear +253272623 clearance +25327464 clearing +2532792837 clearwater +253283 cleave +2532837 cleaver +2533 clef +25338 cleft +25363 blend +2536337 blender +2537424 aldrich +253749626 clergyman +25375 clerk +25377 bless +253874437 bleurgher +2538744377 bleurghers +253926337 alexander +2539263377 alexanders +2539263768 alexandrov +254 ali +2542 alga +25423 algae +2542537 clicker +25427464 aliasing +25432 algea +25433 cliff +254337 cliffs +25436 alien +254367 aliens +25442867 aligator +254448 alight +25462 climb +25462464 climbing +25463 blind +254637 blinds +25465464 blinking +2547 clip +254726273 clipboard +25477 bliss clips +2547737 clipper +25477377 clippers +25477464 clipping +254774647 clippings +2548 clit +25486747 clitoris +25487378 algusest +255 all +25524 allah +25536 allen +25539 alley +255442867 alligator +2554428677 alligators +2556728787 allosaurus +2557 alls +25574448 allright +2559 ally +2562237 clobber +25622437 blobbies +256229 blobby +25625 block cloak clock +256257 blocks +2563 clod +256376 bjoern +2563767 bjoerns +25653 bloke +256537 blokes +25663 blond blood clone +256633 blonde +256637 cloner clones +25663782467 bloodstains +256639 bloody +25664 along +2566464 cloning +2566646 bloomin +25666464 blooming +256678 almost +2566927 bloozar +25673 close +2567359 closely +256738 closet +2567387 closets +2567766 blossom +25677667 blossoms +2568 blot +25683 cloud +256835263 cloudland +256837 clouds clover +25684 cloth +256843 clothe +2568437 clothes +256843737937 clothesdryer +25684375463 clothesline +25684437 clothier +25684464 clothing +25687 blots +256873 blouse +2568837 blotter +2569 blow +25693474 blowfish +2569562 blowjob +25696 clown +256962568437 clownclothes +25696688348 clownoutfit +256967848 clownsuit +25697 blows +256987 bloxur +2573239 already +25742238 alphabet +25742723 alphapad +2574448 alright +2582 club +25825 cluck +25827 altar +2583 blue +258323779 blueberry +25833 bluff +2583332 alteeda +25833327 alteedas +258337 bluffs +25834366 bludgeon +2583529 bluejay +25837 alter blues +258463837 altimeter +25868 blunt +25874 blush +25949 clxix +26 am an cm +262 boa bob cob +2622 coca +26224 coach +262246 cocain +2622463 cocaine +26225378663 cobblestone +262253786637 cobblestones +26229 bobby +26235436 coaelhen +26237 amber +262377 ambers +2624368 ancient +262467 anchor +2625 anal coal +26252866 cockatoo +262528667 cockatoos +26254653 coalhold +2625748 cockpit +262576224 cockroach +26258245 cocktail +2625973 analyse +2625993 analyze +2626 coco +2626688 coconut +26266887 coconuts +2626887 cocnuts +2627 boar bobs +26272 cobra +26273 board +262737 boards +262739255 boardwalk +26277 amass +26278 coast +2628 boat coat +2628426437 coathanger +2628465337 coatholder +262852623 ambulance +26285283 ambulate +2628626 boatman +26287 boats coats +2628762538 coatpocket +26287625387 coatpockets +262932 cobweb +2629327 cobwebs +2629464 amazing +263 and +2633 code +26332273 codecard +263333 coffee +263346 coffin +263353 coddle +263373 coffre +263437 bodies +2637233 andrade +263739 andrew +2637397 andrews +26374226 american +2637643 android +26384978 amethyst +2639 andy body +26392845337 bodybuilder +26397 bodys +264 ani bog +26435 angel +2643537 angeles +26443 angie +2645 boil coil +26453 angle +264537 boiler +2645464 boiling +26457 coils +2646 coin +264622 cognac +264625 animal +2646257 animals +264628466 animation +264637 cogner +26467 coins +26467388767568 coinreturnslot +26467568 coinslot +26479 angry +26483 boite +264837 boites +2649 coiw +265 bol +2652 boka cola +265232 colada +26527 colas +26527465 colargol +26529 colby +2653 coke cold +26537 cokes +2653767426 coldsorian +265527 collar +26553 ankle colle +2655328 collect +265532822537 collectables +2655328466 collection +2655328677 collectors +2655343 college +265537 ankles +2655467 collins +2656463 cologne +265662 coloma +26567 color +2656733 colored +26567385 colorful +265677 colors +265687 colour +2658 bolt +265866 column +2658667 columns +26587 bolts +266 ann boo com coo +2662 anna bomb boob comb +266228 combat +2662325 conceal +266232533 concealed +26624 conch +2662437 boobies +26624628466 combination +2662463 combine +26625 cnock +26626 combo +26627 bombs bonar boobs +26627383 concrete +2663 anne bond bone come cone +26632285283 confabulate +26633426 comedian +266337 confer +2663377 confess +2663448728466 configuration +266344873 configure +2663463 confine +2663473 bonfire +266348466 condition +266366 condom +2663667 condoms +266367 condor +2663678 comfort +266367837 comforter +26637 bonds bones +266382867 conductor +2663848 conduit +26638487 conduits +26639 comfy +2664 bong +26642 booga comic +266427 comics +266439 boogey +2664425283 annihalate +266443 boogie +2664437 boogier +2664445283 annihilate +266473428466 congregation +2665 bonk book cook cool +26652273 bookcase +266522737 bookcases +26652665 cookbook +266526657 cookbooks +266533 cooked +266537 cooker cooler +2665374663 cookerhood +2665379 cookery +266537988367457 cookeryutensils +266543 cookie +2665437 cookies +2665464 booking cooking cooling +2665464475263 cookingisland +266546462837425 cookingmaterial +266546472643 cookingrange +266546478683 cookingstove +266546488367457 cookingutensils +2665465 comlink +26657 books +26657243 bookpage +26657353 bookself +266574353 bookshelf +26657435837 bookshelves +26657666 bookroom +2666 ammo boom +26662559 anomally +2666259 anomaly +2666263 command +26662636368 commandment +266626363687 commandments +2666269 boombox +2666328 connect +2666328466 connection +2666372425 commercial +266638 bonnet +26664 among +266648 commit +266648833 committee +2666633 commode +266666 common +266686236368 announcement +2666862363687 announcements +26668642283 communicate +266686422867 communicator +266686489 community +26669464 annoying +2667 comp coop +2667228 compact +266722867 compactor +266724 bonsai +266724687 conscious +2667248733 bonsaitree +2667269 company +2667274766 comparison +2667277 compass +26672786368 compartment +266727863687 compartments +26673 coord +2667345 conseil +26673457 conseils +26673462837 coordinates +266737 coords +26673848466 competition +26674 boorh +26674337 consider +266752468 complaint +26675383 complete +2667539 complex +266765 consol +2667653 console +26676537 consoles +2667657 consols +2667678 compost +26676863 compound +26677 coors +2667737767 compressor +26678 boost +2667837 booster +2667858 consult +266785828466 consultation +2667863 compund consume +26678637 consumer +26678742867 constrictor +266787828 construct +266787828466 construction +2667878284667 constructions +26678837 computer +266788374263 computergame +266788377 computers +266788637 constumes +2668 boot +2668228 contact +266824637 container +2668246377 containers +2668363373 contendere +26683643623 convenience +26683662 anntenna +26683675283 contemplate +2668367528464 contemplating +26683687 contents +2668377283 conversate +266837728466 conversation +26683773 converse +2668378 contest +2668378377 converters +266837867 convertor +26683787 contests +26683937 conveyer +266839372358 conveyerbelt +26683967 conveyor +26684 booth +2668428 convict +2668437 another +26684683 continue +266847 booths +2668648466 ammunition +266868 amount +26687 boots +2668722378483 contraceptive +26687278466 contraption +2668742883 contribute +26687482623 contrivance +2668765 control +26687653 controle +266876537 controles +2668765474 bootpolish +2668765537 controller +26687655377 controllers +26687657 controls +26687657666 controlroom +26689 booty +26693 booze +267 amp cms cop +2672 corb +26725 coral +267263453 corcodile +26729 corby +2673 bore cord core +267335 bordel +2673355 bordell +26733556 bordello +267337 border +26737 cords +2674 borg +267437 copier copies +2675 cork +267526273 corkboard +267543437 amplifier +2676 corn +2676262 corncob +267634353 cornfield +2676352537 cornflakes +267637 corner +26766 bosom +267662 corona +2676637 coroner +267666288 cosmonaut +267667 bosoms cosmos +2677 boss cops corr +267725 corral +267737 copper +26774367 corridor +267743677 corridors +267766 bossom +2677667 bossoms +267767487 corrosius +267769 borrow +267773 corpse +2677737 corpses +267837 copter +26783883 corvette +26785283 copulate +2678863 costume +26788637 costumes +2679 copy +267937 answer copyer +267937464 answering +2679628 copymat +268 ant bot cnu cot +26824 couch +2682437 couches +26827326 antarean +2683 ante cove +26832426237 antechamber +2683276 antfarm +26836268 covenant +2683632 antenea +2683662 antenna +26837 cover +2683733 covered +26837464 covering +268377 covers +2684 both +268436 anthem +268437 bouger +26844 cough +268447 boughs +26845 anvil +2684669 anthony +2684783 antique +26847837 antiques +26853 could +2685337 boulder +26853377 boulders +268537 antler +2685377 antlers +268538 amulet +268623 bounce +2686237 bouncer +26863 bound +26863279 boundary +26868 count +26868362623 countenance +268683696 countdown +2686837 counter +268683722852 countdracula +26868373348 counterfeit +26868377278 counterpart +268683772787 counterparts +2686837867 countertop +2686879 country +268689 bounty +2687 ants anus cots +2687266 bourbon +26872687 couscous +268736368 amusement +268753 couple +2687538 couplet +268754647 couplings +268766 coupon +2687667 coupons +268773 course +268774766 antprison +26878 court +2687838 bouquet +2687846873 courthouse +268787666 courtroom +268789273 courtyard +2688243 cottage +268853 bottle +2688537 bottles +268853762538 bottlerocket +2688537625387 bottlerockets +268866 bottom bouton cotton +2688667 boutons +2688667433 bottomside +268887437 couturier +2689 antz +269 any bow box boy cow +269273 coward +26935 bowel +26937 boxer boxes +269374363 boyfriend +2693743637 boyfriends +2693774678 boxershort +2695 bowl +26957 bowls +269626 bowman +2696632666 bozoofamoo +26969 a6969 +2697 boxs boys cows +269929 anyway +2699297 anyways +26996 bozzo +2699673 anyword +27 as +272 ara bra +2722 crab +27223 brace +272232 arcada +272233 arcade +27223538 bracelet +27224643 arachnid +27225 crack +2722533 cracked +2722538 bracket +272257 cracks +272353 cradle +272363 ascend +272368 ascent +27238 craft +2724 arch brag crag +272437 arches +2724432687 archidamus +2724483 archive +27244837 archives +27246 brain +272467 brains +27247 archs +2724929 archway +27253 brake +272537 brakes +272624 branch +2726243 branche +27262437 branches +2726247 branchs +27262537 brambles +272626 braman +27263 brand crane +27263464 branding +272639 brandy +2726486 cranium +27265 crank +272657 cranks +2727 arcs bras crap +27273 arbre +272737 arbres +27274 crash +2727433 crashed +2727437 brasier +27277 brass +272774373 brassiere +272779 crappy +27278 apart +272786368 apartment +2727863687 apartments +27283 crate +272837 crater crates +27289778 bratwrst +272898778 bratwurst +27293673 crawford +2729437 brazier +27295 crawl +27295464 crawling +272966 crayon +27299 crazy +273 ape are +2732 area +273224 breach +27323 bread +27324 brech +27325 break +2732532623 breakdance +273253278 breakfast +273257 breaks +27326 cream +27327 areas +273278 breast +2732787 breasts +27327875283 breastplate +273283 create +273284 breath +2732843 breathe +27328437 breather +273284464 breathing +27328477729 breathspray +2732867 creator +27328873 creature +273288737 creatures +27333 breed +273337 breeds +273348 credit +2733487 credits +27335 creek +27337 creep +2733737 creeper +27337377 creepers +273379 creepy +273393 breeze +27362 arena +273624 brench +27362437 brenches +27363 creme +27368 brent +2737 apes +27377537 bressler +27378873 aperture +27382773 crevasse +2738423 crevice +27384237 crevices +2738473 crevise +2739 brew crew +2739626 crewman +2739636 crewmen +2739737766 crewperson +2739759 brewsky +274 ash +2742 crib +274226 ashcan +2742267 ashcans +27423 bribe +27425 brick +27425626 brickman +274257 bricks +274259675 brickwork +274277 briars +274325 bridal +27433 bride +274332273 briefcase +27433464 briefing +274343 bridge +2743437 bridges +27435 ariel +274353 bridle +27437 ashes cries +2744 brig +274448 bright +27444859 brightly +27463 crime +27464 bring +27464625 criminal +274646257 criminals +274678663 brimstone +2747453 ashpile +27476347422 aphrodisiac +2747753 cripple +2747825 cristal +27478257 cristals +274786853 aristotle +27483 argue +27486368 argument +2748729 ashtray +2748837 critter +27488377 critters +275 ark ask +27522688 askabout +27523 asjad +276 arm bro +2762 croc +2762263 armband +27623 broad +27623929 broadway +27624247 armchair +27624873 brochure +276248737 brochures +276263453 crocodile +2762634537 crocodiles +27626368 armament +27627 crocs +27645 broil +276536 broken +276556 apollo +276564437 apologies +276564473 apologise +276564493 apologize +2766 ason +276624 brooch +27663 crone +276637 cromer crones +2766377 cromers +276647 armoir +2766473 armoire +27665 brook crook +27665596 brooklyn +276657 crooks +27666 broom +2766678425 broomstick +27667 armor +276687 armour +2766879 armoury +2767 arms crop +27677 crops cross +2767737 crosses +276779255 crosswalk +276824 crouch +27684 broth +2768435 brothel +2768437 brother +27684377 brothers +276863 around +2769 army crow +27691227 crow_bar +2769227 crowbar +27692277 crowbars +27693 crowd +27696 brown crown +276963 browne +27696464 browning +27697 crows +276973 browse +276976378 crowsnest +277245 assail +2772643 arrange +277272887 apparatus +2772735 apparel +2772748466 apparition +27727746283 assassinate +2772858 assault +2773625 arsenal +27736253 assemble +27736259 assembly +277363243 appendage +2773632437 appendages +27737668 arseroot +277378 arrest +2773849464 appetizing +2774258 asphalt +27742858 asphault +2774466368 assignment +277478 assist +2774782623 assistance +277478268 assistant +2775283 applaud +27753 apple +277537 apples +27754228466 application +277542623 appliance +2775426237 appliances +27759 apply +2776468 appoint +27764686368 appointment +27766 apron +277667 aprons +27769 arrow +277697 arrows +277734363 apprehend +27776224 approach +27776825 approval +2778937 appuyer +278 art cpu cru +27823 bruce +27824349 crucifix +27824349466 crucifixion +2782627463 aquamarine +27827486 aquarium +2783 aque +278336336747 artedmedoris +27833828 aqueduct +27835 cruel +27836336747 artemedoris +27836436747 artemidoris +27837643 asteroid +278376437 asteroids +27842537 articles +2784285283 articulate +27843228 artifact +2784342425 artificial +27846 bruin +278462842 asthmatic +27846436747 artimidoris +2784645426 aquinilian +27846454267 aquinilians +278473 aquire cruise +2784737 cruiser +278487 arthur +27853 crule +27862 crumb +278624 crunch +278624437 crunchies +2786249 crunchy +2786253 crumble +278627 crumbs +2787 arts +278725 astral +27874 brush crush +2787437 crusher +278749663 brushwood +27876 astro +278766288 astronaut +278768873 astroturf +278825493 brutalize +2789675 artwork +27896757 artworks +279 cry +279464 crying +27978 crypt +2797825 crystal +27978257 crystals +279787 crypts +28 at +28222 bubba +282253 bubble +2822537 bubbles +28229 cubby +282294653 cubbyhole +2822946537 cubbyholes +2823 cube +2824253 cubicle +28249 cubix +2825 buck +282529643 buckazoid +2825296437 buckazoids +282538 bucket +282553 buckle +2825667 cuckoos +282566725625 cuckoosclock +28257 bucks +282827 avatar +283 bud cue +2833 buff cuff +2833256 buffalo +283333 cuffed +28334478 buddhist +283353 cuddle +28337 cuffs +28339 buddy +28343 budge +283435 cudgel +28343623 audience +2834867486 auditorium +283683 avenue +2837 cues +283934737 budweiser +284 bug +28453 build +2845337 builder +28453464 building +284534647 buildings +28453842 athletic +2847 bugs +2847463 cuisine +284746377 buisiness +2852 bulb +28527 bulbs +2853 cuke +2855 bull +2855364 bulldog +285538 bullet +28553846 bulletin +2855384626273 bulletinboard +285538467 bulletins +2855387 bullets +2855538 bulllet +28557 bulls +2858 cult +286 bum bun cum +28624 bunch +286353 bundle +28642569 bungalow +28643 avoid +28644653 bunghole +2865 bunk +2865233 bunkbed +28652337 bunkbeds +28657 bunks +28664546487 cunnilingus +2866493 atomize +2866774373 atmosphere +28669 bunny +2867 atop bump buns +286737 bumper +2867377 bumpers +286766 bunson +287 bus cup +2872 curb +28726273 cupboard +287262737 cupboards +2873 cure +287328 bureau +2873287 bureaus +2874 bush +287425 burial +28743 cupid +287433 buried +287437 burger bushes cupids +28743756468 burgerjoint +2874377 burgers +2874466 cushion +28744667 cushions +28745263 bushland +287453 burgle +28746377 business +2876 burn +287633 burned +287637 burner +2876464 burning +2877 burp cups cuss +28773629 currency +2877368 current +28773687 currents +2877464 burping +287769 burrow +28778 burst +2878 bust +2878246 curtain +28782467 curtains +2878246763 curtainrod +2878273 bustard custard +28783 curve +287847 curtis +2878477 curtiss +287863426 custodian +28786637 customer +287866377 customers +2879 bury +288 but ctu cut +288224 attach +288225 attack +2882437 butcher +288246 attain +288278 ctucru +2883 cute +288363268 attendant +2883678 attempt +288368466 attention +28842 attic +288467 author +288467489 authority +288473 attire +28848833 attitude +2885379 cutlery +2886 auto +2886628 autonav +288662842 automatic +28866284428466 autonavigation +288662866 automaton +2886662453 automobile +28866624537 automobiles +28867 autos +288674568 autopilot +2887 cuts +2887228466 attraction +2888 butt +288837 butter cutter +28883724876 butterchurn +28883734353 butterfield +28883735437 butterflies +288837359 butterfly +288837688 butternut +2888377 cutters +28884653 butthole +288866 button +2888667 buttons +288869 buttox +28887377 buttress +2888737737 buttresses +289 buy +28937 buyer +2899273 buzzard +28992737 buzzards +289937 buzzer +29 ax by +29253 cycle awake +292536 awaken +2925464 cycling +29256737 cyclopes +2925677 cyclops +292567737 cyclopses +2926 cyan +29273 award +292737 awards +2927426 azarian +2929 away +293 axe bye +293293 byebye +2937 axes +2947 axis +29546337 cylinder +295463377 cylinders +296464 awning +297663 awsome +2978263377 bystanders +322233 facade +3223 face +32237 faces +3224 each +322425 facial +3224548437 facilities +32245489 facility +322742 fabric +322742283 fabricate +3227427 fabrics +3228 fact +3228679 factory +323 dad +32337 fader +323377 faders +32339 daddy +323396 daddyo +323397 daddys +3237 dads +324 fbi dbg fag +3243553 echelle +324437 dagger +324468 faggot +32447 dbggr +32453 eagle +3246 echo +3247 fags +3247437 daisies fairies +32479 dairy daisy fairy +324797 fairys +32484 faith +324847 faiths +325 dak +3253 dale fake +3255 fall +32557 falls +32573 false +326 dam dan fan +32623 dance +3262335667 dancefloor +326237 dancer +3262377 dancers +326243 damage +3262464 dancing +3263 dame fame +3264 dang +326435 daniel +3264357 daniels +326437 danger +326437687 dangerous +326453 dangle +32645437 families +326459 family +3264597 familys +3266 damn +326633 damned +326648 dammit +3266669 economy +32669 danny +3267 fans +326735 damsel +326736 dampen +32682 fanta +327 ear far +32726 ecran +327267 ecrans +3273 fare fase +32737 farer +32739355 farewell +3274 dash +327426273 dashboard +327473 ecrire +3275 dark +32756377 darkness +32757666 darkroom +32759 early +3276 darn farm +327637 farmer +327646873 farmhouse +32765263 farmland +3277 ears +3277464 earring +32774647 earrings +3278 dart east fart fast +327826273 dartboard +327836 fasten +327836377 fasteners +327837 faster +3278378 fastest +32784 darth earth +3278459 earthly +3278482337 darthvader +327849676 earthworm +3278626 dartman +32787 darts +32788476937 dartthrower +3278867737 darttosser +328 eat fat +3282 data +32822265 databank +328238 faucet +3282387 faucets +328269 fatboy +328274663 dataphone +3283 date dave +32836 eaten +32836879 daventry +32837 eater +328373767 eavesdrop +3283737677464 eavesdropping +328377 eaters +32839 davey +32843 david davie +3284323 fathead +328437 father +32843766 davidson +3284377 fathers +32844837 daughter +328448377 daughters +328464 eating +32847 davis +32858 fault +328587 faults +32862 fauna +32867 favor +3287 eats +328837 fauves +32889 fatty +3289 davy +329 day +329233 daybed +3296 fawn +32967 fawns +3297 days +33 de ed ff +33225 fecal +3322728283 decapatate +3322748283 decapitate +332283 debate +3322848283 deactivate +3323 dead +33232733 deceased +3323537283 decelerate +33237 feces +33247437 decipher +33247466 decision +3325 deal deck +3325273 declare +332537 dealer +3325377 dealers +3325463 decline +3325464 dealing decking +3326 dean +3326337 decoder +332668264628466 decontamination +33267283 decorate +3326728466 decoration +3327 dear fear +33273273 decrease +332747 debris +33278 feast +3328 debt +33284 death debug +3328437 feather +33284377 feathers +33284729843 deathscythe +33284847328 deaththreat +3328873 feature +333223 deface efface +333253 feeble +3333 feed +33332283 defecate +333328 effect +3333464 feeding +3333673 defense +333463 fefine +3335 feel +3335283 deflate +3335464 feeling +3337 deep deer +3337379464 deepfrying +33377546 deerskin +3338 feet +3339 eddy +3343 edge +3343423 edifice +334733 degree +3347337 degrees +3348466 edition +33484667 editions +3349372833 dehydrated +33542283 delicate +335424687 delicious +335463 feline +3354837 deliver +33548379 delivery +33548737 delivrer +3355 dell +33552 fella +335527 fellas +33552846 fellatio +335569 fellow +3355697 fellows +335669 felony +335746742 delphoria +3358287 deltaur +336 den fem fen +3362 fenc +33623 fence +336237 fences +336253 female +3362537 females +3363873 fenetre +33638737 fenetres +33646463 feminine +336473 denise +336476 deniro +3366 demo femo +33663 femme +33665328527493 demolecularize +33665474 demolish +33666 demon +336667 demons +3369 deny +337 eds +3372363 descend +337236373 descendre +337237 fesces +33727478466 description +337278 depart +33727833 departed +3372786368 department +337363368 dependent +337378 desert +337446 design +33744628466 designation +337473 desire +337478 desist +3375 desk +33757 desks +3375867 desktop +3376 fern +337633 derned +337637 fermer +3376748 deposit +3377377 depress +3377377466 depression +3377425 derrick +33774257 derricks +33774373 derriere +337746437 derringer +337786 ferrum +33779 ferry +33779626 ferryman +3378 dept +33784 depth +3378453 fertile +337845493 fertilize +3378454937 fertilizer +337847 depths +33786238 dervocet +3378769 destroy +33787828 destruct +33787828466 destruction +337887 festus +337889 deputy +338224 detach +33822437 detacher +338228466 education +338245 detail +338278283 devastate +33832867 detector +338328677 detectors +33835673 develope +33835676368 development +33837 deter +338374368 detergent +338423 device +33845 devil +3384565 dethlok +33846283 detinate +338687 devour +33874887 detritus +339 dew +339273 edward +3392737 edwards +34 dg eh ei fi +3424667842 diagnostic +34246678427 diagnostics +3424726 diagram +34247267 diagrams +3425 dial dick +3425328 dialect +34254323 dickhead +34255377 dickless +34256483 dialogue +34257 dials dicks +342623 fiance +3426233 fiancee +34262337 fiancees +3426237 fiances +3426663 diamond +342666328 diconnect +34266637 diamonds +34273 fibre +342737 diaper +34274726 diaphram +34277432 diarrhea +34279 diary +3428466 fiction +343 did die +343337368 different +3433428589 difficulty +343353 fiddle +34353 field +343537 fields +34363 fiend +34379 fiery +34384 fifth +344 dig egg +34436 eigen +344378 digest +344378466 digestion +344437 digger +34448 eight fight +3444825 digital +3444837 fighter +344484 eighth +3447 eggs +344873 figure +3448737 figures +34487463 figurine +34524 filch +34526368 filament +3453 file +34532273 filecase +3453269 filebox +34536 dildo +34537 files +345484486 dilithium +3455 fill +34553 fille +345533 filled +34553883 fillette +3455464 filling +3456 film +345837 filter +34584 filth +346 dim din ego +346262425 financial +346262437 financier +34626483 dinamite +3463 dime dine find fine +34637 dimes diner +3464 ding +346437 finger +3464377 fingers +346464 dining +34646482253 diningtable +346464822537 diningtables +346474 finish +346478 finist +346543 dinkie +3466 egon +34662 dhooa +346637 dinner +34667287 dinosaur +34669787 dionysus +347 dip dir dis fir +3472 disc +3472253 disable +3472273 discard +3472376 discern +347242743 discharge +34726 disco +347262255 discoball +3472637 discoer +3472666328 disconnect +347268379 discovery +347268773 discourse +347276 disarm +347277327 disappear +3472776468464 disappointing +3472777683 disapprove +3472877 discuss +3472877466 discussion +3473 fire +34732625 firecock +3473273 disease +34732737 diseases +3473276 firearm +34732767 firearms +347328466 direction +34732867 director +347328679 directory +3473398464847437 fireextinguisher +34734673 firehose +34734766 fireiron +347362275 disembark +3473626935 disembowel +347364243 disengage +34737 fires +3473748 firepit +347375223 fireplace +34737584 fireplug +347376537 firepoker +34737828466 firestation +34739663 firewood +34739675 firework +347396757 fireworks +3474 dish fish +34742663 fishbone +347437 dishes fishes +347437626 fisherman +3474464 fishing +34744645463 fishingline +3474464763 fishingrod +34744647653 fishingpole +3474464822553 fishingtackle +3474666437 fishmonger +347468347283 disintegrate +34747663 fishpond +34748473 disguise +3474878 disgust +34749 fishy +347492 fishx2 +3474927437 dishwasher +3475 disk +34753883 diskette +347562283 dislocate +34756343 dislodge +3475662 diploma +34756627 diplomas +34762 firma +347626368 firmament +347626853 dismantle +347636237 dismember +34766868 dismount +34772824 dispatch +3477282437 dispatcher +347736253 dissemble +347736737 dispenser +347743 dipsie +347743368 dissident +34775223 displace +3477529 display +34775297 displays +3477623 disrobe +347767 fissop +34776725 disposal +34778 first +3477873 fissure +34778737 fissures +3477878 disrupt +347787837 disrupter +347787867 disruptor +34779 dipsy +3478 dirt +34782255 dirtball +34782623 distance +34784648474 distinguish +3478678466 distortion +347874288466 distribution +3478872 disturb +34789 dirty +34824 ditch +34826 divan +3483 dive five +348433 divide +34843464 dividing +34847466 division +34886 ditto +349 fix +34926 diwan +34933 fixed +3498873 fixture +34988737 fixtures +35 dj el +352285283 ejaculate +3524 flag +3524355283 flagellate +35245 flail +352463 elaine +35247 flags +35247653 flagpole +352478233 flagstaff +35253 flake +35263 flame +352637 flames +3526444 flamgig +3526464 flaming +3527 flap +35273 flare +35274 flash +3527437 flasher +35274464 flashing +3527454448 flashlight +35275 flask +352757 flasks +3527842 elastic +3528 flat +35287 flats +3528836 flatten +353 ele elf +35328 eject +3532872 electrc +35328742 electric +3532874225 electrical +35328742489 electricity +3532874289 electricty +3532876624 electromag +3532876642 electronic +35328766427 electronics +3532876763 electrorod +35328767763 electroprod +3533 flee +35337 elder +3533759 elderly +35362 elena +3536368279 elementary +35363687 elements +35374 flesh +35374268 elephant +35382867 elevator +353828677 elevators +353836 eleven +35387 fleur +353877 fleurs +35425 flick +3542537 flicker +3542537464 flickering +35437 flies +354448 flight +35464 fling +354646283 eliminate +35468 flint +3547 flip +35473567 flipflop +35478 flirt +35492 eliza +354922384 elizabeth +3549223847 elizabeths +354927 elizas +354947 elixir +355378 ekkert +35625 flock +35628 float +35628464 floating +356287 floats +3564 flog +35667 floor +3566726273 floorboard +35667262737 floorboards +3566726837464 floorcovering +35667464 flooring +35667628 floormat +356677 floors +3567 flop +35672 flora +356738 floret +3567387 florets +35674935 florizel +356779 floppy +35687 flour +3569 flow +356937 flower +3569377 flowers +356937768 flowerpot +358243283 elucidate +3583 flue +35833 elude fluff +35837 elves +35843 fluid +35874 flush +3587437 flusher +35883 flute +359 fly +35937 flyer +359464 flying +36 do fm +362 dna doc +36237 ember +362377 embers +362426837 enchanter +36245 email +3625 dock +3625464 docking +362567873 enclosure +36257 docks +3626 foam +3627 docs +3627223 embrace +36286368 document +362863687 documents +362867 doctor +3628677 doctors +362925673342 encyclopedia +363 dod doe end +3633 doff +363337 fodder +363337633 dodderned +36343 dodge +3636 dodo +363637 doener +3636437 enemies +3636469 enenimy +36369 enemy +3637253 emerald +36374362437 emergencies +363743629 emergency +36374473 energise +36374493 energize +363749 energy +364 dog fog +364243 engage +364443 doggie +364463 engine +36446337464 engineering +3644637 engines +36449 doggy +3645243 foilage +364636 eminem +36464 doing +3647 dogs +364723353 dogpaddle +364728464 engraving +364853 engulf +3652 fola +3652743 enlarge +3653 fold +365333 folded +365337 folder +3653377 folders +36537 folds +3653837 enlever +36539 dokey +3654243 foliage +3655 doll +365527 dollar +3655272455 dollarbill +3655277 dollars +365569 follow +36556937 follower +365569464 following +36557 dolls folks +36559 dolly +36569 enjoy +3657446 dolphin +36574467 dolphins +366 don doo +36618 don't +3662 emma +366243 doobie +366253 donald +366283 donate +3663 dome done fone food foof +366323 doodad +366353 fondle +366366 doodoo +36637 domes doner foods +366378833 foodstuff +3663788337 foodstuffs +3664 dong +36642453 domicile +366437 donger +366442539 doohickey +3665 fool +366539 donkey dooley +3665397 donkeys +3665474 foolish +366637 donner +36669 donny +3667 door +36672 door2 +36672355 doorbell +366723557 doorbells +3667539 doorkey +36675625 doorlock +3667626 doorman +3667628 doormat +36676287 doormats +36677 doors +36677837 doorstep +3667929 doorway +36679297 doorways +3668 dont font foot +36682255 football +366844 enough +36684455 foothill +366844557 foothills +36684667 emotions +3668562537 footlocker +36687284 footpath +36687837 footstep +366878377 footsteps +367 for +36723 force +3672334353 forcefield +367237 forces +3673 dope ford +36736253 ensemble +36737 doper +36737546 foreskin +367377 dopers +367378 forest +3674 dosh +36743 forge +367446 ensign +36746 ensin +3675 dork fork +367569 employ +36756933 employee +3675696368 employment +36757 forks +3676 dorm form +367628 format +367628466 formation +3676284667 formations +367648679 dormitory +36767 dorms forms +36767486 emporium +367735 dossel +3677626 forsman +3678 fort +36784 forth +3678473 enquire +36787 forts +36787377 fortress +3678737737 fortresses +3678863835537 fortuneteller +36789 empty +367893687 fortyfour +36789749 fortysix +36789896 fortytwo +3679273 forward +36792737 forwards +368 dot +368253 double +36828 doubt +36835673 envelope +36837 enter +3683782466368 entertainment +368423 entice +36844 dough +3684736668 enviremont +36847666368 environment +3685 foul +36868246 fountain +3687 four +368715323 four-leaf +36872457 entrails +36872623 entrance +368726237 entrances +36873 douse +368737 entrer +36875323 fourleaf +36878336 fourteen +368784 fourth +368789 fourty +3687893687 fourtyfour +368789749 fourtysix +368789896 fourtytwo +36879 entry +36879929 entryway +369 fox +3693 doze +36935 dowel +36936 dozen +36937 foyer +3695 fowl +3696 down +36964455 downhill +36965623 download +36967473 downpipe +369677688 downspout +3696782477 downstairs +36969273 downward +37 dr fs +372 f72 +372252867 escalator +372273 escape +37228466 fraction +3722852 dracula +37228873 fracture +372342283 eradicate +3724 drag +3724446 fraggin +37244464 fragging +37246 drain +37246243 drainage +37246368 fragment +372463687 fragments +3724637 drainer +372464653 drainhole +372466 dragon +372467 drains +372467473 drainpipe +37253 drake +372537 drakes +3726227 escobar +372624726 francisco +37263 frame +372633 framed +372637 frames +37265 frank +372653678346 frankenstein +372659 franky +37273 drape erase +372737 drapes eraser +3727379 drapery +3727486473 escritoire +3728 frat frau +3729 draw +372937 drawer +3729377 drawers +3729452867 frazilator +3729464 drawing +37294647 drawings +37325 freak +3732546 freakin +37325464 freaking +373257 freaks +37326 dream +37328466 erection +3733 epee fred free +373337425 frederick +37333745 frederik +373337457 frederiks +37337 freds +373378953 freestyle +3733929 freeway +373393 freeze +3733937 freezer +37339464 freezing +373444837 freighter +373624 french +3736925 frenzal +37377 dress +3737733 dressed +3737737 dresser +37377377 dressers +37378368 frequent +3742 eric +37422 frica +37433 dried +374343 fridge +374363 friend +3743637 friends +37437 fries +37438 drift +3744 frig +3744372867 frigerator +3744446 friggin +37444464 frigging +3745 erik +37455 drill +3745546486937 drillingtower +37455464869377 drillingtowers +37465 drink +3746537 drinker +37465377 drinkers +37465464 drinking +374656224463 drinkmachine +374657 drinks +3747 drip +37475 frisk +37477 drips +3748274 epitaph +37482747 epitaphs +37483 drive +3748346 drivein +374837 driver +3748377 drivers +37483929 driveway +374839297 driveways +3748464 driving +3748836 fritten +375466 eskimo +37546644678 eskimoghost +375466774748 eskimospirit +3764 frog +37643 droid +376437 droids +376542 frolic +3766 from fron +37663 frond +376637 fronds +37667 frons +37668 front +3767 drop +37672 erosa +376727 erosas +3767466 erosion +37675425 dropkick +3767633 dropoff +37677 drops +376774647 droppings +37678 frost +376789 frosty +3767967 dropzor +37683 drove +376936 frozen +37696464 drowning +3773623 essence +37767 error +3779 espy +378 fst +378225474 establish +37825 equal +3784 drug +37847 drugs equip +378476368 equipment +37848 fruit +37848464 fruiting +378487 fruits +3786 drum +37865 drunk +37865273 drunkard +37865379466 drunkerwion +378657 drunks +3786637 drummer +37867 drums +378678425 drumstick +3788279 estuary +379 dry fry +37937 dryer +379377 dryers +379464 drying frying +3798543 erzulie +38 et ft +382 eva +3822597887 eucalyptus +3823 dube +38233 evade +3824373 etagere +38243737 etageres +3825 duck fuck +382537 fucker +3825464 fucking +38257 ducks +3828 duct +38287 ducts +383 eve +3833 dude +38337 dudes +3833883 dudette +3835 fuel +383539 fudley +3836 even +3836464 evening +38368 event +3837 duds ever eves +3837625 eternal +38376489 eternity +38379 every +3837984464 everything +384 dui +38433623 evidence +3843742 etheria +3845 evil +3847237283 eviscerate +3855 full +385866 fulton +386 fun +3862 dumb +386224 funbag +3862247 funbags +38627837 dumbster +3862924837 dumbwaiter +3863 dune fund +3863464 funding +38637 dunes fumes funds +3864 dung +3864366 dungeon +38644 fungi +386444 fungii +386453 etoile +3864537 etoiles +386487 fungus +38659 funky +3866437 dummies +38669 dummy dunny funny +3867 dump +3867464 dumping +38677837 dumpster +387 ets fur +3872255 furball +3873 fuse +3873269 fusebox +38737 fuses +387542283 duplicate +3875422837 duplicates +3876223 furnace +3876474 furnish +3876474464 furnishing +38764744647 furnishings +387648873 furniture +387672 europa +38779 furry +3878 dust +3878246 dustbin +387825683 dustcloud +387837 duster +3878683 dustove +38866 futon +388872 futura +388873 future +3889 duty +3899 fuzz +39 dx ex +39228283 excavate +392372473 excercise +39242643 exchange +3925 eyal +3926463 examine +39264637 examiner +3926753 example +39273 dwarf +392737 dwarfs +3927383 excrete +3927837 dwarves +392873 excuse +393 dye eye +3932255 eyeball +39322557 eyeballs +393225584464 eyeballthing +3932255844647 eyeballthings +3932769 eyebrow +3932883 execute +3934653 eyehole +3935537 dweller +39355464 dwelling +3937 ewer eyes +39372473 exercise +39374323 eyepiece +393743237 eyepieces +39384464 eyething +393844647 eyethings +394 dwi +3942878 exhaust +39464 dying +39465437 dwinkies +39478 exist +394783623 existence +3948 exit +394863 exhume +39529 exlax +3953 dyke +39626483 dynamite +397267466 expansion +39732867283 expectorate +39735 expel +3973743623 experience +3973746368 experiment +397374636825 experimental +397374636828466 experimentation +397378 expert +397473 expire +3974733 expired +3975246 explain +3975648 exploit +3975673 explore +397567483 explosive +3975674837 explosives +3976863 expound +3977377 express +39836337 extender +398363377 extenders +3983636 extendo +39837467 exterior +39837625 external +39837646283 exterminate +3984648474 extinguish +398464847437 extinguisher +39872 extra +3987228 extract +3987283773787425 extraterrestrial +39872837737874257 extraterrestrials +4131 i.d. +4155 i'll +416 i'm +42 gb +422 gab hac +4224828 habitat +4225 hack +42272 haara +423 ice +4232374 iceberg +42323747 icebergs +42324378 icechest +423269 icebox +42337 hades +423438 gadget +4234387 gadgets +424 gag hag +4242842 hagatha +424453 haggle +4245 hail +4247 hags hair +42477 hairs +4247746 hairpin +42479 hairy +425 gal +42522867 galactor +42529437 galaxies +425299 galaxy +4253 gale half +42533278 halffast +4255 hall +425539 galley +42557 halls +4255929 hallway +4258 halt +42583 halve +426 h2o ham +426253 gamble +42625377 gamblers +426253874437 hambleurgher +42625464 gambling +426287437 hamburger +4263 game hand +4263269 gameboy +42632833 handcuff +4263283333 handcuffed +426328337 handcuffs +4263385 handful +426344 gandhi handig +4263486 handgun +42634867 handguns +426353 handle +426353724433 handkerchief +4263688 handout +42636887 handouts +42637 games hands +42637245 handrail +426372457 handrails +4263738 handset +4263742 ganesha +42637663 handsome +4264 gang hang +426437 hanger +4264464 hanging +42645866 hamilton +4264636237 gangmember +42646362377 gangmembers +426474 hamish +4265 hank +42652 ganja +426538 hamlet +42659 hanky +4265972659 hankypanky +4266225 hammack +426637 hammer +42663733 hammered +426637334323 hammeredhead +4266625 hammock +427 gap gas has +4272 garb hara +42722343 garbadge +4272243 garbage +4272243226 garbagecan +427242 garcia +427243 garage +4272433667 garagedoor +4272434283 garagegate +42725474 harakiri +427266 garcon +427266638 garconnet +427267 harbor +4272687 harbour +427277 harass +4273 gape hard hare +427336 garden +4273367 gardens +427346 gardin +42737 gases +42739273 hardware +4274 gash hash +4274474 hashish +427453 gargle +427539 harley +427568 harlot +4276 harm +4276368 garment +42763687 garments +427638 garmet +4276387 garmets +427653 harold +42765377 harmless +42765463 gasoline +4276669 harmony +4277 gaps gars gasp +427736 happen +42773633 happened +42774 harri +4277437 harpies +4277464 gasping +42777424673 harpsichord +42779 happy harpy harry +4278 harv +42783 haste +427837837 harvester +427839 harvey +42784 garth +4278537 hastler +428 hat +42824 hatch +4282438 hatchet +42824929 hatchway +4283 gate hate have +4283533737 gatekeeper +42837 gates +4283929 gateway +42843 gauge +428437 gather +428437464 gathering +4285 haul +42867 gator +4286833 haunted +4287 hats +4287225 hatrack +42877626 haussman +4288 haut +429 hay icy +429273 hazard +4293 gaze haze +429326 gazebo +42934353 hayfield +4295 gawk hawk +42978225 haystack +43 gd he id if +4323 head +432326273 headboard +43234327 headgear +432354448 headlight +4323562 headjob +4323627837 headmaster +43237 heads +432378278377 headquarters +432378663 headstone +4323786637 headstones +4325 heal +432537 healer +432553 heckle +432584 health +4325849 healthy +4327 gear heap hear +4327464 hearing +432774438 gearshift +43278 heart +432784 hearth +4328 heat +43283 heave +432836 heaven +4328367 heavens +432837 heater +43289 heavy +4332 idea +43343 hedge +433437 hedges +43343769 hedgerow +4335 geek +43368434228466 identification +43368439 identify +4338 heft +433937 geezer +4346 hein +43468 idiot +4347 heir +435 gel +43536 helen +4354 heli +4354267837 helicopter +4355 hell +435546863 hellhound +43556 hello +435638 helmet +4357 help +43571 help! +436 gem geo hen +4362336784 henceforth +43624626 henchman +43624636 henchmen +43633 geode +436337 geodes +4363725 general +43637283 generate +4363728387 generateur +436372867 generator +4363728677 generators +43637287423 generatrice +436374257 hendricks +4363782 genesta +436382542 genetalia +43643 genie +43648257 genitals +4365625 hemlock +4366234 gennadi +43662349 gennadiy +4366239 gennady +4367 gems gens henp +436734 geordi +436743 george +43678663 gemstone +4368 gent +436824 hentai +436853626 gentleman +436853636 gentlemen +437 her ids +4372 herb +4372378 herbert +43727 herbs +4373 here +4374237887 hephaestus +4376 hero +437626 german +437643 geroge +437646 heroin +43764663 hermione +437648 hermit +437648243 hermitage +4377 herr hers +43773 herpe +4377353 herself +4377464 herring +4378873 gesture +438 get het +438376 hetero +43876 hetro +4388464 getting +439 gey hey +4392 heya +439737 geyser +44 ii hh hi +44268 giant +44268377 giantess +4433 hide +44331688 hide-out +4433687 hideous +4433688 hideout +44339 hidey +4433946 hideyho +4434 hifi +4437645974427 hieroglyphics +4438 gift +443886 ghetto +4438862527837 ghettoblaster +444 iii +4444 high +444424247 highchair +44447533737 highsleeper +4444929 highway +444687466 ghinusion +4446874667 ghinusions +4452 hija +445225 hijack +4453 hike +4455 hill +44557 hills +446 gin him +4463 hind +44643 ginie +44643727323 gingerbread +446483 ignite +4464837 igniter +44648466 ignition +44663 gimme +446643 gimmie +4467353 himself +44678 ghost +446787 ghosts +4468 hint +44685 ghoul +446857 ghouls +44687 hints +447 hip his iis +4475 girl +447524 hislah +44753 girle +4475374363 girlfriend +44753743637 girlfriends +44757 girls +4477 hips hiss +4477437 hippies +447797 hippys +4478679 history +448 git hit +44824 hitch +448244453 hitchhike +4482444537 hitchhiker +44824464 hitching +4483 give hive +448437 hither +448464 giving +448537 hitler +4485377 hitlers +4492 hiya +44929 hiway +452623 glance +45273 glare +45277 glass +452772243 glasscage +452772273 glasscase +4527737 glasses +452779675 glasswork +45326 gleam +45326464 gleaming +453267 gleams +45433 glide +4546637 glimmer +4546637464 glimmering +45466377 glimmers +4546773 glimpse +45468 glint +4547836464 glistening +45478367 glistens +4548837 glitter +4548837464 glittering +45488377 glitters +455 ill +4553425 illegal +4558646283 illuminate +45623 globe +45683 glove +456837 gloves +4569 glow +4569464 glowing +45699 glowy +4583 glue +4584 glug +4588866 glutton +46 go hn ho im in +462248 hobbit +4622484653 hobbithole +46224846873 hobbithouse +462253 gobble +46226828466 incantation +4623673 incense +462423 imbibe +46243 image +462437 images +462462546 hobgoblin +4624625467 hobgoblins +4625 goal +462546 goblin +4625463 incline +4625467 goblins +4625833 include +4626 hobo +46269 inbox +46273273 increase +4628 goat +462833 goatee +46287 gnats hocus +4629 gnaw +463 god hoe +463268 infant +4633264 goddang +4633266 goddamn +463326633 goddamned +463348 hoddit +4633484653 hoddithole +46334846873 hoddithouse +4633626 hoffman +46336267 hoffmans +46337 infer +463373633623 independence +4633766 inferno +4634843825 individual +4635282253 inflatable +4635283 inflate +463583623 influence +4636 info +463668437 godmother +463676 inform +46367628466 information +4637 gods +4637228466 infraction +4638237 inducer +46387879 industry +464 hog +4642248268 inhabitant +46422482687 inhabitants +4642528466 inhalation +464253 inhale +464344 hohegh +464352 ingela +464378 ingest +464453 goggle +4644537 goggles +46464 going +4647 hogs +4647334368 ingredient +46473343687 ingredients +46478 hoist +464787 hoists +4648 init +4648425493 initialize +46484257 initials +4648473 inguire +465 ink +4652 hola +4653 gold hold hole +465327633 goldarned +465328 inject +46533474 goldfish +465336 golden +465337 holder +4653464 holding +4653468439255 holeinthewall +46536725 goldorak +46537 holer holes +4654329 holiday +46546842 golgotha +46552 holla +465537 holler +465569 hollow +4656 holm +4656345645 holodilnik +46564726 hologram +46564727442 holographic +4657837 holster +465873 injure +465879 injury +4659 holy +466 goo hoo inn +466237 gonads goober +4662737 innards +466283 inmate +4663 good home hood +46632 honda +4663238376666 goodafternoon +466329 goodby +4663293 goodbye +4663329 goodday +46633836464 goodevening +4663437 goodies +466346343353 hoodindiddle +46635377 homeless +4663626 goodman +466366 hoodoo +46636676464 goodmorning +46637 goner goods homer homes inner +46639 gomez goody honey +466392662 honeycomb +46639527 honeyjar +466396666 honeymoon +466464 homing +4665 hook +466533737 innkeeper +466537 hooker +4665377 hookers +46657 hooks +4666 goon homo +46662368 innocent +46663 gnome homme +46667 goons honor +466672253 honorable +466687 honour +4667 hoop +467 hop imp +467247 impair +46727423 inscribe +46727478466 inscription +467274784667 inscriptions +467278 impart +4673 gore hope hose +467328 insect +4673287 insects +46735 impel +46737 hoses +46737425 imperial +46737473 hosepipe +46737626 horesman +467378 insert +46743 gorge +467433 inside +46743687 gorgeous +467464 goring +4674667 gorgons +4674966 horizon +4674966825 horizontal +467536368 implement +4675363687 implements +4675467 hopkins +4676 horn +4676263493 gormandize +467638 hornet +4676387 hornets +467639 horney +46767 horns +467678268 important +46769 horny +4677 horq +46773 horse +4677328 inspect +467737 hopper horses +467743 horsie +467747 gossip +46774766 imprison +46774825 hospital +4678 host +4678255 install +4678268 instant +4678473 inquire +46784888466 institution +4678573 impulse +46787 horus +467872623 insurance +467878284667 instructions +4678786368 instrument +46787863687 instruments +468 got hot inv +4682337 invader +46835 hotel hovel +46836 inven +4683682473 inventaire +468368466 invention +46836867 inventor +468368679 inventory +46837 hover +46837228 interact +46837228483 interactive +46837268773 intercourse +4683727238 hovercraft +468373373 interfere +46837378 interest +4683742522842 intergalactic +46837467 interior +468376257 internals +46837638 internet +4683766368 government +468377328 intersect +468377328466 intersection +46837764283 interrogate +46837773837 interpreter +468377738464 interpreting +468377878 interrupt +468378 invest +46837833 inverted +46837844283 investigate +468378463 intestine +4683784637 intestines +468474245489 invisibility +468474253 invisible +4684828466 invitation +46848284667 invitations +4686 goto into +46863 hound +4686367 hounfor +46863687 hounfour +4686426 houngan +46869422833 intoxicated +4687 hour +46873 house +46873359 housefly +468734653 household +4687366943357 houseonwheels +468737 houses +4687464 housing +46876 intro +468843 hottie +468882 hottub +4689473 hotwire +469 how +46939 howdy +4696 gown +46967 gowns +4697 hows +47 is hq +4722 grab +47222 isaac +47233 grade +47233484 graffiti +472334847 graffitis +472334884 graffitti +47233489 graffity +4723484 grafiti +47234884 grafitti +4723489 grafity +472426 graham +47242617 graham's +4724267 grahams +47246 grain +472467 grains +47263 grand +472633 grande +47263328437 grandfather +47263374266 grandepiano +4726362 grandma +47263668437 grandmother +4726372 grandpa +4726374266 grandpiano +4726483 granite +472669 granny +47268 grant +4727 gras +472737 grapes +4727442 graphic +4727635 grapnel +47277 grasp grass +4727737 grasses +4727753 grapple +472775464 grappling +472779 grassy +4728 grav +47283 grate grave +47283344437 gravedigger +472835 gravel +472837 grates graves +472837483 gravesite +4728378663 gravestone +47283786637 gravestones +472839273 graveyard +4728392737 graveyards +4728464 grating +47284647 gratings +4728489 gravity +4729 gray +473273 grease +47328 great +47336 green +4733653222 greenkebab +4733653227 greenkebap +47338 greet +473384647 greetings +4736233 grenade +47362337 grenades +4739 grey +4743 grid +4743346 griffin +47433467 griffins +474467 grigor +4744674 grigori +47455 grill +47455243 grillage +474553 grille +4745537 grilles +4745539675 grillework +474557 grills +4746 grim grin +47463 grind +47466464 grinning +47467 grins +4746737 grimper +474677666 grinspoon +4747 grip +475263 island +4752637 islands +4753 isle +47537 isles +47538 islet +476237437 groceries +4762379 grocery +47646 groin +4766 iron +476683 groove +4766837 grooves +476689 groovy +47673 grope +476783783464 grostesteing +476863 ground +4768637 grounds +4768637533737 groundskeeper +47687 group +476886 grotto +4769 grow +476984 growth +4782 grub +4784687 isthmus +48 it iv +4817 it's +482 hub +4822 huba +482226653 guacamole +4826 ivan +48273 guard +482737 guards +482737245 guardrail +483 hue iud +483329 guffaw +4836 item +48367 items +48377 guess +48378 guest +483787 guests +484 4th hug huh +4843 huge +48433 guide +4845568463 guillotine +484589 guilty +48466377 guinness +484827 guitar +4848273 guitare +484827478 guitarist +48524 gulch +4853 gulf +48546 hulio +485467 hulios +4855 gull +485538 gullet +48557 gulls +4857 gulp +486 gum gun hum +4862358 gunbelt +48626 human +486267 humans +48629 gumby +486326 gundam +4863733 hundred +486479 hungry +4865 hunk +486637 hummer +4866464 humming +48664647 hummings +48667478 humorist +486687 humour +4867 gums guns hump hums +48674448 gunsight +4867467 gunshop +486769337 gunpowder +48678673 gunstore +48679 ivory +4868 hunt +486837 hunter +487 its +4872263 husband +48722637 husbands +487353 hurdle +4874 hush +4875 hurl +487742263 hurricane +48779 hurry hussy +4878 guru gust hurt +488 hut +48824 hutch +4882437 hutches +4882446766 hutchinson +488362374 gutenberg +4887 guts huts +488837 gutter +489 guy ivy +4897 guys +489953 guzzle +49 ix +4937268 hydrant +493728466 hydration +496 gym +496627486 gymnasium +49737 hyper +4973777333 hyperspeed +497379277 hyperwarp +4976 gyro +4976337642 hypodermic +4993466 gwydion +522 jab lab +522237 jabber +52234 laadi +52235 label +522357 labels +522466 labion +5225 jack +522522 laalaa +522538 jacket +5225387 jackets +5225426637 jackhammer +5225766 jackson +52257667 jacksons +5226728679 laboratory +5227664 jabroni +522867 labtop +5228994 jacuzzi +523 lad lae lcd +523337 ladder laffer +5233377 ladders +52343 ladie +523437 ladies +52353 ladle +5239 lady +524 jah +5243 laid +52437 jager lager +5245 jail +5245362374 kahlenberg +52453623747 kahlenbergs +524537 jailer +52457 jails +52458 lahku +524666 lagoon +5247 lair +5248546 kaitlin +5248596 kaitlyn +5253 jake lake +5254 kali +5257272 kalsarc +52572727 kalsarcs +526 jam lam +5262 jamb +52623 lance +526237 lancer +5263 jane land lane +52633455 landfill +5263464 landing +5263464723 landingpad +5263476 janeiro +52637 james +526372273 landscape +52645293 kamikaze +52648243 language +5264867 janitor +52648677 janitors +5267 lamp +526727 kansas +52673 lampe +52677 lamps +52677678 lamppost +526779673 lampsword +5268376 lantern +52683767 lanterns +527 jar las +52725 kasck +5272653 karaoke +5273 lard +527346 jardin +5273467 jardins +52737 lards laser +527372326 laserbeam +5273723267 laserbeams +52737266382867 laserconductor +52737486 lasergun +527377 lasers +52737932766 laserweapon +52743 large +5275 kask +52766 jason lasoo +5277 jars lars lass +52773 lasse +527737 jasper +52776 lasso +52779 larry +527797 larrys +5278 last +527845 kartik +527867 laptop +5278677 laptops +527882 kasuta +528 kat +5282 lava +52824 latch +528262 katana +5282867437 lavatories +52828679 lavatory +5283 late +52837 later +52837387466 laterfusion +52844 laugh +5284642 lavinia +528624 launch +52863373883 launderette +5286373883 laundrette +5286376628 laundromat +5286379 laundry +52872 laura +5287368 laurent +5287463 latrine +5288423 lattice +52884239675 latticework +529 jaw jay law lay +5292663 jawbone +52933 layed +5293629 lazenby +52936297 lazenbys +529464 laying +5296 lawn +529626 lawman +529666937 lawnmower +52967 lawns +5297 jaws lays +5299 jaxx +53 le +53222 kebab +53227 kebap +5323 lead leaf +53233424 jebediah +532337 leader +5323538 leaflet +53235387 leaflets +53237 leads +5325 leak +5326 lean +532639 keaney +53267 jeans +532686 leanto +5327 leap +53274 leash +53276464 learning +53283 leave +532837 leaves +5328376 lectern +5328437 leather +5328873 lecture +533 lee +53324 leech +5333 jeff +533337766 jefferson +53337 jeffs +5333739 jeffrey +5334 jedi +53343 ledge +533437 ledges +5335 keel +5336743 leforge +5337 jeep keep +533737 keeper +5338 left +53389 lefty +533897 leftys +534 keg leg +53422 legba +534229 legacy +5342663 legbone +5346824 jehovah +5347 kegs legs +5347873 leisure +53484 keith +53487227 lehtsaar +5348727 lehtsar +5355 kell +535539 kelley +53556 jello +53559 jelly +536 jen ken +536372 kendra +536484 length +5365 lenk +5365467 jenkins +5366 jenn +5366273 leonard +53662737 leonards +5366347837 kenmeister +53664 jenni +53664337 jennifer +536643377 jennifers +536647 jennis +53666233 lemonade +536662337 lemonades +53667 jenns +53669 jenny kenny +536697 jennys +5367 jens lens +5367273 leopard +53673 lense +5368 lent +537 jep +53737 leper +537466 lesion +5375 jerk +537648 kermit +537662 kerona +53766426 keronian +537666426 kernonian +53767363 kerosene +53769 leroy +5377 jess leps +5377324286 leprechaun +53773242867 leprechauns +5377422 jessica +537763 jerrod +537766 lesson +5377667 lessons +5377687 leprous +53779 jerry +53787 jesus +538 jet let +53835 level +53837 lever +538377 levers +538428426 leviathan +5384284267 leviathans +53848283 levitate +5387 jets lets +5387225 jetpack +538837 letter +538837269 letterbox +5388377 letters +538853 kettle +5388537 kettles +538868 levtov +539 key +5391 key1 +5392273 keycard +53922737568 keycardslot +53924246 keychain +53926273 keyboard +53935 jewel +53935379 jewelery +53935533 jewelled +539357 jewels +5393579 jewelry +5394653 keyhole +53946537 keyholes +5397 keys +5397225 keyrack +539723 keypad +5397464 keyring +5397568 keyslot +542233 libbed +5422623 licance +5423673 license +54236737 licenses +5423737 liberer +5425 kick lick +542537 kicker +54257 kicks +5427279 library +543 kid lid lie +5433 life +54332628 lifeboat +54333676 lifeform +543336767 lifeforms +543627737 kidnapper +5436277377 kidnappers +5436277464 kidnapping +5437 kids +5438 lift +54387 lifts +5438836268 lieutenant +544 jig +544278487 ligaruius +54448 light +544482852 lightbulb +5444837 lighter +54448377 lighters +54448464 lighting +544486464 lightning +544487 lights +5444877333 lightspeed +545 lil +5453 like +545437 lilies +5455 jill kill +545537 killer +545537626 killerman +5456 kiln +5459 lily +546 jim kim +5462 limb +54626 jimbo +5462656 lincoln +54626567 lincolns +54627 limbs +5463 kind line +54633 kinfe +54636 linen +54637 lines +54637539 lindsley +5463925537 linewalker +5464 king +54643743 lingerie +5464487 kinghts +54647 kings +54648 limit +5465 link +5466 lion +54667 lions +54669 jimmy +54675 kiosk +5468 lint +54696 jinwo +547 lip +5472 lisa +54723673 liscense +5473 lire +5474 kiri +5477 kiss lips +5477488 lippitt +54778425 lipstick +54779 lissy +5478 list +547836 listen +547836464 listening +547837 liquer +547843 liquid +547847 liquir +547867 liquor +5478687 liquour +548 kit lit +5482436 kitchen +548243672643 kitchenrange +5483 lite +54837 liver +5483728873 literature +548378625 livestock +548379 livery +548464 living +5487 kits +54873 livre +548737 livres +5487485 kitshuk +548785 kitsuk +548836 kitten +548837 litter +548837269 litterbox +548853 little +54889 kitty +54889548837 kittylitter +549 liz +549273 lizard +5492737 lizards +5497 lizs +5499 jizz +5533639 kleenex +5539367 llewdor +55464667 klingons +5547843 lliquid +5587 llur +562 job loa lob loc +56225 local +562257 locals +562283 locate +56228466 location +56229 lobby +5623 load loaf +562333 loaded +562337 loader +56234 loadi +56237 locer +5625 jock lock +562537 locker +5625377 lockers +562538 locket +562539 jockey +56257 locks +56257425 lockpick +56257425464 lockpicking +562578727 jockstrap +5626 loam loan loco +5627 loas +5627837 lobster +563 joe +56323 knead +5633 knee +56335 kneel +56343 lodge +5635 joel +5637 joes +5638 loft +5639 joey +56397 joeys +564 jog log +5642533 knicked +56426 johan +56426637 johannes +5642665 logbook +56433 knife +564337 knifes +564448 knight +564453 joggle +5646 john join logo +564625684 loincloth +564633 logoff +564669 johnny +56467 johns +56468 joint +564687 joints +564688 logout +5647 logs lois +564837 knives +56488464 knitting +565 lok lol +565296 kolayn +5653 joke +56537 jokes +5654 loki +56554767 lollipop +5656883 lolotte +5658 jolt +565962 kolyma +566 kon loo +5662 knob +566237 joober +56625 knock +5662537 knocker +56625377 knockers +56625464 knocking +56627 knobs +56637 jones +5664 long +5665 look +566533 looked +5665464 looking +5665688 lookout +56656887 lookouts +566587 lookup +5666 loom +56665 loook +56667 looms +56673 loose +566736 loosen +5668 knot loot +5668454 kontiki +56684547 kontikis +56684653 knothole +5669 know +566953343 knowledge +56696 known +567 los +5673 lord +567342765377 lordharmless +56737 loser +567377 losers +567463 josine +5674867 loritos +56752 korja +5677 loss +5677464 lopping +5678 korv lost +56782546 lostalim +56784 losti +56785246 lostlaim +568 lot lou +5683 loud love +568359 lovely +5683625464 lovemaking +56839 kotex +56843 louie +568466 lotion +56847 louis +568643 lounge +5687625 journal +56876257 journals +5687639 journey +5688379 lottery +569 kow low +56937 lower +56978425 joystick +57 jr kq +572324 kq2dbg +573 lpd lsd +57324 kqdbg +573324 kq3dbg +574324 kq4dbg +5747462 krishna +5747836 kristen +57478367 kristens +57493299766 krgzdaxzson +577 lss +5778 kprt +58 kt lt +582237 lubber +5822377 lubbers +5824337 lucifer +5824687 lucious +5827422833 lubricated +5829 lucy +58343 judge +58367 kudos +58374 jueri +584 jug lug +58423 juice +584236224463 juicemachine +584237 juicer +5844243 luggage +58444 luigi +584447 luigis +5847 jugs +5853 juke luke +5853269 jukebox +58543 julie +585437 julies +5855229 lullaby +5862 jumb +586237 lumber +5862375225 lumberjack +58624 lunch +58643 lunge +5864385 lungful +586453 jungle +5865 junk +58657453 junkpile +58659273 junkyard +5867 jump +586737 jumper +5867464 jumping +5873 lure +5874 juri +58749 juriy +587537 lurker +5875377 lurkers +5878 just +587846 justin +587846353824 justinfletch +5879 jury +5883 jute lute +5883269 jutebox +58836453 juvenile +593 lye +59454 kwiki +5974 jyri +59742 lyric +597427 lyrics +598866 lytton +599948 lxxxiv +62 ma mc +622 nab +6223 mace +6224 mach nach +622426476 machanism +6224383 machete +6224436 machien +6224463 machine +62244633 machined +62244637 machines +622446379 machinery +6225 mack +62277437 mbarrier +62287 occur +62287268 occupant +622872687 occupants +62297 nabys +623 oaf +6232 nada +62326 ocean +623263 madame +6233 made +62342 nadia +623663 mcfood +6236756933 mcemployee +6237 nads +6237437 mcfries +624 mag mai nah +62429463 magazine +624294637 magazines +6243 mage maid +624336 maiden +62442 magic +6244225 magical +62442426 magician +624443 maggie +62449 maggy +6245 mail nail +6245269 mailbox +624526937 mailboxes +6245626 mailman +62457 nails +6246 maim main +62462 magma +624626273 mainboard +624637263 mainframe +624638 magnet +62464269 mahogany +624643437 magnifier +6246439464 magnifying +62468362623 maintenance +624686 magnum +62468973 mcintyre +6247 mags +624766 maison +625 oak obj +6252656 malcolm +62526567 malcolms +6253 make male +625328 object +625328483 objective +6253287 objects +62533 naked +625336377 nakedness +6253566 malekom +6253688 makeout +62537 maker makes males +625377 makers +625387 makeup +625387548 makeupkit +625464 making +6254837283 obliterate +6255 mall +625538 mallet +625663 malone +626 mam man +62617 man's +6262 mama +626243 manage +6262437 manager +62624377 managers +62626 mambo +62626626 manannan +62627 mamas +6263 mame name +62637 names +62637253 mandrake +626375283 nameplate +62638837 maneuver +62643 mange +626437 manger +626453 mangle +6264653 manhole +6264785283 manipulate +62649 mangy +6266 mano +62662 mamma +626625 mammal +626637846 mannequin +626643 mannie +62667 manor +6267 mans +6267466 mansion +626825 manual +6268257 manuals +626835 mantel +62683574323 mantelpiece +626844387 mcnuggets +626853 mantle +62685373423 mantlepeice +62685374323 mantlepiece +626873 manure +6269 many +627 map mas nap +6272 marc narc +627253 marble +627256 napalm +62726 maran +627268 mascot +62726842 narcotic +627268427 narcotics +62728 mcrat +627292 naraza +6273426 mardian +62737828466 observation +6273783 observe +62737837 observer +6274 mash +62742 maria mcrib +62743 marge marie +62743426 obsidian +627448262 marihuana +627458262 marijuana +62747 mcrip oasis +6275 mark mask +62752676 marlboro +62753 maple +627533 marked +627537 marker +627538 market +627546 napkin +6275464 marking +62754647 markings +62757 marks +62758 markt +6276679 masonry +6277 maps mass +62772273 massacre +6277243 massage +62774 marsh +62774243 marriage +6277433 married +6277464 napping +6277483 massive +627769 narrow +62779 marry nappy +6278 mart mast +62782228 mastabat +627822283 mastabate +6278228 mastbat +62782283 mastbate +6278328 marteau +627837 master +6278372283 masterbate +62783774323 masterpiece +62784228 mastibat +627842283 mastibate masticate +6278426 martian +627846 martin marvin +6278464 martini +627847 maquis +6278487 martius +62785587 marullus +62787828 obstruct +62788228 mastubat +627882283 mastubate +6278872283 masturbate +627887228464 masturbating +62789 nasty +6279 mary +628 mat nav +62824 match +628242665 matchbook +62824269 matchbox +6282437 matches +628246 obtain +6282478425 matchstick +62824784257 matchsticks +6282667 navcomp +62826678837 navcomputer +6283 mate +62835 navel +6283647 obtenir +6283742 materia +62837425 material +62837487 materius +628374877 materiuss +6283883 navette +628424933 naugahyde +62844283 navigate +6284428466 navigation +628442846625 navigational +628466 nation +628483 native +6284837 natives +6285 maul +6286787 octopus +6287 oats +6287277 matrass +628765386 mausoleum +628766 matron +6288 matt +628837 matter +6288725 natural +628873 mature nature +62887377 mattress +629 maw max may nay +6293 maze +62934353 mayfield +6294 nazi +6294256763455483 maxiclorofillite +62943524 naziflag +629435247 naziflags +62946455466 maximillion +62947 nazis +62967 mayor +6297 maxs +6299355 maxwell +63 md me ne of +63222 mecca +632369 meadow +6323695263 meadowland +632377279 necessary +632377447 mebership +6324 mech +63242 mecha +632426427 mechanics +632426476 mechanism +6325 meal neal neck +63255223 necklace +63257 meals neals +6325843 necktie +6327 near +6327873 measure +632787464 measuring +6328 meat +632827 nectar +632832837 meateater +6328328377 meateaters +632852 nebula +6328523 nebulae +6328527 nebulas +633 off +6332255 oddball +63325 medal +633255466 medallion +6333 need +633353 needle +63337 offer +63337464 offering +633377 offers +6334225 medical +6334228466 medication +633423 office +6334237 officer +63342463 medicine +6334548 medikit +6334787 oedipus +63348283 meditate +6334828464 meditating +6334828466 meditation +633486 medium +6337 odds +63374668 offshoot +6338 meet +6338464 meeting +633872 medusa +6342 mega +63422527837 megablaster +63426 megan +63428483 negative +63444267 neighbor +634442687 neighbour +6344426877 neighbours +634443 meggie +634453 meggle +634684283 negotiate +6347 megs +635 mel +6352643 melanie +635362485 melenchuk +63547 nelis +635543 nekkid +635639 melody +635667 melons +636 mem men +636237 member +6362377 members +6362377447 membership +636243743 menagerie +6363 mend +6366 memo neon +63667 memos +6366726386 memorandum +63667425 memorial +636679 memory +6367 mens +6368 menu +63687 menus +6372 mesa +63723337 mercedes +637236279 mercenary +63724263473 merchandise +63724268 merchant +6373 nerd +63743 merge +637439 nephew +6376243 mermaid +6377 mess +6377243 message +637724326273 messageboard +63772437 messages +637769 merrow +63779 merry +6378 merv nest +63783 nerve +6378863 neptune +638 net +63825 metal +63825542 metallic +638257 metals +638367 meteor +6383673 meteore +638367483 meteorite +6383677 meteors +63837 meter never +638376463 nevermind +638463 method +63876 metro +6388464 netting +638873 mettre +639 new +6394226 mexican +6397 news +639772737 newspaper +6397727377 newspapers +6398 newt next +6399675 newyork +64 oh +642 mic +642253 nibble +6423 mice +6424235 michael +64243 niche +6424435 michiel +642487 nichts +6425 mick nick +642533 nicked +642535 nickel +6425357 nickels +642539 mickey +642567 mickos +64257 micks +64259 nicky +64276 micro +642762447 microchip +6427672673 microscope +6427674663 microphone +64276776237767 microprocessor +642769283 microwave +6427692836836 microwaveoven +643326 niddam +643353 middle +643438 midget +6435 niek +64357 niels +643643 nienie +643683 niente +64387 niets +64437 niger +644453 niggle +64448 night might +64448464253 nightingale +6444854448 nightlight +64448544487 nightlights +6444874233 nightshade +6444878233 nightstaff +6444878263 nightstand +64448782637 nightstands +6444878425 nightstick +645 oil +64515267 oil&lamp +6452568 oilblot +64525687 oilblots +6453 mike ogle +6453377425 oilderrick +64533774257 oilderricks +64535 mikel +64539 mikey +64548279 military +6455 milk mill +645574253 milkshake +64557663 millpond +6456267 oilmans +64576327 oilsmear +645768343 oilsmudge +6457683437 oilsmudges +6457768 oilspot +64578246 oilstain +645782467 oilstains +64586937 oiltower +645869377 oiltowers +646287 nimbus +6463 mind mine nine +64637 miner mines +6463725 mineral +64637257 minerals +646384 nineth +6464 mini +646428873 miniature +64647837 minister +6464887493 miniturize +64648874937 miniturizer +646488749464 miniturizing +64652 ninja +64652887853 ninjaturtle +64667 minor +64669462 minoxina +64678735 minstrel +6468 mint +64683636 nintendo +64686368 ointment +646883 minute +64688359 minutely +64689 minty +647 mir +6472632 miranda +64726847673 misanthrope +647273268 miscreant +6473 mire ogre +64733632667 misdemeanor +64737 miser +647377 ogress +64765 mirok +647654 miroki +647657 miroks +6477 miss +647747 missis +647753 nipple +6477537 nipples +647767 mirror +64776733 mirrored +6477677 mirrors +6478 mist +6478262 nirvana +647837 mister +647853863 mistletoe +64787 mists +64787377 mistress +64824 nitch +648246 mitain +648836 mitten +649 mix +64933 mixed +64937 mixer +649464 mixing +6498873 mixture +65 ok +6529 okay +653 old +65322867493 olfactorize +6533 olde +65337 older +6539 mkey okey +653936539 okeydokey +654387 olievr +65483 olive +65483645 oliveoil +654837 oliver +655 oll +65736 olsen +66 no on +662 mob +662245 nobail +6624 noah +662453 mobile +66245362758 mobilemarkt +66245374663 mobilephone +662632 omanda +662639 nobody +6628 moat +6629 moby +663 moe one +66314253 one-half +6633 mode +66335 model +663357 models +66337 onder +663439 modify +663538 omelet +6636 mofo +663853 module +6642 ooga +66473 noise +6647362537 noisemaker +66473625377 noisemakers +664737 noises +66478873 moisture +66527 molar +665277 molars +6653 moke mold +665333 molded +6653624677 mokenchops +665378 molest +665543 mollie +6656 mojo nolo +6656868 molotov +665836 molten +6659 only +666 mom non +666278379 monastery +66639 money +66639224 moneybag +666392547 moneyclip +6664 mong mooh +666437 monger +666437382736 mongeretardo +6664377382736 mongerretardo +6664626 mongman +6664735 mongrel +6664837 moniter +66648387 moniteur +666483877 moniteurs +6664867 monitor +66648677 monitors +6665 monk +666524 moolah +666539 monkey +666539626 monkeyman +6665397 monkeys +6665437 monkies +6666 moon +66662 momma +666643 moonie +66665484 monolith +66667 moons +66669 mommy moony +666697 mommys +6667 moms +66673 moose noose +666734323 moosehead +66673673 nonsense +6667837 monster +66678377 monsters +6667873 monstre +66678737 monstres +666837 monter +66684 month +66686368 monument +666863687 monuments +667 mop +6673 more nope nose +66733 moped +6674 nopi omri +667426 morgan +66743 norge +667536 moslem +667625 normal +6676464 morning +66766 moron +6677 moss +667737 mosses +66774 morph +667747 morris +66778486 mosquito +6678 most mort +667825 mortal +667827 mortar +66784 north +667843278 northeast +667849378 northwest +6678745 nostril +6678926833 mostwanted +667929 norway +667934426 norwegian +668 not +66824 notch +6683 move note +66832665 notebook +66835 motel novel +66836 movem +66836368 movement +66837 notes +6683723 notepad +6684 moth +668423 notice +66842326273 noticeboard +6684237 notices +66843 movie +668437 mother +6684377 mothers +6684377447 mothership +6684464 nothing +668464 moving +668466 motion +66847 moths +66853 mould +6686 onto +66863 mound +668637 mounds +66867 motor +6686729253 motorcycle +66867292537 motorcycles +66868 mount +66868246 mountain +668682467 mountains +668682467433 mountainside +668687 mounts +66873 mouse +66873723 mousepad +668747 mourir +6687474 nourish +668782243 moustache +6688246 moutain +66882467 moutains +66884 mouth +66884385 mouthful +669 now +6693 ooze +66937 mower +669464 mowing +669953 nozzle +6699537 nozzles +67 mr ms or +672 npc orb +672253 oracle +672437872 orchestra +672643 orange +6726437 oranges +6726763 osborne +6728 orat +673 ore +67337 order +673377 orders +6736 open +673633 opened +6736464 opening +6737283 operate +67372846482253 operatingtable +673728466 operation +67372867 operator +674 msg +67426 organ +67426476 organism +674264767 organisms +674264928466 organization +674267 organs +674276 orgasm +6743423 orifice +6746466 opinion +67486 orium +67626368 ornament +676263687 ornaments +677 mrs +67767483 opposite +6824 much +6825 muck +6825327 nuclear +683 mud +6832255 mudball +6833 muff nude +68339 muddy +68343 nudge +683489 nudity +6836 oven +6837 over +6837255 overall +68372557 overalls +683726273 overboard +68372628 overcoat +683726287 overcoats +6837328 overeat +68374264 overhang +68377277 overpass +6837768 mudspot +68377687 mudspots +684 mug oui +68437 other +684377 others +684438 nugget +6844387 nuggets +6847 mugs +6853 mule +685337 mulder +68537 mules +6855439 nullify +685848833 multitude +6858488337 multitudes +686 mum +686237 number +6862377 numbers +68624 munch +686253 mumble +6865337 munkees +68662 mumma +68669 mummy +687 mur +68725 mural +687253 muscle +687337 murder +687386 museum +6874 mush +68742 music +6874225 musical +68742269 musicbox +68742426 musician +687424267 musicians +68742752937 musicplayer +68747666 mushroom +687476667 mushrooms +687546 muslim +6877 murs +68773 nurse +6877379 nursery +687743 nursie +687749 murphy +68782243 mustache +6878873 nurture +688 mut muu nut out +688268 mutant +6882687 mutants +688348 outfit +6883487 outfits +68836677 outdoors +68837 outer +68845283 mutilate +68846873 outhouse +688538 outlet +6887 nuts outs +6887433 outside +688743687 nutrients +688747 ouvrir +6888 mutt +688866 mutton +689953 nuzzle +69 my nw ox +69263676 mycoform +692643 mycoid +6936 owen oxen +69367 owens +695667 nylons +696 own +69629 nyoby +69637 owner +697353 myself +697837 oyster +6978377 oysters +697842 mystic +6984 myth +699436 oxygen +72 pc r2 +722248 rabbit +722266 raccon +7222666 raccoon +7223 race +72237 saber +722435 rachel +7224357 rachels +7225 pack rack sack +7225243 package +72253 scale +722538 packet racket +7225464 scaling +72257 sacks scalp +7225735 scalpel +72257464 scalping +7225746456433 scalpingknife +7225753 scalple +722575464 scalpling +72257546456433 scalplingknife +72259 packy +7226 scan +7226637 scanner +72266377 scanners +72266464 scanning +722666 racoon +72268243 sabotage +722722 scarab +7227263686 sacramento +72273 scape scare scarf +722732769 scarecrow +722733 sacred +72274342425 sacrificial +72278 pabst +72279 scary +723 pad raf sad +7231 r2d1 +7232 r2d2 +72327 radar +7233 safe +7233464 padding +723353 paddle +7233766 saffron +723389 safety +72342623 radiance +72342867 radiator +72346 radio +72346564 radiolog +7234667 radioos +723467 radios +72346752937 radioplayer +7234692837 radiowaves +723478 sadist +7235625 padlock +72363 scene +7236379 scenery +72368 scent +7237 pads +7237873 sceptre +7238 raft +723837 rafter +7238377 rafters +724 rag +7243 page sage +724337 raider +72433853 schedule +724338537 schedules +7243623 science +724368478 scientist +7243684787 scientists +72437 pages +7243724446 ragfraggin +72437244464 ragfragging +7245 pail rail sail +72452628 sailboat +7245464 railing +72454647 railings +724566437 schlonger +724567 sailor +7245677 sailors +72457 rails +72457626 sailsman +7245796626 sailswoman +7246 pain rain +72462628 raincoat +724626287 raincoats +7246269 rainbow +7246368 raiment +724665 school +7246657 schools +72468 paint saint +7246824477 paintchips +724683 sainte +7246833 painted +72468464 painting +724684647 paintings +72468562 paintjob +7247 pair rags +72473 raise +724733 raised +724744 rairgh +7247467 raisins +7247767 scissor +72477677 scissors +72488737 pcitures +725 sal +725223 palace +7252237 palaces +72523 salad +725233 salade +7252337 salades +725237 salads +725269 salamy +7252837 palaver +7253 rake sale +72537 sales +7253725375 salesclerk +72537626 salesman +72537636 salesmen +7253784464 salesthing +7256 palm +725637 palmer +725666 saloon +72567 palms +72568733 palmtree +725687337 palmtrees +7258 raju salt +72588284667 salutations +725892837 saltwater +726 pan ram ran sam san sao +72622783 pancarte +7262437 rancher +726253 ramble +726262 panama +72628439 sanctify +7263 pane rand same sand +726325 sandal +7263257 sandals +726334 samedi +72634 sandi +72635 panel +726355464 panelling +726357 panels +7263672 pandora +726367217 pandora's +72636727 pandoras +72637 panes rands +726372 sandra +72639 sandy +72639424 sandwich +7264 sang +72642 panic +72643 range +726437 ranger +72648279 sanitary +726623 sconce +7266328 panneau +726637 panner +7266464 panning +72667 scoop +72668 scoot +7266837 scooter +72668377 scooters +72669 sammy +7267 pans ramp +726724 scorch +7267246275 scorchmark +72673 scope score +72674538 pamphlet +726745387 pamphlets +7267464 ramping +726753 sample +7267537 samples +7268 pant +72682 santa +726824 scotch +72682547 raotalis +726825477 raotaliss +7268437 panties +72686 santo +72687 pants scour +726879 pantry +72688 scott scout +727 pas pbr pcs rap sap sas +7272 papa +727224883 parachute +727235 parcel +72724 sarah +727246368 parchment +72725535 parallel +7272622 saranac +72726253 scramble +72726742487 sarcophagus +72727 papas scrap +727273 scrape +7272737 scrapes +7272738 parapet +72727483 parasite +727274837 parasites +727277 scraps +7272824 scratch +727282437 scratches +7273 rape +727326 scream +727326464 screaming +7273267 screams +727336 screen +7273367 screens +727368 parent +7273687 parents +72737 paper papes +727372547 paperclip +727377 papers +727379675 paperwork +72739 screw +7273933 screwed +72739374837 screwdriver +727393748377 screwdrivers +72739464 screwing +727397 screws +7274 pash raph +7274235 raphael +72743 sarge +727433 rapide +727436 sarien +7274367 sariens +727437 rapids +7275 park +727537 parker parler +7275387 parleur +7275464 parking +727567 parlor +727655 scroll +7276557 scrolls +7277 pass +72772273 passcard +72772377437 raspberries +727723779 raspberry +7277243 passage +7277243929 passageway +7277273552 sasparella +727737 parser +72774473 sapphire +727746628359 passionately +7277539 parsley +727768 parrot +7277687 parrots +72777678 passport +72779673 password +7278 part past +72782 scrub +7278253 partake +72783 paste +727848466 partition +7278637 partner +727867 pastor +7278673 pastore +72787 parts +727879 pastry +7278846473 scrutinise +7278846493 scrutinize +7278873 pasture +72788737 pastures +72789 party +728 pat rat +72822 scuba +728237 saucer +72824 patch +72826 satan +7283 save rate +7283548833474 satelittedish +728355483 satellite +7283554837 satellites +72836 raven +72836368 pavement +728363687 pavements +728367 ravens +7284 path +72843842 pathetic +72846 patio +728463 ravine +7284637 ravines +728464 saving +7284647 savings +728466 ration +7284667 rations +72847 paths +7284929 pathway +7285 paul saul +72855379 scullery +728559 scully +72857 sauls +728578873 sculpture +72858 sault +7286 scum +7287 rats +7287243 sausage +72872437 sausages +72873 pause +728765 patrol +7287652568 patrolalot +7287655464 patrolling +728765626 patrolman +728766 patron +7287667 patrons +728797 patsys +72883427337 sauvegarder +7288376 pattern +72883767 patterns +728853 rattle +7288537 rattler +72885376253 rattlesnake +72889 patty +72897 satyr +729 paw pay ray saw sax say +72924325 paycheck +72937 payer +7294433 rawhide +72946773 sawhorse +729486 raygun +7294867 rayguns +7296 pawn +7296368 payment +7296455 sawmill +729674663 saxophone +72967466478 saxophonist +7297 rays +72974663 payphone +729843 scythe +73 rd se sf +732 pda pea sea +73223 peace +73224 peach reach +732253 pebble +7322537 pebbles +7322625 peacock +73226257 peacocks +73228466 reaction +7322867 reactor +7323 read +73231688 read-out +732316887 read-outs +7323222 rebecca +7323446 rebegin +7323464 reading +7323478 receipt +7323483 receive +73234837 receiver +73235 rebel +732357 rebels +732368 recent +7323688 readout +73236887 readouts +732377 recess +7323782253 receptacle +7323784225 receptical +732378466 reception +732378466478 receptionist +73239 ready +73243837 reciever +73246773 seahorse +732473 recipe +7324737 recipes +732483 recite +7324855 seagull +73248557 seagulls +7325 peak peal peck seal +732537 pecker +732559 really +73257 peaks +7326 sean +732626 seaman +732663 second +73266664837 reconnoiter +732668 reboot +732673 record +73267337 recorder +732673464 recording +732673752937 recordplayer +7326787377 seamstress +732688 peanut +7326887 peanuts +7327 pear peas rear +732724 search +7327263 seasame +7327268 peasant +73272687 peasants +7327328437 rebreather +7327363 rearend +732737 reaper +732738 secret +732738279 secretary +7327387 secrets +73274355 seashell +73274673 seashore +73275 pearl +732766 reason +7328 peat seat +73282358 seatbelt +732833 seated +7328466 section +732867 sector +73287 seats +732873 secure +7328748437 securities +73287489 security +732925464 recycling +73292837 seawater +7329333 seaweed +733 see red pee +73326 sedan +7333 reed seed +733336 redeem +733337 reefer +733353 peddle +73337 reeds seeds +73337825 pedestal +733378257 pedestals +733378665 pedestool +7335 peek peel reel seek +7335328 reflect +7335328466 reflection +7335328483 reflective +733532867 reflector +7336 redo seem +733626 redman +7337 peep peer +73373746368 refreshment +733737463687 refreshments +7337434372867 refridgerator +733744372867 refrigerator +73374653 peephole +733823 reduce seduce +73383537 refueler +733873 refuse +734 peg +73425 regal +73426273 pegboard +73427337 regarder +734453 peggle +734466 region +73447837 register +734478728466 registration +73467 reins +7347 pegs +734738 regret +7348527 regular +734852867 regulator +734874482867 regurgitator +73493 seize +735283 relate +73528464 relating +73528466 relation +735284667 relations +73529 relax +7353 self +7353273 release +735328 reject select +735328466 selection +7354226 pelican +735433 relief +7354383 relieve +73544466 religion +735444687 religious +7355 sell +735537 seller +735538 pellet +7355387 pellets +7355464 selling +7356 relm +73562283 relocate +735623 reload +7358 pelt +735842 pelvic +735847 pelvis +736 pen +736245 pencil +7362457 pencils +736246 remain +7362467 remains +736275 remark +7363 send +7363268 pendant +7363398687 rendezvous +73638586 pendulum +736387283 penetrate +73638728466 penetration +7364 seng +73647 penis +7366 peon reno +73662687 remnants +7366437 pennies +736683 remote remove +73669 penny +7367 pens +73673 sense +736753 people +7367537 peoples +736767 sensor +7367677 sensors +7368 rent sent +73684368 sentient +736843687 sentients +73684635 sentinel +736846357 sentinels +736846873 penthouse +7368486 pentium +73687437 sentries +736879 sentry +736886 pentum +737 pep +73723483 perceive +73724 perch +737247 repair +737263 sesame +73727283 separate +737278 repast +737283 rescue +7372837 rescuer +73728377 rescuers +73729 percy +73732724 research +7373642 serenia +73736728466 perforation +7373676 perform +737367637 performer +7373676377 performers +73737828466 reservation +7373783 reserve +737378647 reservoir +73738 reset +7373863 perfume +737425 serial +73743268 sergeant +737433623 residence +73743368 resident +737446 resign +7374634225 periodical +73746342257 periodicals +7374687 serious +7375223 replace +73752236368 replacement +737542283 replicate +7375422837 replicates +73754228464 replicating +7375422867 replicator +73759 reply +7376 repo +7376748466 reposition +737678 report +7377 pepp +7377328 respect +7377368 serpent +737737 pepper +73773736828466 representation +73773736828483 representative +7377376468 peppermint +7377377 peppers +73774 pepsi +7377426 persian +737747 pepsis +7377472867 respirator +737766 person +73776625 personal +7377667 persons +73776674245489 responsibility +73776674253 responsible +737774728466 perspiration +73777473 perspire +73779 peppy +737797 peppys +7378 pest rest sert +7378268 servant +7378278 restart +7378287268 restaurant +737828737 restaurer +73783 serve +737837 server +7378378 pervert request +7378423 service +73784237 services +7378453 reptile +7378464 resting +737852437 sepulcher +737853 pestle +7378673 restore +73787 pests +7378724637 restrainer +737872466368 restrainment +737872468 restraint +737873 peruse +73787666 restroom +737877328 resurrect +737877328466 resurrection +7378872868 resturaunt +738 pet set +73825 petal +738257 petals +738273 retard +7382736 retardo +7383 pete +738325 reveal +73833 setee +73835 revel +73836 seven +738368336 seventeen +7383684 seventh +73837 peter petes sever +738373 severe +7383733 severed +73837363 reverend +7384367 reviens +738456 revilo +7384656 reviolo +738473 retire +738483 revive +7386583 revolve +73865837 revolver +738658377 revolvers +7387 petr +7387328 retreat +738743825 retrieval +73874383 retrieve +73879 retry +738833 settee +738837 petter +73883733738837 peuterdepeuter +7388536368 settlement +738863 retune +738876 return +73887637 returner +738876464 returning +7388767568 returnslot +739 pew sex +739273 reward +73937 sewer +739464 sewing +7397 pews +7397483 rewrite +739825 sexual +7398268 sextant +7399 sexy +74 pg +742 pic rib sic +7422243 ribcage +742229 shabby +742233 ribbed +74225 shack +7422553 shackle +74225537 shackles +742257 shacks +742266 ribbon +7423 rice +74233 shade +742337 shades +742369 shadow +7423697 shadows +74238 shaft +7424 rich shag +7424273 richard +74244 shagg +7425 pick sick +7425229 sickbay +742529 pickax +7425293 pickaxe +74253 shake +74253773273 shakespeare +742538 picket +74253837 picketer +742538377 picketers +742553 pickle +742587 pickup +74263 shame +74266 piano +7426766 shampoo +742689 shanty +7427 pics ribs +7427264 pharaoh +74273 phase shape shard share +742737 phaser +7427374438 shapeshift +7427377 phasers +74275 shark +742757 sharks +742767 phasor +74277 sharp +7427736 sharpen +742773633 sharpened +74283 shave +7428464 shaving +742846427326 shavingcream +74286 shaun +742869 shauny +7428837 shatter +7428873 picture +74288737 pictures +742926 shazam +74293 phaze +742937 phazer +742967 phazor +743 pie rid she +74323 piece +74323278 shebeast +743237 pieces +74327 shear +743277 shears +743284 sheath +7433 ride shed side +743328767 sideburns +743337825 piedestal +743353 piddle +74337 sheep sides +74338 sheet +743387 sheets +74339255 sidewalk +743392557 sidewalks +7433946337 sidewinder +74343 ridge +74345 sheik +743453 sheild +743464 riding +74353 rifle shelf +743537 rifles shelfs +74355 shell +743557 shells +743583 shelve +7435837 shelter shelves +74358464 shelving +7436 rien +7437 pier pies +7437433 sheriff +74374337 sheriffs +743772 sierra +743773 pierre +7437766 pierson +743782 siesta +7438 rift +744 pig rig +74435 pihel +744352 shiela +744353 shield +744366 pigeon +7443664653 pigeonhole +74436646537 pigeonholes +74438 shift +744443 piggie +7444464 rigging +74448 right sight +74448464 sighting +744487 rights +7445 phil +744538 piglet +744547 philip +74454773 philippe +7445535244 shillelagh +7445547 phillip +74455473 phillipe +74455477 phillips +74456767437 philosopher +744587 philup +7446 shin sign +744625 signal +744628873 signature +74463 shine +744637 shines +7446453 shingle +74464537 shingles +7446464 shining +7446637 shimmer +7446637464 shimmering +74466377 shimmers +74467 signs +74467678 signpost +74469 shiny +7447 rigs ship +74476368 shipment +744763687 shipments +74477 ships +74478 shirt +744797325 shipwreck +7447973257 shipwrecks +744873 sigurd +7448737 sigurds +7453 pike pile +745337 pilfer +7453623 silence +74536859 silently +745464 piling +7454746 pilgrim +7455 pill silk +745527 pillar +7455277 pillars +745569 pillow +7455697 pillows +74557 pills +74566437 shlonger +74568 pilot +745687 pilots +7458 silt +745837 silver +746 pin rio +7462 pina +74624 pinch +74625 shock +7463 pine shoe +74637 shoes +746374463 shoeshine +7463765474 shoepolish +74639 rhody +7464 ring sing +74643 singe +746437 ringer singer singes +7464377 singers +7464464 ringing +7464527 similar +74647 rings +7465 pink sink +74657 sinks +74658 pinku +746586 pinkun +74662 rhomb +74662253 pinnacle +74663 phone +746632273 phonecard +746632427437 phonecharger +746632665 phonebook +7466326684 phonebooth +746632686837 phonecounter +746636862377 phonenumbers +746637 phones +74667 simms +74668 shoot +7466837 shooter +74668377 shooters +7467 pimp shop +74673 rinse shore +746753 simple +7467533737 shopkeeper +74677 shops +746773 shoppe +7467737 shopper +74677464 shopping +74678 short +746787 shorts +7468 shot +74683 shove +746835 shovel +7468357 shovels +746845277 shotglass +7468486 shotgun +74686 photo +74686267437 photocopier +7468647274 photograph +74686472747 photographs +746867 photos +74688 shout +7469 show +74693 rinze +746937 shower +746937435 showergel +7469377 showers +747 rip sip sir +747283 pirate +7472837 pirates +7473 pipe rise +74735463 pipeline +747354637 pipelines +74736 siren +747367 sirens +74737 pipes +7474 pipi +747426 sirian +7474267 sirians +747435 shriek +747435464 shrieking +7474357 shrieks +74746 pipin +747463 shrine +747464 piping +747465 shrink +747466 siphon +747467 shrimp +7474677 shrimps +7474679 shrimpy +747666 shroom +7476667 shrooms +747683 shroud +7477 piss shsr +747733 pissed ripped +74774 pippi +74782 shrub +74782237437 shrubberies +747822379 shrubbery +747827 shrubs +747837 sister +7478377 sisters +747865 pistol +7478657 pistols +747866 piston +7478667 pistons +7478672683 ristorante +748 pit sgt sit +7482272 rhubarb +74824 pitch +7482437 pitcher +74824377 pitchers +7483 site +74833 shuff +74837 river +748372265 riverbank +748377 rivers +74866637 pitonner +7488 shut +7488283 situate +74883696 shutdown +7488837 shutter +74888377 shutters +7488853 shuttle +74888537 shuttles +7488853763 shuttlepod +749 six +7493 size +74943 pixie +74963 rhyme +74974225 physical +749742426 physician +7497427 physics +7498336 sixteen +74984 sixth +749846 rhythm +749893433 sixtyfife +749893483 sixtyfive +749896463 sixtynine +74992 pizza +74992488 pizzahut +74993742 pizzeria +75 pj rl +7522 slab +7522273 placard +75222737 placards +75223 place +7522326 placebo +752237 placer places +752257 slacks +75243 plaid +75246 plain +752467 plains +7526 plan slam +75263 plane +752638 planet +75263827486 planetarium +7526387 planets +75265 plank +752657 planks +7526637 slammer +75268 plant +7526837 planter +75268377 planters +752687 plants +7527 plas slap +75274 slash +7527437 slashes +752762 plasma +752783 plaque +7527837 plaques +7527842 plastic +7528 slat +75283 plate slave +7528328 plateau +75283676 platform +752837 plates skater slaves +752844837 slaughter +75286 plato +75287 slats +7528837 platter +75288377 platters +75288676 platvorm +7529 play slay +75292 plaza +752937 player +7529377 players +75294475 playgirl +7529464 playing +7529476863 playground +752962537 playmaker +75323 plead +753273 please +75327873 pleasure +753299 sleazy +7533 sled +753343 sledge +753343426637 sledgehammer +75337 sleep +75337464 sleeping +75353866 skeleton +753538667 skeletons +753824 sketch +754 ski +75423 slice +75433 slide +7543464 sliding +75437 skies +7545538 skillet +75455387 skillets +7546 skim skin +754627326 skincream +75463 slime +75464 pling sling +754647468 slingshot +75465 slink +7546637 skimmer +754684 plinth +7547 skip slip +7547737 skipper slipper +75477377 slippers +75478 skirt +7548 slit +75488437 skivvies +7566437 plonger +75673 slope +756737 slopes +7568 plot slot +756844 plough slough +75687 pjotr plots slots +7569 plow slow +756937 slower +756959 slowly +75825 pluck +758343 sludge +7584 plug slug +75847 slugs +7585 rlul +75855 skull +758557 skulls +7586 plum +7586237 slumber +75862464 plumbing +758643 plunge +7586437 plunger +75865 plunk +7587 plus +75877 slurp +7588 slut +759 sky +75954448 skylight +7595463 skyline +7597272737 skyscraper +75972727377 skyscrapers +76 so +762 rob +762237 robber +7622372255 soccerball +7622379 robbery +76224 roach snach +76225 smack snack +762257 snacks +7623 road robe +762325625 roadblock +76237 roads robes sober +762378 robert +7623929 roadway +7624 snag +762425 social +76243 poche roche +762437 rocher roches +7624389 society +76245 snail +76246 robin +7625 rock soak sock +76253 snake +762537 rocker snakes +762537546 snakeskin +762538 pocket rocket socket +7625382665 pocketbook +7625387 pockets rockets +7625464 rocking +76255 small +7625537 smaller +76257 rocks socks +76257453 rockpile +7626 roam +76268 robot +7626842 robotic +7626848273 robotguard +762687 robots +7627 snap soap +76272837 socrates +76273 snare +76274 smash +76274389 sobriety +76277 soaps +76278 roast +762824 snatch +76287 pocus +763 pod rod sod +7632 soda sofa +76325 sneak +7632537 sneaker +76325377 sneakers +76327 smear sofas +7632767 sodapop +763277 smears +763368 rodent +76336862 rodentmc +763368626844387 rodentmcnuggets +763393 sneeze +76344464 smegging +76347 rmdir +763486 podium +76355 smell +763559 smelly +7636 poem +76366493 sodomize +7637 pods rods +7638 soft +76383637 softener +763837465 softdrink +7638374657 softdrinks +763862842 pneumatic +763879 poetry +76389 softy +76389273 software +7642 soga +76433 sniff +76437 roger +7643837 snifter +7645 soil +76453 smile +764533 soiled +764543 smilie +7645464 smiling +76459 smily +76468 point +764689 pointy +76473 snipe +764737 sniper +76475 smirk +764766 poison +76476633 poisoned +76477 snips +7647737 snipper +76477377 snippers +76483 rogue smite +764837 rogues +76484 smith +764849 smithy +765 rol +76527 solar +7653 poke pole +7653437 soldier +76534377 soldiers +7653626 poleman +7653666 pokemon +76536662655328466 pokemoncollection +76537 poker poles +765423 police +765423626 policeman +765423636 policemen +7654248 solicit +76543 solid +765474 polish +765484225 political +76548427 politics +7655 roll +765533 rolled +765536 pollen +765537 roller +76553726837 rollercover +7655464 rolling +7655867 rolltop +765588466 pollution +76567 rojos +765722 solrac +76583 solve +76588466 solution +766 poo ron son +76624 pooch +766253 ronald +7662623 romance +76627376 sombrero +7663 pond poof roof some +7663464 roofing +76637 roofs +7663837 poofter +766384464 something +7663867 rooftop +7664 pooh song +76642 sonia sonic +76642327 poohbear +76647 songs +7665 pool +76653 smoke +766533 smoked +766537 smoker smokes +7665378225 smokestack +766574275 poolshark +7665742757 poolsharks +7665752937 poolplayer +76657529377 poolplayers +766578425 poolstick +766582253 pooltable +7666 room smoo soon +766624 smooch +766637 pommes +7666537 snooker +76667 rooms snoop +766684 smooth +76669 sonny +766693 snooze +7667 poop poor romp sons +766738358 roosevelt +76678 snort +7667837 rooster +7668 root soot +76682337 rootbeer +766823377 rootbeers +766843 soothe +76687 roots +76687453 sootpile +7669 pony snow +7669227853 snowcastle +766926273 snowboard +766926273464 snowboarding +766935253 snowflake +76694668377 snowhooters +766946873 snowhouse +7669626 snowman +76697266837 snowscooter +766972668377 snowscooters +76697827 snowstar +766978277 snowstars +767 pop pos +76723737 sorcerer +7672379 sorcery +76724 porch +767279 rosary +7672873 porcure +7673 rope rose sore +7673523337 ropeladder +7673552 rosella +76736279 rosemary +76737 ropes roses +767377 posess +7673882 rosetta +76748466 position +7675 pork +767674342 soporific +76773 posse +7677377 possess +76773774667 possessions +76774253 possible +76774343 porridge +7677437 poppies +76776473 porpoise +76779 poppy sorry +7678 port post sort +76782253 portable +767825 portal +7678257 portals +7678269 postbox +7678285547 portcullis +76783 porte +767837 porter portes poster +7678377 posters +7678426 portico +7678437 portier +76784653 porthole +767846537 portholes +767847 sortir +7678626 postman +76786275 postmark +7678627837 postmaster +7678633423 postoffice +76787 ports posts +76787248 portrait +767872487 portraits +7678786 rostrum +768 pot +76824 pouch +7682437 pouches +768283 rotate +768286 potato +7682863 potatoe +76828637 potatoes +768328 poteau +76833 snuff +768343 smudge +7683437 smudges +7684 snug +7684323 pothead +76844 rough +76844288 roughcut +7684453 snuggle +768466 potion +7685 soul +7685879 poultry +76863 pound round sound +768632527837 soundblaster +768637 rounds sounds +76867 rotor +7687 pots pour soup sous +768723 source +76873 rouse smurf soupe +768747 souris +76883 route +768833 rotted +768836 rotten +768837 potter routes +76884 south +768843278 southeast +768849378 southwest +76889 potty +769 row roy +7692628 rowboat +76926287 rowboats +769337 powder +76933733 powdered +769337346437 powderfinger +7693379 powdery +76937 power +769377 powers +772 spa +77223 space +772232665437 spacecookies +7722327238 spacecraft +77223626 spaceman +772237447 spaceship +772237488853 spaceshuttle +77223762538 spacerocket +772237848 spacesuit +7722378487 spacesuits +7722425 spacial +77228423 practice +772324 sq2dbg +77233 spade +7724 pr24 +772473 praise +7724743 prairie +77247437 prairies +77256 psalm +7725623 psalm23 +772567 psalms +77256723 psalms23 +7726 pram +7726474 spanish +77265 spank +7726637 spanner +77273 spare +77275 spark +7727553 sparkle +77275537 sparkles +772755464 sparkling +7727559 sparkly +772757 sparks +7727599263 sparkywand +7727769 sparrow +7727842 spastic +7728425 spatial +77284253 spatiale +7728852 spatula +7729 pray spaz +77296 prawn +77299 spazz +772992 spazza +773 sq3 +773224 preach +77322437 preacher +773233464 preceding +77324 pqdbg +7732425 special +77324626 speciman +77324636 specimen +773246367 specimens +77324687 precious +773247423 precipice +77325 speak +7732537 speaker +77325377 speakers +77327 spear +773276468 spearmint +773277 spears +773282253 spectacle +77328225345277 spectacleglass +7732822537 spectacles +7732837 specter +77328377 specters +7732873 spectre +77333 speed +773339 speedy +77355 spell +773552665 spellbook +773557 spells +77363 spend +7736373 prendre +7737273 prepare +773727478466 prescription +7737368 present +773736828466 presentation +773743368 president +7737433687 presidents +77376 sperm +77377 press +773772273 presscard +773773 presse +77377873 pressure +7738 pret +77384687 previous +7738735 pretsel +7738745 pretsil +7738753 pretsle +773889 pretty +7739 spew +774 pri +77423 price spice +774237 spices +774237225 spicerack +77424686 sphagnum +77425 prick +774337 spider +7743372248 spiderbait +7743377 spiders +774337932 spiderweb +774373 sphere +774378 priest +774378377 priestess +7743787 priests +774468 spigot +774469 sphinx +77453 spike +774537 spikes +77455 spill +77459 spiky +7746 spin +774623 prince +7746237 princes +77462377 princess +774624725 principal +774625 spinal +77463 spine +77467489 priority +77468 print +7746837 printer +77468464 printing +774725 spiral +77473 spire +774748 spirit +7747487 spirits +77476 prism +774766 prison +77476637 prisoner +7747667 prisons +7748 spit +7748283 private +7748853 spittle +77493 prize +77496 prizm +775274 splash +775433 spliff +77548 split +77622253 probable +77623 probe +7762333 proceed +7762377 process +776237737 processes +7762377464 processing +776237767 processor +7762536 problem +7762873 procure +7763 prod rsoe +7763337 proffer +776348 profit +7763823 produce +77638237 producer +7764726 program +7764726633 programmed +7764726637 programmer +77647267 programs +77647377 progress +7765328466 projection +77653284667 projections +776625 promak +77663 spoof +776636233 promenade +7766384387 prometheus +776643 sponge +77665 spook spool +776657 spooks +776659 spooky +77666 spoon +77666385 spoonful +776663857 spoonfuls +776667 spoons +77673 prose spore +776732327464 sporebearing +776735 propel +776735537 propeller +7767355377 propellers +776737 spores +77673789 property +7767438 prophet +776749522842 prophylactic +7767495228427 prophylactics +77676725 proposal +7767673 propose +77676748466 proposition +776784 prosti +7767848883 prostitute +77678488837 prostitutes +776787 sports +776787283 prostrate +7768 spot +7768328466 protection +7768328483 protective +7768378 protest +776837837 protester +7768378377 protesters +7768433 provide +7768474667 provisions +77687 spots +77688 spout +77729 spray +777323 spread +77736437 sprenger +77744 sprig +777464 spring +77746553 sprinkle +777465537 sprinkler +7774655377 sprinklers +777465537797836 sprinklersystem +777468 sprint +777483 sprite +7774837 sprites +777688 sprout +777823 spruce +778273 square +778274 squash +77828 squat +7783393 squeeze +77843 squid +778437 squids +778474 squish +77847735 squirrel +778477357 squirrels +778478 squirt +778499 squizz +77877435 squrriel +779 pry spy +779227 prybar +77945277 spyglass +7794653 spyhole +78 st sv +782 pub rub +7822 stab +78223 stace +782237 rubber +7822377 rubbers +78223775268 rubberplant +782239 stacey +7822397 staceys +7822474 rubbish +78225 stack +782253 rubble stable +78229 stacy +782297 stacys +7823 quad rube +78233 staff +78237 pubes +7823726453 quadrangle +7823745283725 quadrilateral +7824 such +78242 pubic +78243 stage +7824326224 stagecoach +78245 quail +78246 stain +7824633 stained +78246473 quagmire +782467 stains +78247 stair +782472273 staircase +782477 stairs +782477837 stairstep +7824778377 stairsteps +78247929 stairway +782479355 stairwell +7825228483 stalactite +78252284837 stalactites +7825246483 stalagmite +78252464837 stalagmites +78252484837 stalagtites +78253 stake +782537 stakes +782542 public +782542493 publicize +782547437 publisher +7825474464 publishing +7825489 quality +78255 stalk stall +782553 suckle +782557 stalls +78263 stand +78263273 standard +78263377 standers +78263464 standing +782637 stands +78263743 submerge +78263773 submerse +782648 submit +7826539 stanley +78267 stamp +782692 stanza +7827 star +78272273 starbase +782727238 starcraft +78273 stare +78273474 starfish +78274 stash +78276362 subpoena +782763627 subpoenas +78277 stars +78277447 starship +78278 start +782782623 substance +7827833 started +7827837 quarter +78278372225 quarterback +78278377 quarters +782784888466 substitution +7828 stat +78283 state +782836368 statement +7828363687 statements +7828466 station +78284667 stations +7828478427 statistics +78287 stats +782883 statue +7828837 statues +782883883 statuette +782887 status +7829 ruby stay +782929 subway +78325 steak steal +783257 steaks +78326 steam +7832637 steamer +783267447 steamship +7832674477 steamships +78327464 stearing +7833 puff rude +783326 stefan +783336 sudden +783337 rudder +78335 steel +783353 puddle ruffle +7833537 puddles +78336 queen +78337 queer steer +78337464 steering +7833753 steeple +783377 steers +78339 puffy +783522844 stelbaugh +7836 stem sven +783624 quench stench +7836633 stemmed +78367 stems +7837 step suer +78372322895 pteradactyl +783727287 pterasaur +783736 stereo +783736797836 stereosystem +78374 steph +783742643 stephanie +783745493 sterilize +7837523337 stepladder +7837643 steroid +78376437 steroids +783767287 pterosaur +78377 steps +78377464 stepping +78378 quest +78378466 question +78379 query +78383 steve +783836 steven +7839 stew +7839728 stewrat +784 rug +7842433 suicide +78425 quick stick +7842537 sticker +78425377 stickers +78425378 quickest +784254 quicki +7842543 quickie +7842559 quickly +784257 sticks +784257263 quicksand +784259 sticky +78427 sugar +78433 stiff +78433356 stiefeln +784334 stiffi +7843343 stiffie +784337 stiffs +784339 stiffy +78438 quiet +7844378466 suggestion +78454 quiki +78455 still quill +78458 quilt +784587 quilts +7846 ruin +78465 stink +7846546 stinkin +78465464 stinking +784659 stinky +78466 quinn +78467 ruins +7847 rugs stir +7847737 stirrer +78477377 stirrers +7848 puit quit suit +78482273 suitcase +784824 stitch +78483 quite suite +78487 puits suits +7848837 quitter +7853 puke rule +78533 puked +78535463925537 pukelinewalker +78537 ruler rules +785387 sulfur +7855 pull rull +78552673 pullcord +785539 pulley +78573 pulse +78573729 pulseray +785737297 pulserays +7857374353 pulserifle +78573743537 pulserifles +785748 pulpit +786 rum run sun +7862284464 sunbathing +7862326 sunbeam +78624 punch +78625 stock +786253 rumble +7862537 rumbles +78625463 sunblind +7862546337 sunblinder +78625464 stocking +786254647 stockings +78625625 sunblock +786257453 stockpile +786257666 stockroom +78628873 puncture +786337 sunder +7864 rung sung +7864527737 sunglasses +78647 rungs +7864746368 punishment +7865 punk +786536 stolen +786537 punker +7866224 stomach +7866243 rummage +78663 stone +786631 stone' +786635 pummel +786637 stones summer +786639675 stonework +78665 stool +786657 stools +78667 stomp +78669 sunny +7867 pump stop suns +78672 stop2 +7867243 storage +78672437666 storageroom +78673 store +78673533737 storekeeper +786735784587546 rumpelstiltskin +786737 stores +786737666 storeroom +786738 sunset +7867464 pumping storing +7867473 sunrise +786753784587546 rumplestiltskin +78676 storm +786767 storms +78677 pumps +7867737 stopper +78679 story +7868 punt +786826 suntan +7868266464 suntanning +78683 stove +78683867 stovetop +7869 stow +787 7up pup sup +78724273 purchase +787242737 purchaser +78724448 straight +7872444836 straighten +787246 strain +787248 strait +787248522538 straitjacket +7872643 strange +78727 strap +78729 straw +78729626 strawman +7873 sure +7873223 surface +787326 stream +78733 puree +787338 street +78733832623 streetdance +78733854448 streetlight +787338544487 streetlights +7873387 streets +78733874663 streetphone +7873389327 streetwear +78736484 strength +78737 super +787373278 superfast +787374583 superglue +7873747277 supergrass +787377527 superplas +7873784767 supervisor +7873824 stretch +7874 push +787428679 purgatory +78743437 purifier +787437 pusher +7874377 pushers +7874464 pushing +78745 pupil +787453 strike +787457 pupils +787464 string +7874647 strings +78747 strip +787473 stripe +7874733 striped +7874737 stripes +7874746 pushpin +787477 strips +78747732724 stripsearch +78749 strix +787653 stroke +787655 stroll +787664 strong +787664269 strongbox +7877 russ +78773 purse +7877328 suspect +78773287 suspects +7877363 suspend +787736337 surrender +787738 puppet +7877426 russian +787743 puppie +787753 purple +78775437 supplies +7877587 surplus +787759 supply +7877673 purpose +7877678 support +787767837 supporter +78776787 supports +787768634647 surroundings +78777473 surprise +78779 puppy pussy +78779228 pussycat +7878 rust +7878246 sustain +787828873 structure +7878288737 structures +787834552623 surveillance +787839 survey +78784825 survival +78786738 strumpet +78788 strut +7878873 rupture +78789 rusty +788 put +7883 stud +78833 stuff +78833464 stuffing +7883368 student +78833687 students +788346 studio +78839 study +7886 stun +78867 stump +788677 stumps +788743 putrid stupid +788837 sutter +7888377 sutters +789 sux +789953 puzzle +79 sw +7925569 swallow +7926 ryan swan +79267 swamp swans +792679 swampy +7927 swap +79276 swarm +79276464 swarming +79278422 swastica +792784223524 swasticaflag +7927842235247 swasticaflags +7928 swat +7929 sway +793 rye +79327323 ryebread +79328 sweat +79337 sweep +7933737 sweeper +79338 sweet +7944 swig +79455 swill +7946 swim +79464 swing +794647 swings +79464738 swingset +79466437 swimmies +79466464 swimming +79467848 swimsuit +794687687377 swimtrousers +79473 swipe +79477 swiss +794824 switch +79482425233 switchblade +794824269 switchbox +79482437 switches +795 syl +796265 symbol +7962657 symbols +79673 sword +796737 swords +796737626 swordsman +7967376267 swordsmans +79684 synth +79684374937 synthesizer +796843842 synthetic +79687 pyotr +7972643 pyramid +7973 pyre +797836 system +79787 syrup +797877 syrups +798466 python +799764912 sw9764912 +82 ta u2 +822 tab vac +82227226 tabascco +82235 tabel +8225 tack +82253 table +822537 tables +822538 tablet +8225387 tablets +822553 tackle +8226 taco +8227 tabs +823 tad +82337 vader +8238 taft +824 tag tai +824462 vagina +824484 tahiti +8245 tail +824567 tailor +82457223 tailrace +8246 vain +8247268 vagrant +82477328 vaisseau +8252 ucla +82526423 valanice +8253 take tale +825464 taking +825473 valise +82547626 talisman +8255 talk tall +825539 valley +825543 talkie +825586463 valjumine +8257 takr +82583 value valve +825837 valves +826 tan van +8263 tame vane +826325473 vandalise +826325493 vandalize +82647 tamir +826489 vanity +8265 tank +82657 tanks +8266464 tanning +8267473 vampire +82674737 vampires +826766 tampon +827 tap var vcr +82726 taran +8273 tape vase +8273554 taselli +82737 taper vases +8273787437 tapestries +82737879 tapestry +82742253 variable +827438 target +8274387 targets +82767493 vaporize +827677 vapors +8277 taps +82783 taste +8279 tarx +828 vat +82822 ucucc +82837 tater +828376 tavern +828377 taters +82858 vault +828866 tattoo +829 tax +8294 taxi +8294222 taxicab +83 ve +832 tea +8322437 teacher +83224464 teaching +832287 teacup +8324642426 technician +83246424267 technicians +8324647837 techniques +8324665649 technology +8326 team +83267 teams +8327 tear +83277 tears +833 ted +83339 teddy +833392327 teddybear +8336 teen +83362437 teenager +833833 teevee +83384 teeth +834382253 vegetable +8343822537 vegetables +8343828466 vegetation +8344235 vehicel +8344253 vehicle +83442537 vehicles +8344437 veggies +8345 veil +8346 vein +835246 telbin +8353 tele +835372673 telescope +8353726735367 telescopelens +83537267353673 telescopelense +8353726742 telescopic +835374663 telephone +8353746632273 telephonecard +83537466326684 telephonebooth +8353746636862377 telephonenumbers +8353746637 telephones +83537466464 telephoning +83537678 teleport +8353767828466 teleportation +8353767837 teleporter +8353847466 television +83538474667 televisions +8353847466738 televisionset +8353882243 teletubbie +83538822437 teletubbies +835388229 teletubby +8353882297 teletubbys +8355 tell +835537 teller +835543 tellie +8355437 tellies +83559 telly +836 ten ufo +83633629 tendency +836337 tender vender +8363387 vendeur +8363464 vending +83634646224463 vendingmachine +83648258466 venitaltion +836637 tenner +836647 tennis +83666 venom +836753 temple +83676 tempo +83676725 temporal +83678 tempt +8368 tent vent +83682253 tentacle +836822537 tentacles +83682528466 ventalation +83684 tenth +83684258466 ventialtion +83684528387 ventilateur +83684528464 ventilating +83684528464724238 ventilatingschaft +83684528466 ventilation +8368452846674238 ventilationshaft +836845284667473 ventilationpipe +8368452846674737 ventilationpipes +836845284668823 ventilationtube +8368452846688237 ventilationtubes +8368452867 ventilator +83687 tents vents +837 ver +837225493 verbalize +8372632 veranda +837268766 vercotron +8375 tesk +837638536 vermeulen +837646 vermin +83764625 terminal +837646257 terminals +837646283 terminate +83772 terra +8377223 terrace +8377246 terrain +83773 verse +837735 vessel +8377466 version +837767 terror +837778 tessst +8378 test vest +83783272 vertebra +837832723 vertebrae +837837 tester +83784253 testicle +837842537 testicles +837842853 vestibule +8378452 tequila +83784552 tequilla +8379 very +838 vdu +8383 veve +8387 vdus +838747 tetris +8398 text +8398453 textile +83987 texts +84 uh vi +842 thc vic +84225 tical +84246489 vicinity +8425 tick vial +842538 ticket +8425387 tickets +842553 tickle +84257 vials +8426 than +84265 thank +842657 thanks +84272 tiara +8428 that +8428227 tictacs +842846 victim +8428463 victime +84284637 victimes +842867 victor +84288257 victuals +843 the tie +8432837 theater +8432873 theatre +8433 thee +84336 video +8433673267337 videorecorder +843368273 videotape +84338 theft +8434263 vidgame +84347 their +8436 them then +8436735837 themselves +843679 theory +84373 there these +8437368337844 vierenveertig +8439 tidy view +8439464 viewing +8439727336 viewscreen +84397273367 viewscreens +84397678 viewport +843976787 viewports +844 vii +84425 thick +8442538 thicket +84433 thief +84437 tiger +844383 thieve +8444 viii +84444 thigh +844447 thighs +84448 tight +8444859 tightly +8446 thin +8446253 thimble +8446253385 thimbleful +84462537 thimbles +84463 thine +84464 thing +84464262544 thingamajig +844647 things +844649 thingy +84465 think +84465464 thinking +8447 this +84473 third +84478336 thirteen +844789 thirty +84484 uhhuh +8448437 thither +84529 vijay +8453 tile vile +84537 tiles +84539675 tilework +8454 tiki +84547 tikis +8455 till +8455243 village +84553 ville +8459 ugly +846 tin vin +846237 timber +8462377 timbers +846246489 vincinity +8463 time vine +846337 tinder +8463427 vinegar +84637 timer times vines +846374323 timepiece +846382253 timetable +8463822537 timetables +846437 tinier +846464 timing +846472 viogra +8465283 violate +8465368 violent +846538 violet +846543 tinkie +846543946543 tinkiewinkie +846546 violin +846553 tinkle +84659 tinky +8465994659 tinkywinky +846627 thomas +84664 thong +84668 timov +8467 thor +846729463 thorazine +84673 those +84676 thorn +846767 thorns +8468 thou +846844 though +8468448 thought +84684487 thoughts +84687263 thousand +8469 tiny +847 tip +847243 visage +847274 thrash +8473 tire +847323 thread +8473237 threads +847328 threat +84733 three tired +847337 tireds +84737 tires viper +8474 virh +8474253 visible +847446 virgin +847468 vishnu +84748 visit +8474867 visitor +84748677 visitors +847628 throat +847647 tiroir +847663 throne +847664 throng +8476844 through +84768853 throttle +84769 throw +8476937 thrower +84769464 throwing +8477 tips +847739 tippex +847783 tissue +8477837 tissues +8478 thru +847825493 visualize +84786 thrum +847863 tiptoe +847866464 thrumming +8478664647 thrummings +847867 thrums +84787 virus +8478737 viruses +847878 thrust +84787837 thruster +847878377 thrusters +848 tit +84826 titan +8482642 titanic +84826427 titanics +8484 uhuh +848437 tities +84847 thugs +84853 title +848537 titles +84862 thumb +8486337 thunder +84867 thump +8487 tits +84875464 titsling +8488437 titties +84889 titty +849 thy +8494225 thwhack +84963 thyme +8497353 thyself +853623 ulence +8539 ukey +85872 ultra +858723278 ultrafast +86 to +8622226 tobacco +86225493 vocalize +8623 toad +862378665 toadstool +8623786657 toadstools +8624246 unchain +8625684 uncloth +86256843 unclothe +862568433 unclothed +862658 unbolt +8626837 uncover +86273552 umbrella +86278 toast +8627837 toaster +86282553 unbuckle +862833 uncuff +863 toe +86327836 unfasten +8632784 unearth +86329 today +863297 todays +863323 undead +8633537 toddler +86337 under +8633725684464 underclothing +8633726837 undercover +8633727874 underbrush +86337476863 underground +8633763284 underneath +863376678 undermost +8633772687 underpants +8633778263464 understanding +8633792837 underwater +863379327 underwear +8633796753 underworld +86338837 unfetter +86352 vodka +8636 todo undo +863653 unfold +863737 undres +8637377 undress +863737733 undressed +8639 undy +86423 voice +864237 voices +8642676 unicorn +864285 vohaul +8642857 vohauls +8643 void +864336843433 unidentified +8643676 uniform +86436767 uniforms +86438437 together +864453 toggle +8644824 unhitch +8645283 toilate +864538 toilet +86453835874 toiletflush +8645387 toilets +86453872737 toiletpaper +8645387328 toiletseat +864657837 unholster +86466 union +864665 unhook +8648 unit +86483 unite +864831 unite! +864837725 universal +86483773 universe +8648377489 university +86487 units +8652266 volcano +8652824 unlatch +86529385 unlawful +8653 toke +86536 token +865367 tokens +8654448 unlight +86548 unlit +865623 unload +865625 unlock +8656696 unknown +865669619673 unknown.word +8658243 voltage +865863 volume +8658637 volumes +866 tom too +8662 tomb +86624295 tomahawk +86627 tombs +866278663 tombstone +8662786637 tombstones +866286 tomato +8663 tome tone +866366 voodoo +86637 tomes tones +86642 tonic +86648 vomit +866483 tongue +8665 tool +8665269 toolbox +86657 tools +86657433 toolshed +86667769 tomorrow +8667837 vonster +86678377 vonsters +8668 toot +86684 tooth +8668433 toothed +8669 tony +86697 tonys +867 top vms +86724 torch +8672437 torches +86725426 vorakian +8672726253 unscramble +8672739 unscrew +86732873 unsecure +86733 topee +86746283 unrinate +867584 unplug +8676 torn +8676236 tornado +8676336426 tormeenian +86763364267 tormeenians +867655 unroll +8676678 topmost +8677 tops toss +867737 tosser +86774 topsg +86776 torso +8677645 topsoil +867839 vortex +86784552 tortilla +8678873 torture +868 tnt +8682 v6ta +86824 touch +868243 touche +8682437 touches voucher +86824464 touching +86825 total +8682559 totally +86826453 untangle +868345 unveil +86836 totem +86843 untie +86845 until +86873 toupe +868732 toupea +868733 toupee +8689 unty +869 tow toy +869243 voyage +869273 toward +8692737 towards +86935 towel +869353883 towelette +869357 towels +86937 tower +869377 towers +86946 toxin +8695263 toyland +8696 town +86966873 toymouse +86967 towns +86967447 township +8697 toys vows +87 tp ts up us vs +87223 trace +87225 track +87225464 tracking +87233 trade +8723342 traffic +87245 trail +8724537 trailer +872457 trails +87246 train +87246377 trainers +872467 trains +8724825 upchuck +8726 tram +87267 tramp +87267337 transfer +872674368 transient +8726748 transit +872675283 translate +8726752837 translater +87267528464 translating +87267528466 translation +8726752867 translator +87267648 transmit +87267648837 transmitter +87267766337 transponder +872677678 transport +87267767828466 transportation +87267767837 transporter +872677678464 transporting +8727 trap +87273667 trapdoor +87274 trash +87274226 trashcan +872742267 trashcans +87274227538 trashbasket +87274246 trashbin +872742467 trashbins +872773 trappe +872835 travel +87283537 traveler +872835464 traveling +872835537 traveller +87283773 traverse +87286582 travolta +8729 tray +873 use +87323 tread +873236455 treadmill +873237 treads +87327873 treasure +87327879 treasury +87328 treat +8733 tree used +873346873 treehouse +8733626 treeman +8733636 treemen +87337 trees +8735377 useless +873624 trench +8736242628 trenchcoat +87364 tseng +8737 user +87386378433356 tretoestiefeln +874 uri +87423 tribe +87425 trick +8742863 tribune +87429253 tricycle +8743368 trident +874368 urgent +8744437 trigger +874478 tshirt +8746 trio +874625 urinal +8746283 urinate +87463 urine +87464 using +87465387 trinkets +8746637 trimmer +8747 trip +8747233 upgrade +87543837 uplifter +876 urn +876225 trobak +87627 urmas +8763 trod +8764563983 troglodyte +87655 troll +876557 trolls +87658738 usoltsev +8766 upon +87666 vroom +876666 vrooom +87667 troop +8766737 trooper +87667377 troopers +8767 urns +87674437 trophies +876749 trophy +8768 trou +8768253 trouble +876844 trough +87687 trous +87687377 trousers +876935 trowel +87695 trowl +87737 upper +877376678 uppermost +877433 upside +877658738 ussoltsev +87782477 upstairs +87825 truck usual +8783 true +87832 truda +878524272 tsukahara +87859 truly +8786353 trundle +87865 trunk +878657 trunks +8786738 trumpet +879 try +88 tv +881 tv. +882 tub +882243 tubbie +8822437 tubbies +8823 tube +88237 tubes +882537 tucker +8836745 utensil +88367457 utensils +8838 tuft +88387 tufts +884 tug +8842628 tugboat +8845473 utilise +88454737 utiliser +8845489 utility +8845493 utilize +88547 tulip +885477 tulips +8858873 vulture +88588737 vultures +886253 tumble +8863 tune +88637 tunes +886464 tuning +886635 tunnel +8866357 tunnels +88669 tummy +887 tvs +88726 turbo +8873 turd turf +887336 tureen +88738 tvset +88746 turin +8875 turk +887539 turkey +8875397 turkeys +8876 turn +887682253 turntable +887738 turret +887828466 tvstation +887853 turtle +88837 utter +89325 tweak +893583 twelve +893689 twenty +8943353 twiddle +8944 twig +89447 twigs +8946 twin +89463 twine +8946543 twinkie +8946553 twinkle +89465537 twinkles +894655464 twinkling +89467 twins +89475 twirl +89478 twist +89537 tyler +896 two +8962656733 twocolored +89626568733 twocoloured +8973 type +911 911 +92 wc ya +922 waa zac +922237 yabber +9224379 zachery +9225379 zackery +9233 wade +923464 wading +924 wag yah +92437 wager +9245 wail +9245464 wailing +92457 wails +92466 wagon +924667 wagons +92478 waist +924782263 waistband +9248 wait +924837 waiter +9248464 waiting +92487377 waitress +924934 yahweh +925 yak +925268 walbot +9253 wake +92536 waken +9255 walk wall +9255268 wallbot +92552687 wallbots +925538 wallet +925543 walkie +925546 walkin +9255464 walking +925567 wallop +925569277 wallowars +92557 walls +925572737 wallpaper +92558476844 walkthrough +9255929 walkway +925688 walnut +9256887 walnuts +9263 wand +926337 wander +9264 wang +9265 wank yank +926537 wanker +9268 want +926833 wanted +92687 wants +9269 yaow +927 war yap zap +9273 ware yard +9273273 warfare +927346873 warehouse +9273468737 warehouses +92737 wares yards +92737623 wardrobe +927376237 wardrobes +927378425 yardstick +9274 wash +927422746 washbasin +927425684 washcloth +927426 zarian +92742695 washbowl +92742876 washburn +927437 washer +9274377 washers +9274464 washing +92744646224463 washingmachine +9274464866 washington +9275625 warlock +9276 warm yarn +9276464 warning +9277 warp wars wasp +9277268 warrant +9277467 warrior +92774677 warriors +92777 wasps +927777333 warpspeed +9277978425 zappystick +92783 waste +92783226 wastecan +92783227538 wastebasket +92783246 wastebin +9278372737 wastepaper +92824 watch +9282437 watcher +9282486937 watchtower +9283 wave +92837 water waver waves +9283722746 waterbasin +92837266537 watercooler +928373255 waterfall +9283732557 waterfalls +9283737668 waterfront +928374653 waterhole +928377 waters +92837737378647 waterreservoir +928377473 waterpipe +9283774737 waterpipes +92837929 waterway +9284 xavi +928766 watson +929 wax way +92937 waxer +93 we ye +932 web yea +9324 yeah +932568 zealot +9327 wear webs year +93272 zebra +9327357 weasels +932766 weapon +9327667 weapons +93283 weave +9328437 weather +9328437627 weathermap +933 wed wee +9333 weed +933332837 weedeater +9333464 wedding +93337 weeds +93339422537 weedwhacker +9335 week +9337 weep +9337464 weeping +93378 weest +93444 weigh +934448 weight +9344487 weights +93473 weird +934736 weirdo +934737 weiser +9352663 welcome +93532 zelda +9355 well yell +9355464 yelling +935569 yellow +93556933 yellowed +93557 yells +935827 zeltar +9358277 zeltars +93582771 zeltars) +93624 wench +93666 xenon +9368 went +937 yep yes +9373 werd +9378 west +937837329 yesterday +938 wet +9384 yeti +9387 zeus +9387848 wetsuit +94 xi +94225 whack +9422537 whacker +94253 whale +9425317 whale's +94273 wharf +9428 what +942824262225548 whatchamacallit +942827392 whatareya +94287 whats +94328 wheat +9433 wide wife +94335 wheel +94335227769 wheelbarrow +943357 wheels +94336 widen +94337 wifes +943438 widget +94353 wield +9436 when +94373 where +94373226887 whereabouts +943737 wheres +944 wig xii zig +94433 whiff +9444 xiii +94449 ziggy +944497 ziggys +94453 while +9447 whip whir zigs +9447539 whiskey +944757665 whirlpool +944759 whisky +94477 whirs +9447737 whisper +9447853 whistle +94483 white +944836377 whiteness +944839 whitey +94485267 whitlams +94499 whizz +945 wil +9452378 wilbert +9452478 wilbirt +94526 wilco +9453 wild +9453356937 wildflower +94533569377 wildflowers +9453376377 wilderness +94535433 wildlife +9455 will +9455387 willets +9455426 william +94554267 williams +945543 willie +94559 willy +945597 willys +945766 wilson +946 who +946264 whoami +9463 wind wine zine +946369 window +9463697 windows +9463697263 windowpane +94636972637 windowpanes +9463697455 windowsill +94636974557 windowsills +9463744353 windshield +946387 windup +9464 wing +946433 winged +94647 wings +9465 wink +94653 whole +946543 winkie +94659 winky +9466 wino +946637 winner +946643 winnie +9466464 winning +946674 whoosh +9466743 whoopie +9466948 whoozit +9467 wimp +94673 whore +946737 whores +9467866 winston +946837 winter +9473 wipe wire wise +94735377 wireless +947366 wisdom +94737 wires +9474 wish +947437 wishes +947464 wiring +94779 zippy +948 xiv +94824 witch +9482437 witches +94837 wives +9484 with +94843729 withdraw +94843729464 withdrawing +948437295 withdrawl +948446 within +9484688 without +9486377 witness +949 why wiz +949273 wizard +9499 wizz +9596223 zkxoabd +96 yo +962 yob +9626 yobo +9629 yoaw +9632 yoda +9643 woid +9653 wolf +9653626 wolfman +9653726 wolfram +965638 zoloft +96624 zombi +966243 zombie +9662437 zombies +966247 zombis +96626 woman +966267 womans +9663 wood zone +9663288837 woodcutter +96632888377 woodcutters +966336 wooden +966337 wonder +96635263 woodland +96636 women +966367 womens +96637 woods +96637433 woodshed +966378683 woodstove +96639 woody +96639273 woodward +9665 wool +9666 zoom +9666464 zooming +96666 zooom +9673 word +96737 words +9675 work york +967523624 workbench +96753 world +967537 worker +9675377 workers +96757 works +9675867 worktop +9676 worm worn +9676684486 zornothium +9677447 worship +96774477377 worshippers +967845377 worthless +968 you zot +96853 would +96863 wound +96864 young +968647837 youngster +9687 your +96873 youre youse +96877 yours +96877353 yourself +96884 youth +96884385 youthful +972484 wraith +9724847 wraiths +9727 wrap +9729 xray +97297 xrays +97325 wreck +97325243 wreckage +9732533 wrecked +973257 wrecks +973624 wrench +97362437 wrenches +9737853 wrestle +97478 wrist +9747892824 wristwatch +97483 write +974837 writer +9748464 writing +974846462837425 writingmaterial +97484647 writings +974846482253 writingtable +9748464822537 writingtables +97664 wrong +97683 wrote +98 xv +98222 yucca +982227256 yuccapalm +9846 yugo +987 wus yup +98992 wuzza +99 xx xy zz +99464 xwing +998 xxv +99867 zztop +999 xxx +99999 xyzzy diff --git a/dists/slackware/scummvm.SlackBuild.in b/dists/slackware/scummvm.SlackBuild.in new file mode 100755 index 0000000000..84ac94d7e9 --- /dev/null +++ b/dists/slackware/scummvm.SlackBuild.in @@ -0,0 +1,58 @@ +#!/bin/sh +# ScummVM Slackware 9(.1) Package Creation Script +# by Jay Lanagan - roni@parodius.com + +CWD=`pwd` +if [ "$TMP" = "" ]; then + TMP=/tmp +fi +PKG=$TMP/package-scummvm + +VERSION=@VERSION@ +ARCH=i486 +BUILD=1 + +if [ ! -d $TMP ]; then + mkdir -p $TMP +fi +if [ ! -d $PKG ]; then + mkdir -p $PKG +fi + +cd $TMP +# tar xzvf scummvm-$VERSION.tgz +tar xzvf scummvm-$VERSION.tar.gz +# cd scummvm-$VERSION +cd scummvm +chown -R root.root . +CXXFLAGS="-O2 -march=i486 -mcpu=i686" \ +./configure +make +strip scummvm +chmod 755 scummvm +mkdir -p $PKG/usr/bin +cp scummvm $PKG/usr/bin +chown -R root:bin $PKG/usr/bin +gzip -9 dists/scummvm.6 +mkdir -p $PKG/usr/man/man6 +cp dists/scummvm.6.gz $PKG/usr/man/man6 +mkdir -p $PKG/usr/doc/scummvm-$VERSION +cp -a AUTHORS COPYING COPYRIGHT ChangeLog NEWS README TODO \ + $PKG/usr/doc/scummvm-$VERSION +chmod 644 $PKG/usr/doc/scummvm-$VERSION +mkdir -p $PKG/install +cat $CWD/slack-desc > $PKG/install/slack-desc +mkdir -p $PKG/usr/share/pixmaps +cp -a icons/scummvm.ico icons/scummvm.xpm \ + $PKG/usr/share/pixmaps +mkdir -p $PKG/usr/share/applications +cp -a dists/scummvm.desktop \ + $PKG/usr/share/applications + +cd $PKG +makepkg -l y -c n $TMP/scummvm-$VERSION-$ARCH-$BUILD.tgz + +if [ "$1" = "--cleanup" ]; then + rm -rf $TMP/scummvm-$VERSION + rm -rf $PKG +fi diff --git a/engines/agi/wagparser.cpp b/engines/agi/wagparser.cpp new file mode 100644 index 0000000000..bac4a34454 --- /dev/null +++ b/engines/agi/wagparser.cpp @@ -0,0 +1,229 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include "common/stdafx.h" + +#include "common/file.h" +#include "common/util.h" + +#include "agi/wagparser.h" + +namespace Agi { + +WagProperty::WagProperty() { + setDefaults(); +} + +WagProperty::~WagProperty() { + deleteData(); +} + +WagProperty::WagProperty(const WagProperty &other) { + deepCopy(other); +} + +WagProperty &WagProperty::operator=(const WagProperty &other) { + if (&other != this) deepCopy(other); // Don't do self-assignment + return *this; +} + +void WagProperty::deepCopy(const WagProperty &other) { + _readOk = other._readOk; + _propCode = other._propCode; + _propType = other._propType; + _propNum = other._propNum; + _propSize = other._propSize; + + deleteData(); // Delete old data (If any) and set _propData to NULL + if (other._propData != NULL) { + _propData = new char[other._propSize + 1UL]; // Allocate space for property's data plus trailing zero + memcpy(_propData, other._propData, other._propSize + 1UL); // Copy the whole thing + } +} + +bool WagProperty::read(Common::SeekableReadStream &stream) { + // First read the property's header + _propCode = (enum WagPropertyCode) stream.readByte(); + _propType = (enum WagPropertyType) stream.readByte(); + _propNum = stream.readByte(); + _propSize = stream.readUint16LE(); + + if (stream.ioFailed()) { // Check that we got the whole header + _readOk = false; + return _readOk; + } + + // Then read the property's data + deleteData(); // Delete old data (If any) + _propData = new char[_propSize + 1UL]; // Allocate space for property's data plus trailing zero + uint32 readBytes = stream.read(_propData, _propSize); // Read the data in + _propData[_propSize] = 0; // Set the trailing zero for easy C-style string access + + _readOk = (_propData != NULL && readBytes == _propSize); // Check that we got the whole data + return _readOk; +} + +void WagProperty::clear() { + deleteData(); + setDefaults(); +} + +void WagProperty::setDefaults() { + _readOk = false; + _propCode = PC_UNDEFINED; + _propType = PT_UNDEFINED; + _propNum = 0; + _propSize = 0; + _propData = NULL; +} + +void WagProperty::deleteData() { + if (_propData != NULL) { + delete _propData; + _propData = NULL; + } +} + +WagFileParser::WagFileParser() : + _parsedOk(false) { +} + +WagFileParser::~WagFileParser() { +} + +bool WagFileParser::checkAgiVersionProperty(const WagProperty &version) const { + if (version.getCode() == WagProperty::PC_INTVERSION && // Must be AGI interpreter version property + version.getSize() >= 3 && // Need at least three characters for a version number like "X.Y" + isdigit(version.getData()[0]) && // And the first character must be a digit + (version.getData()[1] == ',' || version.getData()[1] == '.')) { // And the second a comma or a period + + for (int i = 2; i < version.getSize(); i++) // And the rest must all be digits + if (!isdigit(version.getData()[i])) + return false; // Bail out if found a non-digit after the decimal point + + return true; + } else // Didn't pass the preliminary test so fails + return false; +} + +uint16 WagFileParser::convertToAgiVersionNumber(const WagProperty &version) { + // Examples of the conversion: "2.44" -> 0x2440, "2.917" -> 0x2917, "3.002086" -> 0x3086. + if (checkAgiVersionProperty(version)) { // Check that the string is a valid AGI interpreter version string + // Convert first ascii digit to an integer and put it in the fourth nibble (Bits 12...15) of the version number + // and at the same time set all other nibbles to zero. + uint16 agiVerNum = ((uint16) (version.getData()[0] - '0')) << (3 * 4); + + // Convert at most three least significant digits of the version number's minor part + // (i.e. the part after the decimal point) and put them in order to the third, second + // and the first nibble of the version number. Just to clarify version.getSize() - 2 + // is the number of digits after the decimal point. + int32 digitCount = MIN<int32>(3, ((int32) version.getSize()) - 2); // How many digits left to convert + for (int i = 0; i < digitCount; i++) + agiVerNum |= ((uint16) (version.getData()[version.getSize() - digitCount + i] - '0')) << ((2 - i) * 4); + + debug(3, "WagFileParser: Converted AGI version from string %s to number 0x%x", version.getData(), agiVerNum); + return agiVerNum; + } else // Not a valid AGI interpreter version string + return 0; // Can't convert, so failure +} + +bool WagFileParser::checkWagVersion(Common::SeekableReadStream &stream) { + if (stream.size() >= WINAGI_VERSION_LENGTH) { // Stream has space to contain the WinAGI version string + // Read the last WINAGI_VERSION_LENGTH bytes of the stream and make a string out of it + char str[WINAGI_VERSION_LENGTH+1]; // Allocate space for the trailing zero also + uint32 oldStreamPos = stream.pos(); // Save the old stream position + stream.seek(stream.size() - WINAGI_VERSION_LENGTH); + uint32 readBytes = stream.read(str, WINAGI_VERSION_LENGTH); + stream.seek(oldStreamPos); // Seek back to the old stream position + str[readBytes] = 0; // Set the trailing zero to finish the C-style string + if (readBytes != WINAGI_VERSION_LENGTH) { // Check that we got the whole version string + debug(3, "WagFileParser::checkWagVersion: Error reading WAG file version from stream"); + return false; + } + debug(3, "WagFileParser::checkWagVersion: Read WinAGI version string (\"%s\")", str); + + // Check that the WinAGI version string is one of the two version strings + // WinAGI 1.1.21 recognizes as acceptable in the end of a *.wag file. + // Note that they are all of length 16 and are padded with spaces to be that long. + return scumm_stricmp(str, "WINAGI v1.0 ") == 0 || + scumm_stricmp(str, "1.0 BETA ") == 0; + } else { // Stream is too small to contain the WinAGI version string + debug(3, "WagFileParser::checkWagVersion: Stream is too small to contain a valid WAG file"); + return false; + } +} + +bool WagFileParser::parse(const char *filename) { + Common::File file; + WagProperty property; // Temporary property used for reading + Common::MemoryReadStream *stream = NULL; // The file is to be read fully into memory and handled using this + + _parsedOk = false; // We haven't parsed the file yet + + if (file.open(filename)) { // Open the file + stream = file.readStream(file.size()); // Read the file into memory + if (stream != NULL && stream->size() == file.size()) { // Check that the whole file was read into memory + if (checkWagVersion(*stream)) { // Check that WinAGI version string is valid + // It seems we've got a valid *.wag file so let's parse its properties from the start. + stream->seek(0); // Rewind the stream + if (!_propList.empty()) _propList.clear(); // Clear out old properties (If any) + + do { // Parse the properties + if (property.read(*stream)) { // Read the property and check it was read ok + _propList.push_back(property); // Add read property to properties list + debug(4, "WagFileParser::parse: Read property with code %d, type %d, number %d, size %d, data \"%s\"", + property.getCode(), property.getType(), property.getNumber(), property.getSize(), property.getData()); + } else // Reading failed, let's bail out + break; + } while (!endOfProperties(*stream)); // Loop until the end of properties + + // File was parsed successfully only if we got to the end of properties + // and all the properties were read successfully (Also the last). + _parsedOk = endOfProperties(*stream) && property.readOk(); + + if (!_parsedOk) // Error parsing stream + warning("Error parsing WAG file (%s). WAG file ignored", filename); + } else // Invalid WinAGI version string or it couldn't be read + warning("Invalid WAG file (%s) version or error reading it. WAG file ignored", filename); + } else // Couldn't fully read file into memory + warning("Error reading WAG file (%s) into memory. WAG file ignored", filename); + } else // Couldn't open file + warning("Couldn't open WAG file (%s). WAG file ignored", filename); + + if (stream != NULL) delete stream; // If file was read into memory, deallocate that buffer + return _parsedOk; +} + +const WagProperty *WagFileParser::getProperty(const WagProperty::WagPropertyCode code) const { + for (PropertyList::const_iterator iter = _propList.begin(); iter != _propList.end(); iter++) + if (iter->getCode() == code) return iter; + return NULL; +} + +bool WagFileParser::endOfProperties(const Common::SeekableReadStream &stream) const { + return stream.pos() >= (stream.size() - WINAGI_VERSION_LENGTH); +} + +} // End of namespace Agi diff --git a/engines/agi/wagparser.h b/engines/agi/wagparser.h new file mode 100644 index 0000000000..1fc554d522 --- /dev/null +++ b/engines/agi/wagparser.h @@ -0,0 +1,288 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +namespace Agi { + +/** + * WagProperty represents a single property from WinAGI's *.wag file. + * A property consists of a header and of data. + * The header consists of the following: + * - Property code (Integer/Enumeration, 1 byte) + * - Property type (Integer/Enumeration, 1 byte) + * - Property number (Integer, 1 byte) + * - Property size (Little endian integer, 2 bytes) + * And then there's the data with as many bytes as defined in the header's property size variable. + */ +class WagProperty { +// Constants, enumerations etc +public: + /** + * Property codes taken from WinAGI 1.1.21's source code file WinAGI/AGIObjects.bas. + */ + enum WagPropertyCode { + PC_GAMEDESC = 129, ///< Game description (WinAGI 1.1.21 limits these to 4096 bytes) + PC_GAMEAUTHOR, ///< Game author (WinAGI 1.1.21 limits these to 256 bytes) + PC_GAMEID, ///< Game ID + PC_INTVERSION, ///< Interpreter version (WinAGI 1.1.21 defaults to version 2.917) + PC_GAMELAST, ///< Last edit date + PC_GAMEVERSION, ///< Game version (WinAGI 1.1.21 limits these to 256 bytes) + PC_GAMEABOUT, ///< About game (WinAGI 1.1.21 limits these to 4096 bytes) + PC_GAMEEXEC, ///< Game executable + PC_RESDIR, ///< Resource directory name + PC_DEFSYNTAX, ///< Default syntax + PC_INVOBJDESC = 144, + PC_VOCABWORDDESC = 160, + PC_PALETTE = 172, + PC_USERESNAMES = 180, + PC_LOGIC = 192, + PC_PICTURE = 208, + PC_SOUND = 224, + PC_VIEW = 240, + PC_UNDEFINED = 0x100 ///< An undefined property code (Added for ScummVM). + }; + + /** + * Property types taken from WinAGI 1.1.21's source code file WinAGI/AGIObjects.bas. + * At the moment these aren't really at all needed by ScummVM. Just here if anyone decides to use them. + */ + enum WagPropertyType { + PT_ID, + PT_DESC, + PT_SYNTAX, + PT_CRC32, + PT_KEY, + PT_INST0, + PT_INST1, + PT_INST2, + PT_MUTE0, + PT_MUTE1, + PT_MUTE2, + PT_MUTE3, + PT_TPQN, + PT_ROOM, + PT_VIS0, + PT_VIS1, + PT_VIS2, + PT_VIS3, + PT_ALL = 0xff, + PT_UNDEFINED = 0x100 ///< An undefined property type (Added for ScummVM). + }; + +// Constructors, destructors, operators etc +public: + /** + * Creates an empty WagProperty object. + * No property header or property data in it. + */ + WagProperty(); + + /** + * Destructor. Releases allocated memory if any etc. The usual. + */ + ~WagProperty(); + + /** + * Copy constructor. Deep copies the variables. + */ + WagProperty(const WagProperty &other); + + /** + * Assignment operator. Deep copies the variables. + */ + WagProperty &operator=(const WagProperty &other); + +// Non-public helper methods +protected: + /** + * Sets the default values for member variables. + */ + void setDefaults(); + + /** + * Delete's the property's data from memory if we have it, otherwise does nothing. + */ + void deleteData(); + + /** + * Deep copies the parameter object to this object. + * @param other The object to be deep copied to this object. + */ + void deepCopy(const WagProperty &other); + +// Public methods that have side-effects +public: + /** + * Read in a property (Header and data). + * @return True if reading was a success, false otherwise. + */ + bool read(Common::SeekableReadStream &stream); + + /** + * Clears the property. + * After this the property is empty. No header or data. + */ + void clear(); + +// Public access functions +public: + /** + * Was the property read ok from the source stream? + */ + bool readOk() const { return _readOk; }; + + /** + * Return the property's code. + * @return The property's code if readOk(), PC_UNDEFINED otherwise. + */ + enum WagPropertyCode getCode() const { return _propCode; }; + + /** + * Return the property's type. + * @return The property's type if readOk(), PT_UNDEFINED otherwise. + */ + enum WagPropertyType getType() const { return _propType; }; + + /** + * Return the property's number. + * @return The property's number if readOk(), 0 otherwise. + */ + byte getNumber() const { return _propNum; }; + + /** + * Return the property's data's length. + * @return The property's data's length if readOk(), 0 otherwise. + */ + uint16 getSize() const { return _propSize; } + + /** + * Return property's data. Constant access version. + * Can be used as a C-style string (i.e. this is guaranteed to have a trailing zero). + * @return The property's data if readOk(), NULL otherwise. + */ + const char *getData() const { return _propData; }; + +// Member variables +protected: + bool _readOk; ///< Was the property read ok from the source stream? + enum WagPropertyCode _propCode; ///< Property code (Part of the property's header) + enum WagPropertyType _propType; ///< Property type (Part of the property's header) + byte _propNum; ///< Property number (Part of the property's header) + uint16 _propSize; ///< Property's size (Part of the property's header) + char *_propData; ///< The property's data (Plus a trailing zero for C-style string access) +}; + + +/** + * Class for parsing *.wag files created by WinAGI. + * Using this class you can get information about fanmade AGI games if they have provided a *.wag file with them. + */ +class WagFileParser { +// Constants, type definitions, enumerations etc. +public: + static const uint WINAGI_VERSION_LENGTH = 16; ///< WinAGI's version string's length (Always 16) + typedef Common::Array<WagProperty> PropertyList; ///< A type definition for an array of *.wag file properties + +public: + /** + * Constructor. Creates a WagFileParser object in a default state. + */ + WagFileParser(); + + /** + * Destructor. + */ + ~WagFileParser(); + + /** + * Loads a *.wag file and parses it. + * @note After this you can access the loaded properties using getProperty() and getProperties() etc. + * @param filename Name of the file to be parsed. + * @return True if parsed successfully, false otherwise. + */ + bool parse(const char *filename); + + /** + * Get list of the loaded properties. + * @note Use only after a call to parse() first. + * @return The list of loaded properties. + */ + const PropertyList &getProperties() const { return _propList; }; + + /** + * Get property with the given property code. + * @note Use only after a call to parse() first. + * @return Pointer to the property if its found in memory, NULL otherwise. + * + * TODO/FIXME: Handle cases where several properties with the given property code are found. + * At the moment we don't need this functionality because the properties we use + * for fallback detection probably don't have multiples in the WAG-file. + * TODO: Make this faster than linear time if desired/needed. + */ + const WagProperty *getProperty(const WagProperty::WagPropertyCode code) const; + + /** + * Tests if the given property contains a valid AGI interpreter version string. + * A valid AGI interpreter version string is of the form "X.Y" or "X,Y" where + * X is a single decimal digit and Y is a string of decimal digits (At least one digit). + * @param version The property to be tested. + * @return True if the given property contains a valid AGI interpreter version string, false otherwise. + */ + bool checkAgiVersionProperty(const WagProperty &version) const; + + /** + * Convert property's data to an AGI interpreter version number. + * @param version The property to be converted (Property code should be PC_INTVERSION). + * @return AGI interpreter version number if successful, 0 otherwise. + */ + uint16 convertToAgiVersionNumber(const WagProperty &version); + + /** + * Was the file parsed successfully? + * @return True if file was parsed successfully, false otherwise. + */ + bool parsedOk() const { return _parsedOk; }; + +protected: + /** + * Checks if stream has a valid WinAGI version string in its end. + * @param stream The stream to be checked. + * @return True if reading was successful and stream contains a valid WinAGI version string, false otherwise. + */ + bool checkWagVersion(Common::SeekableReadStream &stream); + + /** + * Checks if we're at or past the end of the properties stored in the stream. + * @param stream The stream whose seeking position is to be checked. + * @return True if stream's seeking position is at or past the end of the properties, false otherwise. + */ + bool endOfProperties(const Common::SeekableReadStream &stream) const; + +// Member variables +protected: + PropertyList _propList; ///< List of loaded properties from the file. + bool _parsedOk; ///< Did the parsing of the file go ok? +}; + +} // End of namespace Agi diff --git a/engines/lure/fights.cpp b/engines/lure/fights.cpp new file mode 100644 index 0000000000..4c478bbc17 --- /dev/null +++ b/engines/lure/fights.cpp @@ -0,0 +1,583 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2005-2006 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public 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 "lure/fights.h" +#include "lure/luredefs.h" +#include "lure/game.h" +#include "lure/res.h" +#include "lure/room.h" +#include "lure/sound.h" + +namespace Lure { + +// Three records containing initial states for player, pig, and Skorl +FighterRecord fighterList[3] = { + {0x23C, 0x440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0}, + {0, 0x441, 0x1092, 0, 3, 0, 0, 0, 0xB94, 8, 0xA34, 0x8D4, 0xD06, 0, + 0, 0, 0, 0, 0xDDC, PLAYER_ID}, + {0, 0x446, 0x1092, 0, 3, 0, 0, 0, 0xB94, 8, 0xA34, 0x8D4, 0xD06, 0, + 0, 0, 0, 0, 0xDDC, PLAYER_ID} +}; + +FightsManager *int_fights = NULL; + +FightsManager::FightsManager() { + int_fights = this; + _fightData = NULL; + _mouseFlags = 0; +} + +FightsManager::~FightsManager() { + if (_fightData != NULL) + // Release the fight data + delete _fightData; +} + +FightsManager &FightsManager::getReference() { + return *int_fights; +} + +FighterRecord &FightsManager::getDetails(uint16 hotspotId) { + if (hotspotId == PLAYER_ID) return fighterList[0]; + else if (hotspotId == PIG_ID) return fighterList[1]; + else if (hotspotId == SKORL_FIGHTER_ID) return fighterList[2]; + error("Unknown NPC %d attempted to fight", hotspotId); +} + +// Sets up the data for the pig fight in the cave + +void FightsManager::setupPigFight() { + Resources &res = Resources::getReference(); + Hotspot *player = res.getActiveHotspot(PLAYER_ID); + player->setSkipFlag(false); + player->resource()->colourOffset = 16; + player->setTickProc(PLAYER_FIGHT_TICK_PROC_ID); + player->setSize(48, 53); + player->setAnimation(PLAYER_FIGHT_ANIM_ID); + player->resource()->width = 48; + player->resource()->height = 53; + + player->setOccupied(false); + player->setPosition(262, 94); + FighterRecord &rec = getDetails(PLAYER_ID); + rec.fwhits = 0; + rec.fwtrue_x = 262; + rec.fwtrue_y = 53; + rec.fwseq_ad = FIGHT_PLAYER_INIT; + rec.fwenemy_ad = PIG_ID; +} + +void FightsManager::setupSkorlFight() { + Resources &res = Resources::getReference(); + Hotspot *player = res.getActiveHotspot(PLAYER_ID); + FighterRecord &rec = getDetails(PLAYER_ID); + + setupPigFight(); + + rec.fwenemy_ad = SKORL_FIGHTER_ID; + rec.fwweapon = 0x445; + rec.fwtrue_x = 282; + rec.fwtrue_y = 136; + player->setPosition(282, 136); + player->resource()->colourOffset = 96; +} + +bool FightsManager::isFighting() { + FighterRecord &rec = getDetails(PLAYER_ID); + return rec.fwhits == 0; +} + +void FightsManager::fightLoop() { + Resources &res = Resources::getReference(); + Events &events = Events::getReference(); + FighterRecord &playerFight = getDetails(PLAYER_ID); + + // Loop for the duration of the battle + while (!events.quitFlag && (playerFight.fwhits != GENERAL_MAGIC_ID)) { + checkEvents(); + + Game::getReference().tick(); + Room::getReference().update(); + res.delayList().tick(); + Screen::getReference().update(); + + g_system->delayMillis(20); + } +} + +void FightsManager::saveToStream(Common::WriteStream *stream) { + for (int fighterCtr = 0; fighterCtr < 3; ++fighterCtr) { + FighterRecord &rec = fighterList[fighterCtr]; + + stream->writeUint16LE(rec.fwseq_no); + stream->writeUint16LE(rec.fwseq_ad); + stream->writeUint16LE(rec.fwdist); + stream->writeUint16LE(rec.fwwalk_roll); + stream->writeUint16LE(rec.fwmove_number); + stream->writeUint16LE(rec.fwhits); + } +} + +void FightsManager::loadFromStream(Common::ReadStream *stream) { + for (int fighterCtr = 0; fighterCtr < 3; ++fighterCtr) { + FighterRecord &rec = fighterList[fighterCtr]; + + rec.fwseq_no = stream->readUint16LE(); + rec.fwseq_ad = stream->readUint16LE(); + rec.fwdist = stream->readUint16LE(); + rec.fwwalk_roll = stream->readUint16LE(); + rec.fwmove_number = stream->readUint16LE(); + rec.fwhits = stream->readUint16LE(); + } +} + +const CursorType moveList[] = {CURSOR_LEFT_ARROW, CURSOR_FIGHT_UPPER, + CURSOR_FIGHT_MIDDLE, CURSOR_FIGHT_LOWER, CURSOR_RIGHT_ARROW}; + +struct KeyMapping { + Common::KeyCode keycode; + uint8 moveNumber; +}; + +const KeyMapping keyList[] = { + {Common::KEYCODE_LEFT, 10}, {Common::KEYCODE_RIGHT, 14}, {Common::KEYCODE_7, 11}, {Common::KEYCODE_4, 12}, + {Common::KEYCODE_1, 13}, {Common::KEYCODE_9, 6}, {Common::KEYCODE_6, 7}, {Common::KEYCODE_3, 8}, {Common::KEYCODE_INVALID, 0}}; + +void FightsManager::checkEvents() { + Events &events = Events::getReference(); + if (!events.pollEvent()) return; + FighterRecord &rec = getDetails(PLAYER_ID); + Hotspot *player = Resources::getReference().getActiveHotspot(PLAYER_ID); + Mouse &mouse = Mouse::getReference(); + + int moveNumber = 0; + + if (events.type() == Common::EVENT_KEYDOWN) { + switch (events.event().kbd.keycode) { + case Common::KEYCODE_ESCAPE: + events.quitFlag = true; + break; + + default: + // Scan through the mapping list for a move for the keypress + const KeyMapping *keyPtr = &keyList[0]; + while ((keyPtr->keycode != Common::KEYCODE_INVALID) && + (keyPtr->keycode != events.event().kbd.keycode)) + ++keyPtr; + if (keyPtr->keycode != Common::KEYCODE_INVALID) + moveNumber = keyPtr->moveNumber; + } + } + + if (events.type() == Common::EVENT_MOUSEMOVE) { + Point mPos = events.event().mouse; + if (mPos.x < rec.fwtrue_x - 12) + mouse.setCursorNum(CURSOR_LEFT_ARROW); + else if (mPos.x > rec.fwtrue_x + player->width()) + mouse.setCursorNum(CURSOR_RIGHT_ARROW); + else if (mPos.y < player->y() + 4) + mouse.setCursorNum(CURSOR_FIGHT_UPPER); + else if (mPos.y < player->y() + 38) + mouse.setCursorNum(CURSOR_FIGHT_MIDDLE); + else + mouse.setCursorNum(CURSOR_FIGHT_LOWER); + } + + if ((events.type() == Common::EVENT_LBUTTONDOWN) || + (events.type() == Common::EVENT_RBUTTONDOWN) || + (events.type() == Common::EVENT_LBUTTONUP) || + (events.type() == Common::EVENT_RBUTTONUP)) { + _mouseFlags = 0; + if (events.type() == Common::EVENT_LBUTTONDOWN) ++_mouseFlags; + if (events.type() == Common::EVENT_RBUTTONDOWN) _mouseFlags += 2; + } + + // Get the correct base index for the move + while ((moveNumber < 5) && (moveList[moveNumber] != mouse.getCursorNum())) + ++moveNumber; + if (moveNumber < 5) { + if (_mouseFlags == 1) + // Left mouse + moveNumber += 10; + else if (_mouseFlags == 2) + // Right mouse + moveNumber += 5; + } + + rec.fwmove_number = moveNumber; + + if (rec.fwmove_number >= 5) + debugC(ERROR_INTERMEDIATE, kLureDebugFights, + "Player fight move number=%d", rec.fwmove_number); +} + +void FightsManager::fighterAnimHandler(Hotspot &h) { + FighterRecord &fighter = getDetails(h.hotspotId()); + FighterRecord &opponent = getDetails(fighter.fwenemy_ad); + FighterRecord &player = getDetails(PLAYER_ID); + + fetchFighterDistance(fighter, opponent); + + if (fighter.fwseq_ad) { + fightHandler(h, fighter.fwseq_ad); + return; + } + + uint16 seqNum = 0; + if (fighter.fwdist != FIGHT_DISTANCE) { + seqNum = getFighterMove(fighter, fighter.fwnot_near); + } else { + uint16 offset = (fighter.fwhits * fighter.fwdef_len) + fighter.fwdefend_adds + 4; + + // Scan for the given sequence + uint16 v = getWord(offset); + while ((v != 0) && (v != player.fwseq_no)) { + offset += 4; + v = getWord(offset); + } + + if (v == 0) { + // No sequence match found + seqNum = getFighterMove(fighter, fighter.fwattack_table); + } else { + v = getWord(offset + 2); + seqNum = getFighterMove(fighter, fighter.fwdefend_table); + + if (seqNum == 0) + seqNum = getFighterMove(fighter, fighter.fwattack_table); + else if (seqNum == 0xff) + seqNum = v; + } + } + + // Set the sequence and pass onto the fight handler + fighter.fwseq_no = seqNum; + fighter.fwseq_ad = getWord(FIGHT_TBL_1 + (seqNum << 1)); +} + +void FightsManager::playerAnimHandler(Hotspot &h) { + FighterRecord &fighter = getDetails(h.hotspotId()); + fightHandler(h, fighter.fwseq_ad); +} + +void FightsManager::fightHandler(Hotspot &h, uint16 moveOffset) { + Resources &res = Resources::getReference(); + FighterRecord &fighter = getDetails(h.hotspotId()); + FighterRecord &opponent = getDetails(fighter.fwenemy_ad); + + uint16 v1, v2; + bool breakFlag = false; + + while (!breakFlag) { + if (moveOffset == 0) { + // Player is doing nothing, so check the move number + moveOffset = getWord(FIGHT_PLAYER_MOVE_TABLE + (fighter.fwmove_number << 1)); + + debugC(ERROR_DETAILED, kLureDebugFights, + "Hotspot %xh fight move=%d, new offset=%xh", + h.hotspotId(), fighter.fwmove_number, moveOffset); + + if (moveOffset == 0) + return; + + fighter.fwseq_no = fighter.fwmove_number; + fighter.fwseq_ad = moveOffset; + } + + uint16 moveValue = getWord(moveOffset); + debugC(ERROR_DETAILED, kLureDebugFights, + "Hotspot %xh script offset=%xh value=%xh", + h.hotspotId(), moveOffset, moveValue); + moveOffset += sizeof(uint16); + + if ((moveValue & 0x8000) == 0) { + // Set frame to specified number + h.setFrameNumber(moveValue); + + // Set the new fighter position + int16 newX, newY; + newX = h.x() + (int16)getWord(moveOffset); + if (newX < 32) newX = 32; + if (newX > 240) newX = 240; + newY = h.y() + (int16)getWord(moveOffset + 2); + h.setPosition(newX, newY); + + if (fighter.fwweapon != 0) { + Hotspot *weaponHotspot = res.getActiveHotspot(fighter.fwweapon); + assert(weaponHotspot); + weaponHotspot->setFrameNumber(getWord(moveOffset + 4)); + weaponHotspot->setPosition(weaponHotspot->x() + + (int16)getWord(moveOffset + 6), + weaponHotspot->y() + getWord(moveOffset + 8)); + } + + moveOffset += 5 * sizeof(uint16); + fighter.fwseq_ad = moveOffset; + return; + } + + switch (moveValue) + { + case 0xFFFA: + // Walk left + if ((fighter.fwmove_number == 5) || (fighter.fwmove_number == 10)) { + if (h.x() < 32) { + breakFlag = true; + } else { + h.setPosition(h.x() - 4, h.y()); + fighter.fwtrue_x = h.x(); + if (fetchFighterDistance(fighter, opponent) < FIGHT_DISTANCE) { + h.setPosition(h.x() + 4, h.y()); + fighter.fwtrue_x += 4; + breakFlag = true; + } else { + removeWeapon(fighter.fwweapon); + fighter.fwtrue_x = h.x(); + fighter.fwtrue_y = h.y(); + + uint16 frameNum = (fighter.fwwalk_roll == 7) ? 0 : + fighter.fwwalk_roll + 1; + fighter.fwwalk_roll = frameNum; + fighter.fwseq_ad = moveOffset; + h.setFrameNumber(frameNum); + return; + } + } + } else { + // Signal to start a new action + moveOffset = 0; + } + break; + + case 0xFFF9: + // Walk right + if ((fighter.fwmove_number == 9) || (fighter.fwmove_number == 14)) { + if (h.x() >= 240) { + breakFlag = true; + } else { + removeWeapon(fighter.fwweapon); + h.setPosition(h.x() + 4, h.y()); + fighter.fwtrue_x = h.x(); + fighter.fwtrue_y = h.y(); + + fighter.fwwalk_roll = (fighter.fwwalk_roll == 0) ? 7 : + fighter.fwwalk_roll - 1; + fighter.fwseq_ad = moveOffset; + h.setFrameNumber(fighter.fwwalk_roll); + return; + } + + } else { + // Signal to start a new action + moveOffset = 0; + } + break; + + case 0xFFEB: + // Enemy right + removeWeapon(fighter.fwweapon); + h.setPosition(h.x() + 4, h.y()); + fighter.fwtrue_x = h.x(); + + if (fetchFighterDistance(fighter, opponent) < FIGHT_DISTANCE) { + h.setPosition(h.x() - 4, h.y()); + fighter.fwtrue_x -= 4; + fighter.fwseq_ad = 0; + h.setFrameNumber(8); + } else { + h.setFrameNumber(getWord(moveOffset)); + moveOffset += sizeof(uint16); + fighter.fwseq_ad = moveOffset; + } + return; + + case 0xFFFB: + // End of sequence + breakFlag = true; + break; + + case 0xFFF8: + // Set fight address + moveOffset = getWord(moveOffset); + break; + + case 0xFFFF: + case 0xFFFE: + if (moveValue == 0xffff) + // Set the animation record + h.setAnimation(getWord(moveOffset)); + else + // New set animation record + h.setAnimation(getWord(fighter.fwheader_list + (getWord(moveOffset) << 1))); + h.setFrameNumber(0); + moveOffset += sizeof(uint16); + break; + + case 0xFFF7: + // On hold + if (getWord(moveOffset) == fighter.fwmove_number) + moveOffset = getWord(moveOffset + 2); + else + moveOffset += 2 * sizeof(uint16); + break; + + case 0xFFF6: + // Not hold + if (getWord(moveOffset) == fighter.fwmove_number) + moveOffset += 2 * sizeof(uint16); + else + moveOffset = getWord(moveOffset + 2); + break; + + case 0xFFF4: + // End sequence + fighter.fwseq_no = 0; + break; + + case 0xFFF2: + // Set defend + fighter.fwblocking = getWord(moveOffset); + moveOffset += sizeof(uint16); + break; + + case 0xFFF1: + // If blocking + v1 = getWord(moveOffset); + v2 = getWord(moveOffset + 2); + moveOffset += 2 * sizeof(uint16); + + if (v1 == opponent.fwblocking) { + Sound.playSound(42); + moveOffset = v2; + } + break; + + case 0xFFF0: + // Check hit + v1 = getWord(moveOffset); + moveOffset += sizeof(uint16); + if (fighter.fwdist <= FIGHT_DISTANCE) { + if (h.hotspotId() == PLAYER_ID) { + // Player hits opponent + Sound.playSound(52); + + if (opponent.fwhits != 5) { + opponent.fwseq_ad = v1; + if (++opponent.fwhit_value != opponent.fwhit_rate) { + opponent.fwhit_value = 0; + if (++opponent.fwhits == 5) + opponent.fwseq_ad = opponent.fwdie_seq; + } + } + } else { + // Opponent hit player + Sound.playSound(37); + opponent.fwseq_ad = v1; + if (++opponent.fwhits == 10) { + // Player has been killed + fighter.fwhits = 10; + opponent.fwseq_ad = FIGHT_PLAYER_DIES; + Sound.playSound(36); + } + } + } + break; + + case 0xFFEF: + // Save co-ordinates + fighter.fwtrue_x = h.x(); + fighter.fwtrue_y = h.y(); + break; + + case 0xFFEE: + // Restore co-ordinates + h.setPosition(fighter.fwtrue_x, fighter.fwtrue_y); + break; + + case 0xFFED: + // End of game + getDetails(PLAYER_ID).fwhits = GENERAL_MAGIC_ID; + Game::getReference().setState(GS_RESTORE_RESTART); + return; + + case 0xFFEC: + // Enemy has been killed + enemyKilled(); + break; + + case 0xFFEA: + // Fight sound + Sound.playSound(getWord(moveOffset)); + moveOffset += sizeof(uint16); + break; + + default: + error("Unknown fight command %xh", moveValue); + } + } + + fighter.fwseq_no = 0; + fighter.fwseq_ad = 0; + if (h.hotspotId() == PLAYER_ID) + _mouseFlags = 0; +} + +uint16 FightsManager::fetchFighterDistance(FighterRecord &f1, FighterRecord &f2) { + f1.fwdist = ABS(f1.fwtrue_x - f2.fwtrue_x) & 0xFFF8; + return f1.fwdist; +} + +void FightsManager::enemyKilled() { + Resources &res = Resources::getReference(); + Hotspot *playerHotspot = res.getActiveHotspot(PLAYER_ID); + FighterRecord &playerRec = getDetails(PLAYER_ID); + + playerHotspot->setTickProc(PLAYER_TICK_PROC_ID); + playerRec.fwhits = GENERAL_MAGIC_ID; + playerHotspot->resource()->colourOffset = 128; + playerHotspot->setSize(32, 48); + playerHotspot->resource()->width = 32; + playerHotspot->resource()->height = 48; + playerHotspot->setAnimation(PLAYER_ANIM_ID); + playerHotspot->setPosition(playerHotspot->x(), playerHotspot->y() + 5); + playerHotspot->setDirection(LEFT); + + if (playerHotspot->roomNumber() == 6) { + Dialog::show(0xc9f); + HotspotData *axeHotspot = res.getHotspot(0x2738); + axeHotspot->roomNumber = PLAYER_ID; + axeHotspot->flags |= HOTSPOTFLAG_FOUND; + } +} + +// Makes sure the given weapon is off-screen +void FightsManager::removeWeapon(uint16 weaponId) { + Hotspot *weaponHotspot = Resources::getReference().getActiveHotspot(weaponId); + weaponHotspot->setPosition(-32, -32); +} + +uint16 FightsManager::getFighterMove(FighterRecord &rec, uint16 baseOffset) { + int actionIndex = _rnd.getRandomNumber(31); + return getByte(baseOffset + (rec.fwhits << 5) + actionIndex); +} + +} // end of namespace Lure diff --git a/engines/lure/fights.h b/engines/lure/fights.h new file mode 100644 index 0000000000..048949f2b6 --- /dev/null +++ b/engines/lure/fights.h @@ -0,0 +1,111 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2005-2006 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public 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 LURE_FIGHT_H +#define LURE_FIGHT_H + +#include "lure/luredefs.h" +#include "lure/hotspots.h" +#include "lure/palette.h" +#include "common/singleton.h" +#include "common/endian.h" + +namespace Lure { + +struct FighterRecord { + uint16 fwheader_list; + uint16 fwweapon; + uint16 fwdie_seq; + uint16 fwhit_value; + uint16 fwhit_rate; + int16 fwtrue_x; + int16 fwtrue_y; + uint16 fwblocking; + uint16 fwattack_table; + uint16 fwdef_len; + uint16 fwdefend_table; + uint16 fwnot_near; + uint16 fwdefend_adds; + uint16 fwseq_no; + uint16 fwdist; + uint16 fwwalk_roll; + uint16 fwmove_number; + uint16 fwhits; + uint16 fwseq_ad; + uint16 fwenemy_ad; +}; + +// Constant references into the fight data +#define FIGHT_TBL_1 0x8b8 +#define FIGHT_PLAYER_MOVE_TABLE 0xDAA +#define FIGHT_PLAYER_INIT 0xDC8 +#define FIGHT_PLAYER_DIES 0xF46 + +#define FIGHT_DISTANCE 32 + +class FightsManager { +private: + MemoryBlock *_fightData; + Common::RandomSource _rnd; + uint8 _mouseFlags; + + FighterRecord &getDetails(uint16 hotspotId); + uint16 fetchFighterDistance(FighterRecord &f1, FighterRecord &f2); + void removeWeapon(uint16 weaponId); + void enemyKilled(); + uint16 getFighterMove(FighterRecord &rec, uint16 baseOffset); + void checkEvents(); + void fightHandler(Hotspot &h, uint16 moveOffset); + + inline uint16 getWord(uint16 offset) { + if (!_fightData) + _fightData = Disk::getReference().getEntry(FIGHT_DATA_RESOURCE_ID); + if (offset >= _fightData->size() - 1) error("Invalid fight data index"); + return READ_LE_UINT16(_fightData->data() + offset); + } + inline uint8 getByte(uint16 offset) { + if (!_fightData) + _fightData = Disk::getReference().getEntry(FIGHT_DATA_RESOURCE_ID); + if (offset >= _fightData->size()) error("Invalid fight data index"); + return _fightData->data()[offset]; + } +public: + FightsManager(); + ~FightsManager(); + static FightsManager &getReference(); + + void setupPigFight(); + void setupSkorlFight(); + bool isFighting(); + void fightLoop(); + void saveToStream(Common::WriteStream *stream); + void loadFromStream(Common::ReadStream *stream); + + void fighterAnimHandler(Hotspot &h); + void playerAnimHandler(Hotspot &h); +}; + +#define Fights FightsManager::getReference() + +} // End of namespace Lure + +#endif diff --git a/engines/lure/sound.cpp b/engines/lure/sound.cpp new file mode 100644 index 0000000000..6961e4c7cc --- /dev/null +++ b/engines/lure/sound.cpp @@ -0,0 +1,37 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2005-2006 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public 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 "lure/sound.h" + +DECLARE_SINGLETON(Lure::SoundManager); + +namespace Lure { + +void SoundManager::killSounds() { + +} + +void SoundManager::playSound(uint16 soundId) { + +} + +} // end of namespace Lure diff --git a/engines/lure/sound.h b/engines/lure/sound.h new file mode 100644 index 0000000000..4a7422d77f --- /dev/null +++ b/engines/lure/sound.h @@ -0,0 +1,41 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2005-2006 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public 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 LURE_SOUND_H +#define LURE_SOUND_H + +#include "lure/luredefs.h" +#include "common/singleton.h" + +namespace Lure { + +class SoundManager: public Common::Singleton<SoundManager> { +public: + static void killSounds(); + static void playSound(uint16 soundId); +}; + +} // End of namespace Lure + +#define Sound (::Lure::SoundManager::instance()) + +#endif diff --git a/sound/rate_arm.cpp b/sound/rate_arm.cpp new file mode 100644 index 0000000000..694e213dce --- /dev/null +++ b/sound/rate_arm.cpp @@ -0,0 +1,431 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +/* + * The code in this file, together with the rate_arm_asm.s file offers + * an ARM optimised version of the code in rate.cpp. The operation of this + * code should be identical to that of rate.cpp, but faster. The heavy + * lifting is done in the assembler file. + * + * To be as portable as possible we implement the core routines with C + * linkage in assembly, and implement the C++ routines that call into + * the C here. The C++ symbol mangling varies wildly between compilers, + * so this is the simplest way to ensure that the C/C++ combination should + * work on as many ARM based platforms as possible. + * + * Essentially the algorithm herein is the same as that in rate.cpp, so + * anyone seeking to understand this should attempt to understand that + * first. That code was based in turn on code with Copyright 1998 Fabrice + * Bellard - part of SoX (http://sox.sourceforge.net). + * Max Horn adapted that code to the needs of ScummVM and partially rewrote + * it, in the process removing any use of floating point arithmetic. Various + * other improvments over the original code were made. + */ + +#include "common/stdafx.h" +#include "sound/audiostream.h" +#include "sound/rate.h" +#include "sound/mixer.h" +#include "common/util.h" + +namespace Audio { + +/** + * The precision of the fractional computations used by the rate converter. + * Normally you should never have to modify this value. + */ +#define FRAC_BITS 16 + +/** + * The size of the intermediate input cache. Bigger values may increase + * performance, but only until some point (depends largely on cache size, + * target processor and various other factors), at which it will decrease + * again. + */ +#define INTERMEDIATE_BUFFER_SIZE 512 + + +/** + * Audio rate converter based on simple resampling. Used when no + * interpolation is required. + * + * Limited to sampling frequency <= 65535 Hz. + */ +typedef struct { + const st_sample_t *inPtr; + int inLen; + + /** position of how far output is ahead of input */ + /** Holds what would have been opos-ipos */ + long opos; + + /** fractional position increment in the output stream */ + long opos_inc; + + st_sample_t inBuf[INTERMEDIATE_BUFFER_SIZE]; +} SimpleRateDetails; + +template<bool stereo, bool reverseStereo> +class SimpleRateConverter : public RateConverter { +protected: + SimpleRateDetails sr; +public: + SimpleRateConverter(st_rate_t inrate, st_rate_t outrate); + int flow(AudioStream &input, st_sample_t *obuf, st_size_t osamp, st_volume_t vol_l, st_volume_t vol_r); + int drain(st_sample_t *obuf, st_size_t osamp, st_volume_t vol) { + return (ST_SUCCESS); + } +}; + + +/* + * Prepare processing. + */ +template<bool stereo, bool reverseStereo> +SimpleRateConverter<stereo, reverseStereo>::SimpleRateConverter(st_rate_t inrate, st_rate_t outrate) { + if (inrate == outrate) { + error("Input and Output rates must be different to use rate effect"); + } + + if ((inrate % outrate) != 0) { + error("Input rate must be a multiple of Output rate to use rate effect"); + } + + if (inrate >= 65536 || outrate >= 65536) { + error("rate effect can only handle rates < 65536"); + } + + sr.opos = 1; + + /* increment */ + sr.opos_inc = inrate / outrate; + + sr.inLen = 0; +} + +extern "C" void ARM_SimpleRate_M(AudioStream &input, + int (*fn)(Audio::AudioStream&,int16*,int), + SimpleRateDetails *sr, + st_sample_t *obuf, + st_size_t osamp, + st_volume_t vol_l, + st_volume_t vol_r); + +extern "C" void ARM_SimpleRate_S(AudioStream &input, + int (*fn)(Audio::AudioStream&,int16*,int), + SimpleRateDetails *sr, + st_sample_t *obuf, + st_size_t osamp, + st_volume_t vol_l, + st_volume_t vol_r); + +extern "C" void ARM_SimpleRate_R(AudioStream &input, + int (*fn)(Audio::AudioStream&,int16*,int), + SimpleRateDetails *sr, + st_sample_t *obuf, + st_size_t osamp, + st_volume_t vol_l, + st_volume_t vol_r); + +extern "C" int SimpleRate_readFudge(Audio::AudioStream &input, + int16 *a, int b) +{ + return input.readBuffer(a, b); +} + +template<bool stereo, bool reverseStereo> +int SimpleRateConverter<stereo, reverseStereo>::flow(AudioStream &input, st_sample_t *obuf, st_size_t osamp, st_volume_t vol_l, st_volume_t vol_r) { + +#ifdef DEBUG_RATECONV +fprintf(stderr, "Simple st=%d rev=%d\n", stereo, reverseStereo); +fflush(stderr); +#endif + if (!stereo) { + ARM_SimpleRate_M(input, + &SimpleRate_readFudge, + &sr, + obuf, osamp, vol_l, vol_r); + } else if (reverseStereo) { + ARM_SimpleRate_R(input, + &SimpleRate_readFudge, + &sr, + obuf, osamp, vol_l, vol_r); + } else { + ARM_SimpleRate_S(input, + &SimpleRate_readFudge, + &sr, + obuf, osamp, vol_l, vol_r); + } + return (ST_SUCCESS); +} + +/** + * Audio rate converter based on simple linear Interpolation. + * + * The use of fractional increment allows us to use no buffer. It + * avoid the problems at the end of the buffer we had with the old + * method which stored a possibly big buffer of size + * lcm(in_rate,out_rate). + * + * Limited to sampling frequency <= 65535 Hz. + */ + +typedef struct { + const st_sample_t *inPtr; + int inLen; + + /** position of how far output is ahead of input */ + /** Holds what would have been opos-ipos */ + long opos; + + /** integer position increment in the output stream */ + long opos_inc; + + /** current sample(s) in the input stream (left/right channel) */ + st_sample_t icur[2]; + /** last sample(s) in the input stream (left/right channel) */ + st_sample_t ilast[2]; + + /** fractional position in the output stream */ + long opos_frac; + + /** fractional position increment in the output stream */ + long opos_inc_frac; + + st_sample_t inBuf[INTERMEDIATE_BUFFER_SIZE]; +} LinearRateDetails; + +extern "C" void ARM_LinearRate_M(AudioStream &input, + int (*fn)(Audio::AudioStream&,int16*,int), + LinearRateDetails *lr, + st_sample_t *obuf, + st_size_t osamp, + st_volume_t vol_l, + st_volume_t vol_r); + +extern "C" void ARM_LinearRate_S(AudioStream &input, + int (*fn)(Audio::AudioStream&,int16*,int), + LinearRateDetails *lr, + st_sample_t *obuf, + st_size_t osamp, + st_volume_t vol_l, + st_volume_t vol_r); + +extern "C" void ARM_LinearRate_R(AudioStream &input, + int (*fn)(Audio::AudioStream&,int16*,int), + LinearRateDetails *lr, + st_sample_t *obuf, + st_size_t osamp, + st_volume_t vol_l, + st_volume_t vol_r); + +template<bool stereo, bool reverseStereo> +class LinearRateConverter : public RateConverter { +protected: + LinearRateDetails lr; + +public: + LinearRateConverter(st_rate_t inrate, st_rate_t outrate); + int flow(AudioStream &input, st_sample_t *obuf, st_size_t osamp, st_volume_t vol_l, st_volume_t vol_r); + int drain(st_sample_t *obuf, st_size_t osamp, st_volume_t vol) { + return (ST_SUCCESS); + } +}; + + +/* + * Prepare processing. + */ +template<bool stereo, bool reverseStereo> +LinearRateConverter<stereo, reverseStereo>::LinearRateConverter(st_rate_t inrate, st_rate_t outrate) { + unsigned long incr; + + if (inrate == outrate) { + error("Input and Output rates must be different to use rate effect"); + } + + if (inrate >= 65536 || outrate >= 65536) { + error("rate effect can only handle rates < 65536"); + } + + lr.opos_frac = 0; + lr.opos = 1; + + /* increment */ + incr = (inrate << FRAC_BITS) / outrate; + + lr.opos_inc_frac = incr & ((1UL << FRAC_BITS) - 1); + lr.opos_inc = incr >> FRAC_BITS; + + lr.ilast[0] = lr.ilast[1] = 0; + lr.icur[0] = lr.icur[1] = 0; + + lr.inLen = 0; +} + +/* + * Processed signed long samples from ibuf to obuf. + * Return number of samples processed. + */ +template<bool stereo, bool reverseStereo> +int LinearRateConverter<stereo, reverseStereo>::flow(AudioStream &input, st_sample_t *obuf, st_size_t osamp, st_volume_t vol_l, st_volume_t vol_r) { + +#ifdef DEBUG_RATECONV +fprintf(stderr, "Linear st=%d rev=%d\n", stereo, reverseStereo); +fflush(stderr); +#endif + if (!stereo) { + ARM_LinearRate_M(input, + &SimpleRate_readFudge, + &lr, + obuf, osamp, vol_l, vol_r); + } else if (reverseStereo) { + ARM_LinearRate_R(input, + &SimpleRate_readFudge, + &lr, + obuf, osamp, vol_l, vol_r); + } else { + ARM_LinearRate_S(input, + &SimpleRate_readFudge, + &lr, + obuf, osamp, vol_l, vol_r); + } + return (ST_SUCCESS); +} + + +#pragma mark - + + +/** + * Simple audio rate converter for the case that the inrate equals the outrate. + */ +extern "C" void ARM_CopyRate_M(st_size_t len, + st_sample_t *obuf, + st_volume_t vol_l, + st_volume_t vol_r, + st_sample_t *_buffer); + +extern "C" void ARM_CopyRate_S(st_size_t len, + st_sample_t *obuf, + st_volume_t vol_l, + st_volume_t vol_r, + st_sample_t *_buffer); + +extern "C" void ARM_CopyRate_R(st_size_t len, + st_sample_t *obuf, + st_volume_t vol_l, + st_volume_t vol_r, + st_sample_t *_buffer); + + +template<bool stereo, bool reverseStereo> +class CopyRateConverter : public RateConverter { + st_sample_t *_buffer; + st_size_t _bufferSize; +public: + CopyRateConverter() : _buffer(0), _bufferSize(0) {} + ~CopyRateConverter() { + free(_buffer); + } + + virtual int flow(AudioStream &input, st_sample_t *obuf, st_size_t osamp, st_volume_t vol_l, st_volume_t vol_r) { + assert(input.isStereo() == stereo); + +#ifdef DEBUG_RATECONV +fprintf(stderr, "Copy st=%d rev=%d\n", stereo, reverseStereo); +fflush(stderr); +#endif + st_sample_t *ptr; + st_size_t len; + + if (stereo) + osamp *= 2; + + // Reallocate temp buffer, if necessary + if (osamp > _bufferSize) { + free(_buffer); + _buffer = (st_sample_t *)malloc(osamp * 2); + _bufferSize = osamp; + } + + // Read up to 'osamp' samples into our temporary buffer + len = input.readBuffer(_buffer, osamp); + if (len <= 0) + return (ST_SUCCESS); + + // Mix the data into the output buffer + if (stereo && reverseStereo) + ARM_CopyRate_R(len, obuf, vol_l, vol_r, _buffer); + else if (stereo) + ARM_CopyRate_S(len, obuf, vol_l, vol_r, _buffer); + else + ARM_CopyRate_M(len, obuf, vol_l, vol_r, _buffer); + + return (ST_SUCCESS); + } + virtual int drain(st_sample_t *obuf, st_size_t osamp, st_volume_t vol) { + return (ST_SUCCESS); + } +}; + + +#pragma mark - + + +/** + * Create and return a RateConverter object for the specified input and output rates. + */ +RateConverter *makeRateConverter(st_rate_t inrate, st_rate_t outrate, bool stereo, bool reverseStereo) { + if (inrate != outrate) { + if ((inrate % outrate) == 0) { + if (stereo) { + if (reverseStereo) + return new SimpleRateConverter<true, true>(inrate, outrate); + else + return new SimpleRateConverter<true, false>(inrate, outrate); + } else + return new SimpleRateConverter<false, false>(inrate, outrate); + } else { + if (stereo) { + if (reverseStereo) + return new LinearRateConverter<true, true>(inrate, outrate); + else + return new LinearRateConverter<true, false>(inrate, outrate); + } else + return new LinearRateConverter<false, false>(inrate, outrate); + } + } else { + if (stereo) { + if (reverseStereo) + return new CopyRateConverter<true, true>(); + else + return new CopyRateConverter<true, false>(); + } else + return new CopyRateConverter<false, false>(); + } +} + +} // End of namespace Audio diff --git a/sound/rate_arm_asm.s b/sound/rate_arm_asm.s new file mode 100644 index 0000000000..709d343c6c --- /dev/null +++ b/sound/rate_arm_asm.s @@ -0,0 +1,692 @@ +@ ScummVM - Graphic Adventure Engine +@ +@ ScummVM is the legal property of its developers, whose names +@ are too numerous to list here. Please refer to the COPYRIGHT +@ file distributed with this source distribution. +@ +@ This program is free software@ you can redistribute it and/or +@ modify it under the terms of the GNU General Public License +@ as published by the Free Software Foundation@ either version 2 +@ of the License, or (at your option) any later version. +@ +@ This program is distributed in the hope that it will be useful, +@ but WITHOUT ANY WARRANTY@ without even the implied warranty of +@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +@ GNU General Public License for more details. +@ +@ You should have received a copy of the GNU General Public 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$ +@ +@ @author Robin Watts (robin@wss.co.uk) +@ +@ This file, together with rate_arm.cpp, provides an ARM optimised version +@ of rate.cpp. The algorithm is essentially the same as that within rate.cpp +@ so to understand this file you should understand rate.cpp first. + + .text + + .global ARM_CopyRate_M + .global ARM_CopyRate_S + .global ARM_CopyRate_R + .global ARM_SimpleRate_M + .global ARM_SimpleRate_S + .global ARM_SimpleRate_R + .global ARM_LinearRate_M + .global ARM_LinearRate_S + .global ARM_LinearRate_R + +ARM_CopyRate_M: + @ r0 = len + @ r1 = obuf + @ r2 = vol_l + @ r3 = vol_r + @ <> = ptr + LDR r12,[r13] + STMFD r13!,{r4-r7,r14} + + MOV r14,#0 @ r14= 0 + ORR r2, r2, r2, LSL #8 @ r2 = vol_l as 16 bits + ORR r3, r3, r3, LSL #8 @ r3 = vol_r as 16 bits +CopyRate_M_loop: + LDRSH r5, [r12], #2 @ r5 = tmp0 = tmp1 = *ptr++ + LDRSH r6, [r1] @ r6 = obuf[0] + LDRSH r7, [r1, #2] @ r7 = obuf[1] + MUL r4, r2, r5 @ r4 = tmp0*vol_l + MUL r5, r3, r5 @ r5 = tmp1*vol_r + + ADDS r6, r4, r6, LSL #16 @ r6 = obuf[0]<<16 + tmp0*vol_l + RSCVS r6, r14,#1<<31 @ Clamp r6 + ADDS r7, r5, r7, LSL #16 @ r7 = obuf[1]<<16 + tmp1*vol_r + RSCVS r7, r14,#1<<31 @ Clamp r7 + + MOV r6, r6, LSR #16 @ Shift back to halfword + MOV r7, r7, LSR #16 @ Shift back to halfword + + STRH r6, [r1], #2 @ Store output value + STRH r7, [r1], #2 @ Store output value + + SUBS r0,r0,#1 @ len-- + BGT CopyRate_M_loop @ and loop + + LDMFD r13!,{r4-r7,PC} + +ARM_CopyRate_S: + @ r0 = len + @ r1 = obuf + @ r2 = vol_l + @ r3 = vol_r + @ <> = ptr + LDR r12,[r13] + STMFD r13!,{r4-r7,r14} + + MOV r14,#0 @ r14= 0 + ORR r2, r2, r2, LSL #8 @ r2 = vol_l as 16 bits + ORR r3, r3, r3, LSL #8 @ r3 = vol_r as 16 bits +CopyRate_S_loop: + LDRSH r4, [r12],#2 @ r4 = tmp0 = *ptr++ + LDRSH r5, [r12],#2 @ r5 = tmp1 = *ptr++ + LDRSH r6, [r1] @ r6 = obuf[0] + LDRSH r7, [r1,#2] @ r7 = obuf[1] + MUL r4, r2, r4 @ r5 = tmp0*vol_l + MUL r5, r3, r5 @ r6 = tmp1*vol_r + + ADDS r6, r4, r6, LSL #16 @ r6 = obuf[0]<<16 + tmp0*vol_l + RSCVS r6, r14,#1<<31 @ Clamp r6 + ADDS r7, r5, r7, LSL #16 @ r7 = obuf[1]<<16 + tmp1*vol_r + RSCVS r7, r14,#1<<31 @ Clamp r7 + + MOV r6, r6, LSR #16 @ Shift back to halfword + MOV r7, r7, LSR #16 @ Shift back to halfword + + STRH r6, [r1],#2 @ Store output value + STRH r7, [r1],#2 @ Store output value + + SUBS r0,r0,#2 @ len -= 2 + BGT CopyRate_S_loop @ and loop + + LDMFD r13!,{r4-r7,PC} + +ARM_CopyRate_R: + @ r0 = len + @ r1 = obuf + @ r2 = vol_l + @ r3 = vol_r + @ <> = ptr + LDR r12,[r13] + STMFD r13!,{r4-r7,r14} + + MOV r14,#0 @ r14= 0 + ORR r2, r2, r2, LSL #8 @ r2 = vol_l as 16 bits + ORR r3, r3, r3, LSL #8 @ r3 = vol_r as 16 bits +CopyRate_R_loop: + LDRSH r5, [r12],#2 @ r5 = tmp1 = *ptr++ + LDRSH r4, [r12],#2 @ r4 = tmp0 = *ptr++ + LDRSH r6, [r1] @ r6 = obuf[0] + LDRSH r7, [r1,#2] @ r7 = obuf[1] + MUL r4, r2, r4 @ r4 = tmp0*vol_l + MUL r5, r3, r5 @ r5 = tmp1*vol_r + + ADDS r6, r4, r6, LSL #16 @ r6 = obuf[0]<<16 + tmp0*vol_l + RSCVS r6, r14,#1<<31 @ Clamp r6 + ADDS r7, r5, r7, LSL #16 @ r7 = obuf[1]<<16 + tmp1*vol_r + RSCVS r7, r14,#1<<31 @ Clamp r7 + + MOV r6, r6, LSR #16 @ Shift back to halfword + MOV r7, r7, LSR #16 @ Shift back to halfword + + STRH r6, [r1],#2 @ Store output value + STRH r7, [r1],#2 @ Store output value + + SUBS r0,r0,#2 @ len -= 2 + BGT CopyRate_R_loop @ and loop + + LDMFD r13!,{r4-r7,PC} + +ARM_SimpleRate_M: + @ r0 = AudioStream &input + @ r1 = input.readBuffer + @ r2 = input->sr + @ r3 = obuf + @ <> = osamp + @ <> = vol_l + @ <> = vol_r + MOV r12,r13 + STMFD r13!,{r0-r2,r4-r8,r10-r11,r14} + LDMFD r12,{r11,r12,r14} @ r11= osamp + @ r12= vol_l + @ r14= vol_r + LDMIA r2,{r0,r1,r2,r8} @ r0 = inPtr + @ r1 = inLen + @ r2 = opos + @ r8 = opos_inc + CMP r11,#0 @ if (osamp <= 0) + BLE SimpleRate_M_end @ bale + MOV r10,#0 + ORR r12,r12,r12,LSL #8 @ r12= vol_l as 16 bits + ORR r14,r14,r14,LSL #8 @ r14= vol_r as 16 bits +SimpleRate_M_loop: + SUBS r1, r1, #1 @ r1 = inLen -= 1 + BLT SimpleRate_M_read + SUBS r2, r2, #1 @ r2 = opos-- + ADDGE r0, r0, #2 @ if (r2 >= 0) { sr.inPtr++ + BGE SimpleRate_M_loop @ and loop } +SimpleRate_M_read_return: + LDRSH r5, [r0],#2 @ r5 = tmp1 = *inPtr++ + LDRSH r6, [r3] @ r6 = obuf[0] + LDRSH r7, [r3,#2] @ r7 = obuf[1] + ADD r2, r2, r8 @ r2 = opos += opos_inc + MUL r4, r12,r5 @ r4 = tmp0*vol_l + MUL r5, r14,r5 @ r5 = tmp1*vol_r + + ADDS r6, r4, r6, LSL #16 @ r6 = obuf[0]<<16 + tmp0*vol_l + RSCVS r6, r10,#1<<31 @ Clamp r6 + ADDS r7, r5, r7, LSL #16 @ r7 = obuf[1]<<16 + tmp1*vol_r + RSCVS r7, r10,#1<<31 @ Clamp r7 + + MOV r6, r6, LSR #16 @ Shift back to halfword + MOV r7, r7, LSR #16 @ Shift back to halfword + + STRH r6, [r3],#2 @ Store output value + STRH r7, [r3],#2 @ Store output value + + SUBS r11,r11,#1 @ len-- + BGT SimpleRate_M_loop @ and loop +SimpleRate_M_end: + LDR r14,[r13,#8] @ r14 = sr + ADD r13,r13,#12 @ Skip over r0-r2 on stack + STMIA r14,{r0,r1,r2} @ Store back updated values + LDMFD r13!,{r4-r8,r10-r11,PC} +SimpleRate_M_read: + LDR r0, [r13,#4*2] @ r0 = sr + ADD r0, r0, #16 @ r0 = inPtr = inBuf + STMFD r13!,{r0,r2-r3,r12,r14} + + MOV r1, r0 @ r1 = inBuf + LDR r0, [r13,#4*5] @ r0 = AudioStream & input + MOV r2, #512 @ r2 = ARRAYSIZE(inBuf) + + @ Calling back into C++ here. WinCE is fairly easy about such things + @ but other OS are more awkward. r9 is preserved for Symbian, and + @ we have 3+8+5 = 16 things on the stack (an even number). + MOV r14,PC + LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf,512) + SUBS r1, r0, #1 @ r1 = inLen-1 + LDMFD r13!,{r0,r2-r3,r12,r14} + BLT SimpleRate_M_end + SUBS r2, r2, #1 @ r2 = opos-- + ADDGE r0, r0, #2 @ if (r2 >= 0) { sr.inPtr++ + BGE SimpleRate_M_loop @ and loop } + B SimpleRate_M_read_return + + +ARM_SimpleRate_S: + @ r0 = AudioStream &input + @ r1 = input.readBuffer + @ r2 = input->sr + @ r3 = obuf + @ <> = osamp + @ <> = vol_l + @ <> = vol_r + MOV r12,r13 + STMFD r13!,{r0-r2,r4-r8,r10-r11,r14} + LDMFD r12,{r11,r12,r14} @ r11= osamp + @ r12= vol_l + @ r14= vol_r + LDMIA r2,{r0,r1,r2,r8} @ r0 = inPtr + @ r1 = inLen + @ r2 = opos + @ r8 = opos_inc + CMP r11,#0 @ if (osamp <= 0) + BLE SimpleRate_S_end @ bale + MOV r10,#0 + ORR r12,r12,r12,LSL #8 @ r12= vol_l as 16 bits + ORR r14,r14,r14,LSL #8 @ r14= vol_r as 16 bits +SimpleRate_S_loop: + SUBS r1, r1, #2 @ r1 = inLen -= 2 + BLT SimpleRate_S_read + SUBS r2, r2, #1 @ r2 = opos-- + ADDGE r0, r0, #4 @ if (r2 >= 0) { sr.inPtr += 2 + BGE SimpleRate_S_loop @ and loop } +SimpleRate_S_read_return: + LDRSH r4, [r0],#2 @ r4 = tmp0 = *inPtr++ + LDRSH r5, [r0],#2 @ r5 = tmp1 = *inPtr++ + LDRSH r6, [r3] @ r6 = obuf[0] + LDRSH r7, [r3,#2] @ r7 = obuf[1] + ADD r2, r2, r8 @ r2 = opos += opos_inc + MUL r4, r12,r4 @ r5 = tmp0*vol_l + MUL r5, r14,r5 @ r6 = tmp1*vol_r + + ADDS r6, r4, r6, LSL #16 @ r6 = obuf[0]<<16 + tmp0*vol_l + RSCVS r6, r10,#1<<31 @ Clamp r6 + ADDS r7, r5, r7, LSL #16 @ r7 = obuf[1]<<16 + tmp1*vol_r + RSCVS r7, r10,#1<<31 @ Clamp r7 + + MOV r6, r6, LSR #16 @ Shift back to halfword + MOV r7, r7, LSR #16 @ Shift back to halfword + + STRH r6, [r3],#2 @ Store output value + STRH r7, [r3],#2 @ Store output value + + SUBS r11,r11,#1 @ osamp-- + BGT SimpleRate_S_loop @ and loop +SimpleRate_S_end: + LDR r14,[r13,#8] @ r14 = sr + ADD r13,r13,#12 @ skip over r0-r2 on stack + STMIA r14,{r0,r1,r2} @ store back updated values + LDMFD r13!,{r4-r8,r10-r11,PC} +SimpleRate_S_read: + LDR r0, [r13,#4*2] @ r0 = sr + ADD r0, r0, #16 @ r0 = inPtr = inBuf + STMFD r13!,{r0,r2-r3,r12,r14} + + MOV r1, r0 @ r1 = inBuf + LDR r0, [r13,#4*5] @ r0 = AudioStream & input + MOV r2, #512 @ r2 = ARRAYSIZE(inBuf) + + @ Calling back into C++ here. WinCE is fairly easy about such things + @ but other OS are more awkward. r9 is preserved for Symbian, and + @ we have 3+8+5 = 16 things on the stack (an even number). + MOV r14,PC + LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf,512) + SUBS r1, r0, #2 @ r1 = inLen-2 + LDMFD r13!,{r0,r2-r3,r12,r14} + BLT SimpleRate_S_end + SUBS r2, r2, #1 @ r2 = opos-- + ADDGE r0, r0, #4 @ if (r2 >= 0) { sr.inPtr += 2 + BGE SimpleRate_S_loop @ and loop } + B SimpleRate_S_read_return + + + +ARM_SimpleRate_R: + @ r0 = AudioStream &input + @ r1 = input.readBuffer + @ r2 = input->sr + @ r3 = obuf + @ <> = osamp + @ <> = vol_l + @ <> = vol_r + MOV r12,r13 + STMFD r13!,{r0-r2,r4-r8,r10-r11,r14} + LDMFD r12,{r11,r12,r14} @ r11= osamp + @ r12= vol_l + @ r14= vol_r + LDMIA r2,{r0,r1,r2,r8} @ r0 = inPtr + @ r1 = inLen + @ r2 = opos + @ r8 = opos_inc + CMP r11,#0 @ if (osamp <= 0) + BLE SimpleRate_R_end @ bale + MOV r10,#0 + ORR r12,r12,r12,LSL #8 @ r12= vol_l as 16 bits + ORR r14,r14,r14,LSL #8 @ r14= vol_r as 16 bits +SimpleRate_R_loop: + SUBS r1, r1, #2 @ r1 = inLen -= 2 + BLT SimpleRate_R_read + SUBS r2, r2, #1 @ r2 = opos-- + ADDGE r0, r0, #4 @ if (r2 >= 0) { sr.inPtr += 2 + BGE SimpleRate_R_loop @ and loop } +SimpleRate_R_read_return: + LDRSH r5, [r0],#2 @ r5 = tmp0 = *inPtr++ + LDRSH r4, [r0],#2 @ r4 = tmp1 = *inPtr++ + LDRSH r6, [r3] @ r6 = obuf[0] + LDRSH r7, [r3,#2] @ r7 = obuf[1] + ADD r2, r2, r8 @ r2 = opos += opos_inc + MUL r4, r12,r4 @ r5 = tmp0*vol_l + MUL r5, r14,r5 @ r6 = tmp1*vol_r + + ADDS r6, r4, r6, LSL #16 @ r6 = obuf[0]<<16 + tmp0*vol_l + RSCVS r6, r10,#1<<31 @ Clamp r6 + ADDS r7, r5, r7, LSL #16 @ r7 = obuf[1]<<16 + tmp1*vol_r + RSCVS r7, r10,#1<<31 @ Clamp r7 + + MOV r6, r6, LSR #16 @ Shift back to halfword + MOV r7, r7, LSR #16 @ Shift back to halfword + + STRH r6, [r3],#2 @ Store output value + STRH r7, [r3],#2 @ Store output value + + SUBS r11,r11,#1 @ osamp-- + BGT SimpleRate_R_loop @ and loop +SimpleRate_R_end: + LDR r14,[r13,#8] @ r14 = sr + ADD r13,r13,#12 @ Skip over r0-r2 on stack + STMIA r14,{r0,r1,r2} @ Store back updated values + LDMFD r13!,{r4-r8,r10-r11,PC} +SimpleRate_R_read: + LDR r0, [r13,#4*2] @ r0 = sr + ADD r0, r0, #16 @ r0 = inPtr = inBuf + STMFD r13!,{r0,r2-r3,r12,r14} + + MOV r1, r0 @ r1 = inBuf + LDR r0, [r13,#4*5] @ r0 = AudioStream & input + MOV r2, #512 @ r2 = ARRAYSIZE(inBuf) + + @ Calling back into C++ here. WinCE is fairly easy about such things + @ but other OS are more awkward. r9 is preserved for Symbian, and + @ we have 3+8+5 = 16 things on the stack (an even number). + MOV r14,PC + LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf,512) + SUBS r1, r0, #2 @ r1 = inLen-2 + LDMFD r13!,{r0,r2-r3,r12,r14} + BLT SimpleRate_R_end + SUBS r2, r2, #1 @ r2 = opos-- + ADDGE r0, r0, #4 @ if (r2 >= 0) { sr.inPtr += 2 + BGE SimpleRate_R_loop @ and loop } + B SimpleRate_R_read_return + + +ARM_LinearRate_M: + @ r0 = AudioStream &input + @ r1 = input.readBuffer + @ r2 = input->sr + @ r3 = obuf + @ <> = osamp + @ <> = vol_l + @ <> = vol_r + MOV r12,r13 + STMFD r13!,{r0-r1,r4-r11,r14} + LDMFD r12,{r11,r12,r14} @ r11= osamp + @ r12= vol_l + @ r14= vol_r + LDMIA r2,{r0,r1,r8} @ r0 = inPtr + @ r1 = inLen + @ r8 = opos + CMP r11,#0 @ if (osamp <= 0) + BLE LinearRate_M_end @ bale + ORR r12,r12,r12,LSL #8 @ r12= vol_l as 16 bits + ORR r14,r14,r14,LSL #8 @ r14= vol_r as 16 bits + CMP r1,#0 + BGT LinearRate_M_part2 + + @ part1 - read input samples +LinearRate_M_loop: + SUBS r1, r1, #1 @ r1 = inLen -= 1 + BLT LinearRate_M_read +LinearRate_M_read_return: + LDR r10,[r2, #16] @ r10= icur[0,1] + LDRSH r5, [r0],#2 @ r5 = tmp1 = *inPtr++ + SUBS r8, r8, #1 @ r8 = opos-- + STR r10,[r2,#20] @ ilast[0,1] = icur[0,1] + STRH r5, [r2,#16] @ icur[0] = tmp1 + BGE LinearRate_M_loop + + @ part2 - form output samples +LinearRate_M_part2: + @ We are guaranteed that opos < 0 here + LDRSH r6, [r2,#20] @ r6 = ilast[0] + LDRSH r5, [r2,#16] @ r5 = icur[0] + LDRH r4, [r2,#24] @ r4 = opos_frac + LDR r10,[r2,#28] @ r10= opos_frac_inc + MOV r6, r6, LSL #16 @ r6 = ilast[0]<<16 + SUB r5, r5, r6, ASR #16 @ r5 = icur[0] - ilast[0] + ADD r6, r6, #1<<15 @ r6 = ilast[0]+1<<(FRAC_BITS-1) + MLA r6, r4, r5, r6 @ r6 = (icur[0]-ilast[0])*opos_frac+ilast[0] + + ADD r4, r4, r10 @ r4 = tmp = opos_frac+opos_inc_frac + STRH r4,[r2,#24] @ opos_frac &= 65535 + ADD r8, r8, r4, LSR #16 @ opos += (tmp>>FRAC_BITS) + + LDRSH r4, [r3] @ r4 = obuf[0] + LDRSH r5, [r3,#2] @ r5 = obuf[1] + MOV r6, r6, ASR #16 @ r6 = tmp0 = tmp1 >>= 16 + MUL r7, r12,r6 @ r7 = tmp0*vol_l + MUL r6, r14,r6 @ r6 = tmp1*vol_r + + ADDS r7, r7, r4, LSL #16 @ r7 = obuf[0]<<16 + tmp0*vol_l + MOV r4, #0 + RSCVS r7, r4, #1<<31 @ Clamp r7 + ADDS r6, r6, r5, LSL #16 @ r6 = obuf[1]<<16 + tmp1*vol_r + RSCVS r6, r4, #1<<31 @ Clamp r6 + + MOV r7, r7, LSR #16 @ Shift back to halfword + MOV r6, r6, LSR #16 @ Shift back to halfword + + LDR r5, [r2,#12] @ r5 = opos_inc + STRH r7, [r3],#2 @ Store output value + STRH r6, [r3],#2 @ Store output value + SUBS r11, r11,#1 @ opos-- + BLE LinearRate_M_end @ end if needed + + ADDS r8, r8, r5 @ r8 = opos += opos_inc + BLT LinearRate_M_part2 + B LinearRate_M_loop +LinearRate_M_end: + ADD r13,r13,#8 + STMIA r2,{r0,r1,r8} + LDMFD r13!,{r4-r11,PC} +LinearRate_M_read: + ADD r0, r2, #32 @ r0 = inPtr = inBuf + STMFD r13!,{r0,r2-r3,r12,r14} + + MOV r1, r0 @ r1 = inBuf + LDR r0, [r13,#4*5] @ r0 = AudioStream & input + MOV r2, #512 @ r2 = ARRAYSIZE(inBuf) + + @ Calling back into C++ here. WinCE is fairly easy about such things + @ but other OS are more awkward. r9 is preserved for Symbian, and + @ we have 2+9+5 = 16 things on the stack (an even number). + MOV r14,PC + LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf,512) + SUBS r1, r0, #1 @ r1 = inLen-1 + LDMFD r13!,{r0,r2-r3,r12,r14} + BLT LinearRate_M_end + B LinearRate_M_read_return + +ARM_LinearRate_S: + @ r0 = AudioStream &input + @ r1 = input.readBuffer + @ r2 = input->sr + @ r3 = obuf + @ <> = osamp + @ <> = vol_l + @ <> = vol_r + MOV r12,r13 + STMFD r13!,{r0-r1,r4-r11,r14} + LDMFD r12,{r11,r12,r14} @ r11= osamp + @ r12= vol_l + @ r14= vol_r + LDMIA r2,{r0,r1,r8} @ r0 = inPtr + @ r1 = inLen + @ r8 = opos + CMP r11,#0 @ if (osamp <= 0) + BLE LinearRate_S_end @ bale + ORR r12,r12,r12,LSL #8 @ r12= vol_l as 16 bits + ORR r14,r14,r14,LSL #8 @ r14= vol_r as 16 bits + CMP r1,#0 + BGT LinearRate_S_part2 + + @ part1 - read input samples +LinearRate_S_loop: + SUBS r1, r1, #2 @ r1 = inLen -= 2 + BLT LinearRate_S_read +LinearRate_S_read_return: + LDR r10,[r2, #16] @ r10= icur[0,1] + LDRSH r5, [r0],#2 @ r5 = tmp0 = *inPtr++ + LDRSH r6, [r0],#2 @ r5 = tmp1 = *inPtr++ + SUBS r8, r8, #1 @ r8 = opos-- + STR r10,[r2,#20] @ ilast[0,1] = icur[0,1] + STRH r5, [r2,#16] @ icur[0] = tmp0 + STRH r6, [r2,#16] @ icur[1] = tmp1 + BGE LinearRate_S_loop + + @ part2 - form output samples +LinearRate_S_part2: + @ We are guaranteed that opos < 0 here + LDRSH r6, [r2,#20] @ r6 = ilast[0] + LDRSH r5, [r2,#16] @ r5 = icur[0] + LDRH r4, [r2,#24] @ r4 = opos_frac + MOV r6, r6, LSL #16 @ r6 = ilast[0]<<16 + SUB r5, r5, r6, ASR #16 @ r5 = icur[0] - ilast[0] + ADD r6, r6, #1<<15 @ r6 = ilast[0]+1<<(FRAC_BITS-1) + MLA r6, r4, r5, r6 @ r6 = (icur[0]-ilast[0])*opos_frac+ilast[0] + + LDRSH r7, [r2,#22] @ r6 = ilast[1] + LDRSH r5, [r2,#18] @ r5 = icur[1] + LDR r10,[r2,#28] @ r10= opos_frac_inc + MOV r7, r7, LSL #16 @ r7 = ilast[1]<<16 + SUB r5, r5, r7, ASR #16 @ r5 = icur[1] - ilast[1] + ADD r7, r7, #1<<15 @ r6 = ilast[1]+1<<(FRAC_BITS-1) + MLA r7, r4, r5, r7 @ r6 = (icur[1]-ilast[1])*opos_frac+ilast[1] + + ADD r4, r4, r10 @ r4 = tmp = opos_frac+opos_inc_frac + STRH r4,[r2,#24] @ opos_frac &= 65535 + ADD r8, r8, r4, LSR #16 @ opos += (tmp>>FRAC_BITS) + + LDRSH r4, [r3] @ r4 = obuf[0] + LDRSH r5, [r3,#2] @ r5 = obuf[1] + MOV r7, r7, ASR #16 @ r7 = tmp0 >>= 16 + MOV r6, r6, ASR #16 @ r6 = tmp1 >>= 16 + MUL r7, r12,r7 @ r7 = tmp0*vol_l + MUL r6, r14,r6 @ r6 = tmp1*vol_r + + ADDS r7, r7, r4, LSL #16 @ r7 = obuf[0]<<16 + tmp0*vol_l + MOV r4, #0 + RSCVS r7, r4, #1<<31 @ Clamp r7 + ADDS r6, r6, r5, LSL #16 @ r6 = obuf[1]<<16 + tmp1*vol_r + RSCVS r6, r4, #1<<31 @ Clamp r6 + + MOV r7, r7, LSR #16 @ Shift back to halfword + MOV r6, r6, LSR #16 @ Shift back to halfword + + LDR r5, [r2,#12] @ r5 = opos_inc + STRH r7, [r3],#2 @ Store output value + STRH r6, [r3],#2 @ Store output value + SUBS r11, r11,#1 @ opos-- + BLE LinearRate_S_end @ and loop + + ADDS r8, r8, r5 @ r8 = opos += opos_inc + BLT LinearRate_S_part2 + B LinearRate_S_loop +LinearRate_S_end: + ADD r13,r13,#8 + STMIA r2,{r0,r1,r8} + LDMFD r13!,{r4-r11,PC} +LinearRate_S_read: + ADD r0, r2, #32 @ r0 = inPtr = inBuf + STMFD r13!,{r0,r2-r3,r12,r14} + + MOV r1, r0 @ r1 = inBuf + LDR r0, [r13,#4*5] @ r0 = AudioStream & input + MOV r2, #512 @ r2 = ARRAYSIZE(inBuf) + + @ Calling back into C++ here. WinCE is fairly easy about such things + @ but other OS are more awkward. r9 is preserved for Symbian, and + @ we have 2+9+5 = 16 things on the stack (an even number). + MOV r14,PC + LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf,512) + SUBS r1, r0, #2 @ r1 = inLen-2 + LDMFD r13!,{r0,r2-r3,r12,r14} + BLT LinearRate_S_end + B LinearRate_S_read_return + +ARM_LinearRate_R: + @ r0 = AudioStream &input + @ r1 = input.readBuffer + @ r2 = input->sr + @ r3 = obuf + @ <> = osamp + @ <> = vol_l + @ <> = vol_r + MOV r12,r13 + STMFD r13!,{r0-r1,r4-r11,r14} + LDMFD r12,{r11,r12,r14} @ r11= osamp + @ r12= vol_l + @ r14= vol_r + LDMIA r2,{r0,r1,r8} @ r0 = inPtr + @ r1 = inLen + @ r8 = opos + CMP r11,#0 @ if (osamp <= 0) + BLE LinearRate_R_end @ bale + ORR r12,r12,r12,LSL #8 @ r12= vol_l as 16 bits + ORR r14,r14,r14,LSL #8 @ r14= vol_r as 16 bits + CMP r1,#0 + BGT LinearRate_R_part2 + + @ part1 - read input samples +LinearRate_R_loop: + SUBS r1, r1, #2 @ r1 = inLen -= 2 + BLT LinearRate_R_read +LinearRate_R_read_return: + LDR r10,[r2, #16] @ r10= icur[0,1] + LDRSH r5, [r0],#2 @ r5 = tmp0 = *inPtr++ + LDRSH r6, [r0],#2 @ r5 = tmp1 = *inPtr++ + SUBS r8, r8, #1 @ r8 = opos-- + STR r10,[r2,#20] @ ilast[0,1] = icur[0,1] + STRH r5, [r2,#16] @ icur[0] = tmp0 + STRH r6, [r2,#16] @ icur[1] = tmp1 + BGE LinearRate_R_loop + + @ part2 - form output samples +LinearRate_R_part2: + @ We are guaranteed that opos < 0 here + LDRSH r6, [r2,#20] @ r6 = ilast[0] + LDRSH r5, [r2,#16] @ r5 = icur[0] + LDRH r4, [r2,#24] @ r4 = opos_frac + MOV r6, r6, LSL #16 @ r6 = ilast[0]<<16 + SUB r5, r5, r6, ASR #16 @ r5 = icur[0] - ilast[0] + ADD r6, r6, #1<<15 @ r6 = ilast[0]+1<<(FRAC_BITS-1) + MLA r6, r4, r5, r6 @ r6 = (icur[0]-ilast[0])*opos_frac+ilast[0] + + LDRSH r7, [r2,#22] @ r6 = ilast[1] + LDRSH r5, [r2,#18] @ r5 = icur[1] + LDR r10,[r2,#28] @ r10= opos_frac_inc + MOV r7, r7, LSL #16 @ r7 = ilast[1]<<16 + SUB r5, r5, r7, ASR #16 @ r5 = icur[1] - ilast[1] + ADD r7, r7, #1<<15 @ r6 = ilast[1]+1<<(FRAC_BITS-1) + MLA r7, r4, r5, r7 @ r6 = (icur[1]-ilast[1])*opos_frac+ilast[1] + + ADD r4, r4, r10 @ r4 = tmp = opos_frac+opos_inc_frac + STRH r4,[r2,#24] @ opos_frac &= 65535 + ADD r8, r8, r4, LSR #16 @ opos += (tmp>>FRAC_BITS) + + LDRSH r4, [r3] @ r4 = obuf[0] + LDRSH r5, [r3,#2] @ r5 = obuf[1] + MOV r7, r7, ASR #16 @ r7 = tmp0 >>= 16 + MOV r6, r6, ASR #16 @ r6 = tmp1 >>= 16 + MUL r7, r12,r7 @ r7 = tmp0*vol_l + MUL r6, r14,r6 @ r6 = tmp1*vol_r + + ADDS r7, r7, r4, LSL #16 @ r7 = obuf[0]<<16 + tmp0*vol_l + MOV r4, #0 + RSCVS r7, r4, #1<<31 @ Clamp r7 + ADDS r6, r6, r5, LSL #16 @ r6 = obuf[1]<<16 + tmp1*vol_r + RSCVS r6, r4, #1<<31 @ Clamp r6 + + MOV r7, r7, LSR #16 @ Shift back to halfword + MOV r6, r6, LSR #16 @ Shift back to halfword + + LDR r5, [r2,#12] @ r5 = opos_inc + STRH r6, [r3],#2 @ Store output value + STRH r7, [r3],#2 @ Store output value + SUBS r11, r11,#1 @ opos-- + BLE LinearRate_R_end @ and loop + + ADDS r8, r8, r5 @ r8 = opos += opos_inc + BLT LinearRate_R_part2 + B LinearRate_R_loop +LinearRate_R_end: + ADD r13,r13,#8 + STMIA r2,{r0,r1,r8} + LDMFD r13!,{r4-r11,PC} +LinearRate_R_read: + ADD r0, r2, #32 @ r0 = inPtr = inBuf + STMFD r13!,{r0,r2-r3,r12,r14} + + MOV r1, r0 @ r1 = inBuf + LDR r0, [r13,#4*5] @ r0 = AudioStream & input + MOV r2, #512 @ r2 = ARRAYSIZE(inBuf) + + @ Calling back into C++ here. WinCE is fairly easy about such things + @ but other OS are more awkward. r9 is preserved for Symbian, and + @ we have 2+9+5 = 16 things on the stack (an even number). + MOV r14,PC + LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf,512) + SUBS r1, r0, #2 @ r1 = inLen-2 + LDMFD r13!,{r0,r2-r3,r12,r14} + BLT LinearRate_R_end + B LinearRate_R_read_return |