[Scummvm-git-logs] scummvm master -> 570482a075dd83514ad146da6bce54bef4db9feb

NMIError 60350957+NMIError at users.noreply.github.com
Mon Sep 13 19:02:13 UTC 2021


This automated email contains information about 10 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
8a17747ea3 TOON: Add English demo character animation table
7dd628083a TOON: Fix English demo Flux idle anmiations
aff2f12440 TOON: Fix English demo Drew walking animation
8ac072c265 TOON: Fix array out of bounds access in killAmbientSFX
01daf7d22b TOON: Fix English demo inventory
aff1e60597 TOON: Fix English demo invalid additional Rif data
f2185bfb35 TOON: Fix English demo options menu
389fe44dda TOON: Implement English demo font rendering
c786c75695 TOON: Implement sparkles on English demo options screen
570482a075 TOON: Remove English demo unstable flag


Commit: 8a17747ea3c99e455930f88ac551dc5da1581ee8
    https://github.com/scummvm/scummvm/commit/8a17747ea3c99e455930f88ac551dc5da1581ee8
Author: Coen Rampen (crampen at gmail.com)
Date: 2021-09-13T20:59:16+02:00

Commit Message:
TOON: Add English demo character animation table

The English demo uses a different character animation table than the other
versions of the game.

Changed paths:
    engines/toon/character.cpp
    engines/toon/character.h
    engines/toon/toon.cpp
    engines/toon/toon.h


diff --git a/engines/toon/character.cpp b/engines/toon/character.cpp
index d68278f9d0..0bcfc245c1 100644
--- a/engines/toon/character.cpp
+++ b/engines/toon/character.cpp
@@ -681,9 +681,302 @@ const SpecialCharacterAnimation *Character::getSpecialAnimation(int32 characterI
 	debugC(6, kDebugCharacter, "getSpecialAnimation(%d, %d)", characterId, animationId);
 
 	// very nice animation list hardcoded in the executable...
-	// TODO This list does not seem to be correct for the English demo.
-	static const SpecialCharacterAnimation anims[] = {
-		{ "TLK547_?", 9, 0, 0, 0, 0, 0, 1, 5, 8, 1, 8, 0, 255 },
+	static const SpecialCharacterAnimation regularAnims[] = {
+		{"TLK547_?", 9, 0, 0, 0, 0, 0, 1, 5, 8, 1, 8, 0, 255},
+		{"TLK555_?", 16, 0, 0, 0, 0, 6, 8, 10, 255, 6, 11, 2, 255},
+		{"LST657_?", 14, 0, 0, 0, 0, 255, 255, 255, 255, 5, 11, 0, 255},
+		{"TLK587_?", 18, 0, 0, 0, 0, 5, 7, 9, 11, 4, 13, 1, 255},
+		{"LST659_?", 14, 0, 0, 0, 0, 255, 255, 255, 255, 6, 8, 0, 255},
+		{"TLK595_?", 11, 0, 0, 0, 0, 3, 6, 255, 255, 1, 7, 0, 255},
+		{"IDL165_?", 13, 0, 0, 0, 0, 255, 255, 255, 255, 6, 8, 0, 255},
+		{"LST699_?", 10, 0, 0, 0, 0, 255, 255, 255, 255, 1, 9, 1, 255},
+		{"LST713_?", 10, 0, 0, 0, 0, 255, 255, 255, 255, 4, 6, 0, 255},
+		{"IDL169_?", 16, 0, 0, 0, 0, 255, 255, 255, 255, 5, 9, 2, 255},
+		{"IDL173_?", 19, 0, 0, 0, 0, 255, 255, 255, 255, 4, 17, 1, 255},
+		{"IDL187_?", 14, 0, 0, 0, 0, 255, 255, 255, 255, 4, 8, 0, 255},
+		{"IDL185_?", 15, 0, 0, 0, 0, 255, 255, 255, 255, 6, 9, 1, 255},
+		{"TLK635_?", 16, 0, 0, 0, 0, 5, 8, 10, 12, 4, 12, 0, 255},
+		{"TLK637_?", 18, 0, 0, 0, 0, 5, 7, 9, 12, 4, 13, 0, 255},
+		{"TLK551_?", 20, 0, 0, 0, 0, 5, 9, 11, 15, 4, 16, 0, 255},
+		{"TLK553_?", 20, 0, 0, 0, 0, 7, 9, 11, 13, 6, 15, 0, 255},
+		{"TLK619_?", 18, 0, 0, 0, 0, 5, 8, 11, 13, 5, 15, 0, 255},
+		{"TLK601_?", 12, 0, 0, 0, 0, 2, 5, 6, 10, 2, 10, 1, 255},
+		{"TLK559_?", 18, 0, 0, 0, 0, 4, 6, 10, 12, 4, 13, 0, 255},
+		{"TLK557_?", 16, 0, 0, 0, 0, 6, 8, 10, 255, 6, 11, 0, 255},
+		{"TLK561_?", 17, 0, 0, 0, 0, 6, 8, 10, 12, 5, 12, 0, 255},
+		{"TLK623_?", 19, 0, 0, 0, 0, 6, 8, 10, 13, 6, 14, 0, 255},
+		{"TLK591_?", 20, 0, 0, 0, 0, 10, 14, 255, 255, 7, 15, 0, 255},
+		{"TLK567_?", 19, 0, 0, 0, 0, 6, 9, 11, 14, 5, 15, 0, 255},
+		{"TLK629_?", 18, 0, 0, 0, 0, 6, 8, 10, 11, 6, 12, 0, 255},
+		{"TLK627_?", 19, 0, 0, 0, 0, 7, 10, 12, 14, 4, 14, 0, 255},
+		{"TLK631_?", 19, 0, 0, 0, 0, 8, 10, 255, 255, 8, 12, 0, 255},
+		{"TLK565_?", 17, 0, 0, 0, 0, 4, 7, 9, 11, 3, 12, 0, 255},
+		{"TLK603_?", 16, 0, 0, 0, 0, 5, 255, 255, 255, 3, 9, 0, 255},
+		{"TLK573_?", 20, 0, 0, 0, 0, 6, 7, 10, 255, 6, 16, 2, 255},
+		{"TLK615_?", 17, 0, 0, 0, 0, 6, 8, 10, 12, 5, 12, 0, 255},
+		{"TLK609_?", 18, 0, 0, 0, 0, 6, 8, 10, 12, 5, 13, 0, 255},
+		{"TLK611_?", 18, 0, 0, 0, 0, 8, 10, 12, 255, 7, 13, 0, 255},
+		{"TLK607_?", 16, 0, 0, 0, 0, 4, 7, 9, 11, 4, 12, 0, 255},
+		{"TLK581_?", 15, 0, 0, 0, 0, 7, 9, 11, 255, 6, 11, 0, 255},
+		{"SHD107_?", 46, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"IHL106_?", 23, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 7},
+		{"GLV106_?", 23, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 7},
+		{"FXTKA_?", 11, 0, 0, 0, 0, 7, 255, 255, 255, 2, 9, 0, 255},
+		{"FXTKF_?", 12, 0, 0, 0, 0, 6, 8, 255, 255, 5, 9, 0, 255},
+		{"FXTKG_?", 9, 0, 0, 0, 0, 5, 255, 255, 255, 4, 7, 0, 255},
+		{"FXTKI_?", 12, 0, 0, 0, 0, 6, 255, 255, 255, 5, 9, 0, 255},
+		{"FXTKL_?", 14, 0, 0, 0, 0, 4, 6, 255, 255, 3, 10, 0, 255},
+		{"FXTKO_?", 10, 0, 0, 0, 0, 4, 255, 255, 255, 4, 7, 0, 255},
+		{"FXTKP_?", 9, 0, 0, 0, 0, 4, 6, 255, 255, 3, 7, 0, 255},
+		{"FXTKQ_?", 10, 0, 0, 0, 0, 4, 6, 255, 255, 3, 7, 0, 255},
+		{"FXLSA_?", 11, 0, 0, 0, 0, 255, 255, 255, 255, 4, 6, 0, 255},
+		{"FXLSB_?", 9, 0, 0, 0, 0, 255, 255, 255, 255, 4, 5, 0, 255},
+		{"FXLSK_?", 8, 0, 0, 0, 0, 255, 255, 255, 255, 5, 6, 0, 255},
+		{"FXLSM_?", 7, 0, 0, 0, 0, 255, 255, 255, 255, 4, 4, 0, 255},
+		{"FXLSP_?", 7, 0, 0, 0, 0, 255, 255, 255, 255, 3, 3, 0, 255},
+		{"FXLSQ_?", 6, 0, 0, 0, 0, 255, 255, 255, 255, 3, 3, 0, 255},
+		{"FXIDE_?", 10, 0, 0, 0, 0, 255, 255, 255, 255, 5, 7, 0, 255},
+		{"FXIDI_?", 7, 0, 0, 0, 0, 255, 255, 255, 255, 1, 6, 1, 255},
+		{"FXRCT1_?", 12, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"FXTKB_?", 11, 0, 0, 0, 0, 7, 255, 255, 255, 5, 9, 0, 255},
+		{"FXTKC_?", 14, 0, 0, 0, 0, 2, 5, 8, 10, 1, 12, 2, 255},
+		{"FXTKD_?", 14, 0, 0, 0, 0, 5, 7, 9, 255, 4, 11, 0, 255},
+		{"FXTKE_?", 14, 0, 0, 0, 0, 2, 255, 255, 255, 1, 12, 1, 255},
+		{"FXTKH_?", 11, 0, 0, 0, 0, 6, 8, 255, 255, 4, 9, 0, 255},
+		{"FXTKJ_?", 8, 0, 0, 0, 0, 7, 255, 255, 255, 4, 7, 0, 255},
+		{"FXTKK_?", 13, 0, 0, 0, 0, 6, 8, 255, 255, 5, 9, 0, 255},
+		{"FXTKM_?", 11, 0, 0, 0, 0, 6, 255, 255, 255, 4, 7, 0, 255},
+		{"FXTKN_?", 9, 0, 0, 0, 0, 5, 7, 255, 255, 4, 7, 0, 255},
+		{"FXLSC_?", 9, 0, 0, 0, 0, 255, 255, 255, 255, 3, 6, 1, 255},
+		{"FXLSD_?", 7, 0, 0, 0, 0, 255, 255, 255, 255, 4, 5, 0, 255},
+		{"FXLSE_?", 9, 0, 0, 0, 0, 255, 255, 255, 255, 8, 8, 0, 255},
+		{"FXLSG_?", 11, 0, 0, 0, 0, 255, 255, 255, 255, 6, 8, 2, 255},
+		{"FXLSI_?", 8, 0, 0, 0, 0, 255, 255, 255, 255, 5, 6, 0, 255},
+		{"FXLSJ_?", 5, 0, 0, 0, 0, 255, 255, 255, 255, 3, 4, 0, 255},
+		{"FXLSO_?", 8, 0, 0, 0, 0, 255, 255, 255, 255, 4, 5, 0, 255},
+		{"FXIDA_?", 15, 0, 0, 0, 0, 255, 255, 255, 255, 1, 12, 1, 255},
+		{"FXIDB_?", 12, 0, 0, 0, 0, 255, 255, 255, 255, 4, 11, 1, 255},
+		{"FXIDC_?", 11, 0, 0, 0, 0, 255, 255, 255, 255, 7, 7, 0, 255},
+		{"FXIDD_?", 15, 0, 0, 0, 0, 255, 255, 255, 255, 6, 6, 0, 255},
+		{"FXIDG_?", 6, 0, 0, 0, 0, 255, 255, 255, 255, 3, 4, 0, 255},
+		{"FXVRA_?", 7, 0, 0, 0, 0, 255, 255, 255, 255, 2, 6, 2, 255},
+		{"FXIDF_?", 15, 0, 0, 0, 0, 255, 255, 255, 255, 9, 11, 0, 255},
+		{"FXEXA_?", 9, 0, 0, 0, 0, 255, 255, 255, 255, 5, 5, 0, 255},
+		{"FXEXA_?", 9, 0, 0, 0, 0, 255, 255, 255, 255, 5, 5, 0, 255},
+		{"FFNTK1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 1, 7, 0, 255},
+		{"FFTLK1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 1, 9, 0, 1},
+		{"FFBLS1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 3, 8, 0, 2},
+		{"FFLOV2", 6, 0, 0, 0, 0, 255, 255, 255, 255, 3, 5, 0, 2},
+		{"FFWOE1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 3, 9, 0, 2},
+		{"FFSNF1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 4, 6, 0, 4},
+		{"FFLAF1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 2, 8, 0, 1},
+		{"FFSKE1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 3, 10, 0, 2},
+		{"RGTLK2", 10, 0, 0, 0, 0, 4, 6, 255, 255, 2, 6, 0, 1},
+		{"RGTLK1", 10, 0, 0, 0, 0, 4, 6, 255, 255, 2, 6, 0, 1},
+		{"BRTLK1", 26, 0, 0, 0, 0, 255, 255, 255, 255, 2, 23, 0, 255},
+		{"BREXT1", 14, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"BRLRT1", 19, 0, 0, 0, 0, 255, 255, 255, 255, 1, 15, 0, 255},
+		{"BRBWV1", 12, 0, 0, 0, 0, 255, 255, 255, 255, 3, 8, 0, 255},
+		{"BRPAT1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"BRBSP1", 7, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"BRBEX1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"BRBLK1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"BRBET1", 17, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"BRWEX1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"BBTLK2", 26, 0, 0, 0, 0, 255, 255, 255, 255, 2, 23, 1, 255},
+		{"BBEXT2", 14, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 1, 255},
+		{"BRLST1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 2, 7, 0, 255},
+		{"BRLSN1", 13, 0, 0, 0, 0, 255, 255, 255, 255, 1, 13, 2, 255},
+		{"BRBNO1", 13, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"BRBND1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"BBLSN2", 13, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"CCTALK", 6, 0, 0, 0, 0, 2, 5, 255, 255, 1, 5, 0, 255},
+		{"CCBIT1", 13, 0, 0, 0, 0, 3, 5, 9, 11, 2, 11, 2, 255},
+		{"CCCMP1", 13, 0, 0, 0, 0, 6, 9, 255, 255, 5, 10, 1, 2},
+		{"CCCOY1", 14, 0, 0, 0, 0, 6, 8, 255, 255, 4, 8, 0, 3},
+		{"CCFNG1", 5, 0, 0, 0, 0, 255, 255, 255, 255, 4, 4, 0, 255},
+		{"CCGRB1", 13, 0, 0, 0, 0, 6, 255, 255, 255, 6, 9, 0, 3},
+		{"CCGST1", 9, 0, 0, 0, 0, 4, 255, 255, 255, 4, 7, 0, 2},
+		{"CCHCN1", 10, 0, 0, 0, 0, 6, 9, 255, 255, 4, 9, 0, 0},
+		{"CCHND1", 7, 0, 0, 0, 0, 6, 255, 255, 255, 2, 6, 0, 1},
+		{"FTTLK2", 11, 0, 0, 0, 0, 1, 4, 6, 9, 1, 10, 0, 2},
+		{"FTGNO2", 11, 0, 0, 0, 0, 4, 6, 8, 255, 4, 8, 1, 2},
+		{"FTGST2", 6, 0, 0, 0, 0, 1, 2, 4, 5, 2, 5, 0, 1},
+		{"FTHND2", 7, 0, 0, 0, 0, 2, 5, 255, 255, 1, 6, 1, 255},
+		{"FTRNT2", 11, 0, 0, 0, 0, 3, 5, 7, 9, 2, 9, 1, 1},
+		{"FTSRG2", 10, 0, 0, 0, 0, 4, 6, 8, 255, 3, 8, 1, 1},
+		{"FTQOT2", 8, 0, 0, 0, 0, 1, 4, 8, 255, 1, 6, 1, 255},
+		{"FMSTK1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 1, 7, 0, 255},
+		{"FMCRH1", 13, 0, 0, 0, 0, 255, 255, 255, 255, 3, 10, 0, 255},
+		{"FMFGR1", 12, 0, 0, 0, 0, 255, 255, 255, 255, 1, 10, 0, 255},
+		{"FMPRS1", 17, 0, 0, 0, 0, 255, 255, 255, 255, 1, 14, 0, 255},
+		{"FMAGR1", 12, 0, 0, 0, 0, 255, 255, 255, 255, 2, 9, 0, 255},
+		{"FMWOE1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 1, 9, 0, 255},
+		{"FMTOE1", 17, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"FM1TK1", 12, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"FM2TK1", 6, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"FM3TK1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"FMTNB1", 4, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"FMLOK1", 6, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"FMCST1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 3, 8, 0, 255},
+		{"FMLUP3", 8, 0, 0, 0, 0, 255, 255, 255, 255, 2, 5, 0, 255},
+		{"BDTLK1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 1, 7, 0, 255},
+		{"BDGLE1", 15, 0, 0, 0, 0, 255, 255, 255, 255, 6, 10, 0, 255},
+		{"BDSHK1", 16, 0, 0, 0, 0, 255, 255, 255, 255, 5, 11, 0, 1},
+		{"BDWOE1", 22, 0, 0, 0, 0, 255, 255, 255, 255, 9, 16, 0, 2},
+		{"BDHIP1", 22, 0, 0, 0, 0, 255, 255, 255, 255, 8, 16, 0, 1},
+		{"BDFLG1", 13, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"BDKLT1", 12, 0, 0, 0, 0, 255, 255, 255, 255, 5, 10, 0, 255},
+		{"BDSWY1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"WPSNK1", 5, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"WPLAF1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 5, 9, 1, 1},
+		{"DOTLK1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 1, 8, 0, 255},
+		{"DOGST1", 15, 0, 0, 0, 0, 255, 255, 255, 255, 4, 11, 1, 255},
+		{"DO2DF1", 14, 0, 0, 0, 0, 255, 255, 255, 255, 3, 11, 1, 255},
+		{"DOSNG1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 8, 9, 1, 255},
+		{"DOWOE1", 12, 0, 0, 0, 0, 255, 255, 255, 255, 5, 10, 1, 255},
+		{"DO2ME1", 18, 0, 0, 0, 0, 255, 255, 255, 255, 5, 13, 1, 255},
+		{"DOGLP1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 1, 255},
+		{"DOCRY1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 3, 6, 1, 255},
+		{"METLK1", 5, 0, 0, 0, 0, 255, 255, 255, 255, 1, 4, 0, 255},
+		{"MECHT1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 2, 9, 1, 255},
+		{"ME2DF1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 2, 9, 0, 255},
+		{"MESNG1", 12, 0, 0, 0, 0, 255, 255, 255, 255, 5, 10, 2, 255},
+		{"MEWOE1", 13, 0, 0, 0, 0, 255, 255, 255, 255, 3, 10, 1, 255},
+		{"ME2DO1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 2, 9, 1, 255},
+		{"MEGLP1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 1, 255},
+		{"MECRY1", 12, 0, 0, 0, 0, 255, 255, 255, 255, 6, 9, 1, 255},
+		{"CSTLK1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 1, 7, 0, 0},
+		{"CSNUD1", 14, 0, 0, 0, 0, 255, 255, 255, 255, 5, 11, 0, 2},
+		{"CSSPR1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 4, 8, 0, 2},
+		{"CSWVE1", 13, 0, 0, 0, 0, 255, 255, 255, 255, 4, 9, 0, 1},
+		{"CSYEL1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 2, 6, 0, 1},
+		{"JMTLK1", 7, 0, 0, 0, 0, 1, 4, 255, 255, 1, 6, 0, 0},
+		{"JMEGO1", 11, 0, 0, 0, 0, 6, 255, 255, 255, 3, 8, 0, 1},
+		{"JMARS1", 7, 0, 0, 0, 0, 4, 6, 255, 255, 3, 6, 0, 2},
+		{"JMHIP1", 8, 0, 0, 0, 0, 3, 5, 7, 255, 2, 7, 0, 1},
+		{"JMBNK1", 2, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"MRTLK1", 9, 0, 0, 0, 0, 4, 7, 255, 255, 2, 7, 0, 1},
+		{"MRHOF1", 8, 0, 0, 0, 0, 3, 5, 255, 255, 2, 5, 0, 255},
+		{"MRMRN1", 11, 0, 0, 0, 0, 3, 7, 255, 255, 1, 8, 0, 0},
+		{"MRDPR1", 11, 0, 0, 0, 0, 1, 5, 9, 255, 1, 8, 0, 255},
+		{"MRGLE1", 13, 0, 0, 0, 0, 5, 9, 255, 255, 3, 10, 0, 2},
+		{"MRTDF1", 11, 0, 0, 0, 0, 3, 7, 9, 255, 3, 9, 0, 1},
+		{"MREDF1", 11, 0, 0, 0, 0, 4, 255, 255, 255, 1, 10, 1, 255},
+		{"MREPL1", 12, 0, 0, 0, 0, 5, 6, 7, 9, 2, 9, 1, 1},
+		{"MRAPL1", 12, 0, 0, 0, 0, 4, 8, 9, 255, 2, 9, 0, 1},
+		{"MREVL1", 8, 0, 0, 0, 0, 5, 255, 255, 255, 1, 5, 1, 255},
+		{"BWDMR1", 16, 0, 0, 0, 0, 4, 7, 9, 11, 3, 14, 0, 1},
+		{"BWBUF1", 12, 0, 0, 0, 0, 5, 8, 255, 255, 3, 11, 0, 1},
+		{"BWHIP1", 12, 0, 0, 0, 0, 3, 6, 255, 255, 1, 9, 2, 0},
+		{"BWHWL1", 14, 0, 0, 0, 0, 255, 255, 255, 255, 1, 4, 2, 255},
+		{"BWLEN1", 10, 0, 0, 0, 0, 3, 6, 255, 255, 2, 7, 0, 1},
+		{"BWSRL1", 6, 0, 0, 0, 0, 255, 255, 255, 255, 2, 5, 0, 1},
+		{"BWWAG1", 6, 0, 0, 0, 0, 4, 10, 14, 18, 1, 4, 0, 0},
+		{"BWYEL1", 8, 0, 0, 0, 0, 4, 255, 255, 255, 2, 7, 0, 1},
+		{"BWTLK1", 15, 0, 0, 0, 0, 5, 8, 255, 255, 5, 9, 0, 1},
+		{"SLTLK1", 19, 0, 0, 0, 0, 255, 255, 255, 255, 1, 18, 0, 255},
+		{"SLPND1", 12, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"SLPNT1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"SLPTR1", 14, 0, 0, 0, 0, 255, 255, 255, 255, 6, 13, 1, 255},
+		{"SDTLK1", 7, 0, 0, 0, 0, 255, 255, 255, 255, 1, 5, 0, 255},
+		{"SDPDF1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 3, 6, 0, 255},
+		{"SDPNT1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 2, 7, 0, 255},
+		{"SDSLF1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 2, 7, 0, 255},
+		{"SDSTG1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"SDWVE1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 1, 8, 0, 255},
+		{"SDSTK1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"SDSMK1", 22, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"SDGLN1", 5, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"SDLAF1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"RMHIP1", 12, 0, 0, 0, 0, 7, 255, 255, 255, 1, 10, 2, 255},
+		{"RMGES1", 19, 0, 0, 0, 0, 11, 255, 255, 255, 8, 13, 2, 2},
+		{"RMPCH1", 18, 0, 0, 0, 0, 12, 255, 255, 255, 6, 13, 0, 2},
+		{"RMSTH1", 12, 0, 0, 0, 0, 5, 255, 255, 255, 3, 6, 0, 2},
+		{"RMHND1", 7, 0, 0, 0, 0, 5, 255, 255, 255, 5, 5, 1, 255},
+		{"RMSTH1", 12, 0, 0, 0, 0, 5, 255, 255, 255, 5, 6, 1, 2},
+		{"SGHND1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 1, 9, 0, 0},
+		{"SGSTF1", 13, 0, 0, 0, 0, 255, 255, 255, 255, 1, 12, 0, 255},
+		{"SGSLP1", 16, 0, 0, 0, 0, 255, 255, 255, 255, 1, 15, 0, 255},
+		{"SGPHC1", 12, 0, 0, 0, 0, 255, 255, 255, 255, 4, 9, 0, 255},
+		{"SGHALT", 22, 0, 0, 0, 0, 255, 255, 255, 255, 7, 15, 0, 255},
+		{"STTLK1", 13, 0, 0, 0, 0, 5, 9, 255, 255, 3, 10, 0, 2},
+		{"STTNM1", 13, 0, 0, 0, 0, 5, 9, 255, 255, 3, 10, 0, 2},
+		{"STFST1", 11, 0, 0, 0, 0, 3, 8, 255, 255, 1, 9, 0, 255},
+		{"STLAF1", 20, 0, 0, 0, 0, 255, 255, 255, 255, 11, 15, 1, 2},
+		{"STGES1", 13, 0, 0, 0, 0, 5, 7, 255, 255, 3, 7, 0, 2},
+		{"STFNT1", 10, 0, 0, 0, 0, 4, 6, 255, 255, 255, 255, 0, 2},
+		{"STSRK1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 1, 3, 2, 0},
+		{"STRED1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 2, 10, 0, 255},
+		{"STLKU1", 6, 0, 0, 0, 0, 3, 255, 255, 255, 2, 5, 0, 0},
+		{"STKEY1", 15, 0, 0, 0, 0, 9, 11, 255, 255, 9, 14, 0, 255},
+		{"STMKTD1", 7, 0, 0, 0, 0, 3, 6, 255, 255, 1, 6, 0, 255},
+		{"STTKM1", 21, 0, 0, 0, 0, 12, 13, 15, 16, 12, 17, 0, 1},
+		{"STMSZ1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 1, 3, 2, 255},
+		{"STPNV1", 14, 0, 0, 0, 0, 6, 11, 255, 255, 4, 11, 0, 1},
+		{"STSOM1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 1, 3, 2, 255},
+		{"MYTLK1", 9, 0, 0, 0, 0, 2, 4, 255, 255, 1, 4, 0, 0},
+		{"MYSQUAWK", 5, 0, 0, 0, 0, 255, 255, 255, 255, 3, 3, 1, 255},
+		{"SPTLK", 12, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"SPARM", 16, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"SPHOP", 18, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"SPLNT", 16, 0, 0, 0, 0, 255, 255, 255, 255, 3, 13, 0, 255},
+		{"SPLAF", 11, 0, 0, 0, 0, 255, 255, 255, 255, 5, 10, 2, 255},
+		{"SPTFN", 10, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"SPPIN", 14, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"SPINH1", 21, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"SPSFTCOM", 10, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255},
+		{"MFTMZ1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 1, 8, 1, 255},
+		{"MFTLK1", 13, 0, 0, 0, 0, 2, 7, 255, 255, 1, 12, 1, 255},
+		{"VGCIR1", 15, 0, 0, 0, 0, 5, 9, 255, 255, 2, 13, 1, 255},
+		{"VGBIT1", 12, 0, 0, 0, 0, 6, 9, 255, 255, 2, 9, 1, 255},
+		{"VGANG1", 10, 0, 0, 0, 0, 9, 255, 255, 255, 1, 9, 0, 255},
+		{"VGCOM1", 13, 0, 0, 0, 0, 5, 11, 255, 255, 2, 11, 0, 255},
+		{"VGCUR1", 8, 0, 0, 0, 0, 4, 8, 255, 255, 2, 7, 0, 255},
+		{"VGTLK1", 11, 0, 0, 0, 0, 3, 6, 255, 255, 3, 10, 0, 255},
+		{"VGEXP1", 10, 0, 0, 0, 0, 5, 9, 255, 255, 3, 9, 0, 255},
+		{"WFTLK1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 1, 7, 0, 1},
+		{"WFPNT1", 20, 0, 0, 0, 0, 255, 255, 255, 255, 6, 16, 0, 1},
+		{"WFFST1", 13, 0, 0, 0, 0, 255, 255, 255, 255, 2, 8, 0, 2},
+		{"WFTNO1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 2, 5, 0, 2},
+		{"WFSRG1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 3, 8, 0, 1},
+		{"WFGTK1", 16, 0, 0, 0, 0, 255, 255, 255, 255, 1, 15, 0, 255},
+		{"WFPAW1", 24, 0, 0, 0, 0, 255, 255, 255, 255, 4, 22, 0, 1},
+		{"LGTLK", 20, 0, 0, 0, 0, 4, 8, 11, 15, 1, 17, 0, 255},
+		{"LGSHOUT", 16, 0, 0, 0, 0, 12, 255, 255, 255, 6, 12, 0, 255},
+		{"POMRN1", 12, 0, 0, 0, 0, 3, 5, 7, 255, 3, 9, 0, 2},
+		{"POGLE1", 14, 0, 0, 0, 0, 7, 10, 255, 255, 5, 10, 0, 2},
+		{"PLMRG1", 16, 0, 0, 0, 0, 9, 255, 255, 255, 8, 12, 0, 1},
+		{"PLCMR1", 16, 0, 0, 0, 0, 8, 10, 255, 255, 8, 12, 0, 3},
+		{"PLEVL1", 17, 0, 0, 0, 0, 9, 255, 255, 255, 7, 9, 0, 1},
+		{"PLEDF1", 9, 0, 0, 0, 0, 4, 6, 255, 255, 5, 7, 0, 2},
+		{"PLTLK1", 11, 0, 0, 0, 0, 5, 8, 255, 255, 5, 8, 0, 1},
+		{"ELTLK1", 8, 0, 0, 0, 0, 3, 5, 7, 255, 2, 7, 0, 255},
+		{"ELSNR1", 7, 0, 0, 0, 0, 3, 255, 255, 255, 1, 5, 0, 255},
+		{"RG2TK1", 10, 0, 0, 0, 0, 4, 6, 255, 255, 2, 6, 0, 1},
+		{"RG2TK1", 10, 0, 0, 0, 0, 4, 6, 255, 255, 2, 6, 0, 1},
+		{"C2TALK", 6, 0, 0, 0, 0, 2, 5, 255, 255, 1, 5, 0, 255},
+		{"C2BIT1", 13, 0, 0, 0, 0, 3, 5, 9, 11, 2, 11, 2, 255},
+		{"C2CMP1", 13, 0, 0, 0, 0, 6, 9, 255, 255, 5, 10, 1, 2},
+		{"C2COY1", 14, 0, 0, 0, 0, 6, 8, 255, 255, 4, 8, 0, 3},
+		{"C2FNG1", 5, 0, 0, 0, 0, 255, 255, 255, 255, 4, 4, 0, 255},
+		{"C2GRB1", 13, 0, 0, 0, 0, 6, 255, 255, 255, 6, 9, 0, 3},
+		{"C2GST1", 9, 0, 0, 0, 0, 4, 255, 255, 255, 4, 7, 0, 2},
+		{"C2HCN1", 10, 0, 0, 0, 0, 6, 9, 255, 255, 4, 9, 0, 0},
+		{"C2HND1", 7, 0, 0, 0, 0, 6, 255, 255, 255, 2, 6, 0, 1},
+		{"666TKBB3", 21, 0, 0, 0, 0, 9, 14, 255, 255, 6, 16, 0, 255},
+		{"665TFLX3", 27, 0, 0, 0, 0, 10, 14, 17, 255, 10, 18, 0, 255},
+		{"664FXTK3", 18, 0, 0, 0, 0, 5, 7, 11, 13, 3, 15, 0, 255},
+		{"FDTALK", 15, 0, 0, 0, 0, 9, 255, 255, 255, 7, 9, 0, 255},
+		{"FDYELL", 16, 0, 0, 0, 0, 10, 255, 255, 255, 8, 10, 0, 255},
+		{"GLTLK", 20, 0, 0, 0, 0, 6, 12, 18, 255, 1, 19, 0, 255},
+		{"GLTRN", 4, 0, 0, 0, 0, 3, 255, 255, 255, 1, 2, 0, 255},
+		{"RAYTALK1", 10, 0, 0, 0, 0, 3, 5, 8, 255, 1, 9, 0, 255},
+		{"BRTKB1", 17, 0, 0, 0, 0, 255, 255, 255, 255, 2, 14, 0, 255}
+	};
+
+	static const SpecialCharacterAnimation englishDemoAnims[] = {
+		{"TLK547_?", 9, 0, 0, 0, 0, 0, 1, 5, 8, 1, 8, 0, 255},
 		{ "TLK555_?", 16, 0, 0, 0, 0, 6, 8, 10, 255, 6, 11, 2, 255 },
 		{ "LST657_?", 14, 0, 0, 0, 0, 255, 255, 255, 255, 5, 11, 0, 255 },
 		{ "TLK587_?", 18, 0, 0, 0, 0, 5, 7, 9, 11, 4, 13, 1, 255 },
@@ -713,15 +1006,12 @@ const SpecialCharacterAnimation *Character::getSpecialAnimation(int32 characterI
 		{ "TLK631_?", 19, 0, 0, 0, 0, 8, 10, 255, 255, 8, 12, 0, 255 },
 		{ "TLK565_?", 17, 0, 0, 0, 0, 4, 7, 9, 11, 3, 12, 0, 255 },
 		{ "TLK603_?", 16, 0, 0, 0, 0, 5, 255, 255, 255, 3, 9, 0, 255 },
-		{ "TLK573_?", 20, 0, 0, 0, 0, 6, 7, 10, 255, 6, 16, 2, 255 },
+		{ "TLK573_?", 20, 0, 0, 0, 0, 6, 7, 10, 255, 6, 11, 0, 255 },
 		{ "TLK615_?", 17, 0, 0, 0, 0, 6, 8, 10, 12, 5, 12, 0, 255 },
 		{ "TLK609_?", 18, 0, 0, 0, 0, 6, 8, 10, 12, 5, 13, 0, 255 },
 		{ "TLK611_?", 18, 0, 0, 0, 0, 8, 10, 12, 255, 7, 13, 0, 255 },
 		{ "TLK607_?", 16, 0, 0, 0, 0, 4, 7, 9, 11, 4, 12, 0, 255 },
 		{ "TLK581_?", 15, 0, 0, 0, 0, 7, 9, 11, 255, 6, 11, 0, 255 },
-		{ "SHD107_?", 46, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
-		{ "IHL106_?", 23, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 7 },
-		{ "GLV106_?", 23, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 7 },
 		{ "FXTKA_?", 11, 0, 0, 0, 0, 7, 255, 255, 255, 2, 9, 0, 255 },
 		{ "FXTKF_?", 12, 0, 0, 0, 0, 6, 8, 255, 255, 5, 9, 0, 255 },
 		{ "FXTKG_?", 9, 0, 0, 0, 0, 5, 255, 255, 255, 4, 7, 0, 255 },
@@ -736,7 +1026,7 @@ const SpecialCharacterAnimation *Character::getSpecialAnimation(int32 characterI
 		{ "FXLSM_?", 7, 0, 0, 0, 0, 255, 255, 255, 255, 4, 4, 0, 255 },
 		{ "FXLSP_?", 7, 0, 0, 0, 0, 255, 255, 255, 255, 3, 3, 0, 255 },
 		{ "FXLSQ_?", 6, 0, 0, 0, 0, 255, 255, 255, 255, 3, 3, 0, 255 },
-		{ "FXIDE_?", 10, 0, 0, 0, 0, 255, 255, 255, 255, 5, 7, 0, 255 },
+		{ "FXIDE_?", 10, 0, 0, 0, 0, 255, 255, 255, 255, 3, 7, 0, 255 },
 		{ "FXIDI_?", 7, 0, 0, 0, 0, 255, 255, 255, 255, 1, 6, 1, 255 },
 		{ "FXRCT1_?", 12, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
 		{ "FXTKB_?", 11, 0, 0, 0, 0, 7, 255, 255, 255, 5, 9, 0, 255 },
@@ -755,25 +1045,22 @@ const SpecialCharacterAnimation *Character::getSpecialAnimation(int32 characterI
 		{ "FXLSI_?", 8, 0, 0, 0, 0, 255, 255, 255, 255, 5, 6, 0, 255 },
 		{ "FXLSJ_?", 5, 0, 0, 0, 0, 255, 255, 255, 255, 3, 4, 0, 255 },
 		{ "FXLSO_?", 8, 0, 0, 0, 0, 255, 255, 255, 255, 4, 5, 0, 255 },
-		{ "FXIDA_?", 15, 0, 0, 0, 0, 255, 255, 255, 255, 1, 12, 1, 255 },
-		{ "FXIDB_?", 12, 0, 0, 0, 0, 255, 255, 255, 255, 4, 11, 1, 255 },
+		{ "FXIDA_?", 11, 0, 0, 0, 0, 255, 255, 255, 255, 1, 8, 1, 255 },
+		{ "FXIDB_?", 7, 0, 0, 0, 0, 255, 255, 255, 255, 5, 6, 0, 255 },
 		{ "FXIDC_?", 11, 0, 0, 0, 0, 255, 255, 255, 255, 7, 7, 0, 255 },
-		{ "FXIDD_?", 15, 0, 0, 0, 0, 255, 255, 255, 255, 6, 6, 0, 255 },
+		{ "FXIDD_?", 15, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
 		{ "FXIDG_?", 6, 0, 0, 0, 0, 255, 255, 255, 255, 3, 4, 0, 255 },
-		{ "FXVRA_?", 7, 0, 0, 0, 0, 255, 255, 255, 255, 2, 6, 2, 255 },
-		{ "FXIDF_?", 15, 0, 0, 0, 0, 255, 255, 255, 255, 9, 11, 0, 255 },
-		{ "FXEXA_?", 9, 0, 0, 0, 0, 255, 255, 255, 255, 5, 5, 0, 255 },
-		{ "FXEXA_?", 9, 0, 0, 0, 0, 255, 255, 255, 255, 5, 5, 0, 255 },
-		{ "FFNTK1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 1, 7, 0, 255 },
-		{ "FFTLK1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 1, 9, 0, 1 },
-		{ "FFBLS1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 3, 8, 0, 2 },
-		{ "FFLOV2", 6, 0, 0, 0, 0, 255, 255, 255, 255, 3, 5, 0, 2 },
-		{ "FFWOE1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 3, 9, 0, 2 },
-		{ "FFSNF1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 4, 6, 0, 4 },
-		{ "FFLAF1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 2, 8, 0, 1 },
-		{ "FFSKE1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 3, 10, 0, 2 },
-		{ "RGTLK2", 10, 0, 0, 0, 0, 4, 6, 255, 255, 2, 6, 0, 1 },
-		{ "RGTLK1", 10, 0, 0, 0, 0, 4, 6, 255, 255, 2, 6, 0, 1 },
+		{ "FXVRA_?", 7, 0, 0, 0, 0, 255, 255, 255, 255, 2, 6, 0, 255 },
+		{ "FFTLK1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "FFBLS1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "FFLOV1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "FFSKE1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "FFWOE1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "FFSNF1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "FFLST1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "FFPAW1", 5, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "RGTLK2", 10, 0, 0, 0, 0, 4, 6, 255, 255, 2, 6, 0, 255 },
+		{ "RGTLK1", 10, 0, 0, 0, 0, 4, 6, 255, 255, 2, 6, 0, 255 },
 		{ "BRTLK1", 26, 0, 0, 0, 0, 255, 255, 255, 255, 2, 23, 0, 255 },
 		{ "BREXT1", 14, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
 		{ "BRLRT1", 19, 0, 0, 0, 0, 255, 255, 255, 255, 1, 15, 0, 255 },
@@ -783,30 +1070,30 @@ const SpecialCharacterAnimation *Character::getSpecialAnimation(int32 characterI
 		{ "BRBEX1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
 		{ "BRBLK1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
 		{ "BRBET1", 17, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "BRTKB1", 17, 0, 0, 0, 0, 255, 255, 255, 255, 2, 14, 0, 255 },
 		{ "BRWEX1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
-		{ "BBTLK2", 26, 0, 0, 0, 0, 255, 255, 255, 255, 2, 23, 1, 255 },
-		{ "BBEXT2", 14, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 1, 255 },
+		{ "BBTLK2", 26, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "BBEXT2", 14, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
 		{ "BRLST1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 2, 7, 0, 255 },
 		{ "BRLSN1", 13, 0, 0, 0, 0, 255, 255, 255, 255, 1, 13, 2, 255 },
+		{ "BRLSB1", 1, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 1, 255 },
 		{ "BRBNO1", 13, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
 		{ "BRBND1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
 		{ "BBLSN2", 13, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
-		{ "CCTALK", 6, 0, 0, 0, 0, 2, 5, 255, 255, 1, 5, 0, 255 },
-		{ "CCBIT1", 13, 0, 0, 0, 0, 3, 5, 9, 11, 2, 11, 2, 255 },
-		{ "CCCMP1", 13, 0, 0, 0, 0, 6, 9, 255, 255, 5, 10, 1, 2 },
-		{ "CCCOY1", 14, 0, 0, 0, 0, 6, 8, 255, 255, 4, 8, 0, 3 },
-		{ "CCFNG1", 5, 0, 0, 0, 0, 255, 255, 255, 255, 4, 4, 0, 255 },
-		{ "CCGRB1", 13, 0, 0, 0, 0, 6, 255, 255, 255, 6, 9, 0, 3 },
-		{ "CCGST1", 9, 0, 0, 0, 0, 4, 255, 255, 255, 4, 7, 0, 2 },
-		{ "CCHCN1", 10, 0, 0, 0, 0, 6, 9, 255, 255, 4, 9, 0, 0 },
-		{ "CCHND1", 7, 0, 0, 0, 0, 6, 255, 255, 255, 2, 6, 0, 1 },
-		{ "FTTLK2", 11, 0, 0, 0, 0, 1, 4, 6, 9, 1, 10, 0, 2 },
-		{ "FTGNO2", 11, 0, 0, 0, 0, 4, 6, 8, 255, 4, 8, 1, 2 },
-		{ "FTGST2", 6, 0, 0, 0, 0, 1, 2, 4, 5, 2, 5, 0, 1 },
-		{ "FTHND2", 7, 0, 0, 0, 0, 2, 5, 255, 255, 1, 6, 1, 255 },
-		{ "FTRNT2", 11, 0, 0, 0, 0, 3, 5, 7, 9, 2, 9, 1, 1 },
-		{ "FTSRG2", 10, 0, 0, 0, 0, 4, 6, 8, 255, 3, 8, 1, 1 },
-		{ "FTQOT2", 8, 0, 0, 0, 0, 1, 4, 8, 255, 1, 6, 1, 255 },
+		{ "CCTLK1", 13, 0, 0, 0, 0, 6, 255, 255, 255, 5, 8, 0, 255 },
+		{ "CCBIT1", 14, 0, 0, 0, 0, 3, 5, 9, 11, 2, 11, 2, 255 },
+		{ "CCCMP1", 13, 0, 0, 0, 0, 7, 10, 255, 255, 6, 11, 1, 255 },
+		{ "CCFNG1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 3, 6, 0, 255 },
+		{ "CCGRB1", 15, 0, 0, 0, 0, 255, 255, 255, 255, 8, 10, 0, 255 },
+		{ "CCGST1", 10, 0, 0, 0, 0, 4, 255, 255, 255, 4, 7, 0, 255 },
+		{ "CCHCN1", 17, 0, 0, 0, 0, 9, 255, 255, 255, 9, 11, 0, 255 },
+		{ "CCHND1", 12, 0, 0, 0, 0, 6, 255, 255, 255, 5, 8, 0, 255 },
+		{ "FTTLK1", 12, 0, 0, 0, 0, 3, 5, 8, 10, 1, 11, 0, 255 },
+		{ "FTCHT1", 16, 0, 0, 0, 0, 4, 6, 8, 11, 2, 6, 0, 255 },
+		{ "FTRNT1", 12, 0, 0, 0, 0, 3, 5, 255, 255, 2, 9, 0, 255 },
+		{ "FTHND1", 9, 0, 0, 0, 0, 1, 3, 6, 8, 1, 8, 0, 255 },
+		{ "FTGNO1", 13, 0, 0, 0, 0, 7, 9, 255, 255, 5, 9, 0, 255 },
+		{ "FTSRG1", 11, 0, 0, 0, 0, 4, 6, 8, 255, 3, 8, 0, 255 },
 		{ "FMSTK1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 1, 7, 0, 255 },
 		{ "FMCRH1", 13, 0, 0, 0, 0, 255, 255, 255, 255, 3, 10, 0, 255 },
 		{ "FMFGR1", 12, 0, 0, 0, 0, 255, 255, 255, 255, 1, 10, 0, 255 },
@@ -821,65 +1108,72 @@ const SpecialCharacterAnimation *Character::getSpecialAnimation(int32 characterI
 		{ "FMLOK1", 6, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
 		{ "FMCST1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 3, 8, 0, 255 },
 		{ "FMLUP3", 8, 0, 0, 0, 0, 255, 255, 255, 255, 2, 5, 0, 255 },
-		{ "BDTLK1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 1, 7, 0, 255 },
-		{ "BDGLE1", 15, 0, 0, 0, 0, 255, 255, 255, 255, 6, 10, 0, 255 },
-		{ "BDSHK1", 16, 0, 0, 0, 0, 255, 255, 255, 255, 5, 11, 0, 1 },
-		{ "BDWOE1", 22, 0, 0, 0, 0, 255, 255, 255, 255, 9, 16, 0, 2 },
-		{ "BDHIP1", 22, 0, 0, 0, 0, 255, 255, 255, 255, 8, 16, 0, 1 },
+		{ "BDHIP1", 15, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "BDGLE1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "BDWOE1", 15, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "BDSHK1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
 		{ "BDFLG1", 13, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
-		{ "BDKLT1", 12, 0, 0, 0, 0, 255, 255, 255, 255, 5, 10, 0, 255 },
-		{ "BDSWY1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
 		{ "WPSNK1", 5, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
-		{ "WPLAF1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 5, 9, 1, 1 },
-		{ "DOTLK1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 1, 8, 0, 255 },
-		{ "DOGST1", 15, 0, 0, 0, 0, 255, 255, 255, 255, 4, 11, 1, 255 },
-		{ "DO2DF1", 14, 0, 0, 0, 0, 255, 255, 255, 255, 3, 11, 1, 255 },
-		{ "DOSNG1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 8, 9, 1, 255 },
-		{ "DOWOE1", 12, 0, 0, 0, 0, 255, 255, 255, 255, 5, 10, 1, 255 },
-		{ "DO2ME1", 18, 0, 0, 0, 0, 255, 255, 255, 255, 5, 13, 1, 255 },
-		{ "DOGLP1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 1, 255 },
-		{ "DOCRY1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 3, 6, 1, 255 },
-		{ "METLK1", 5, 0, 0, 0, 0, 255, 255, 255, 255, 1, 4, 0, 255 },
-		{ "MECHT1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 2, 9, 1, 255 },
-		{ "ME2DF1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 2, 9, 0, 255 },
-		{ "MESNG1", 12, 0, 0, 0, 0, 255, 255, 255, 255, 5, 10, 2, 255 },
-		{ "MEWOE1", 13, 0, 0, 0, 0, 255, 255, 255, 255, 3, 10, 1, 255 },
-		{ "ME2DO1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 2, 9, 1, 255 },
-		{ "MEGLP1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 1, 255 },
-		{ "MECRY1", 12, 0, 0, 0, 0, 255, 255, 255, 255, 6, 9, 1, 255 },
-		{ "CSTLK1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 1, 7, 0, 0 },
-		{ "CSNUD1", 14, 0, 0, 0, 0, 255, 255, 255, 255, 5, 11, 0, 2 },
-		{ "CSSPR1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 4, 8, 0, 2 },
-		{ "CSWVE1", 13, 0, 0, 0, 0, 255, 255, 255, 255, 4, 9, 0, 1 },
-		{ "CSYEL1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 2, 6, 0, 1 },
-		{ "JMTLK1", 7, 0, 0, 0, 0, 1, 4, 255, 255, 1, 6, 0, 0 },
-		{ "JMEGO1", 11, 0, 0, 0, 0, 6, 255, 255, 255, 3, 8, 0, 1 },
-		{ "JMARS1", 7, 0, 0, 0, 0, 4, 6, 255, 255, 3, 6, 0, 2 },
-		{ "JMHIP1", 8, 0, 0, 0, 0, 3, 5, 7, 255, 2, 7, 0, 1 },
+		{ "WPLAF1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "DO2DF1", 12, 0, 0, 0, 0, 5, 255, 255, 255, 5, 8, 0, 255 },
+		{ "DOSAD1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 2, 8, 0, 255 },
+		{ "DO2ME1", 14, 0, 0, 0, 0, 7, 255, 255, 255, 7, 12, 0, 255 },
+		{ "DOSNG1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 1, 6, 0, 255 },
+		{ "DOGST1", 14, 0, 0, 0, 0, 2, 9, 255, 255, 2, 10, 0, 255 },
+		{ "DOWOE1", 8, 0, 0, 0, 0, 4, 255, 255, 255, 1, 7, 0, 255 },
+		{ "DOCRY1", 7, 0, 0, 0, 0, 2, 255, 255, 255, 1, 6, 0, 255 },
+		{ "DOBLNK", 3, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "DOBTK1", 10, 0, 0, 0, 0, 4, 9, 255, 255, 255, 255, 0, 255 },
+		{ "ME2DO1", 9, 0, 0, 0, 0, 0, 7, 255, 255, 6, 9, 0, 255 },
+		{ "ME2DF1", 9, 0, 0, 0, 0, 5, 255, 255, 255, 5, 9, 0, 255 },
+		{ "MECHT1", 9, 0, 0, 0, 0, 2, 6, 255, 255, 6, 9, 0, 255 },
+		{ "MECRY1", 9, 0, 0, 0, 0, 1, 255, 255, 255, 255, 255, 0, 255 },
+		{ "MEWOE1", 10, 0, 0, 0, 0, 0, 6, 255, 255, 6, 9, 0, 255 },
+		{ "MESND1", 5, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "MESNG1", 8, 0, 0, 0, 0, 0, 255, 255, 255, 3, 6, 0, 255 },
+		{ "MESFL1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "MEATC1", 4, 0, 0, 0, 0, 3, 255, 255, 255, 1, 2, 0, 255 },
+		{ "CSNUD1", 14, 0, 0, 0, 0, 255, 255, 255, 255, 5, 11, 0, 255 },
+		{ "CSSPR1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 4, 8, 0, 255 },
+		{ "CSWVE1", 13, 0, 0, 0, 0, 255, 255, 255, 255, 4, 11, 0, 255 },
+		{ "CSYEL1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 2, 6, 0, 255 },
+		{ "JMTLK1", 7, 0, 0, 0, 0, 1, 4, 255, 255, 1, 6, 0, 255 },
+		{ "JMEGO1", 11, 0, 0, 0, 0, 6, 255, 255, 255, 3, 8, 0, 255 },
+		{ "JMARS1", 7, 0, 0, 0, 0, 4, 6, 255, 255, 3, 6, 0, 255 },
+		{ "JMHIP1", 8, 0, 0, 0, 0, 3, 5, 7, 255, 2, 7, 0, 255 },
 		{ "JMBNK1", 2, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
-		{ "MRTLK1", 9, 0, 0, 0, 0, 4, 7, 255, 255, 2, 7, 0, 1 },
+		{ "MRTLK1", 9, 0, 0, 0, 0, 4, 7, 255, 255, 2, 7, 0, 255 },
 		{ "MRHOF1", 8, 0, 0, 0, 0, 3, 5, 255, 255, 2, 5, 0, 255 },
-		{ "MRMRN1", 11, 0, 0, 0, 0, 3, 7, 255, 255, 1, 8, 0, 0 },
+		{ "MRMRN1", 11, 0, 0, 0, 0, 3, 7, 255, 255, 1, 8, 0, 255 },
 		{ "MRDPR1", 11, 0, 0, 0, 0, 1, 5, 9, 255, 1, 8, 0, 255 },
-		{ "MRGLE1", 13, 0, 0, 0, 0, 5, 9, 255, 255, 3, 10, 0, 2 },
-		{ "MRTDF1", 11, 0, 0, 0, 0, 3, 7, 9, 255, 3, 9, 0, 1 },
+		{ "MRGLE1", 13, 0, 0, 0, 0, 5, 9, 255, 255, 3, 10, 0, 255 },
+		{ "MRTDF1", 11, 0, 0, 0, 0, 3, 7, 9, 255, 3, 9, 0, 255 },
 		{ "MREDF1", 11, 0, 0, 0, 0, 4, 255, 255, 255, 1, 10, 1, 255 },
-		{ "MREPL1", 12, 0, 0, 0, 0, 5, 6, 7, 9, 2, 9, 1, 1 },
-		{ "MRAPL1", 12, 0, 0, 0, 0, 4, 8, 9, 255, 2, 9, 0, 1 },
+		{ "MREPL1", 12, 0, 0, 0, 0, 5, 6, 7, 9, 2, 9, 1, 255 },
+		{ "MRAPL1", 12, 0, 0, 0, 0, 4, 8, 9, 255, 2, 9, 0, 255 },
 		{ "MREVL1", 8, 0, 0, 0, 0, 5, 255, 255, 255, 1, 5, 1, 255 },
-		{ "BWDMR1", 16, 0, 0, 0, 0, 4, 7, 9, 11, 3, 14, 0, 1 },
-		{ "BWBUF1", 12, 0, 0, 0, 0, 5, 8, 255, 255, 3, 11, 0, 1 },
-		{ "BWHIP1", 12, 0, 0, 0, 0, 3, 6, 255, 255, 1, 9, 2, 0 },
-		{ "BWHWL1", 14, 0, 0, 0, 0, 255, 255, 255, 255, 1, 4, 2, 255 },
-		{ "BWLEN1", 10, 0, 0, 0, 0, 3, 6, 255, 255, 2, 7, 0, 1 },
-		{ "BWSRL1", 6, 0, 0, 0, 0, 255, 255, 255, 255, 2, 5, 0, 1 },
-		{ "BWWAG1", 6, 0, 0, 0, 0, 4, 10, 14, 18, 1, 4, 0, 0 },
-		{ "BWYEL1", 8, 0, 0, 0, 0, 4, 255, 255, 255, 2, 7, 0, 1 },
-		{ "BWTLK1", 15, 0, 0, 0, 0, 5, 8, 255, 255, 5, 9, 0, 1 },
-		{ "SLTLK1", 19, 0, 0, 0, 0, 255, 255, 255, 255, 1, 18, 0, 255 },
-		{ "SLPND1", 12, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
-		{ "SLPNT1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
-		{ "SLPTR1", 14, 0, 0, 0, 0, 255, 255, 255, 255, 6, 13, 1, 255 },
+		{ "BWDMRL", 25, 0, 0, 0, 0, 3, 8, 13, 17, 3, 17, 0, 255 },
+		{ "BW1PS1", 5, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "BW2PSL", 13, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "BWBUFL1", 23, 0, 0, 0, 0, 0, 3, 6, 255, 3, 8, 0, 255 },
+		{ "BWCIG1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "BWCLD1", 6, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "BWHIPL", 27, 0, 0, 0, 0, 5, 9, 14, 18, 5, 19, 0, 255 },
+		{ "BWHWLL", 16, 0, 0, 0, 0, 0, 15, 255, 255, 255, 255, 0, 255 },
+		{ "BWLENL", 27, 0, 0, 0, 0, 4, 7, 13, 19, 4, 20, 0, 255 },
+		{ "BWRNG1", 5, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "BWSKL1", 6, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "BWSNP1", 7, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "BWSNPL", 22, 0, 0, 0, 0, 2, 7, 12, 17, 2, 18, 0, 255 },
+		{ "BWSRL1", 7, 0, 0, 0, 0, 6, 255, 255, 255, 255, 255, 0, 255 },
+		{ "BWWAGL", 23, 0, 0, 0, 0, 6, 10, 14, 18, 6, 19, 0, 255 },
+		{ "BWYEL1", 9, 0, 0, 0, 0, 255, 255, 255, 255, 4, 8, 0, 255 },
+		{ "BWTEEL", 21, 0, 0, 0, 0, 255, 255, 255, 255, 2, 6, 0, 255 },
+		{ "BWTLK1", 15, 0, 0, 0, 0, 5, 8, 255, 255, 5, 9, 0, 255 },
+		{ "SLTLK1", 19, 0, 0, 0, 0, 2, 6, 255, 255, 255, 255, 1, 255 },
+		{ "SLPND1", 12, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 1, 255 },
+		{ "SLPNT1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 1, 255 },
+		{ "SLPTR1", 14, 0, 0, 0, 0, 255, 255, 255, 255, 5, 13, 1, 255 },
 		{ "SDTLK1", 7, 0, 0, 0, 0, 255, 255, 255, 255, 1, 5, 0, 255 },
 		{ "SDPDF1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 3, 6, 0, 255 },
 		{ "SDPNT1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 2, 7, 0, 255 },
@@ -891,39 +1185,35 @@ const SpecialCharacterAnimation *Character::getSpecialAnimation(int32 characterI
 		{ "SDGLN1", 5, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
 		{ "SDLAF1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
 		{ "RMHIP1", 12, 0, 0, 0, 0, 7, 255, 255, 255, 1, 10, 2, 255 },
-		{ "RMGES1", 19, 0, 0, 0, 0, 11, 255, 255, 255, 8, 13, 2, 2 },
-		{ "RMPCH1", 18, 0, 0, 0, 0, 12, 255, 255, 255, 6, 13, 0, 2 },
-		{ "RMSTH1", 12, 0, 0, 0, 0, 5, 255, 255, 255, 3, 6, 0, 2 },
+		{ "RMGES1", 19, 0, 0, 0, 0, 11, 255, 255, 255, 8, 13, 2, 255 },
+		{ "RMPCH1", 18, 0, 0, 0, 0, 12, 255, 255, 255, 6, 13, 0, 255 },
+		{ "RMSTH1", 12, 0, 0, 0, 0, 4, 5, 6, 7, 3, 6, 0, 255 },
 		{ "RMHND1", 7, 0, 0, 0, 0, 5, 255, 255, 255, 5, 5, 1, 255 },
-		{ "RMSTH1", 12, 0, 0, 0, 0, 5, 255, 255, 255, 5, 6, 1, 2 },
-		{ "SGHND1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 1, 9, 0, 0 },
-		{ "SGSTF1", 13, 0, 0, 0, 0, 255, 255, 255, 255, 1, 12, 0, 255 },
-		{ "SGSLP1", 16, 0, 0, 0, 0, 255, 255, 255, 255, 1, 15, 0, 255 },
-		{ "SGPHC1", 12, 0, 0, 0, 0, 255, 255, 255, 255, 4, 9, 0, 255 },
-		{ "SGHALT", 22, 0, 0, 0, 0, 255, 255, 255, 255, 7, 15, 0, 255 },
-		{ "STTLK1", 13, 0, 0, 0, 0, 5, 9, 255, 255, 3, 10, 0, 2 },
-		{ "STTNM1", 13, 0, 0, 0, 0, 5, 9, 255, 255, 3, 10, 0, 2 },
+		{ "SGSTF1", 6, 0, 0, 0, 0, 2, 6, 255, 255, 255, 255, 0, 255 },
+		{ "SGHTLK", 5, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "SGSLP1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "SGPHC1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "STTLK1", 13, 0, 0, 0, 0, 5, 9, 255, 255, 3, 10, 0, 255 },
+		{ "STTNM1", 13, 0, 0, 0, 0, 5, 9, 255, 255, 3, 10, 0, 255 },
 		{ "STFST1", 11, 0, 0, 0, 0, 3, 8, 255, 255, 1, 9, 0, 255 },
-		{ "STLAF1", 20, 0, 0, 0, 0, 255, 255, 255, 255, 11, 15, 1, 2 },
-		{ "STGES1", 13, 0, 0, 0, 0, 5, 7, 255, 255, 3, 7, 0, 2 },
-		{ "STFNT1", 10, 0, 0, 0, 0, 4, 6, 255, 255, 255, 255, 0, 2 },
-		{ "STSRK1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 1, 3, 2, 0 },
+		{ "STLAF1", 20, 0, 0, 0, 0, 255, 255, 255, 255, 11, 15, 1, 255 },
+		{ "STGES1", 13, 0, 0, 0, 0, 5, 7, 255, 255, 3, 7, 0, 255 },
+		{ "STFNT1", 9, 0, 0, 0, 0, 4, 255, 255, 255, 4, 5, 0, 255 },
+		{ "STSRK1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 1, 4, 0, 255 },
 		{ "STRED1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 2, 10, 0, 255 },
-		{ "STLKU1", 6, 0, 0, 0, 0, 3, 255, 255, 255, 2, 5, 0, 0 },
+		{ "STLKU1", 6, 0, 0, 0, 0, 3, 255, 255, 255, 2, 5, 0, 255 },
 		{ "STKEY1", 15, 0, 0, 0, 0, 9, 11, 255, 255, 9, 14, 0, 255 },
 		{ "STMKTD1", 7, 0, 0, 0, 0, 3, 6, 255, 255, 1, 6, 0, 255 },
-		{ "STTKM1", 21, 0, 0, 0, 0, 12, 13, 15, 16, 12, 17, 0, 1 },
-		{ "STMSZ1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 1, 3, 2, 255 },
-		{ "STPNV1", 14, 0, 0, 0, 0, 6, 11, 255, 255, 4, 11, 0, 1 },
-		{ "STSOM1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 1, 3, 2, 255 },
-		{ "MYTLK1", 9, 0, 0, 0, 0, 2, 4, 255, 255, 1, 4, 0, 0 },
-		{ "MYSQUAWK", 5, 0, 0, 0, 0, 255, 255, 255, 255, 3, 3, 1, 255 },
+		{ "STTKM1", 21, 0, 0, 0, 0, 12, 13, 15, 16, 12, 17, 0, 255 },
+		{ "STMSZ1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 1, 4, 0, 255 },
+		{ "STPNV1", 15, 0, 0, 0, 0, 6, 9, 255, 255, 4, 11, 0, 255 },
+		{ "STSOM1", 10, 0, 0, 0, 0, 255, 255, 255, 255, 1, 4, 0, 255 },
 		{ "SPTLK", 12, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
 		{ "SPARM", 16, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
 		{ "SPHOP", 18, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
-		{ "SPLNT", 16, 0, 0, 0, 0, 255, 255, 255, 255, 3, 13, 0, 255 },
-		{ "SPLAF", 11, 0, 0, 0, 0, 255, 255, 255, 255, 5, 10, 2, 255 },
-		{ "SPTFN", 10, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "SPLNT", 16, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "SPLAF", 11, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
+		{ "SPTFN", 8, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
 		{ "SPPIN", 14, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
 		{ "SPINH1", 21, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
 		{ "SPSFTCOM", 10, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 0, 255 },
@@ -936,47 +1226,43 @@ const SpecialCharacterAnimation *Character::getSpecialAnimation(int32 characterI
 		{ "VGCUR1", 8, 0, 0, 0, 0, 4, 8, 255, 255, 2, 7, 0, 255 },
 		{ "VGTLK1", 11, 0, 0, 0, 0, 3, 6, 255, 255, 3, 10, 0, 255 },
 		{ "VGEXP1", 10, 0, 0, 0, 0, 5, 9, 255, 255, 3, 9, 0, 255 },
-		{ "WFTLK1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 1, 7, 0, 1 },
-		{ "WFPNT1", 20, 0, 0, 0, 0, 255, 255, 255, 255, 6, 16, 0, 1 },
-		{ "WFFST1", 13, 0, 0, 0, 0, 255, 255, 255, 255, 2, 8, 0, 2 },
-		{ "WFTNO1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 2, 5, 0, 2 },
-		{ "WFSRG1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 3, 8, 0, 1 },
+		{ "WFPAW1", 24, 0, 0, 0, 0, 255, 255, 255, 255, 5, 21, 0, 255 },
+		{ "WFPNT1", 20, 0, 0, 0, 0, 255, 255, 255, 255, 6, 16, 0, 255 },
+		{ "WFFST1", 13, 0, 0, 0, 0, 255, 255, 255, 255, 2, 9, 0, 255 },
+		{ "WFTNO1", 8, 0, 0, 0, 0, 255, 255, 255, 255, 2, 5, 0, 255 },
+		{ "WFSRG1", 11, 0, 0, 0, 0, 255, 255, 255, 255, 3, 8, 0, 255 },
 		{ "WFGTK1", 16, 0, 0, 0, 0, 255, 255, 255, 255, 1, 15, 0, 255 },
-		{ "WFPAW1", 24, 0, 0, 0, 0, 255, 255, 255, 255, 4, 22, 0, 1 },
 		{ "LGTLK", 20, 0, 0, 0, 0, 4, 8, 11, 15, 1, 17, 0, 255 },
 		{ "LGSHOUT", 16, 0, 0, 0, 0, 12, 255, 255, 255, 6, 12, 0, 255 },
-		{ "POMRN1", 12, 0, 0, 0, 0, 3, 5, 7, 255, 3, 9, 0, 2 },
-		{ "POGLE1", 14, 0, 0, 0, 0, 7, 10, 255, 255, 5, 10, 0, 2 },
-		{ "PLMRG1", 16, 0, 0, 0, 0, 9, 255, 255, 255, 8, 12, 0, 1 },
-		{ "PLCMR1", 16, 0, 0, 0, 0, 8, 10, 255, 255, 8, 12, 0, 3 },
-		{ "PLEVL1", 17, 0, 0, 0, 0, 9, 255, 255, 255, 7, 9, 0, 1 },
-		{ "PLEDF1", 9, 0, 0, 0, 0, 4, 6, 255, 255, 5, 7, 0, 2 },
-		{ "PLTLK1", 11, 0, 0, 0, 0, 5, 8, 255, 255, 5, 8, 0, 1 },
+		{ "POMRN1", 12, 0, 0, 0, 0, 3, 5, 7, 255, 3, 9, 0, 255 },
+		{ "POGLE1", 14, 0, 0, 0, 0, 7, 10, 255, 255, 5, 10, 0, 255 },
+		{ "PLMRG1", 16, 0, 0, 0, 0, 9, 255, 255, 255, 8, 12, 0, 255 },
+		{ "PLCMR1", 16, 0, 0, 0, 0, 8, 10, 255, 255, 8, 12, 0, 255 },
+		{ "PLEVL1", 17, 0, 0, 0, 0, 9, 255, 255, 255, 7, 9, 0, 255 },
+		{ "PLEDF1", 9, 0, 0, 0, 0, 4, 6, 255, 255, 5, 7, 0, 255 },
 		{ "ELTLK1", 8, 0, 0, 0, 0, 3, 5, 7, 255, 2, 7, 0, 255 },
 		{ "ELSNR1", 7, 0, 0, 0, 0, 3, 255, 255, 255, 1, 5, 0, 255 },
-		{ "RG2TK1", 10, 0, 0, 0, 0, 4, 6, 255, 255, 2, 6, 0, 1 },
-		{ "RG2TK1", 10, 0, 0, 0, 0, 4, 6, 255, 255, 2, 6, 0, 1 },
-		{ "C2TALK", 6, 0, 0, 0, 0, 2, 5, 255, 255, 1, 5, 0, 255 },
-		{ "C2BIT1", 13, 0, 0, 0, 0, 3, 5, 9, 11, 2, 11, 2, 255 },
-		{ "C2CMP1", 13, 0, 0, 0, 0, 6, 9, 255, 255, 5, 10, 1, 2 },
-		{ "C2COY1", 14, 0, 0, 0, 0, 6, 8, 255, 255, 4, 8, 0, 3 },
-		{ "C2FNG1", 5, 0, 0, 0, 0, 255, 255, 255, 255, 4, 4, 0, 255 },
-		{ "C2GRB1", 13, 0, 0, 0, 0, 6, 255, 255, 255, 6, 9, 0, 3 },
-		{ "C2GST1", 9, 0, 0, 0, 0, 4, 255, 255, 255, 4, 7, 0, 2 },
-		{ "C2HCN1", 10, 0, 0, 0, 0, 6, 9, 255, 255, 4, 9, 0, 0 },
-		{ "C2HND1", 7, 0, 0, 0, 0, 6, 255, 255, 255, 2, 6, 0, 1 },
-		{ "666TKBB3", 21, 0, 0, 0, 0, 9, 14, 255, 255, 6, 16, 0, 255 },
-		{ "665TFLX3", 27, 0, 0, 0, 0, 10, 14, 17, 255, 10, 18, 0, 255 },
-		{ "664FXTK3", 18, 0, 0, 0, 0, 5, 7, 11, 13, 3, 15, 0, 255 },
+		{ "RG2TK1", 10, 0, 0, 0, 0, 4, 6, 255, 255, 2, 6, 0, 255 },
+		{ "RG2TK1", 10, 0, 0, 0, 0, 4, 6, 255, 255, 2, 6, 0, 255 },
+		{ "CCTLK2", 13, 0, 0, 0, 0, 6, 255, 255, 255, 5, 8, 0, 255 },
+		{ "CCBIT2", 14, 0, 0, 0, 0, 3, 5, 9, 11, 2, 11, 2, 255 },
+		{ "CCCMP2", 13, 0, 0, 0, 0, 7, 10, 255, 255, 6, 11, 1, 255 },
+		{ "CCFNG2", 8, 0, 0, 0, 0, 255, 255, 255, 255, 3, 6, 2, 255 },
+		{ "CCGRB2", 15, 0, 0, 0, 0, 255, 255, 255, 255, 8, 10, 0, 255 },
+		{ "CCGST2", 10, 0, 0, 0, 0, 4, 255, 255, 255, 4, 7, 0, 255 },
+		{ "CCHCN2", 17, 0, 0, 0, 0, 9, 255, 255, 255, 9, 11, 0, 255 },
+		{ "CCHND2", 12, 0, 0, 0, 0, 6, 255, 255, 255, 5, 8, 0, 255 },
+		{ "666TKBB1", 21, 0, 0, 0, 0, 9, 14, 255, 255, 6, 16, 0, 255 },
+		{ "665TFLX1", 27, 0, 0, 0, 0, 10, 14, 17, 255, 10, 18, 0, 255 },
+		{ "664FXTK1", 18, 0, 0, 0, 0, 5, 7, 11, 13, 3, 15, 0, 255 },
 		{ "FDTALK", 15, 0, 0, 0, 0, 9, 255, 255, 255, 7, 9, 0, 255 },
 		{ "FDYELL", 16, 0, 0, 0, 0, 10, 255, 255, 255, 8, 10, 0, 255 },
 		{ "GLTLK", 20, 0, 0, 0, 0, 6, 12, 18, 255, 1, 19, 0, 255 },
 		{ "GLTRN", 4, 0, 0, 0, 0, 3, 255, 255, 255, 1, 2, 0, 255 },
-		{ "RAYTALK1", 10, 0, 0, 0, 0, 3, 5, 8, 255, 1, 9, 0, 255 },
-		{ "BRTKB1", 17, 0, 0, 0, 0, 255, 255, 255, 255, 2, 14, 0, 255 }
+		{ "RAYTALK1", 10, 0, 0, 0, 0, 3, 5, 8, 255, 1, 9, 0, 255 }
 	};
 
-	static const int32 characterAnims[] = {
+	static const int32 regularCharacterAnims[] = {
 		0,   39,  81,  89,  91,  108, 117, 124, 138, 146,
 		148, 156, 164, 169, 174, 179, 184, 193, 197, 207,
 		213, 218, 233, 235, 244, 245, 246, 246, 246, 246,
@@ -985,6 +1271,18 @@ const SpecialCharacterAnimation *Character::getSpecialAnimation(int32 characterI
 		289, 289, 289, 289, 289, 289, 289, 289, 289, 289
 	};
 
+	static const int32 englishDemoCharacterAnims[] = {
+		0,   36,  75,  83,  85,  104, 112, 118, 132, 137,
+		139, 148, 157, 161, 166, 171, 176, 194, 198, 208,
+		213, 217, 217, 232, 241, 242, 242, 242, 242, 243,
+		243, 243, 243, 250, 256, 258, 260, 260, 266, 268,
+		276, 278, 279, 281, 283, 283, 283, 283, 283, 283,
+		283, 283, 283, 283, 283, 283, 283, 283, 283, 283
+	};
+
+	const SpecialCharacterAnimation *anims = _vm->isEnglishDemo() ? englishDemoAnims : regularAnims;
+	const int32 *characterAnims = _vm->isEnglishDemo() ? englishDemoCharacterAnims : regularCharacterAnims;
+
 	return &anims[characterAnims[characterId] + animationId];
 }
 
diff --git a/engines/toon/character.h b/engines/toon/character.h
index 1e0ad9c2b7..1d38a71cde 100644
--- a/engines/toon/character.h
+++ b/engines/toon/character.h
@@ -103,7 +103,7 @@ public:
 	virtual void plotPath(Graphics::Surface& surface);
 
 	int32 getFacingFromDirection(int16 dx, int16 dy);
-	static const SpecialCharacterAnimation *getSpecialAnimation(int32 characterId, int32 animationId);
+	const SpecialCharacterAnimation *getSpecialAnimation(int32 characterId, int32 animationId);
 
 protected:
 	ToonEngine *_vm;
diff --git a/engines/toon/toon.cpp b/engines/toon/toon.cpp
index 08b9590d1c..781d61345c 100644
--- a/engines/toon/toon.cpp
+++ b/engines/toon/toon.cpp
@@ -1163,6 +1163,7 @@ ToonEngine::ToonEngine(OSystem *syst, const ADGameDescription *gameDescription)
 	_showConversationText = true;
 	_useAlternativeFont = false;
 	_isDemo = _gameDescription->flags & ADGF_DEMO;
+	_isEnglishDemo = _isDemo && _gameDescription->language == Common::EN_ANY;
 
 	_resources = NULL;
 	_animationManager = NULL;
diff --git a/engines/toon/toon.h b/engines/toon/toon.h
index c756d1b62c..83699597f3 100644
--- a/engines/toon/toon.h
+++ b/engines/toon/toon.h
@@ -311,6 +311,10 @@ public:
 		return _pathFinding;
 	}
 
+	bool isEnglishDemo() {
+		return _isEnglishDemo;
+	}
+
 	Common::WriteStream *getSaveBufferStream();
 
 	bool shouldQuitGame() const {
@@ -433,6 +437,7 @@ protected:
 
 	bool _firstFrame;
 	bool _isDemo;
+	bool _isEnglishDemo;
 	bool _showConversationText;
 	bool _useAlternativeFont;
 	bool _needPaletteFlush;


Commit: 7dd628083af91f5c754d23e951512f78e423d7d2
    https://github.com/scummvm/scummvm/commit/7dd628083af91f5c754d23e951512f78e423d7d2
Author: Coen Rampen (crampen at gmail.com)
Date: 2021-09-13T20:59:16+02:00

Commit Message:
TOON: Fix English demo Flux idle anmiations

The English demo only has part of Flux' idle animations; the others are blank
or do not exist (crashing the game).

Changed paths:
    engines/toon/flux.cpp


diff --git a/engines/toon/flux.cpp b/engines/toon/flux.cpp
index 65ad66ffd8..cb94730dee 100644
--- a/engines/toon/flux.cpp
+++ b/engines/toon/flux.cpp
@@ -131,8 +131,9 @@ void CharacterFlux::update(int32 timeIncrement) {
 
 int32 CharacterFlux::getRandomIdleAnim() {
 	debugC(3, kDebugCharacter, "getRandomIdleAnim()");
-	static const int32 idle[] = { 0xe, 0xf, 0x21, 0x22, 0x24, 0x25, 0x27 };
-	return idle[_vm->randRange(0, 6)];
+	// English demo only has part of the idle animations (the first 3 entries).
+	static const int32 idle[] = { 0xf, 0x21, 0x22, 0xe, 0x24, 0x25, 0x27 };
+	return idle[_vm->randRange(0, _vm->isEnglishDemo() ? 2 : 6)];
 }
 
 } // End of namespace Toon


Commit: aff2f124404ba0ffd06cabbcf6cb2baedeaa0007
    https://github.com/scummvm/scummvm/commit/aff2f124404ba0ffd06cabbcf6cb2baedeaa0007
Author: Coen Rampen (crampen at gmail.com)
Date: 2021-09-13T20:59:16+02:00

Commit Message:
TOON: Fix English demo Drew walking animation

The English demo has 3 frames for Drew's standing "animations" instead of 2.

Changed paths:
    engines/toon/drew.cpp


diff --git a/engines/toon/drew.cpp b/engines/toon/drew.cpp
index a0569a2d78..439d001801 100644
--- a/engines/toon/drew.cpp
+++ b/engines/toon/drew.cpp
@@ -79,9 +79,10 @@ void CharacterDrew::playStandingAnim() {
 
 	stopSpecialAnim();
 	_animationInstance->setAnimation(_walkAnim);
-	_animationInstance->setFrame(_facing * 2);
+	int standingFrames = _vm->isEnglishDemo() ? 3 : 2;
+	_animationInstance->setFrame(_facing * standingFrames);
 	_shadowAnimationInstance->setFrame(_facing);
-	_animationInstance->setAnimationRange(_facing * 2, _facing * 2);
+	_animationInstance->setAnimationRange(_facing * standingFrames, _facing * standingFrames);
 	_animationInstance->stopAnimation();
 	_animationInstance->setLooping(true);
 	//setVisible(true);
@@ -93,7 +94,8 @@ void CharacterDrew::playWalkAnim(int32 start, int32 end) {
 	stopSpecialAnim();
 	_animationInstance->setAnimation(_walkAnim);
 	_shadowAnimationInstance->setFrame(_facing);
-	_animationInstance->setAnimationRange(16 + _facing * 14, 16 + _facing * 14 + 13);
+	int walkAnimOffset = _vm->isEnglishDemo() ? 24 : 16;
+	_animationInstance->setAnimationRange(walkAnimOffset + _facing * 14, walkAnimOffset + _facing * 14 + 13);
 	_animationInstance->playAnimation();
 	_animationInstance->setFps(16);
 	_animationInstance->setLooping(true);


Commit: 8ac072c265ad64dbc38690bd973b0145301d4978
    https://github.com/scummvm/scummvm/commit/8ac072c265ad64dbc38690bd973b0145301d4978
Author: Coen Rampen (crampen at gmail.com)
Date: 2021-09-13T20:59:16+02:00

Commit Message:
TOON: Fix array out of bounds access in killAmbientSFX

The channel on the data of an ambient SFX is set to -1 when it is removed, but
this was not checked in killAmbientSFX, causing an access to
_channels[0xFFFFFFFF]. Fixed this by adding the missing check.

Changed paths:
    engines/toon/audio.cpp


diff --git a/engines/toon/audio.cpp b/engines/toon/audio.cpp
index 82544375d5..9b9cac6467 100644
--- a/engines/toon/audio.cpp
+++ b/engines/toon/audio.cpp
@@ -570,7 +570,7 @@ void AudioManager::killAmbientSFX(int32 id)
 			ambient->_enabled = false;
 			ambient->_id = -1;
 
-			if (_channels[ambient->_channel]) {
+			if (ambient->_channel >= 0 && _channels[ambient->_channel]) {
 				_channels[ambient->_channel]->stop(false);
 			}
 		}


Commit: 01daf7d22b169a2fe5984b13a28a7d3125af087a
    https://github.com/scummvm/scummvm/commit/01daf7d22b169a2fe5984b13a28a7d3125af087a
Author: Coen Rampen (crampen at gmail.com)
Date: 2021-09-13T20:59:16+02:00

Commit Message:
TOON: Fix English demo inventory

In the English demo you start with less items than the German demo.

Changed paths:
    engines/toon/toon.cpp


diff --git a/engines/toon/toon.cpp b/engines/toon/toon.cpp
index 781d61345c..f1dcff744f 100644
--- a/engines/toon/toon.cpp
+++ b/engines/toon/toon.cpp
@@ -3189,8 +3189,10 @@ void ToonEngine::newGame() {
 	if (_isDemo) {
 		addItemToInventory(59);
 		addItemToInventory(67);
-		addItemToInventory(11);
-		addItemToInventory(19);
+		if (!_isEnglishDemo) {
+			addItemToInventory(11);
+			addItemToInventory(19);
+		}
 		loadScene(22);
 		//loadScene(_gameState->_currentScene);
 	} else {


Commit: aff1e60597e70cdc61da6c66b1388d31c1696abc
    https://github.com/scummvm/scummvm/commit/aff1e60597e70cdc61da6c66b1388d31c1696abc
Author: Coen Rampen (crampen at gmail.com)
Date: 2021-09-13T20:59:16+02:00

Commit Message:
TOON: Fix English demo invalid additional Rif data

In the English demo a location (Wacme interior) has invalid additional Rif data
which causes an overflow of the Hotspots _items array. Disabling loading of the
data fixes this issue; the data does not seem to be necessary (the location
works fine without it).

Changed paths:
    engines/toon/hotspot.cpp


diff --git a/engines/toon/hotspot.cpp b/engines/toon/hotspot.cpp
index cb9e30f5c8..d7b9990a50 100644
--- a/engines/toon/hotspot.cpp
+++ b/engines/toon/hotspot.cpp
@@ -106,7 +106,9 @@ bool Hotspots::loadRif(const Common::String &rifName, const Common::String &addi
 
 	uint32 size2 = 0;
 	uint8 *rifData2 = 0;
-	if (additionalRifName.size())
+
+	// English demo seems to have some invalid additional Rif data so do not load it
+	if (!_vm->isEnglishDemo() && additionalRifName.size())
 		rifData2 = _vm->resources()->getFileData(additionalRifName, &size2);
 
 	// figure out the number of hotspots based on file size
@@ -114,8 +116,6 @@ bool Hotspots::loadRif(const Common::String &rifName, const Common::String &addi
 	int32 rifsize2 = 0;
 
 	if (size2)
-		// TODO This is not correct for the English demo.
-		// The size seems to be a uint16?
 		rifsize2 = READ_BE_UINT32(&rifData2[4]);
 
 	_numItems = (rifsize + rifsize2) / 512;


Commit: f2185bfb3515bb7533d484a2021c4d40987f8421
    https://github.com/scummvm/scummvm/commit/f2185bfb3515bb7533d484a2021c4d40987f8421
Author: Coen Rampen (crampen at gmail.com)
Date: 2021-09-13T20:59:16+02:00

Commit Message:
TOON: Fix English demo options menu

The options menu of the English demo has less animations and no sound effects.

Changed paths:
    engines/toon/toon.cpp


diff --git a/engines/toon/toon.cpp b/engines/toon/toon.cpp
index f1dcff744f..24040016fe 100644
--- a/engines/toon/toon.cpp
+++ b/engines/toon/toon.cpp
@@ -625,6 +625,7 @@ static const MenuFile mainMenuFiles[] = {
 };
 
 #define OPTIONMENU_ENTRYCOUNT 27
+#define OPTIONMENU_ENTRYCOUNT_ENGLISH_DEMO 11
 static const MenuFile optionMenuFiles[] = {
 	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_PLAY,        "PLAYBUTN.CAF", 0 }, // "Start" button
 	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_QUIT,        "QUITBUTN.CAF", 0 }, // "Intro" button
@@ -681,9 +682,11 @@ bool ToonEngine::showOptions() {
 	bool oldMouseHidden = _gameState->_mouseHidden;
 	_gameState->_mouseHidden = false;
 
-	MenuEntry entries[OPTIONMENU_ENTRYCOUNT];
+	// English demo options menu has less animations and no SFX
+	int optionMenuEntryCount = _isEnglishDemo ? OPTIONMENU_ENTRYCOUNT_ENGLISH_DEMO : OPTIONMENU_ENTRYCOUNT;
+	MenuEntry *entries = new MenuEntry[optionMenuEntryCount];
 
-	for (int entryNr = 0; entryNr < OPTIONMENU_ENTRYCOUNT; entryNr++) {
+	for (int entryNr = 0; entryNr < optionMenuEntryCount; entryNr++) {
 		entries[entryNr].menuMask = optionMenuFiles[entryNr].menuMask;
 		entries[entryNr].id = optionMenuFiles[entryNr].id;
 		entries[entryNr].animation = new Animation(this);
@@ -740,7 +743,7 @@ bool ToonEngine::showOptions() {
 			}
 			clearDirtyRects();
 
-			for (int entryNr = 0; entryNr < OPTIONMENU_ENTRYCOUNT; entryNr++) {
+			for (int entryNr = 0; entryNr < optionMenuEntryCount; entryNr++) {
 				if (entries[entryNr].menuMask & menuMask) {
 					if (entries[entryNr].animateOnFrame) {
 						entries[entryNr].animateCurFrame++;
@@ -776,7 +779,7 @@ bool ToonEngine::showOptions() {
 			if (_mouseButton & 1) {
 				// left mouse button pushed down
 				clickingOn = OPTIONMENUHOTSPOT_NONE;
-				for (int entryNr = 0; entryNr < OPTIONMENU_ENTRYCOUNT; entryNr++) {
+				for (int entryNr = 0; entryNr < optionMenuEntryCount; entryNr++) {
 					if (entries[entryNr].menuMask & menuMask) {
 						if (entries[entryNr].id != OPTIONMENUHOTSPOT_NONE) {
 							if (entries[entryNr].rect.contains(_mouseX, _mouseY)) {
@@ -843,7 +846,8 @@ bool ToonEngine::showOptions() {
 				entries[9].activeFrame = 0;
 				_audioManager->muteMusic(true);
 			}
-			playSFX(-7, 128);
+			if (!_isEnglishDemo)
+				playSFX(-7, 128);
 		}
 
 		if (clickingOn == OPTIONMENUHOTSPOT_VOLUMEVOICE) {
@@ -854,7 +858,8 @@ bool ToonEngine::showOptions() {
 				entries[7].activeFrame = 0;
 				_audioManager->muteVoice(true);
 			}
-			playSFX(-7, 128);
+			if (!_isEnglishDemo)
+				playSFX(-7, 128);
 		}
 
 		if (clickingOn == OPTIONMENUHOTSPOT_VOLUMESFX) {
@@ -865,7 +870,8 @@ bool ToonEngine::showOptions() {
 				entries[5].activeFrame = 0;
 				_audioManager->muteSfx(true);
 			}
-			playSFX(-7, 128);
+			if (!_isEnglishDemo)
+				playSFX(-7, 128);
 		}
 
 		if (clickingOn == OPTIONMENUHOTSPOT_SPEAKERBUTTON) {
@@ -876,7 +882,8 @@ bool ToonEngine::showOptions() {
 			entries[19].playOnce = true;
 
 			playSFX(-10, 128);
-			_audioManager->playVoice(316, true);
+			if (!_isEnglishDemo)
+				_audioManager->playVoice(316, true);
 		}
 
 		if (clickingOn == OPTIONMENUHOTSPOT_SPEAKERLEVER) {
@@ -889,7 +896,8 @@ bool ToonEngine::showOptions() {
 			} else {
 				entries[20].playOnce = true;
 			}
-			playSFX(-9, 128);
+			if (!_isEnglishDemo)
+				playSFX(-9, 128);
 		}
 
 		if (clickingOn == OPTIONMENUHOTSPOT_TEXT) {
@@ -907,7 +915,8 @@ bool ToonEngine::showOptions() {
 				entries[4].activeFrame = 0;
 			}
 
-			playSFX(-9, 128);
+			if (!_isEnglishDemo)
+				playSFX(-9, 128);
 		}
 
 		// don't allow change to video mode
@@ -918,14 +927,16 @@ bool ToonEngine::showOptions() {
 		if (clickingOn == OPTIONMENUHOTSPOT_PLAY) {
 			doExit = true;
 			exitGame = false;
-			_audioManager->playSFX(10, 128, true);
+			if (!_isEnglishDemo)
+				_audioManager->playSFX(10, 128, true);
 		}
 
 		if (clickingOn == OPTIONMENUHOTSPOT_QUIT) {
 			doExit = true;
 			exitGame = true;
 			_shouldQuit = true;
-			_audioManager->playSFX(10, 128, true);
+			if (!_isEnglishDemo)
+				_audioManager->playSFX(10, 128, true);
 		}
 	}
 
@@ -938,6 +949,7 @@ bool ToonEngine::showOptions() {
 	restorePalette();
 	dirtyAllScreen();
 
+	delete[] entries;
 	delete optionPicture;
 
 	return exitGame;


Commit: 389fe44ddabd133271a68b5602510b3408596e03
    https://github.com/scummvm/scummvm/commit/389fe44ddabd133271a68b5602510b3408596e03
Author: Coen Rampen (crampen at gmail.com)
Date: 2021-09-13T20:59:16+02:00

Commit Message:
TOON: Implement English demo font rendering

The English demo uses a different font format than the other versions of the
game. This implements text rendering using this format.

Changed paths:
    engines/toon/font.cpp
    engines/toon/font.h
    engines/toon/toon.cpp
    engines/toon/toon.h


diff --git a/engines/toon/font.cpp b/engines/toon/font.cpp
index 06454ad3d6..6cd01c9337 100644
--- a/engines/toon/font.cpp
+++ b/engines/toon/font.cpp
@@ -34,9 +34,12 @@ FontRenderer::FontRenderer(ToonEngine *vm) : _vm(vm) {
 	_currentFontColor[3] = 0xce;
 
 	_currentFont = nullptr;
+	_currentDemoFont = nullptr;
 }
 
 FontRenderer::~FontRenderer() {
+	if (_currentDemoFont)
+		delete _currentDemoFont;
 }
 
 // mapping extended characters required for foreign versions to font (animation)
@@ -98,9 +101,15 @@ void FontRenderer::renderText(int16 x, int16 y, const Common::String &origText,
 			curX = x;
 		} else {
 			curChar = textToFont(curChar);
-			_currentFont->drawFontFrame(_vm->getMainSurface(), curChar, curX, curY, _currentFontColor);
-			curX = curX + MAX<int32>(_currentFont->getFrameWidth(curChar) - 2, 0);
-			height = MAX<int32>(height, _currentFont->getFrameHeight(curChar));
+			if (_currentFont) {
+				_currentFont->drawFontFrame(_vm->getMainSurface(), curChar, curX, curY, _currentFontColor);
+			} else {
+				_currentDemoFont->drawGlyph(_vm->getMainSurface(), curChar, curX, curY, _currentFontColor);
+			}
+			curX = curX + MAX<int32>((_currentFont ? _currentFont->getFrameWidth(curChar) :
+				_currentDemoFont->getGlyphWidth(curChar)) - 2, 0);
+			height = MAX<int32>(height, _currentFont ? _currentFont->getFrameHeight(curChar) :
+				_currentDemoFont->getHeight());
 		}
 		text++;
 	}
@@ -129,8 +138,10 @@ void FontRenderer::computeSize(const Common::String &origText, int16 *retX, int1
 			continue;
 		} else {
 			curChar = textToFont(curChar);
-			int16 charWidth = _currentFont->getFrameWidth(curChar) - 1;
-			int16 charHeight = _currentFont->getFrameHeight(curChar);
+			int16 charWidth = (_currentFont ? _currentFont->getFrameWidth(curChar) :
+				_currentDemoFont->getGlyphWidth(curChar)) - 1;
+			int16 charHeight = _currentFont ? _currentFont->getFrameHeight(curChar) :
+				_currentDemoFont->getHeight();
 			lineWidth += charWidth;
 			lineHeight = MAX(lineHeight, charHeight);
 
@@ -139,7 +150,9 @@ void FontRenderer::computeSize(const Common::String &origText, int16 *retX, int1
 			// assume we only need to take the lower bound into
 			// consideration.
 			//Common::Rect charRect = _currentFont->getFrameRect(curChar);
-			lastLineHeight = MAX(lastLineHeight, _currentFont->getHeight());
+			lastLineHeight = MAX(lastLineHeight, _currentFont ? _currentFont->getHeight() :
+				(int16)_currentDemoFont->getHeight());
+			
 		}
 		text++;
 	}
@@ -185,10 +198,11 @@ void FontRenderer::setFontColorByCharacter(int32 characterId) {
 void FontRenderer::setFontColor(int32 fontColor1, int32 fontColor2, int32 fontColor3) {
 	debugC(5, kDebugFont, "setFontColor(%d, %d, %d)", fontColor1, fontColor2, fontColor3);
 
+	// The English demo uses a different palette assignment.
 	_currentFontColor[0] = 0;
-	_currentFontColor[1] = fontColor1;
-	_currentFontColor[2] = fontColor2;
-	_currentFontColor[3] = fontColor3;
+	_currentFontColor[1] = _currentFont ? fontColor1 : fontColor3;
+	_currentFontColor[2] = _currentFont ? fontColor2 : fontColor1;
+	_currentFontColor[3] = _currentFont ? fontColor3 : fontColor2;
 }
 
 void FontRenderer::renderMultiLineText(int16 x, int16 y, const Common::String &origText, int32 mode, Graphics::Surface &frame) {
@@ -223,8 +237,9 @@ void FontRenderer::renderMultiLineText(int16 x, int16 y, const Common::String &o
 			} else
 				curChar = textToFont(curChar);
 
-			int width = _currentFont->getFrameWidth(curChar);
-			curWidth += MAX(width - 2, 0);
+			int width = (_currentFont ? _currentFont->getFrameWidth(curChar) :
+				_currentDemoFont->getGlyphWidth(curChar)) - 2;
+			curWidth += MAX(width, 0);
 			it++;
 			curLetterNr++;
 		}
@@ -261,7 +276,7 @@ void FontRenderer::renderMultiLineText(int16 x, int16 y, const Common::String &o
 	//numLines++;
 
 	// get font height (assumed to be constant)
-	int16 height = _currentFont->getHeight();
+	int16 height = _currentFont ? _currentFont->getHeight() : _currentDemoFont->getHeight();
 	int32 textSize = (height - 2) * numLines;
 	y = y - textSize;
 	if (y < 30)
@@ -289,8 +304,14 @@ void FontRenderer::renderMultiLineText(int16 x, int16 y, const Common::String &o
 
 		while (*line) {
 			byte curChar = textToFont(*line);
-			if (curChar != 32) _currentFont->drawFontFrame(frame, curChar, curX + _vm->state()->_currentScrollValue, curY, _currentFontColor);
-			curX = curX + MAX<int32>(_currentFont->getFrameWidth(curChar) - 2, 0);
+			if (curChar != 32) {
+				if (_currentFont) {
+					_currentFont->drawFontFrame(frame, curChar, curX + _vm->state()->_currentScrollValue, curY, _currentFontColor);
+				} else {
+					_currentDemoFont->drawGlyph(frame, curChar, curX + _vm->state()->_currentScrollValue, curY, _currentFontColor);
+				}
+			}
+			curX = curX + MAX<int32>((_currentFont ? _currentFont->getFrameWidth(curChar) : _currentDemoFont->getGlyphWidth(curChar)) - 2, 0);
 			//height = MAX(height, _currentFont->getFrameHeight(curChar));
 			line++;
 		}
@@ -298,4 +319,162 @@ void FontRenderer::renderMultiLineText(int16 x, int16 y, const Common::String &o
 	}
 }
 
+bool FontRenderer::loadDemoFont(const Common::String& filename) {
+	uint32 fileSize = 0;
+	uint8 *fileData = _vm->resources()->getFileData(filename, &fileSize);
+	if (!fileData)
+		return false;
+
+	uint16 dataSize = READ_LE_UINT16(fileData);
+	if (dataSize != fileSize)
+		return false;
+
+	// Offsets of the various parts of the font.
+	uint16 fontDataOffset = READ_LE_UINT16(fileData + 4);
+	uint16 glyphOffsetTableOffset = READ_LE_UINT16(fileData + 6);
+	uint16 glyphWidthDataOffset = READ_LE_UINT16(fileData + 8);
+	uint16 glyphDataOffset = READ_LE_UINT16(fileData + 10);
+	uint16 glyphHeightDataOffset = READ_LE_UINT16(fileData + 12);
+
+	// Generic font data.
+	uint8 numGlyphs = *(fileData + fontDataOffset + 3);
+	uint8 glyphWidth = *(fileData + fontDataOffset + 4);
+	uint8 glyphHeight = *(fileData + fontDataOffset + 5);
+
+	if (_currentDemoFont)
+		delete _currentDemoFont;
+
+	_currentDemoFont = new DemoFont(glyphWidth, glyphHeight, numGlyphs);
+
+	// Copy the data for each glyph to the DemoFont.
+	for (int i = 0; i < numGlyphs; i++) {
+		// Read glyph dimensions.
+		GlyphDimensions dimensions;
+		dimensions.width = *(fileData + glyphWidthDataOffset + i);
+		dimensions.heightOffset = *(fileData + glyphHeightDataOffset + (2 * i));
+		dimensions.height = *(fileData + glyphHeightDataOffset + (2 * i) + 1);
+		_currentDemoFont->setGlyphDimensions(i, dimensions);
+
+		// Determine start of data for this glyph.
+		uint16 currentGlyphDataOffset = READ_LE_UINT16(fileData + glyphOffsetTableOffset + (i * 2));
+		assert(currentGlyphDataOffset >= glyphDataOffset);
+		// Get pointers for the file and DemoFont data for this glyph.
+		uint8 *srcGlyphDataPtr = fileData + currentGlyphDataOffset;
+		uint8 *dstGlyphDataPtr = _currentDemoFont->getGlyphData(i);
+
+		// Pad the glyph data with zeroes at the start for the height offset.
+		uint16 offsetBytes = dimensions.heightOffset * dimensions.width;
+		memset(dstGlyphDataPtr, 0, offsetBytes);
+		dstGlyphDataPtr += offsetBytes;
+
+		// Read each line of pixels.
+		for (int j = 0; j < dimensions.height; j++) {
+			// Each nibble has data for one pixel, so alternately read the low
+			// and high nibble. If the number of pixels in a line is odd, one
+			// nibble is discarded.
+			bool lowNibble = true;
+			uint8 glyphByte = 0;
+			// Read each pixel in this line.
+			for (int k = 0; k < dimensions.width; k++) {
+				if (lowNibble) {
+					// Copy the data byte.
+					glyphByte = *srcGlyphDataPtr++;
+					// Read the low nibble.
+					*dstGlyphDataPtr++ = glyphByte & 0xF;
+				} else {
+					// Read the high nibble.
+					*dstGlyphDataPtr++ = glyphByte >> 4;
+				}
+				// Switch to the other nibble.
+				lowNibble = !lowNibble;
+			}
+		}
+	}
+
+	return true;
+}
+
+DemoFont::DemoFont(uint8 glyphWidth, uint8 glyphHeight, uint16 numGlyphs) {
+	_glyphWidth = glyphWidth;
+	_glyphHeight = glyphHeight;
+	_numGlyphs = numGlyphs;
+
+	// Allocate room for the full height and width for each glyph. A glyph
+	// might not need this if the width is less, but it makes lookup easier.
+	_glyphData = new uint8[_numGlyphs * _glyphWidth * _glyphHeight];
+	_glyphDimensions = new GlyphDimensions[_numGlyphs];
+}
+
+DemoFont::~DemoFont() {
+	delete[] _glyphData;
+	delete[] _glyphDimensions;
+}
+
+uint8 *DemoFont::getGlyphData() {
+	return _glyphData;
+}
+
+uint8 *DemoFont::getGlyphData(uint8 glyphNum) {
+	assert(glyphNum < _numGlyphs);
+	return _glyphData + (glyphNum * _glyphWidth * _glyphHeight);
+}
+
+uint8 DemoFont::getGlyphWidth(uint8 glyphNum) {
+	assert(glyphNum < _numGlyphs);
+	return _glyphDimensions[glyphNum].width;
+}
+
+uint8 DemoFont::getHeight() {
+	return _glyphHeight;
+}
+
+void DemoFont::setGlyphDimensions(uint8 glyphNum, GlyphDimensions &glyphOffsets) {
+	assert(glyphNum < _numGlyphs);
+	_glyphDimensions[glyphNum] = glyphOffsets;
+}
+
+void DemoFont::drawGlyph(Graphics::Surface &surface, int32 glyphNum, int16 xx, int16 yy, byte *colorMap) {
+	debugC(4, kDebugFont, "drawGlyph(surface, %d, %d, %d, colorMap)", glyphNum, xx, yy);
+	// Clip character into range.
+	if (glyphNum < 0)
+		glyphNum = 0;
+
+	if (glyphNum >= _numGlyphs)
+		glyphNum = _numGlyphs - 1;
+
+	if (_numGlyphs == 0)
+		return;
+
+	int16 rectX = getGlyphWidth(glyphNum);
+	int16 rectY = getHeight();
+
+	// Clip glyph dimensions to surface.
+	if (rectX + xx >= surface.w)
+		rectX = surface.w - xx;
+
+	if (rectX < 0)
+		return;
+
+	if (rectY + yy >= surface.h)
+		rectY = surface.h - yy;
+
+	if (rectY < 0)
+		return;
+
+	// Copy the glyph data to the surface.
+	int32 destPitch = surface.pitch;
+	uint8 *c = getGlyphData(glyphNum);
+	uint8 *curRow = (uint8 *)surface.getBasePtr(xx, yy);
+	for (int16 y = 0; y < rectY; y++) {
+		unsigned char *cur = curRow;
+		for (int16 x = 0; x < rectX; x++) {
+			if (*c && *c < 4)
+				*cur = colorMap[*c];
+			c++;
+			cur++;
+		}
+		curRow += destPitch;
+	}
+}
+
 } // End of namespace Toon
diff --git a/engines/toon/font.h b/engines/toon/font.h
index e6cf916fe3..6788d8a8ae 100644
--- a/engines/toon/font.h
+++ b/engines/toon/font.h
@@ -27,12 +27,15 @@
 
 namespace Toon {
 
+class DemoFont;
+
 class FontRenderer {
 public:
 	FontRenderer(ToonEngine *vm);
 	~FontRenderer();
 
 	void setFont(Animation *font);
+	bool loadDemoFont(const Common::String &filename);
 	void computeSize(const Common::String &origText, int16 *retX, int16 *retY);
 	void renderText(int16 x, int16 y, const Common::String &origText, int32 mode);
 	void renderMultiLineText(int16 x, int16 y, const Common::String &origText, int32 mode, Graphics::Surface &frame);
@@ -40,11 +43,42 @@ public:
 	void setFontColor(int32 fontColor1, int32 fontColor2, int32 fontColor3);
 protected:
 	Animation *_currentFont;
+	DemoFont *_currentDemoFont;
 	ToonEngine *_vm;
 	byte _currentFontColor[4];
 	byte textToFont(byte c);
 };
 
+struct GlyphDimensions {
+	uint8 width;
+	uint8 heightOffset; // # lines from top
+	uint8 height;
+};
+
+// The font format used by the English demo.
+class DemoFont {
+public:
+	DemoFont(uint8 glyphWidth, uint8 glyphHeight, uint16 numGlyphs);
+	~DemoFont();
+
+	uint8 *getGlyphData();
+	uint8 *getGlyphData(uint8 glyphNum);
+
+	uint8 getGlyphWidth(uint8 glyphNum);
+	uint8 getHeight();
+	void setGlyphDimensions(uint8 glyphNum, GlyphDimensions &glyphDimensions);
+
+	void drawGlyph(Graphics::Surface &surface, int32 glyphNum, int16 xx, int16 yy, byte *colorMap);
+
+protected:
+	uint16 _numGlyphs;
+	uint8 _glyphWidth;
+	uint8 _glyphHeight;
+
+	uint8 *_glyphData;
+	GlyphDimensions *_glyphDimensions;
+};
+
 } // End of namespace Toon
 
 #endif
diff --git a/engines/toon/toon.cpp b/engines/toon/toon.cpp
index 24040016fe..c4c8dd5806 100644
--- a/engines/toon/toon.cpp
+++ b/engines/toon/toon.cpp
@@ -2194,13 +2194,18 @@ void ToonEngine::fadeOut(int32 numFrames) {
 }
 
 void ToonEngine::initFonts() {
-	// TODO These font files do not exist in the English demo
 	_fontRenderer = new FontRenderer(this);
-	_fontToon = new Animation(this);
-	_fontToon->loadAnimation("TOONFONT.CAF");
+	if (_isEnglishDemo) {
+		// The English demo uses a different font format. There is only one
+		// font, so the alternative font setting is ignored.
+		_fontRenderer->loadDemoFont("8FAT.FNT");
+	} else {
+		_fontToon = new Animation(this);
+		_fontToon->loadAnimation("TOONFONT.CAF");
 
-	_fontEZ = new Animation(this);
-	_fontEZ->loadAnimation("EZFONT.CAF");
+		_fontEZ = new Animation(this);
+		_fontEZ->loadAnimation("EZFONT.CAF");
+	}
 
 	setFont(false);
 }
diff --git a/engines/toon/toon.h b/engines/toon/toon.h
index 83699597f3..a84d2adaeb 100644
--- a/engines/toon/toon.h
+++ b/engines/toon/toon.h
@@ -428,6 +428,7 @@ protected:
 	Animation *_fontToon;
 	Animation *_fontEZ;
 	Animation *_currentFont;
+	Common::String *_currentDemoFont;
 
 	AudioManager *_audioManager;
 


Commit: c786c756952ce6e612c20e1f68064cd4b6e45a2f
    https://github.com/scummvm/scummvm/commit/c786c756952ce6e612c20e1f68064cd4b6e45a2f
Author: Coen Rampen (crampen at gmail.com)
Date: 2021-09-13T20:59:16+02:00

Commit Message:
TOON: Implement sparkles on English demo options screen

This adds the random sparkle animation on the options screen of the English
demo.

Changed paths:
    engines/toon/toon.cpp


diff --git a/engines/toon/toon.cpp b/engines/toon/toon.cpp
index c4c8dd5806..ea1fe082be 100644
--- a/engines/toon/toon.cpp
+++ b/engines/toon/toon.cpp
@@ -625,35 +625,52 @@ static const MenuFile mainMenuFiles[] = {
 };
 
 #define OPTIONMENU_ENTRYCOUNT 27
-#define OPTIONMENU_ENTRYCOUNT_ENGLISH_DEMO 11
 static const MenuFile optionMenuFiles[] = {
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_PLAY,        "PLAYBUTN.CAF", 0 }, // "Start" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_QUIT,        "QUITBUTN.CAF", 0 }, // "Intro" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_VIDEO_MODE,        "VIDMODE.CAF", 0 }, // "Start" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_TEXTSPEED,        "TXTSPEED.CAF", 0 }, // "Intro" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_TEXT,        "TEXTDIAL.CAF", 0}, // "Intro" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_VOLUMESFX,        "SFXBUTN.CAF", 0 }, // "Start" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_VOLUMESFXSLIDER,        "SFXSLDR.CAF", 0 }, // "Intro" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_VOLUMEVOICE,        "VOICEBTN.CAF", 0 }, // "Start" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_VOLUMEVOICESLIDER,        "VOICESLD.CAF", 0 }, // "Intro" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_VOLUMEMUSIC,        "MUSICBTN.CAF", 0 }, // "Start" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_VOLUMEMUSICSLIDER,        "MUSICSLD.CAF", 0 }, // "Intro" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_SPEAKERBUTTON,        "XTRABUTN.CAF", 0 }, // "Start" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_SPEAKERLEVER,        "XTRALEVR.CAF", 0}, // "Intro" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_NONE,        "ANTENNAL.CAF", 6 }, // "Start" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_NONE,        "ANTENNAR.CAF", 6 }, // "Intro" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_NONE,        "BIGREDL.CAF", 6 }, // "Start" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_NONE,        "BIGREDR.CAF", 6 }, // "Intro" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_NONE,        "GRIDLTEL.CAF", 6 }, // "Start" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_NONE,        "GRIDLTER.CAF", 6 }, // "Intro" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_NONE,        "LSPEAKR.CAF", 0 }, // "Start" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_NONE,        "RSPEAKR.CAF", 0 }, // "Intro" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_NONE,        "STARLITL.CAF", 6 }, // "Start" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_NONE,        "STARLITR.CAF", 6 }, // "Intro" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_NONE,        "CHASE1.CAF", 6 }, // "Intro" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_NONE,        "CHASE2.CAF", 6 }, // "Intro" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_NONE,        "CHASE3.CAF", 6 }, // "Intro" button
-	{ OPTIONMENUMASK_EVERYWHERE,       OPTIONMENUHOTSPOT_NONE,        "CHASE4.CAF", 6 } // "Intro" button
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_PLAY,					"PLAYBUTN.CAF",	0 },	// "Play" button
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_QUIT,					"QUITBUTN.CAF",	0 },	// "Quit" button
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_VIDEO_MODE,			"VIDMODE.CAF",	0 },	// "Video mode" slider
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_TEXTSPEED,			"TXTSPEED.CAF",	0 },	// "Text speed" slider
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_TEXT,					"TEXTDIAL.CAF",	0},		// "Text" button
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_VOLUMESFX,			"SFXBUTN.CAF",	0 },	// "SFX" button
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_VOLUMESFXSLIDER,		"SFXSLDR.CAF",	0 },	// "SFX volume" slider
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_VOLUMEVOICE,			"VOICEBTN.CAF",	0 },	// "Voice" button
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_VOLUMEVOICESLIDER,	"VOICESLD.CAF",	0 },	// "Voice volume" slider
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_VOLUMEMUSIC,			"MUSICBTN.CAF",	0 },	// "Music" button
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_VOLUMEMUSICSLIDER,	"MUSICSLD.CAF",	0 },	// "Music volume" button
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_SPEAKERBUTTON,		"XTRABUTN.CAF",	0 },	// Right speaker button
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_SPEAKERLEVER,			"XTRALEVR.CAF",	0},		// Left speaker switch
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_NONE,					"ANTENNAL.CAF",	6 },	// Decorative animation
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_NONE,					"ANTENNAR.CAF",	6 },	// Decorative animation
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_NONE,					"BIGREDL.CAF",	6 },	// Decorative animation
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_NONE,					"BIGREDR.CAF",	6 },	// Decorative animation
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_NONE,					"GRIDLTEL.CAF",	6 },	// Decorative animation
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_NONE,					"GRIDLTER.CAF",	6 },	// Decorative animation
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_NONE,					"LSPEAKR.CAF",	0 },	// Left speaker animation
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_NONE,					"RSPEAKR.CAF",	0 },	// Right speaker animation
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_NONE,					"STARLITL.CAF",	6 },	// Decorative animation
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_NONE,					"STARLITR.CAF",	6 },	// Decorative animation
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_NONE,					"CHASE1.CAF",	6 },	// Decorative animation
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_NONE,					"CHASE2.CAF",	6 },	// Decorative animation
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_NONE,					"CHASE3.CAF",	6 },	// Decorative animation
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_NONE,					"CHASE4.CAF",	6 }		// Decorative animation
+};
+
+// English demo does not have most of the animations, but it has a random
+// sparkle effect instead.
+#define OPTIONMENU_ENTRYCOUNT_ENGLISH_DEMO 12
+static const MenuFile optionMenuFilesEnglishDemo[] = {
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_PLAY,					"PLAYBUTN.CAF",	0 },	// "Play" button
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_QUIT,					"QUITBUTN.CAF",	0 },	// "Quit" button
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_VIDEO_MODE,			"VIDMODE.CAF",	0 },	// "Video mode" slider
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_TEXTSPEED,			"TXTSPEED.CAF",	0 },	// "Text speed" slider
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_TEXT,					"TEXTDIAL.CAF",	0},		// "Text" button
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_VOLUMESFX,			"SFXBUTN.CAF",	0 },	// "SFX" button
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_VOLUMESFXSLIDER,		"SFXSLDR.CAF",	0 },	// "SFX volume" slider
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_VOLUMEVOICE,			"VOICEBTN.CAF",	0 },	// "Voice" button
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_VOLUMEVOICESLIDER,	"VOICESLD.CAF",	0 },	// "Voice volume" slider
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_VOLUMEMUSIC,			"MUSICBTN.CAF",	0 },	// "Music" button
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_VOLUMEMUSICSLIDER,	"MUSICSLD.CAF",	0 },	// "Music volume" button
+	{ OPTIONMENUMASK_EVERYWHERE,	OPTIONMENUHOTSPOT_NONE,					"SPRKL.CAF",	6 }		// Sparkle animation
 };
 
 struct MenuEntry {
@@ -684,16 +701,17 @@ bool ToonEngine::showOptions() {
 
 	// English demo options menu has less animations and no SFX
 	int optionMenuEntryCount = _isEnglishDemo ? OPTIONMENU_ENTRYCOUNT_ENGLISH_DEMO : OPTIONMENU_ENTRYCOUNT;
+	const MenuFile *optionMenuFilesPtr = _isEnglishDemo ? optionMenuFilesEnglishDemo : optionMenuFiles;
 	MenuEntry *entries = new MenuEntry[optionMenuEntryCount];
 
 	for (int entryNr = 0; entryNr < optionMenuEntryCount; entryNr++) {
-		entries[entryNr].menuMask = optionMenuFiles[entryNr].menuMask;
-		entries[entryNr].id = optionMenuFiles[entryNr].id;
+		entries[entryNr].menuMask = optionMenuFilesPtr[entryNr].menuMask;
+		entries[entryNr].id = optionMenuFilesPtr[entryNr].id;
 		entries[entryNr].animation = new Animation(this);
-		entries[entryNr].animation->loadAnimation(optionMenuFiles[entryNr].animationFile);
+		entries[entryNr].animation->loadAnimation(optionMenuFilesPtr[entryNr].animationFile);
 		if (entries[entryNr].id != OPTIONMENUHOTSPOT_NONE)
 			entries[entryNr].rect = entries[entryNr].animation->getRect();
-		entries[entryNr].animateOnFrame = optionMenuFiles[entryNr].animateOnFrame;
+		entries[entryNr].animateOnFrame = optionMenuFilesPtr[entryNr].animateOnFrame;
 		entries[entryNr].animateCurFrame = 0;
 		entries[entryNr].activeFrame = 0;
 		entries[entryNr].playOnce = false;
@@ -717,6 +735,11 @@ bool ToonEngine::showOptions() {
 		entries[4].activeFrame = 0;
 	}
 
+	// Variables for the English demo sparkle animation.
+	int sparkleDelay = 100;
+	int sparklePosX = 0;
+	int sparklePosY = 0;
+
 	setCursor(0);
 
 	int menuMask = OPTIONMENUMASK_EVERYWHERE;
@@ -745,6 +768,24 @@ bool ToonEngine::showOptions() {
 
 			for (int entryNr = 0; entryNr < optionMenuEntryCount; entryNr++) {
 				if (entries[entryNr].menuMask & menuMask) {
+					int animPosX = 0;
+					int animPosY = 0;
+					if (_isEnglishDemo && entryNr == 11) {
+						// Special handling for the sparkles in the English demo.
+						if (sparkleDelay > 0) {
+							// Don't show the next sparkle until the delay has
+							// counted down.
+							sparkleDelay--;
+							continue;
+						} else if (entries[entryNr].animateCurFrame == 0 && entries[entryNr].activeFrame == 0) {
+							// Start of a new sparkle animation. Generate a
+							// random position on the screen.
+							sparklePosX = randRange(0, 639 - entries[entryNr].animation->getWidth());
+							sparklePosY = randRange(0, 399 - entries[entryNr].animation->getHeight());
+						}
+						animPosX = sparklePosX;
+						animPosY = sparklePosY;
+					}
 					if (entries[entryNr].animateOnFrame) {
 						entries[entryNr].animateCurFrame++;
 						if (entries[entryNr].animateOnFrame <= entries[entryNr].animateCurFrame) {
@@ -758,12 +799,16 @@ bool ToonEngine::showOptions() {
 								if (entryNr == 20 && entries[entryNr].animateOnFrame > 0) {
 									playSFX(-3, 128);
 								}
+								if (_isEnglishDemo && entryNr == 11)
+									// Sparkle animation has finished. Generate
+									// a random delay until the next sparkle.
+									sparkleDelay = randRange(0, 100);
 							}
 							entries[entryNr].animateCurFrame = 0;
 						}
 					}
 					int32 frameNr = entries[entryNr].activeFrame;
-					entries[entryNr].animation->drawFrame(*_mainSurface, frameNr, 0, 0);
+					entries[entryNr].animation->drawFrame(*_mainSurface, frameNr, animPosX, animPosY);
 				}
 			}
 


Commit: 570482a075dd83514ad146da6bce54bef4db9feb
    https://github.com/scummvm/scummvm/commit/570482a075dd83514ad146da6bce54bef4db9feb
Author: Coen Rampen (crampen at gmail.com)
Date: 2021-09-13T20:59:17+02:00

Commit Message:
TOON: Remove English demo unstable flag

Changed paths:
    engines/toon/detection.cpp


diff --git a/engines/toon/detection.cpp b/engines/toon/detection.cpp
index e311a5eb08..84e2cc9112 100644
--- a/engines/toon/detection.cpp
+++ b/engines/toon/detection.cpp
@@ -115,7 +115,7 @@ static const ADGameDescription gameDescriptions[] = {
 			{"generic.svl", 0, "5c42724bb93b360dca7044d6b7ef26e5", 7739319},
 			AD_LISTEND
 		},
-		Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO | ADGF_UNSTABLE, GUIO1(GUIO_NOMIDI)
+		Common::EN_ANY, Common::kPlatformDOS, ADGF_DEMO, GUIO1(GUIO_NOMIDI)
 	},
 	{
 		// English 2-CD "Sold out" release




More information about the Scummvm-git-logs mailing list