[Scummvm-git-logs] scummvm master -> 56f69e40c5e636bc9ac416dc314b7711e38e35ba

neuromancer noreply at scummvm.org
Sat May 7 06:29:39 UTC 2022


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

Summary:
69e61a6427 HYPNO: play pre arcade videos in boyz
7c4042c82c HYPNO: handle a corner case where the first segment starts after the first frame
63f45d4d5a HYPNO: improved parsing for player selection in boyz
56f69e40c5 HYPNO: basic ammo handling in boyz


Commit: 69e61a6427cba723549f67fa589e26b88f9d94b2
    https://github.com/scummvm/scummvm/commit/69e61a6427cba723549f67fa589e26b88f9d94b2
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-07T08:26:07+02:00

Commit Message:
HYPNO: play pre arcade videos in boyz

Changed paths:
    engines/hypno/boyz/arcade.cpp


diff --git a/engines/hypno/boyz/arcade.cpp b/engines/hypno/boyz/arcade.cpp
index 9c17c240dad..39891aa2ab0 100644
--- a/engines/hypno/boyz/arcade.cpp
+++ b/engines/hypno/boyz/arcade.cpp
@@ -45,6 +45,11 @@ void BoyzEngine::runBeforeArcade(ArcadeShooting *arc) {
 	_playerFrameSep = _playerFrames.size();
 	_playerFrameIdx = -1;
 
+	if (!arc->beforeVideo.empty()) {
+		MVideo video(arc->beforeVideo, Common::Point(0, 0), false, true, false);
+		runIntro(video);
+	}
+
 	_currentScript = arc->script;
 	updateFromScript();
 }


Commit: 7c4042c82c2f7247d373d53e48c6c2e0422c7b87
    https://github.com/scummvm/scummvm/commit/7c4042c82c2f7247d373d53e48c6c2e0422c7b87
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-07T08:26:07+02:00

Commit Message:
HYPNO: handle a corner case where the first segment starts after the first frame

Changed paths:
    engines/hypno/arcade.cpp


diff --git a/engines/hypno/arcade.cpp b/engines/hypno/arcade.cpp
index 9af4876d161..7ebcd7c5235 100644
--- a/engines/hypno/arcade.cpp
+++ b/engines/hypno/arcade.cpp
@@ -249,6 +249,13 @@ void HypnoEngine::runArcade(ArcadeShooting *arc) {
 	}
 	_currentPalette = arc->backgroundPalette;
 	loadPalette(_currentPalette);
+
+	if (segments[_segmentIdx].start > 1) {
+		_background->decoder->forceSeekToFrame(segments[_segmentIdx].start - 10);
+		segments[_segmentIdx].size -= segments[_segmentIdx].start;
+		segments[_segmentIdx].start = 1;
+	}
+
 	bool shootingPrimary = false;
 	bool shootingSecondary = false;
 	bool needsUpdate = true;


Commit: 63f45d4d5a2b403c6ae71904f6811c68661ecedc
    https://github.com/scummvm/scummvm/commit/63f45d4d5a2b403c6ae71904f6811c68661ecedc
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-07T08:26:07+02:00

Commit Message:
HYPNO: improved parsing for player selection in boyz

Changed paths:
    engines/hypno/actions.cpp
    engines/hypno/boyz/boyz.cpp
    engines/hypno/grammar.h
    engines/hypno/grammar_mis.cpp
    engines/hypno/grammar_mis.y
    engines/hypno/hypno.h
    engines/hypno/lexer_mis.cpp
    engines/hypno/lexer_mis.l
    engines/hypno/scene.cpp
    engines/hypno/tokens_mis.h


diff --git a/engines/hypno/actions.cpp b/engines/hypno/actions.cpp
index 8841c0c412e..d9d42170e6e 100644
--- a/engines/hypno/actions.cpp
+++ b/engines/hypno/actions.cpp
@@ -31,6 +31,10 @@ namespace Hypno {
 void HypnoEngine::runMenu(Hotspots *hs, bool only_menu) {
 	Hotspot *h = hs->begin();
 	assert(h->type == MakeMenu);
+	if (!h->background.empty()) {
+		loadImage(h->background, 0, 0, false, true);
+	}
+
 	debugC(1, kHypnoDebugScene, "hotspot actions size: %d", h->actions.size());
 	for (Actions::const_iterator itt = h->actions.begin(); !only_menu && itt != h->actions.end(); ++itt) {
 		Action *action = *itt;
diff --git a/engines/hypno/boyz/boyz.cpp b/engines/hypno/boyz/boyz.cpp
index 514dd7f3c27..19b0bcf4037 100644
--- a/engines/hypno/boyz/boyz.cpp
+++ b/engines/hypno/boyz/boyz.cpp
@@ -36,6 +36,24 @@ BoyzEngine::BoyzEngine(OSystem *syst, const ADGameDescription *gd) : HypnoEngine
 	_crosshairsPalette = nullptr;
 }
 
+static const char *selectBoyz = "\
+MENU preload\\slct_boy.smk\n\
+HOTS /BBOX= 19  3   66  199\n\
+SOND tollop1.raw 22K\n\
+HOTS /BBOX= 69  3   116 199\n\
+SOND tollam.raw  22K\n\
+HOTS /BBOX= 119 3   166 199\n\
+SOND tolvas1.raw 22K\n\
+HOTS /BBOX= 169 3   216 199\n\
+SOND tolbut1.raw 22K\n\
+HOTS /BBOX= 219 3   266 199\n\
+SOND tolbro1.raw 22K\n\
+HOTS /BBOX= 269 3   316 170\n\
+SOND tolmon1.raw 22K\n\
+HOTS /BBOX= 262 172 312 194\n\
+SOND pstlfire.raw\n\
+END\n";
+
 void BoyzEngine::loadAssets() {
 	LibFile *missions = loadLib("", "preload/missions.lib", true);
 	Common::ArchiveMemberList files;
@@ -51,7 +69,7 @@ void BoyzEngine::loadAssets() {
 
 	Code *menu = new Code("<main_menu>");
 	_levels["<main_menu>"] = menu;
-	_levels["<main_menu>"]->levelIfWin = "c19.mi_";
+	_levels["<main_menu>"]->levelIfWin = "<select_boyz>";
 
 	loadArcadeLevel("c19.mi_", "c11.mi_", "??", "");
 	loadArcadeLevel("c11.mi_", "c12.mi_", "??", "");
@@ -63,6 +81,12 @@ void BoyzEngine::loadAssets() {
 	loadArcadeLevel("c17.mi_", "c18.mi_", "??", "");
 	loadArcadeLevel("c18.mi_", "c21.mi_", "??", "");
 
+	loadSceneLevel(selectBoyz, "<select_boyz>", "", "");
+	Scene *sc = (Scene *) _levels["<select_boyz>"];
+
+	ChangeLevel *cl = new ChangeLevel("c19.mi_");
+	sc->hots[7].actions.push_back(cl);
+
 	loadLib("sound/", "misc/sound.lib", true);
 
 	_weaponShootSound[0] = "pstlfire.raw";
diff --git a/engines/hypno/grammar.h b/engines/hypno/grammar.h
index fd0133d5cff..9ab01a85c51 100644
--- a/engines/hypno/grammar.h
+++ b/engines/hypno/grammar.h
@@ -105,6 +105,7 @@ public:
 	Common::String flags[3];
 	Common::Rect rect;
 	Common::String setting;
+	Common::String background;
 	Actions actions;
 	Hotspots *smenu;
 };
diff --git a/engines/hypno/grammar_mis.cpp b/engines/hypno/grammar_mis.cpp
index 9472a2d20fa..5db18c13036 100644
--- a/engines/hypno/grammar_mis.cpp
+++ b/engines/hypno/grammar_mis.cpp
@@ -103,7 +103,7 @@ int HYPNO_MIS_wrap() {
 using namespace Hypno;
 
 
-#line 108 "engines/hypno/grammar_mis.cpp"
+#line 107 "engines/hypno/grammar_mis.cpp"
 
 # ifndef YY_CAST
 #  ifdef __cplusplus
@@ -141,58 +141,60 @@ enum yysymbol_kind_t
   YYSYMBOL_GSSWITCH = 7,                   /* GSSWITCH  */
   YYSYMBOL_COMMAND = 8,                    /* COMMAND  */
   YYSYMBOL_WALNTOK = 9,                    /* WALNTOK  */
-  YYSYMBOL_NUM = 10,                       /* NUM  */
-  YYSYMBOL_HOTSTOK = 11,                   /* HOTSTOK  */
-  YYSYMBOL_CUTSTOK = 12,                   /* CUTSTOK  */
-  YYSYMBOL_BACKTOK = 13,                   /* BACKTOK  */
-  YYSYMBOL_INTRTOK = 14,                   /* INTRTOK  */
-  YYSYMBOL_RETTOK = 15,                    /* RETTOK  */
-  YYSYMBOL_TIMETOK = 16,                   /* TIMETOK  */
-  YYSYMBOL_PALETOK = 17,                   /* PALETOK  */
-  YYSYMBOL_BBOXTOK = 18,                   /* BBOXTOK  */
-  YYSYMBOL_OVERTOK = 19,                   /* OVERTOK  */
-  YYSYMBOL_MICETOK = 20,                   /* MICETOK  */
-  YYSYMBOL_PLAYTOK = 21,                   /* PLAYTOK  */
-  YYSYMBOL_ENDTOK = 22,                    /* ENDTOK  */
-  YYSYMBOL_MENUTOK = 23,                   /* MENUTOK  */
-  YYSYMBOL_SMENTOK = 24,                   /* SMENTOK  */
-  YYSYMBOL_ESCPTOK = 25,                   /* ESCPTOK  */
-  YYSYMBOL_NRTOK = 26,                     /* NRTOK  */
-  YYSYMBOL_AMBITOK = 27,                   /* AMBITOK  */
-  YYSYMBOL_SWPTTOK = 28,                   /* SWPTTOK  */
-  YYSYMBOL_MPTRTOK = 29,                   /* MPTRTOK  */
-  YYSYMBOL_GLOBTOK = 30,                   /* GLOBTOK  */
-  YYSYMBOL_TONTOK = 31,                    /* TONTOK  */
-  YYSYMBOL_TOFFTOK = 32,                   /* TOFFTOK  */
-  YYSYMBOL_TALKTOK = 33,                   /* TALKTOK  */
-  YYSYMBOL_INACTOK = 34,                   /* INACTOK  */
-  YYSYMBOL_FDTOK = 35,                     /* FDTOK  */
-  YYSYMBOL_BOXXTOK = 36,                   /* BOXXTOK  */
-  YYSYMBOL_ESCAPETOK = 37,                 /* ESCAPETOK  */
-  YYSYMBOL_SECONDTOK = 38,                 /* SECONDTOK  */
-  YYSYMBOL_INTROTOK = 39,                  /* INTROTOK  */
-  YYSYMBOL_DEFAULTTOK = 40,                /* DEFAULTTOK  */
-  YYSYMBOL_PG = 41,                        /* PG  */
-  YYSYMBOL_PA = 42,                        /* PA  */
-  YYSYMBOL_PD = 43,                        /* PD  */
-  YYSYMBOL_PH = 44,                        /* PH  */
-  YYSYMBOL_PF = 45,                        /* PF  */
-  YYSYMBOL_PE = 46,                        /* PE  */
-  YYSYMBOL_PP = 47,                        /* PP  */
-  YYSYMBOL_PI = 48,                        /* PI  */
-  YYSYMBOL_PL = 49,                        /* PL  */
-  YYSYMBOL_PS = 50,                        /* PS  */
-  YYSYMBOL_YYACCEPT = 51,                  /* $accept  */
-  YYSYMBOL_start = 52,                     /* start  */
-  YYSYMBOL_init = 53,                      /* init  */
-  YYSYMBOL_lines = 54,                     /* lines  */
-  YYSYMBOL_line = 55,                      /* line  */
-  YYSYMBOL_anything = 56,                  /* anything  */
-  YYSYMBOL_alloctalk = 57,                 /* alloctalk  */
-  YYSYMBOL_talk = 58,                      /* talk  */
-  YYSYMBOL_mflag = 59,                     /* mflag  */
-  YYSYMBOL_flag = 60,                      /* flag  */
-  YYSYMBOL_gsswitch = 61                   /* gsswitch  */
+  YYSYMBOL_ENCTOK = 10,                    /* ENCTOK  */
+  YYSYMBOL_NUM = 11,                       /* NUM  */
+  YYSYMBOL_HOTSTOK = 12,                   /* HOTSTOK  */
+  YYSYMBOL_CUTSTOK = 13,                   /* CUTSTOK  */
+  YYSYMBOL_BACKTOK = 14,                   /* BACKTOK  */
+  YYSYMBOL_INTRTOK = 15,                   /* INTRTOK  */
+  YYSYMBOL_RETTOK = 16,                    /* RETTOK  */
+  YYSYMBOL_TIMETOK = 17,                   /* TIMETOK  */
+  YYSYMBOL_PALETOK = 18,                   /* PALETOK  */
+  YYSYMBOL_BBOXTOK = 19,                   /* BBOXTOK  */
+  YYSYMBOL_OVERTOK = 20,                   /* OVERTOK  */
+  YYSYMBOL_MICETOK = 21,                   /* MICETOK  */
+  YYSYMBOL_SONDTOK = 22,                   /* SONDTOK  */
+  YYSYMBOL_PLAYTOK = 23,                   /* PLAYTOK  */
+  YYSYMBOL_ENDTOK = 24,                    /* ENDTOK  */
+  YYSYMBOL_MENUTOK = 25,                   /* MENUTOK  */
+  YYSYMBOL_SMENTOK = 26,                   /* SMENTOK  */
+  YYSYMBOL_ESCPTOK = 27,                   /* ESCPTOK  */
+  YYSYMBOL_NRTOK = 28,                     /* NRTOK  */
+  YYSYMBOL_AMBITOK = 29,                   /* AMBITOK  */
+  YYSYMBOL_SWPTTOK = 30,                   /* SWPTTOK  */
+  YYSYMBOL_MPTRTOK = 31,                   /* MPTRTOK  */
+  YYSYMBOL_GLOBTOK = 32,                   /* GLOBTOK  */
+  YYSYMBOL_TONTOK = 33,                    /* TONTOK  */
+  YYSYMBOL_TOFFTOK = 34,                   /* TOFFTOK  */
+  YYSYMBOL_TALKTOK = 35,                   /* TALKTOK  */
+  YYSYMBOL_INACTOK = 36,                   /* INACTOK  */
+  YYSYMBOL_FDTOK = 37,                     /* FDTOK  */
+  YYSYMBOL_BOXXTOK = 38,                   /* BOXXTOK  */
+  YYSYMBOL_ESCAPETOK = 39,                 /* ESCAPETOK  */
+  YYSYMBOL_SECONDTOK = 40,                 /* SECONDTOK  */
+  YYSYMBOL_INTROTOK = 41,                  /* INTROTOK  */
+  YYSYMBOL_DEFAULTTOK = 42,                /* DEFAULTTOK  */
+  YYSYMBOL_PG = 43,                        /* PG  */
+  YYSYMBOL_PA = 44,                        /* PA  */
+  YYSYMBOL_PD = 45,                        /* PD  */
+  YYSYMBOL_PH = 46,                        /* PH  */
+  YYSYMBOL_PF = 47,                        /* PF  */
+  YYSYMBOL_PE = 48,                        /* PE  */
+  YYSYMBOL_PP = 49,                        /* PP  */
+  YYSYMBOL_PI = 50,                        /* PI  */
+  YYSYMBOL_PL = 51,                        /* PL  */
+  YYSYMBOL_PS = 52,                        /* PS  */
+  YYSYMBOL_YYACCEPT = 53,                  /* $accept  */
+  YYSYMBOL_start = 54,                     /* start  */
+  YYSYMBOL_init = 55,                      /* init  */
+  YYSYMBOL_lines = 56,                     /* lines  */
+  YYSYMBOL_line = 57,                      /* line  */
+  YYSYMBOL_anything = 58,                  /* anything  */
+  YYSYMBOL_alloctalk = 59,                 /* alloctalk  */
+  YYSYMBOL_talk = 60,                      /* talk  */
+  YYSYMBOL_mflag = 61,                     /* mflag  */
+  YYSYMBOL_flag = 62,                      /* flag  */
+  YYSYMBOL_gsswitch = 63                   /* gsswitch  */
 };
 typedef enum yysymbol_kind_t yysymbol_kind_t;
 
@@ -520,19 +522,19 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   125
+#define YYLAST   131
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  51
+#define YYNTOKENS  53
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  11
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  54
+#define YYNRULES  57
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  137
+#define YYNSTATES  141
 
 /* YYMAXUTOK -- Last valid token kind.  */
-#define YYMAXUTOK   305
+#define YYMAXUTOK   307
 
 
 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
@@ -576,19 +578,19 @@ static const yytype_int8 yytranslate[] =
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
       35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50
+      45,    46,    47,    48,    49,    50,    51,    52
 };
 
 #if HYPNO_MIS_DEBUG
 /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_int16 yyrline[] =
 {
-       0,    73,    73,    76,    87,    88,    92,   108,   114,   129,
-     135,   141,   142,   149,   156,   162,   168,   174,   181,   188,
-     195,   202,   208,   214,   217,   223,   229,   232,   233,   236,
-     243,   246,   247,   251,   254,   257,   261,   265,   270,   276,
-     277,   283,   289,   295,   302,   309,   315,   320,   321,   324,
-     325,   328,   329,   332,   333
+       0,    72,    72,    75,    86,    87,    91,   107,   121,   127,
+     142,   148,   154,   155,   162,   169,   175,   181,   187,   193,
+     199,   206,   213,   220,   227,   233,   239,   242,   248,   254,
+     257,   258,   261,   268,   271,   272,   276,   279,   282,   286,
+     290,   295,   301,   302,   308,   314,   320,   327,   334,   340,
+     345,   346,   349,   350,   353,   354,   357,   358
 };
 #endif
 
@@ -605,15 +607,15 @@ static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
 static const char *const yytname[] =
 {
   "\"end of file\"", "error", "\"invalid token\"", "NAME", "FILENAME",
-  "FLAG", "COMMENT", "GSSWITCH", "COMMAND", "WALNTOK", "NUM", "HOTSTOK",
-  "CUTSTOK", "BACKTOK", "INTRTOK", "RETTOK", "TIMETOK", "PALETOK",
-  "BBOXTOK", "OVERTOK", "MICETOK", "PLAYTOK", "ENDTOK", "MENUTOK",
-  "SMENTOK", "ESCPTOK", "NRTOK", "AMBITOK", "SWPTTOK", "MPTRTOK",
-  "GLOBTOK", "TONTOK", "TOFFTOK", "TALKTOK", "INACTOK", "FDTOK", "BOXXTOK",
-  "ESCAPETOK", "SECONDTOK", "INTROTOK", "DEFAULTTOK", "PG", "PA", "PD",
-  "PH", "PF", "PE", "PP", "PI", "PL", "PS", "$accept", "start", "init",
-  "lines", "line", "anything", "alloctalk", "talk", "mflag", "flag",
-  "gsswitch", YY_NULLPTR
+  "FLAG", "COMMENT", "GSSWITCH", "COMMAND", "WALNTOK", "ENCTOK", "NUM",
+  "HOTSTOK", "CUTSTOK", "BACKTOK", "INTRTOK", "RETTOK", "TIMETOK",
+  "PALETOK", "BBOXTOK", "OVERTOK", "MICETOK", "SONDTOK", "PLAYTOK",
+  "ENDTOK", "MENUTOK", "SMENTOK", "ESCPTOK", "NRTOK", "AMBITOK", "SWPTTOK",
+  "MPTRTOK", "GLOBTOK", "TONTOK", "TOFFTOK", "TALKTOK", "INACTOK", "FDTOK",
+  "BOXXTOK", "ESCAPETOK", "SECONDTOK", "INTROTOK", "DEFAULTTOK", "PG",
+  "PA", "PD", "PH", "PF", "PE", "PP", "PI", "PL", "PS", "$accept", "start",
+  "init", "lines", "line", "anything", "alloctalk", "talk", "mflag",
+  "flag", "gsswitch", YY_NULLPTR
 };
 
 static const char *
@@ -623,7 +625,7 @@ yysymbol_name (yysymbol_kind_t yysymbol)
 }
 #endif
 
-#define YYPACT_NINF (-85)
+#define YYPACT_NINF (-89)
 
 #define yypact_value_is_default(Yyn) \
   ((Yyn) == YYPACT_NINF)
@@ -637,20 +639,21 @@ yysymbol_name (yysymbol_kind_t yysymbol)
    STATE-NUM.  */
 static const yytype_int8 yypact[] =
 {
-     -85,     5,    77,   -85,     9,    -4,    13,    14,    15,   -85,
-      10,    18,    20,    21,    23,    25,    27,   -85,   -85,    28,
-      26,    29,    24,   -85,   -85,    77,    30,    31,   -85,    33,
-      34,    27,   -85,    36,    40,    41,    25,    22,   -85,    27,
-      42,   -85,    43,    32,    35,   -85,    44,    45,    46,    47,
-     -85,    49,   -85,    50,   -85,   -85,    27,    51,    52,   -85,
-      59,    35,    35,    54,   -85,    61,    62,    63,    35,    35,
-      35,    35,    35,   -85,    85,    93,    35,    35,   -85,    38,
-      98,    38,   -85,    82,    38,   -85,    82,    99,   101,   -85,
-     -85,   102,   103,   104,   105,   -85,   -85,   -85,   -85,   -85,
-     106,   107,   -85,   -85,   -85,    82,   108,    82,   -85,   -85,
-      82,   -85,   109,   110,   -85,   111,   112,   113,    82,    35,
-     -85,   -85,    82,   -85,   114,    38,    82,   -85,   -85,    35,
-     -85,   -85,   -85,    82,   -85,   -85,   -85
+     -89,     5,    78,   -89,    13,    -1,    15,    16,    18,   -89,
+      14,    20,    23,    24,    25,    26,    28,     9,   -89,   -89,
+      29,    30,    31,    32,   -89,   -89,    78,    33,    35,   -89,
+      39,    40,    37,   -89,    41,    42,    27,    43,    28,    44,
+     -89,   -89,    37,    45,   -89,    46,    52,    34,   -89,    48,
+      50,    51,    53,   -89,    54,   -89,   -89,    55,   -89,   -89,
+      37,    56,    58,   -89,    59,    34,    34,    77,   -89,    85,
+      93,   102,    34,    34,    34,    34,    34,   -89,   100,   101,
+      34,    34,   -89,    36,   103,    36,   -89,   110,    36,   -89,
+     110,   105,   106,   -89,   -89,   107,   108,   109,   111,   -89,
+     -89,   -89,   -89,   -89,   112,   113,   -89,   -89,   -89,   110,
+     114,   110,   -89,   -89,   110,   -89,   115,   116,   -89,   117,
+     118,   119,   110,    34,   -89,   -89,   110,   -89,   120,    36,
+     110,   -89,   -89,    34,   -89,   -89,   -89,   110,   -89,   -89,
+     -89
 };
 
 /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -658,34 +661,35 @@ static const yytype_int8 yypact[] =
    means the default is an error.  */
 static const yytype_int8 yydefact[] =
 {
-       3,     0,     5,     1,     0,     0,     0,     0,     0,    26,
-       0,     0,     0,     0,     0,    28,    50,     8,     9,     0,
-       0,     0,     0,    29,     2,     5,     0,     0,    20,     0,
-      19,    50,    17,     0,     0,     0,    28,     0,    49,    50,
-       0,    11,     0,     0,    48,     4,     0,     0,     0,     0,
-      10,     0,    22,     0,    27,    25,    50,     0,     0,    13,
-       0,    48,    48,     0,    34,     0,     0,     0,    48,    48,
-      48,    48,    48,    47,     0,     0,    48,    48,    24,    54,
-       0,    54,    18,    52,    54,     6,    52,     0,     0,    30,
-      31,     0,     0,     0,     0,    38,    41,    42,    39,    40,
-       0,     0,    46,    45,    53,    52,     0,    52,    51,    16,
-      52,    14,     0,     0,    33,     0,     0,     0,    52,    48,
-      21,     7,    52,    15,     0,    54,    52,    36,    37,    48,
-      44,    12,    23,    52,    35,    43,    32
+       3,     0,     5,     1,     0,     0,     0,     0,     0,    29,
+       0,     0,     0,     0,     0,     0,    31,    53,     9,    10,
+       0,     0,     0,     0,    32,     2,     5,     0,     0,    23,
+       0,    22,    53,    20,     0,     0,    18,     0,    31,     0,
+      52,     7,    53,     0,    12,     0,     0,    51,     4,     0,
+       0,     0,     0,    11,     0,    25,    17,     0,    30,    28,
+      53,     0,     0,    14,     0,    51,    51,     0,    37,     0,
+       0,     0,    51,    51,    51,    51,    51,    50,     0,     0,
+      51,    51,    27,    57,     0,    57,    21,    55,    57,     6,
+      55,     0,     0,    33,    34,     0,     0,     0,     0,    41,
+      44,    45,    42,    43,     0,     0,    49,    48,    56,    55,
+       0,    55,    54,    19,    55,    15,     0,     0,    36,     0,
+       0,     0,    55,    51,    24,     8,    55,    16,     0,    57,
+      55,    39,    40,    51,    47,    13,    26,    55,    38,    46,
+      35
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int8 yypgoto[] =
 {
-     -85,   -85,   -85,   100,   -85,     3,   -85,   -61,   -27,   -84,
-     -78
+     -89,   -89,   -89,    10,   -89,     7,   -89,   -65,   -28,   -88,
+     -82
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int8 yydefgoto[] =
 {
-       0,     1,     2,    24,    25,    37,    44,    78,    39,   109,
-     105
+       0,     1,     2,    25,    26,    39,    47,    82,    42,   113,
+     109
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -693,78 +697,81 @@ static const yytype_int8 yydefgoto[] =
    number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_uint8 yytable[] =
 {
-      89,    90,   111,   107,    50,     3,   110,    95,    96,    97,
-      98,    99,    56,    26,    27,   102,   103,    28,    29,    30,
-      31,   120,    32,   122,    33,    34,   123,    35,    36,    85,
-      38,    43,    40,    42,   129,    59,    41,    55,   131,    54,
-      46,    47,   134,    48,    49,   104,    51,   133,    60,   136,
-      52,    53,    57,    58,    79,    80,    81,    82,   130,    83,
-      84,    86,    87,    88,    91,    92,    93,    94,   135,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,    71,
-      72,    73,    74,    75,    76,    77,     4,   108,     5,     6,
-       7,     8,     9,    10,    11,   100,    12,    13,    14,    15,
-      16,    17,    18,   101,    19,    20,    21,    22,   106,   112,
-      23,   113,   114,   115,   116,   117,   118,   119,   121,   124,
-     125,   126,   127,   128,   132,    45
+      93,    94,   115,   111,    53,     3,   114,    99,   100,   101,
+     102,   103,    40,    41,    60,   106,   107,    27,    28,    29,
+      30,   124,    31,   126,    33,    32,   127,    34,    35,    36,
+      37,    38,    89,    43,   133,    45,    48,    56,   135,    46,
+      40,    44,   138,   108,    49,    58,    50,   137,    64,   140,
+      51,    52,    54,    55,    57,    63,    61,    62,   134,    83,
+      59,    84,    85,    92,    86,    87,    88,    90,   139,    91,
+      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
+      75,    76,    77,    78,    79,    80,    81,     4,    95,    96,
+       5,     6,     7,     8,     9,    10,    11,    97,    12,    13,
+      14,    15,    16,    17,    18,    19,    98,    20,    21,    22,
+      23,   104,   105,    24,   110,   112,   116,   117,   118,   119,
+     120,     0,   121,   122,   123,   125,   128,   129,   130,   131,
+     132,   136
 };
 
-static const yytype_uint8 yycheck[] =
+static const yytype_int16 yycheck[] =
 {
-      61,    62,    86,    81,    31,     0,    84,    68,    69,    70,
-      71,    72,    39,     4,    18,    76,    77,     4,     4,     4,
-      10,   105,     4,   107,     4,     4,   110,     4,     3,    56,
-       3,     7,     4,     4,   118,     3,    10,    15,   122,    36,
-      10,    10,   126,    10,    10,     7,    10,   125,    13,   133,
-      10,    10,    10,    10,    10,    10,    10,    10,   119,    10,
-      10,    10,    10,     4,    10,     4,     4,     4,   129,    34,
-      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,     9,     5,    11,    12,
-      13,    14,    15,    16,    17,    10,    19,    20,    21,    22,
-      23,    24,    25,    10,    27,    28,    29,    30,    10,    10,
-      33,    10,    10,    10,    10,    10,    10,    10,    10,    10,
-      10,    10,    10,    10,    10,    25
+      65,    66,    90,    85,    32,     0,    88,    72,    73,    74,
+      75,    76,     3,     4,    42,    80,    81,     4,    19,     4,
+       4,   109,     4,   111,     4,    11,   114,     4,     4,     4,
+       4,     3,    60,     4,   122,     4,    26,    10,   126,     7,
+       3,    11,   130,     7,    11,    38,    11,   129,    14,   137,
+      11,    11,    11,    11,    11,     3,    11,    11,   123,    11,
+      16,    11,    11,     4,    11,    11,    11,    11,   133,    11,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,     9,    11,     4,
+      12,    13,    14,    15,    16,    17,    18,     4,    20,    21,
+      22,    23,    24,    25,    26,    27,     4,    29,    30,    31,
+      32,    11,    11,    35,    11,     5,    11,    11,    11,    11,
+      11,    -1,    11,    11,    11,    11,    11,    11,    11,    11,
+      11,    11
 };
 
 /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
    state STATE-NUM.  */
 static const yytype_int8 yystos[] =
 {
-       0,    52,    53,     0,     9,    11,    12,    13,    14,    15,
-      16,    17,    19,    20,    21,    22,    23,    24,    25,    27,
-      28,    29,    30,    33,    54,    55,     4,    18,     4,     4,
-       4,    10,     4,     4,     4,     4,     3,    56,     3,    59,
-       4,    10,     4,     7,    57,    54,    10,    10,    10,    10,
-      59,    10,    10,    10,    56,    15,    59,    10,    10,     3,
-      13,    34,    35,    36,    37,    38,    39,    40,    41,    42,
-      43,    44,    45,    46,    47,    48,    49,    50,    58,    10,
-      10,    10,    10,    10,    10,    59,    10,    10,     4,    58,
-      58,    10,     4,     4,     4,    58,    58,    58,    58,    58,
-      10,    10,    58,    58,     7,    61,    10,    61,     5,    60,
-      61,    60,    10,    10,    10,    10,    10,    10,    10,    10,
-      60,    10,    60,    60,    10,    10,    10,    10,    10,    60,
-      58,    60,    10,    61,    60,    58,    60
+       0,    54,    55,     0,     9,    12,    13,    14,    15,    16,
+      17,    18,    20,    21,    22,    23,    24,    25,    26,    27,
+      29,    30,    31,    32,    35,    56,    57,     4,    19,     4,
+       4,     4,    11,     4,     4,     4,     4,     4,     3,    58,
+       3,     4,    61,     4,    11,     4,     7,    59,    56,    11,
+      11,    11,    11,    61,    11,    11,    10,    11,    58,    16,
+      61,    11,    11,     3,    14,    36,    37,    38,    39,    40,
+      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    60,    11,    11,    11,    11,    11,    11,    61,
+      11,    11,     4,    60,    60,    11,     4,     4,     4,    60,
+      60,    60,    60,    60,    11,    11,    60,    60,     7,    63,
+      11,    63,     5,    62,    63,    62,    11,    11,    11,    11,
+      11,    11,    11,    11,    62,    11,    62,    62,    11,    11,
+      11,    11,    11,    62,    60,    62,    11,    63,    62,    60,
+      62
 };
 
 /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM.  */
 static const yytype_int8 yyr1[] =
 {
-       0,    51,    52,    53,    54,    54,    55,    55,    55,    55,
-      55,    55,    55,    55,    55,    55,    55,    55,    55,    55,
-      55,    55,    55,    55,    55,    55,    55,    56,    56,    57,
-      58,    58,    58,    58,    58,    58,    58,    58,    58,    58,
-      58,    58,    58,    58,    58,    58,    58,    58,    58,    59,
-      59,    60,    60,    61,    61
+       0,    53,    54,    55,    56,    56,    57,    57,    57,    57,
+      57,    57,    57,    57,    57,    57,    57,    57,    57,    57,
+      57,    57,    57,    57,    57,    57,    57,    57,    57,    57,
+      58,    58,    59,    60,    60,    60,    60,    60,    60,    60,
+      60,    60,    60,    60,    60,    60,    60,    60,    60,    60,
+      60,    60,    61,    61,    62,    62,    63,    63
 };
 
 /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM.  */
 static const yytype_int8 yyr2[] =
 {
-       0,     2,     2,     0,     2,     0,     4,     6,     1,     1,
-       3,     2,     7,     3,     5,     6,     5,     2,     4,     2,
-       2,     6,     3,     7,     3,     3,     1,     2,     0,     0,
-       2,     2,     6,     3,     1,     5,     4,     4,     2,     2,
-       2,     2,     2,     5,     4,     2,     2,     1,     0,     1,
-       0,     1,     0,     1,     0
+       0,     2,     2,     0,     2,     0,     4,     2,     6,     1,
+       1,     3,     2,     7,     3,     5,     6,     3,     2,     5,
+       2,     4,     2,     2,     6,     3,     7,     3,     3,     1,
+       2,     0,     0,     2,     2,     6,     3,     1,     5,     4,
+       4,     2,     2,     2,     2,     2,     5,     4,     2,     2,
+       1,     0,     1,     0,     1,     0,     1,     0
 };
 
 
@@ -1228,8 +1235,8 @@ yyreduce:
   switch (yyn)
     {
   case 3: /* init: %empty  */
-#line 76 "engines/hypno/grammar_mis.y"
-      { 
+#line 75 "engines/hypno/grammar_mis.y"
+      {
 	if (smenu_idx)
 		delete smenu_idx;
 	smenu_idx = new Common::Array<uint32>();
@@ -1239,13 +1246,13 @@ yyreduce:
 	stack = new Hypno::HotspotsStack();
 	stack->push_back(new Hotspots());
 }
-#line 1244 "engines/hypno/grammar_mis.cpp"
+#line 1250 "engines/hypno/grammar_mis.cpp"
     break;
 
   case 6: /* line: MENUTOK mflag mflag mflag  */
-#line 92 "engines/hypno/grammar_mis.y"
+#line 91 "engines/hypno/grammar_mis.y"
                                 {
-		Hotspot hot(MakeMenu); 
+		Hotspot hot(MakeMenu);
 		debugC(1, kHypnoDebugParser, "MENU %s %s", (yyvsp[-2].s), (yyvsp[-1].s));
 		hot.flags[0] = (yyvsp[-2].s);
 		hot.flags[1] = (yyvsp[-1].s);
@@ -1260,23 +1267,42 @@ yyreduce:
 		smenu_idx->pop_back();
 		smenu_idx->push_back(idx);
 	}
-#line 1265 "engines/hypno/grammar_mis.cpp"
+#line 1271 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 7: /* line: HOTSTOK BBOXTOK NUM NUM NUM NUM  */
-#line 108 "engines/hypno/grammar_mis.y"
-                                           {  
-		Hotspot hot(MakeHotspot, Common::Rect((yyvsp[-3].i), (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i))); 
+  case 7: /* line: MENUTOK FILENAME  */
+#line 107 "engines/hypno/grammar_mis.y"
+                           {
+		Hotspot hot(MakeMenu);
+		debugC(1, kHypnoDebugParser, "MENU %s", (yyvsp[0].s));
+		hot.background = (yyvsp[0].s);
+
+		Hotspots *cur = stack->back();
+		cur->push_back(hot);
+
+		// We don't care about menus, only hotspots
+		int idx = smenu_idx->back();
+		idx++;
+		smenu_idx->pop_back();
+		smenu_idx->push_back(idx);
+	}
+#line 1290 "engines/hypno/grammar_mis.cpp"
+    break;
+
+  case 8: /* line: HOTSTOK BBOXTOK NUM NUM NUM NUM  */
+#line 121 "engines/hypno/grammar_mis.y"
+                                           {
+		Hotspot hot(MakeHotspot, Common::Rect((yyvsp[-3].i), (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i)));
 		debugC(1, kHypnoDebugParser, "HOTS %d.", hot.type);
 		Hotspots *cur = stack->back();
-		cur->push_back(hot); 
+		cur->push_back(hot);
 	}
-#line 1276 "engines/hypno/grammar_mis.cpp"
+#line 1301 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 8: /* line: SMENTOK  */
-#line 114 "engines/hypno/grammar_mis.y"
-                   { 
+  case 9: /* line: SMENTOK  */
+#line 127 "engines/hypno/grammar_mis.y"
+                   {
 		// This should always point to a hotspot
 		int idx = smenu_idx->back();
 		idx++;
@@ -1291,39 +1317,39 @@ yyreduce:
 		stack->push_back(hot->smenu);
 		debugC(1, kHypnoDebugParser, "SUBMENU");
 	}
-#line 1296 "engines/hypno/grammar_mis.cpp"
+#line 1321 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 9: /* line: ESCPTOK  */
-#line 129 "engines/hypno/grammar_mis.y"
+  case 10: /* line: ESCPTOK  */
+#line 142 "engines/hypno/grammar_mis.y"
                     {
 		Escape *a = new Escape();
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);
 		debugC(1, kHypnoDebugParser, "ESC SUBMENU"); }
-#line 1307 "engines/hypno/grammar_mis.cpp"
+#line 1332 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 10: /* line: TIMETOK NUM mflag  */
-#line 135 "engines/hypno/grammar_mis.y"
-                              { 
+  case 11: /* line: TIMETOK NUM mflag  */
+#line 148 "engines/hypno/grammar_mis.y"
+                              {
 		Timer *a = new Timer((yyvsp[-1].i));
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);
 		debugC(1, kHypnoDebugParser, "TIME %d", (yyvsp[-1].i)); }
-#line 1318 "engines/hypno/grammar_mis.cpp"
+#line 1343 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 11: /* line: SWPTTOK NUM  */
-#line 141 "engines/hypno/grammar_mis.y"
+  case 12: /* line: SWPTTOK NUM  */
+#line 154 "engines/hypno/grammar_mis.y"
                        { debugC(1, kHypnoDebugParser, "SWPT %d", (yyvsp[0].i)); }
-#line 1324 "engines/hypno/grammar_mis.cpp"
+#line 1349 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 12: /* line: BACKTOK FILENAME NUM NUM gsswitch flag flag  */
-#line 142 "engines/hypno/grammar_mis.y"
+  case 13: /* line: BACKTOK FILENAME NUM NUM gsswitch flag flag  */
+#line 155 "engines/hypno/grammar_mis.y"
                                                        {
 		Background *a = new Background((yyvsp[-5].s), Common::Point((yyvsp[-4].i), (yyvsp[-3].i)), (yyvsp[-2].s), (yyvsp[-1].s), (yyvsp[0].s));
 		Hotspots *cur = stack->back();
@@ -1331,56 +1357,78 @@ yyreduce:
 		hot->actions.push_back(a);
 		debugC(1, kHypnoDebugParser, "BACK");
 	}
-#line 1336 "engines/hypno/grammar_mis.cpp"
+#line 1361 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 13: /* line: GLOBTOK GSSWITCH NAME  */
-#line 149 "engines/hypno/grammar_mis.y"
-                                  { 
+  case 14: /* line: GLOBTOK GSSWITCH NAME  */
+#line 162 "engines/hypno/grammar_mis.y"
+                                  {
 		Global *a = new Global((yyvsp[-1].s), (yyvsp[0].s));
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);
-		debugC(1, kHypnoDebugParser, "GLOB"); 
+		debugC(1, kHypnoDebugParser, "GLOB");
 	}
-#line 1348 "engines/hypno/grammar_mis.cpp"
+#line 1373 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 14: /* line: AMBITOK FILENAME NUM NUM flag  */
-#line 156 "engines/hypno/grammar_mis.y"
-                                         { 
+  case 15: /* line: AMBITOK FILENAME NUM NUM flag  */
+#line 169 "engines/hypno/grammar_mis.y"
+                                         {
 		Ambient *a = new Ambient((yyvsp[-3].s), Common::Point((yyvsp[-2].i), (yyvsp[-1].i)), (yyvsp[0].s));
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
-		hot->actions.push_back(a);			
+		hot->actions.push_back(a);
 		debugC(1, kHypnoDebugParser, "AMBI %d %d", (yyvsp[-2].i), (yyvsp[-1].i)); }
-#line 1359 "engines/hypno/grammar_mis.cpp"
+#line 1384 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 15: /* line: PLAYTOK FILENAME NUM NUM gsswitch flag  */
-#line 162 "engines/hypno/grammar_mis.y"
-                                                  { 
+  case 16: /* line: PLAYTOK FILENAME NUM NUM gsswitch flag  */
+#line 175 "engines/hypno/grammar_mis.y"
+                                                  {
 		Play *a = new Play((yyvsp[-4].s), Common::Point((yyvsp[-3].i), (yyvsp[-2].i)), (yyvsp[-1].s), (yyvsp[0].s));
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
-		hot->actions.push_back(a);		  
+		hot->actions.push_back(a);
 		debugC(1, kHypnoDebugParser, "PLAY %s.", (yyvsp[-4].s)); }
-#line 1370 "engines/hypno/grammar_mis.cpp"
+#line 1395 "engines/hypno/grammar_mis.cpp"
+    break;
+
+  case 17: /* line: SONDTOK FILENAME ENCTOK  */
+#line 181 "engines/hypno/grammar_mis.y"
+                                   {
+		//Play *a = new Play($2, Common::Point($3, $4), $5, $6);
+		//Hotspots *cur = stack->back();
+		//Hotspot *hot = &cur->back();
+		//hot->actions.push_back(a);
+		debugC(1, kHypnoDebugParser, "SOND %s.", (yyvsp[-1].s)); }
+#line 1406 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 16: /* line: OVERTOK FILENAME NUM NUM flag  */
-#line 168 "engines/hypno/grammar_mis.y"
-                                         { 
+  case 18: /* line: SONDTOK FILENAME  */
+#line 187 "engines/hypno/grammar_mis.y"
+                            {
+		//Play *a = new Play($2, Common::Point($3, $4), $5, $6);
+		//Hotspots *cur = stack->back();
+		//Hotspot *hot = &cur->back();
+		//hot->actions.push_back(a);
+		debugC(1, kHypnoDebugParser, "SOND %s.", (yyvsp[0].s)); }
+#line 1417 "engines/hypno/grammar_mis.cpp"
+    break;
+
+  case 19: /* line: OVERTOK FILENAME NUM NUM flag  */
+#line 193 "engines/hypno/grammar_mis.y"
+                                         {
 		Overlay *a = new Overlay((yyvsp[-3].s), Common::Point((yyvsp[-2].i), (yyvsp[-1].i)), (yyvsp[0].s));
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);
 	}
-#line 1381 "engines/hypno/grammar_mis.cpp"
+#line 1428 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 17: /* line: PALETOK FILENAME  */
-#line 174 "engines/hypno/grammar_mis.y"
+  case 20: /* line: PALETOK FILENAME  */
+#line 199 "engines/hypno/grammar_mis.y"
                             {
 		Palette *a = new Palette((yyvsp[0].s));
 		Hotspots *cur = stack->back();
@@ -1388,320 +1436,320 @@ yyreduce:
 		hot->actions.push_back(a);
 		debugC(1, kHypnoDebugParser, "PALE");
 	}
-#line 1393 "engines/hypno/grammar_mis.cpp"
+#line 1440 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 18: /* line: INTRTOK FILENAME NUM NUM  */
-#line 181 "engines/hypno/grammar_mis.y"
-                                    { 
+  case 21: /* line: INTRTOK FILENAME NUM NUM  */
+#line 206 "engines/hypno/grammar_mis.y"
+                                    {
 		Intro *a = new Intro(Common::String("cine/") + (yyvsp[-2].s));
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);
-		debugC(1, kHypnoDebugParser, "INTRO %s %d %d", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].i)); 
+		debugC(1, kHypnoDebugParser, "INTRO %s %d %d", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1405 "engines/hypno/grammar_mis.cpp"
+#line 1452 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 19: /* line: INTRTOK FILENAME  */
-#line 188 "engines/hypno/grammar_mis.y"
-                            { 
+  case 22: /* line: INTRTOK FILENAME  */
+#line 213 "engines/hypno/grammar_mis.y"
+                            {
 		Intro *a = new Intro(Common::String("cine/") + (yyvsp[0].s));
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);
-		debugC(1, kHypnoDebugParser, "INTRO %s", (yyvsp[0].s)); 
+		debugC(1, kHypnoDebugParser, "INTRO %s", (yyvsp[0].s));
 	}
-#line 1417 "engines/hypno/grammar_mis.cpp"
+#line 1464 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 20: /* line: CUTSTOK FILENAME  */
-#line 195 "engines/hypno/grammar_mis.y"
-                            { 
+  case 23: /* line: CUTSTOK FILENAME  */
+#line 220 "engines/hypno/grammar_mis.y"
+                            {
 		Cutscene *a = new Cutscene((yyvsp[0].s));
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
-		hot->actions.push_back(a);		  
-		debugC(1, kHypnoDebugParser, "CUTS %s", (yyvsp[0].s)); 
+		hot->actions.push_back(a);
+		debugC(1, kHypnoDebugParser, "CUTS %s", (yyvsp[0].s));
 	}
-#line 1429 "engines/hypno/grammar_mis.cpp"
+#line 1476 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 21: /* line: WALNTOK FILENAME NUM NUM gsswitch flag  */
-#line 202 "engines/hypno/grammar_mis.y"
-                                                   { 
+  case 24: /* line: WALNTOK FILENAME NUM NUM gsswitch flag  */
+#line 227 "engines/hypno/grammar_mis.y"
+                                                   {
 		WalN *a = new WalN((yyvsp[-5].s), (yyvsp[-4].s), Common::Point((yyvsp[-3].i), (yyvsp[-2].i)), (yyvsp[-1].s), (yyvsp[0].s));
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
-		hot->actions.push_back(a);		  
+		hot->actions.push_back(a);
 		debugC(1, kHypnoDebugParser, "WALN %s %d %d", (yyvsp[-4].s), (yyvsp[-3].i), (yyvsp[-2].i)); }
-#line 1440 "engines/hypno/grammar_mis.cpp"
+#line 1487 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 22: /* line: MICETOK FILENAME NUM  */
-#line 208 "engines/hypno/grammar_mis.y"
+  case 25: /* line: MICETOK FILENAME NUM  */
+#line 233 "engines/hypno/grammar_mis.y"
                                 {
 		Mice *a = new Mice((yyvsp[-1].s), (yyvsp[0].i)-1);
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);
 	}
-#line 1451 "engines/hypno/grammar_mis.cpp"
+#line 1498 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 23: /* line: MPTRTOK FILENAME NUM NUM NUM NUM NUM  */
-#line 214 "engines/hypno/grammar_mis.y"
+  case 26: /* line: MPTRTOK FILENAME NUM NUM NUM NUM NUM  */
+#line 239 "engines/hypno/grammar_mis.y"
                                                 {
 		debugC(1, kHypnoDebugParser, "MPTR %s %d %d %d %d %d", (yyvsp[-5].s), (yyvsp[-4].i), (yyvsp[-3].i), (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1459 "engines/hypno/grammar_mis.cpp"
+#line 1506 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 24: /* line: TALKTOK alloctalk talk  */
-#line 217 "engines/hypno/grammar_mis.y"
-                                  { 
+  case 27: /* line: TALKTOK alloctalk talk  */
+#line 242 "engines/hypno/grammar_mis.y"
+                                  {
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(talk_action);
 		talk_action = nullptr;
 		debugC(1, kHypnoDebugParser, "TALK"); }
-#line 1470 "engines/hypno/grammar_mis.cpp"
+#line 1517 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 25: /* line: ENDTOK anything RETTOK  */
-#line 223 "engines/hypno/grammar_mis.y"
-                                  { 
+  case 28: /* line: ENDTOK anything RETTOK  */
+#line 248 "engines/hypno/grammar_mis.y"
+                                  {
 		debugC(1, kHypnoDebugParser, "explicit END");
 		g_parsedHots = stack->back();
 		stack->pop_back();
 		smenu_idx->pop_back();
 	}
-#line 1481 "engines/hypno/grammar_mis.cpp"
+#line 1528 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 26: /* line: RETTOK  */
-#line 229 "engines/hypno/grammar_mis.y"
+  case 29: /* line: RETTOK  */
+#line 254 "engines/hypno/grammar_mis.y"
                        { debugC(1, kHypnoDebugParser, "implicit END"); }
-#line 1487 "engines/hypno/grammar_mis.cpp"
+#line 1534 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 29: /* alloctalk: %empty  */
-#line 236 "engines/hypno/grammar_mis.y"
-           { 
+  case 32: /* alloctalk: %empty  */
+#line 261 "engines/hypno/grammar_mis.y"
+           {
 	assert(talk_action == nullptr);
 	talk_action = new Talk();
 	talk_action->escape = false;
-	talk_action->active = true; 
+	talk_action->active = true;
 }
-#line 1498 "engines/hypno/grammar_mis.cpp"
+#line 1545 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 30: /* talk: INACTOK talk  */
-#line 243 "engines/hypno/grammar_mis.y"
+  case 33: /* talk: INACTOK talk  */
+#line 268 "engines/hypno/grammar_mis.y"
                    {
-		talk_action->active = false; 
+		talk_action->active = false;
 		debugC(1, kHypnoDebugParser, "inactive"); }
-#line 1506 "engines/hypno/grammar_mis.cpp"
+#line 1553 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 31: /* talk: FDTOK talk  */
-#line 246 "engines/hypno/grammar_mis.y"
+  case 34: /* talk: FDTOK talk  */
+#line 271 "engines/hypno/grammar_mis.y"
                      { debugC(1, kHypnoDebugParser, "inactive"); }
-#line 1512 "engines/hypno/grammar_mis.cpp"
+#line 1559 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 32: /* talk: BACKTOK FILENAME NUM NUM gsswitch flag  */
-#line 247 "engines/hypno/grammar_mis.y"
-                                                 { 
+  case 35: /* talk: BACKTOK FILENAME NUM NUM gsswitch flag  */
+#line 272 "engines/hypno/grammar_mis.y"
+                                                 {
 		talk_action->background = (yyvsp[-4].s);
 		talk_action->backgroundPos = Common::Point((yyvsp[-3].i), (yyvsp[-2].i));
 		debugC(1, kHypnoDebugParser, "BACK in TALK"); }
-#line 1521 "engines/hypno/grammar_mis.cpp"
+#line 1568 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 33: /* talk: BOXXTOK NUM NUM  */
-#line 251 "engines/hypno/grammar_mis.y"
+  case 36: /* talk: BOXXTOK NUM NUM  */
+#line 276 "engines/hypno/grammar_mis.y"
                           {
-		talk_action->boxPos = Common::Point((yyvsp[-1].i), (yyvsp[0].i)); 
+		talk_action->boxPos = Common::Point((yyvsp[-1].i), (yyvsp[0].i));
 		debugC(1, kHypnoDebugParser, "BOXX %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1529 "engines/hypno/grammar_mis.cpp"
+#line 1576 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 34: /* talk: ESCAPETOK  */
-#line 254 "engines/hypno/grammar_mis.y"
+  case 37: /* talk: ESCAPETOK  */
+#line 279 "engines/hypno/grammar_mis.y"
                     {
-		talk_action->escape = true; 
+		talk_action->escape = true;
 		debugC(1, kHypnoDebugParser, "ESCAPE"); }
-#line 1537 "engines/hypno/grammar_mis.cpp"
+#line 1584 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 35: /* talk: SECONDTOK FILENAME NUM NUM flag  */
-#line 257 "engines/hypno/grammar_mis.y"
+  case 38: /* talk: SECONDTOK FILENAME NUM NUM flag  */
+#line 282 "engines/hypno/grammar_mis.y"
                                           {
 		talk_action->second = (yyvsp[-3].s);
-		talk_action->secondPos = Common::Point((yyvsp[-2].i), (yyvsp[-1].i)); 
+		talk_action->secondPos = Common::Point((yyvsp[-2].i), (yyvsp[-1].i));
 		debugC(1, kHypnoDebugParser, "SECOND %s %d %d '%s'", (yyvsp[-3].s), (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].s)); }
-#line 1546 "engines/hypno/grammar_mis.cpp"
+#line 1593 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 36: /* talk: INTROTOK FILENAME NUM NUM  */
-#line 261 "engines/hypno/grammar_mis.y"
-                                    { 
+  case 39: /* talk: INTROTOK FILENAME NUM NUM  */
+#line 286 "engines/hypno/grammar_mis.y"
+                                    {
 		talk_action->intro = (yyvsp[-2].s);
 		talk_action->introPos = Common::Point((yyvsp[-1].i), (yyvsp[0].i));
 		debugC(1, kHypnoDebugParser, "INTRO %s %d %d", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1555 "engines/hypno/grammar_mis.cpp"
+#line 1602 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 37: /* talk: DEFAULTTOK FILENAME NUM NUM  */
-#line 265 "engines/hypno/grammar_mis.y"
-                                      { 
+  case 40: /* talk: DEFAULTTOK FILENAME NUM NUM  */
+#line 290 "engines/hypno/grammar_mis.y"
+                                      {
 		// Unsure how this is different from second
 		talk_action->second = (yyvsp[-2].s);
 		talk_action->secondPos = Common::Point((yyvsp[-1].i), (yyvsp[0].i));
 		debugC(1, kHypnoDebugParser, "DEFAULT %s %d %d", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1565 "engines/hypno/grammar_mis.cpp"
+#line 1612 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 38: /* talk: PG talk  */
-#line 270 "engines/hypno/grammar_mis.y"
-                  { 
+  case 41: /* talk: PG talk  */
+#line 295 "engines/hypno/grammar_mis.y"
+                  {
 		TalkCommand talk_cmd;
 		talk_cmd.command = "G";
 		talk_cmd.path = (yyvsp[-1].s)+2;
-		talk_action->commands.push_back(talk_cmd); 
+		talk_action->commands.push_back(talk_cmd);
 		debugC(1, kHypnoDebugParser, "%s", (yyvsp[-1].s)); }
-#line 1576 "engines/hypno/grammar_mis.cpp"
+#line 1623 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 39: /* talk: PH talk  */
-#line 276 "engines/hypno/grammar_mis.y"
+  case 42: /* talk: PH talk  */
+#line 301 "engines/hypno/grammar_mis.y"
                   { debugC(1, kHypnoDebugParser, "%s", (yyvsp[-1].s)); }
-#line 1582 "engines/hypno/grammar_mis.cpp"
+#line 1629 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 40: /* talk: PF talk  */
-#line 277 "engines/hypno/grammar_mis.y"
-                  { 
+  case 43: /* talk: PF talk  */
+#line 302 "engines/hypno/grammar_mis.y"
+                  {
 		TalkCommand talk_cmd;
 		talk_cmd.command = "F";
 		talk_cmd.num = atoi((yyvsp[-1].s)+2)-1;
-		talk_action->commands.push_back(talk_cmd); 
+		talk_action->commands.push_back(talk_cmd);
 		debugC(1, kHypnoDebugParser, "%s", (yyvsp[-1].s)); }
-#line 1593 "engines/hypno/grammar_mis.cpp"
+#line 1640 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 41: /* talk: PA talk  */
-#line 283 "engines/hypno/grammar_mis.y"
-                  { 
+  case 44: /* talk: PA talk  */
+#line 308 "engines/hypno/grammar_mis.y"
+                  {
 		TalkCommand talk_cmd;
 		talk_cmd.command = "A";
 		talk_cmd.num = atoi((yyvsp[-1].s)+2)-1;
-		talk_action->commands.push_back(talk_cmd); 
+		talk_action->commands.push_back(talk_cmd);
 		debugC(1, kHypnoDebugParser, "|A%d", talk_cmd.num); }
-#line 1604 "engines/hypno/grammar_mis.cpp"
+#line 1651 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 42: /* talk: PD talk  */
-#line 289 "engines/hypno/grammar_mis.y"
-                  { 
+  case 45: /* talk: PD talk  */
+#line 314 "engines/hypno/grammar_mis.y"
+                  {
 		TalkCommand talk_cmd;
 		talk_cmd.command = "D";
 		talk_cmd.num = atoi((yyvsp[-1].s)+2)-1;
-		talk_action->commands.push_back(talk_cmd); 
+		talk_action->commands.push_back(talk_cmd);
 		debugC(1, kHypnoDebugParser, "%s", (yyvsp[-1].s)); }
-#line 1615 "engines/hypno/grammar_mis.cpp"
+#line 1662 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 43: /* talk: PP NUM NUM flag talk  */
-#line 295 "engines/hypno/grammar_mis.y"
-                               { 
+  case 46: /* talk: PP NUM NUM flag talk  */
+#line 320 "engines/hypno/grammar_mis.y"
+                               {
 		TalkCommand talk_cmd;
 		talk_cmd.command = "P";
 		talk_cmd.path = (yyvsp[-4].s)+2;
 		talk_cmd.position = Common::Point((yyvsp[-3].i), (yyvsp[-2].i));
 		talk_action->commands.push_back(talk_cmd);
 		debugC(1, kHypnoDebugParser, "%s %d %d '%s'", (yyvsp[-4].s), (yyvsp[-3].i), (yyvsp[-2].i), (yyvsp[-1].s)); }
-#line 1627 "engines/hypno/grammar_mis.cpp"
+#line 1674 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 44: /* talk: PI NUM NUM talk  */
-#line 302 "engines/hypno/grammar_mis.y"
-                          { 
+  case 47: /* talk: PI NUM NUM talk  */
+#line 327 "engines/hypno/grammar_mis.y"
+                          {
 		TalkCommand talk_cmd;
 		talk_cmd.command = "I";
 		talk_cmd.path = (yyvsp[-3].s)+2;
 		talk_cmd.position = Common::Point((yyvsp[-2].i), (yyvsp[-1].i));
-		talk_action->commands.push_back(talk_cmd);		  
+		talk_action->commands.push_back(talk_cmd);
 		debugC(1, kHypnoDebugParser, "%s %d %d", (yyvsp[-3].s), (yyvsp[-2].i), (yyvsp[-1].i)); }
-#line 1639 "engines/hypno/grammar_mis.cpp"
+#line 1686 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 45: /* talk: PS talk  */
-#line 309 "engines/hypno/grammar_mis.y"
-                  { 
+  case 48: /* talk: PS talk  */
+#line 334 "engines/hypno/grammar_mis.y"
+                  {
 		TalkCommand talk_cmd;
 		talk_cmd.command = "S";
 		talk_cmd.variable = (yyvsp[-1].s)+2;
 		talk_action->commands.push_back(talk_cmd);
 		debugC(1, kHypnoDebugParser, "%s", (yyvsp[-1].s)); }
-#line 1650 "engines/hypno/grammar_mis.cpp"
+#line 1697 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 46: /* talk: PL talk  */
-#line 315 "engines/hypno/grammar_mis.y"
-                  { 
+  case 49: /* talk: PL talk  */
+#line 340 "engines/hypno/grammar_mis.y"
+                  {
 		TalkCommand talk_cmd;
 		talk_cmd.command = "L";
 		talk_action->commands.push_back(talk_cmd);
 		debugC(1, kHypnoDebugParser, "|L"); }
-#line 1660 "engines/hypno/grammar_mis.cpp"
+#line 1707 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 47: /* talk: PE  */
-#line 320 "engines/hypno/grammar_mis.y"
+  case 50: /* talk: PE  */
+#line 345 "engines/hypno/grammar_mis.y"
              { debugC(1, kHypnoDebugParser, "|E"); }
-#line 1666 "engines/hypno/grammar_mis.cpp"
+#line 1713 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 49: /* mflag: NAME  */
-#line 324 "engines/hypno/grammar_mis.y"
+  case 52: /* mflag: NAME  */
+#line 349 "engines/hypno/grammar_mis.y"
             { (yyval.s) = (yyvsp[0].s); }
-#line 1672 "engines/hypno/grammar_mis.cpp"
+#line 1719 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 50: /* mflag: %empty  */
-#line 325 "engines/hypno/grammar_mis.y"
+  case 53: /* mflag: %empty  */
+#line 350 "engines/hypno/grammar_mis.y"
                         { (yyval.s) = scumm_strdup(""); }
-#line 1678 "engines/hypno/grammar_mis.cpp"
+#line 1725 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 51: /* flag: FLAG  */
-#line 328 "engines/hypno/grammar_mis.y"
+  case 54: /* flag: FLAG  */
+#line 353 "engines/hypno/grammar_mis.y"
                         { (yyval.s) = (yyvsp[0].s); debugC(1, kHypnoDebugParser, "flag: %s", (yyvsp[0].s)); }
-#line 1684 "engines/hypno/grammar_mis.cpp"
+#line 1731 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 52: /* flag: %empty  */
-#line 329 "engines/hypno/grammar_mis.y"
+  case 55: /* flag: %empty  */
+#line 354 "engines/hypno/grammar_mis.y"
                         { (yyval.s) = scumm_strdup(""); }
-#line 1690 "engines/hypno/grammar_mis.cpp"
+#line 1737 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 53: /* gsswitch: GSSWITCH  */
-#line 332 "engines/hypno/grammar_mis.y"
+  case 56: /* gsswitch: GSSWITCH  */
+#line 357 "engines/hypno/grammar_mis.y"
                         { (yyval.s) = (yyvsp[0].s); debugC(1, kHypnoDebugParser, "switch %s", (yyvsp[0].s)); }
-#line 1696 "engines/hypno/grammar_mis.cpp"
+#line 1743 "engines/hypno/grammar_mis.cpp"
     break;
 
-  case 54: /* gsswitch: %empty  */
-#line 333 "engines/hypno/grammar_mis.y"
+  case 57: /* gsswitch: %empty  */
+#line 358 "engines/hypno/grammar_mis.y"
                         { (yyval.s) = scumm_strdup(""); }
-#line 1702 "engines/hypno/grammar_mis.cpp"
+#line 1749 "engines/hypno/grammar_mis.cpp"
     break;
 
 
-#line 1706 "engines/hypno/grammar_mis.cpp"
+#line 1753 "engines/hypno/grammar_mis.cpp"
 
       default: break;
     }
diff --git a/engines/hypno/grammar_mis.y b/engines/hypno/grammar_mis.y
index c56e38bfb06..b5756c87507 100644
--- a/engines/hypno/grammar_mis.y
+++ b/engines/hypno/grammar_mis.y
@@ -50,16 +50,16 @@ int HYPNO_MIS_wrap() {
 
 using namespace Hypno;
 
-%} 
+%}
 
 %union {
 	char *s; /* string value */
 	int i;	 /* integer value */
 }
 
-%token<s> NAME FILENAME FLAG COMMENT GSSWITCH COMMAND WALNTOK
+%token<s> NAME FILENAME FLAG COMMENT GSSWITCH COMMAND WALNTOK ENCTOK
 %token<i> NUM
-%token HOTSTOK CUTSTOK BACKTOK INTRTOK RETTOK TIMETOK PALETOK BBOXTOK OVERTOK MICETOK PLAYTOK ENDTOK 
+%token HOTSTOK CUTSTOK BACKTOK INTRTOK RETTOK TIMETOK PALETOK BBOXTOK OVERTOK MICETOK SONDTOK PLAYTOK ENDTOK
 %token MENUTOK SMENTOK ESCPTOK NRTOK AMBITOK SWPTTOK MPTRTOK
 %token GLOBTOK TONTOK TOFFTOK
 %token TALKTOK INACTOK FDTOK BOXXTOK ESCAPETOK SECONDTOK INTROTOK DEFAULTTOK
@@ -69,10 +69,10 @@ using namespace Hypno;
 
 %%
 
-start: init lines 
+start: init lines
 	;
 
-init: { 
+init: {
 	if (smenu_idx)
 		delete smenu_idx;
 	smenu_idx = new Common::Array<uint32>();
@@ -85,11 +85,11 @@ init: {
 
 lines: line lines
 	| /* nothing */
-	; 
+	;
 
 
 line: MENUTOK mflag mflag mflag {
-		Hotspot hot(MakeMenu); 
+		Hotspot hot(MakeMenu);
 		debugC(1, kHypnoDebugParser, "MENU %s %s", $2, $3);
 		hot.flags[0] = $2;
 		hot.flags[1] = $3;
@@ -104,13 +104,27 @@ line: MENUTOK mflag mflag mflag {
 		smenu_idx->pop_back();
 		smenu_idx->push_back(idx);
 	}
-	| HOTSTOK BBOXTOK NUM NUM NUM NUM  {  
-		Hotspot hot(MakeHotspot, Common::Rect($3, $4, $5, $6)); 
+	| MENUTOK FILENAME {
+		Hotspot hot(MakeMenu);
+		debugC(1, kHypnoDebugParser, "MENU %s", $2);
+		hot.background = $2;
+
+		Hotspots *cur = stack->back();
+		cur->push_back(hot);
+
+		// We don't care about menus, only hotspots
+		int idx = smenu_idx->back();
+		idx++;
+		smenu_idx->pop_back();
+		smenu_idx->push_back(idx);
+	}
+	| HOTSTOK BBOXTOK NUM NUM NUM NUM  {
+		Hotspot hot(MakeHotspot, Common::Rect($3, $4, $5, $6));
 		debugC(1, kHypnoDebugParser, "HOTS %d.", hot.type);
 		Hotspots *cur = stack->back();
-		cur->push_back(hot); 
+		cur->push_back(hot);
 	}
-	|  SMENTOK { 
+	|  SMENTOK {
 		// This should always point to a hotspot
 		int idx = smenu_idx->back();
 		idx++;
@@ -131,12 +145,12 @@ line: MENUTOK mflag mflag mflag {
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);
 		debugC(1, kHypnoDebugParser, "ESC SUBMENU"); }
-	|  TIMETOK NUM  mflag { 
+	|  TIMETOK NUM  mflag {
 		Timer *a = new Timer($2);
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);
-		debugC(1, kHypnoDebugParser, "TIME %d", $2); } 
+		debugC(1, kHypnoDebugParser, "TIME %d", $2); }
 	|  SWPTTOK NUM { debugC(1, kHypnoDebugParser, "SWPT %d", $2); }
 	|  BACKTOK FILENAME NUM NUM gsswitch flag flag {
 		Background *a = new Background($2, Common::Point($3, $4), $5, $6, $7);
@@ -145,26 +159,38 @@ line: MENUTOK mflag mflag mflag {
 		hot->actions.push_back(a);
 		debugC(1, kHypnoDebugParser, "BACK");
 	}
-	|  GLOBTOK GSSWITCH NAME  { 
+	|  GLOBTOK GSSWITCH NAME  {
 		Global *a = new Global($2, $3);
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);
-		debugC(1, kHypnoDebugParser, "GLOB"); 
+		debugC(1, kHypnoDebugParser, "GLOB");
 	}
-	|  AMBITOK FILENAME NUM NUM flag { 
+	|  AMBITOK FILENAME NUM NUM flag {
 		Ambient *a = new Ambient($2, Common::Point($3, $4), $5);
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
-		hot->actions.push_back(a);			
+		hot->actions.push_back(a);
 		debugC(1, kHypnoDebugParser, "AMBI %d %d", $3, $4); }
-	|  PLAYTOK FILENAME NUM NUM gsswitch flag { 
+	|  PLAYTOK FILENAME NUM NUM gsswitch flag {
 		Play *a = new Play($2, Common::Point($3, $4), $5, $6);
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
-		hot->actions.push_back(a);		  
+		hot->actions.push_back(a);
 		debugC(1, kHypnoDebugParser, "PLAY %s.", $2); }
-	|  OVERTOK FILENAME NUM NUM flag { 
+	|  SONDTOK FILENAME ENCTOK {
+		//Play *a = new Play($2, Common::Point($3, $4), $5, $6);
+		//Hotspots *cur = stack->back();
+		//Hotspot *hot = &cur->back();
+		//hot->actions.push_back(a);
+		debugC(1, kHypnoDebugParser, "SOND %s.", $2); }
+	|  SONDTOK FILENAME {
+		//Play *a = new Play($2, Common::Point($3, $4), $5, $6);
+		//Hotspots *cur = stack->back();
+		//Hotspot *hot = &cur->back();
+		//hot->actions.push_back(a);
+		debugC(1, kHypnoDebugParser, "SOND %s.", $2); }
+	|  OVERTOK FILENAME NUM NUM flag {
 		Overlay *a = new Overlay($2, Common::Point($3, $4), $5);
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
@@ -177,33 +203,33 @@ line: MENUTOK mflag mflag mflag {
 		hot->actions.push_back(a);
 		debugC(1, kHypnoDebugParser, "PALE");
 	}
-	|  INTRTOK FILENAME NUM NUM { 
+	|  INTRTOK FILENAME NUM NUM {
 		Intro *a = new Intro(Common::String("cine/") + $2);
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);
-		debugC(1, kHypnoDebugParser, "INTRO %s %d %d", $2, $3, $4); 
+		debugC(1, kHypnoDebugParser, "INTRO %s %d %d", $2, $3, $4);
 	}
-	|  INTRTOK FILENAME { 
+	|  INTRTOK FILENAME {
 		Intro *a = new Intro(Common::String("cine/") + $2);
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);
-		debugC(1, kHypnoDebugParser, "INTRO %s", $2); 
+		debugC(1, kHypnoDebugParser, "INTRO %s", $2);
 	}
-	|  CUTSTOK FILENAME { 
+	|  CUTSTOK FILENAME {
 		Cutscene *a = new Cutscene($2);
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
-		hot->actions.push_back(a);		  
-		debugC(1, kHypnoDebugParser, "CUTS %s", $2); 
+		hot->actions.push_back(a);
+		debugC(1, kHypnoDebugParser, "CUTS %s", $2);
 	}
-	|  WALNTOK FILENAME NUM NUM gsswitch flag  { 
+	|  WALNTOK FILENAME NUM NUM gsswitch flag  {
 		WalN *a = new WalN($1, $2, Common::Point($3, $4), $5, $6);
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
-		hot->actions.push_back(a);		  
-		debugC(1, kHypnoDebugParser, "WALN %s %d %d", $2, $3, $4); } 
+		hot->actions.push_back(a);
+		debugC(1, kHypnoDebugParser, "WALN %s %d %d", $2, $3, $4); }
 	|  MICETOK FILENAME NUM {
 		Mice *a = new Mice($2, $3-1);
 		Hotspots *cur = stack->back();
@@ -213,13 +239,13 @@ line: MENUTOK mflag mflag mflag {
 	|  MPTRTOK FILENAME NUM NUM NUM NUM NUM {
 		debugC(1, kHypnoDebugParser, "MPTR %s %d %d %d %d %d", $2, $3, $4, $5, $6, $7);
 	}
-	|  TALKTOK alloctalk talk { 
+	|  TALKTOK alloctalk talk {
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(talk_action);
 		talk_action = nullptr;
 		debugC(1, kHypnoDebugParser, "TALK"); }
-	|  ENDTOK anything RETTOK { 
+	|  ENDTOK anything RETTOK {
 		debugC(1, kHypnoDebugParser, "explicit END");
 		g_parsedHots = stack->back();
 		stack->pop_back();
@@ -232,86 +258,86 @@ anything: NAME anything
 	|  // nothing
 	;
 
-alloctalk: { 
+alloctalk: {
 	assert(talk_action == nullptr);
 	talk_action = new Talk();
 	talk_action->escape = false;
-	talk_action->active = true; 
+	talk_action->active = true;
 }
 
 talk: INACTOK talk {
-		talk_action->active = false; 
+		talk_action->active = false;
 		debugC(1, kHypnoDebugParser, "inactive"); }
 	| FDTOK talk { debugC(1, kHypnoDebugParser, "inactive"); }
-	| BACKTOK FILENAME NUM NUM gsswitch flag { 
+	| BACKTOK FILENAME NUM NUM gsswitch flag {
 		talk_action->background = $2;
 		talk_action->backgroundPos = Common::Point($3, $4);
 		debugC(1, kHypnoDebugParser, "BACK in TALK"); }
 	| BOXXTOK NUM NUM {
-		talk_action->boxPos = Common::Point($2, $3); 
+		talk_action->boxPos = Common::Point($2, $3);
 		debugC(1, kHypnoDebugParser, "BOXX %d %d", $2, $3); }
 	| ESCAPETOK {
-		talk_action->escape = true; 
+		talk_action->escape = true;
 		debugC(1, kHypnoDebugParser, "ESCAPE"); }
 	| SECONDTOK FILENAME NUM NUM flag {
 		talk_action->second = $2;
-		talk_action->secondPos = Common::Point($3, $4); 
+		talk_action->secondPos = Common::Point($3, $4);
 		debugC(1, kHypnoDebugParser, "SECOND %s %d %d '%s'", $2, $3, $4, $5); }
-	| INTROTOK FILENAME NUM NUM { 
+	| INTROTOK FILENAME NUM NUM {
 		talk_action->intro = $2;
 		talk_action->introPos = Common::Point($3, $4);
 		debugC(1, kHypnoDebugParser, "INTRO %s %d %d", $2, $3, $4); }
-	| DEFAULTTOK FILENAME NUM NUM { 
+	| DEFAULTTOK FILENAME NUM NUM {
 		// Unsure how this is different from second
 		talk_action->second = $2;
 		talk_action->secondPos = Common::Point($3, $4);
 		debugC(1, kHypnoDebugParser, "DEFAULT %s %d %d", $2, $3, $4); }
-	| PG talk { 
+	| PG talk {
 		TalkCommand talk_cmd;
 		talk_cmd.command = "G";
 		talk_cmd.path = $1+2;
-		talk_action->commands.push_back(talk_cmd); 
+		talk_action->commands.push_back(talk_cmd);
 		debugC(1, kHypnoDebugParser, "%s", $1); }
 	| PH talk { debugC(1, kHypnoDebugParser, "%s", $1); }
-	| PF talk { 
+	| PF talk {
 		TalkCommand talk_cmd;
 		talk_cmd.command = "F";
 		talk_cmd.num = atoi($1+2)-1;
-		talk_action->commands.push_back(talk_cmd); 
+		talk_action->commands.push_back(talk_cmd);
 		debugC(1, kHypnoDebugParser, "%s", $1); }
-	| PA talk { 
+	| PA talk {
 		TalkCommand talk_cmd;
 		talk_cmd.command = "A";
 		talk_cmd.num = atoi($1+2)-1;
-		talk_action->commands.push_back(talk_cmd); 
-		debugC(1, kHypnoDebugParser, "|A%d", talk_cmd.num); } 
-	| PD talk { 
+		talk_action->commands.push_back(talk_cmd);
+		debugC(1, kHypnoDebugParser, "|A%d", talk_cmd.num); }
+	| PD talk {
 		TalkCommand talk_cmd;
 		talk_cmd.command = "D";
 		talk_cmd.num = atoi($1+2)-1;
-		talk_action->commands.push_back(talk_cmd); 
+		talk_action->commands.push_back(talk_cmd);
 		debugC(1, kHypnoDebugParser, "%s", $1); }
-	| PP NUM NUM flag talk { 
+	| PP NUM NUM flag talk {
 		TalkCommand talk_cmd;
 		talk_cmd.command = "P";
 		talk_cmd.path = $1+2;
 		talk_cmd.position = Common::Point($2, $3);
 		talk_action->commands.push_back(talk_cmd);
 		debugC(1, kHypnoDebugParser, "%s %d %d '%s'", $1, $2, $3, $4); }
-	| PI NUM NUM talk { 
+	| PI NUM NUM talk {
 		TalkCommand talk_cmd;
 		talk_cmd.command = "I";
 		talk_cmd.path = $1+2;
 		talk_cmd.position = Common::Point($2, $3);
-		talk_action->commands.push_back(talk_cmd);		  
+		talk_action->commands.push_back(talk_cmd);
 		debugC(1, kHypnoDebugParser, "%s %d %d", $1, $2, $3); }
-	| PS talk { 
+	| PS talk {
 		TalkCommand talk_cmd;
 		talk_cmd.command = "S";
 		talk_cmd.variable = $1+2;
 		talk_action->commands.push_back(talk_cmd);
 		debugC(1, kHypnoDebugParser, "%s", $1); }
-	| PL talk { 
+	| PL talk {
 		TalkCommand talk_cmd;
 		talk_cmd.command = "L";
 		talk_action->commands.push_back(talk_cmd);
diff --git a/engines/hypno/hypno.h b/engines/hypno/hypno.h
index 580d311dce1..972aed5660d 100644
--- a/engines/hypno/hypno.h
+++ b/engines/hypno/hypno.h
@@ -135,6 +135,8 @@ public:
 	SegmentShootsSequence parseShootList(const Common::String &name, const Common::String &data);
 	void loadArcadeLevel(const Common::String &current, const Common::String &nextWin, const Common::String &nextLose, const Common::String &prefix);
 	void loadSceneLevel(const Common::String &current, const Common::String &next, const Common::String &prefix);
+	void loadSceneLevel(const char *buf, const Common::String &name, const Common::String &next, const Common::String &prefix);
+
 	LibFile *loadLib(const Filename &prefix, const Filename &filename, bool encrypted);
 
 	// User input
diff --git a/engines/hypno/lexer_mis.cpp b/engines/hypno/lexer_mis.cpp
index c0e09133e6d..2975acffbe1 100644
--- a/engines/hypno/lexer_mis.cpp
+++ b/engines/hypno/lexer_mis.cpp
@@ -633,8 +633,8 @@ static void yynoreturn yy_fatal_error ( const char* msg  );
 	(yy_hold_char) = *yy_cp; \
 	*yy_cp = '\0'; \
 	(yy_c_buf_p) = yy_cp;
-#define YY_NUM_RULES 48
-#define YY_END_OF_BUFFER 49
+#define YY_NUM_RULES 51
+#define YY_END_OF_BUFFER 52
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -642,24 +642,25 @@ struct yy_trans_info
 	flex_int32_t yy_verify;
 	flex_int32_t yy_nxt;
 	};
-static const flex_int16_t yy_accept[150] =
+static const flex_int16_t yy_accept[159] =
     {   0,
-        0,    0,   49,   47,   46,   45,   45,   47,   41,   44,
-       44,   47,   42,   42,   42,   42,   42,   42,   42,   42,
-       42,   42,   42,   42,   42,   42,   42,   42,   45,   46,
-       44,    0,   41,   41,    0,    1,   43,   42,   42,   42,
-       42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
-       42,   42,   42,   42,   42,   42,   42,   42,   42,   42,
-       42,   42,    0,    0,   37,    0,    0,    0,    0,   38,
-        0,    0,    2,   41,    0,   42,   42,   42,   42,   42,
-       11,   42,   42,   42,   42,   42,   42,   42,   42,   42,
-       42,   42,   42,   42,   42,   42,   42,   42,   42,   34,
-
-       35,   36,   30,   33,   32,   31,   29,   41,    0,    4,
-        5,   20,    6,   42,   42,   15,    7,   39,    9,   42,
-       25,    3,   10,   21,   13,    8,   16,   42,   14,   26,
-       17,   12,   28,   41,   19,   42,   42,   42,   24,   42,
-       40,   42,   22,   42,   23,   27,   42,   18,    0
+        0,    0,   52,   50,   49,   48,   48,   50,   44,   47,
+       47,   47,   47,   50,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       48,   49,   47,    0,   44,   44,   47,   47,    0,    1,
+       46,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,    0,    0,   38,
+        0,    0,    0,    0,   39,    0,    0,    2,   44,   41,
+       40,    0,   45,   45,   45,   45,   45,   11,   45,   45,
+       45,   45,   45,   45,   45,   45,   45,   45,   45,   45,
+
+       45,   45,   45,   45,   45,   45,   45,   35,   36,   37,
+       31,   34,   33,   32,   30,   44,    0,    4,    5,   21,
+        6,   45,   45,   15,    7,   42,    9,   45,   26,    3,
+       10,   22,   13,    8,   16,   45,   14,   17,   27,   18,
+       12,   29,   44,   20,   45,   45,   45,   25,   45,   43,
+       45,   23,   45,   24,   28,   45,   19,    0
     } ;
 
 static const YY_CHAR yy_ec[256] =
@@ -668,16 +669,16 @@ static const YY_CHAR yy_ec[256] =
         1,    1,    4,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    2,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    5,    6,    7,    8,    8,    9,
-        9,   10,    9,    9,    9,    9,    9,    1,   11,    1,
-       12,    1,    1,    1,   13,   14,   15,   16,   17,   18,
-       19,   20,   21,   22,   23,   24,   25,   26,   27,   28,
-       22,   29,   30,   31,   32,   33,   34,   35,   36,   22,
-        1,    6,    1,    1,   37,    1,   38,   38,   38,   38,
-
-       38,   38,   38,   38,   38,   38,   38,   38,   38,   38,
-       38,   38,   38,   38,   38,   38,   38,   38,   38,   38,
-       38,   38,    1,   39,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    5,    6,    7,    8,    9,   10,
+       11,   12,   11,   11,   11,   11,   11,    1,   13,    1,
+       14,    1,    1,    1,   15,   16,   17,   18,   19,   20,
+       21,   22,   23,   24,   25,   26,   27,   28,   29,   30,
+       24,   31,   32,   33,   34,   35,   36,   37,   38,   24,
+        1,    6,    1,    1,   39,    1,   40,   40,   40,   40,
+
+       40,   40,   40,   40,   40,   40,   41,   40,   40,   40,
+       40,   40,   40,   40,   40,   40,   40,   40,   40,   40,
+       40,   40,    1,   42,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
@@ -694,148 +695,167 @@ static const YY_CHAR yy_ec[256] =
         1,    1,    1,    1,    1
     } ;
 
-static const YY_CHAR yy_meta[40] =
+static const YY_CHAR yy_meta[43] =
     {   0,
         1,    1,    2,    1,    1,    3,    4,    5,    5,    5,
-        1,    1,    5,    5,    5,    5,    5,    5,    5,    5,
-        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
-        5,    5,    5,    5,    5,    5,    5,    5,    1
+        5,    5,    1,    1,    6,    6,    6,    6,    6,    6,
+        6,    6,    6,    6,    5,    6,    6,    6,    6,    6,
+        6,    6,    6,    6,    6,    6,    6,    6,    6,    6,
+        5,    7
     } ;
 
-static const flex_int16_t yy_base[161] =
+static const flex_int16_t yy_base[171] =
     {   0,
-        0,    0,  311,  312,  308,  312,  312,   32,   36,   36,
-       39,    0,   45,   46,   47,   48,   50,  303,   51,   55,
-       52,   66,   56,   61,   71,   78,   58,    0,   93,  306,
-       92,    0,  299,   79,  289,    0,    0,  294,   54,   89,
-       57,   84,  101,   92,  110,   91,   97,  114,  116,  118,
-      120,  121,  122,  124,  125,  126,  134,  127,  130,  131,
-      136,    0,  149,  153,  312,  156,    0,  159,    0,  312,
-        0,    0,    0,  143,  270,  165,  166,  140,  143,  168,
-      288,  170,  171,  172,  173,  176,  178,  174,  182,  184,
-      186,  187,  181,  189,  188,  190,  195,  191,  194,  214,
-
-      217,  220,    0,  223,    0,    0,    0,  202,  256,  280,
-      277,  272,  267,  206,  213,  266,  264,  205,  263,  214,
-      228,  262,  261,  260,  259,  258,  257,  230,  256,  255,
-      252,  248,  246,  228,  312,  233,  236,  238,  245,  137,
-      312,  240,  244,  241,  242,  199,  243,   63,  312,  271,
-      276,  279,   61,  284,  287,  290,  293,  296,  299,  302
+        0,    0,  373,  380,  367,  380,  380,   35,   41,   41,
+       50,   55,   60,    0,   48,   67,   49,   68,   70,  359,
+       71,   50,   78,   82,   74,   84,   88,   85,   80,    0,
+      110,  359,  110,    0,  350,   97,  102,  109,  338,    0,
+        0,  341,  110,   75,  108,  105,  117,  129,  135,  133,
+      140,  142,  143,  149,  147,  148,  150,  154,  151,  153,
+      155,  157,  159,  161,  165,  162,    0,  185,  190,  380,
+      195,    0,  200,    0,  380,    0,    0,    0,  184,  380,
+      380,  312,  167,  208,  178,  210,  211,  328,  213,  166,
+      180,  212,  217,  216,  218,  219,  223,  224,  221,  225,
+
+      229,  231,  230,  233,  226,  243,  259,  261,  266,  271,
+        0,  276,    0,    0,    0,  253,  291,  321,  320,  319,
+      317,  255,  285,  316,  315,  258,  307,  286,  287,  306,
+      305,  304,  302,  300,  299,  289,  298,  297,  296,  250,
+      244,  235,  239,  380,  288,  290,  295,  177,  239,  380,
+      291,  172,  294,   87,   83,  301,   79,  380,  326,  332,
+      337,  339,  345,  348,  353,  357,  361,  365,  369,  373
     } ;
 
-static const flex_int16_t yy_def[161] =
+static const flex_int16_t yy_def[171] =
     {   0,
-      149,    1,  149,  149,  149,  149,  149,  149,  150,  149,
-      149,  151,  152,  152,  152,  152,  152,  152,  152,  152,
-      152,  152,  152,  152,  152,  152,  152,  153,  149,  149,
-      149,  154,  150,  150,  149,  151,  155,  152,  152,  152,
-      152,  152,  152,  152,  152,  152,  152,  152,  152,  152,
-      152,  152,  152,  152,  152,  152,  152,  152,  152,  152,
-      152,  153,  149,  149,  149,  149,  156,  149,  157,  149,
-      158,  159,  154,  150,  149,  152,  152,  152,  152,  152,
-      152,  152,  152,  160,  152,  152,  152,  152,  152,  152,
-      152,  152,  152,  152,  152,  152,  152,  152,  152,  149,
-
-      149,  149,  156,  149,  157,  158,  159,  150,  149,  152,
-      152,  152,  152,  152,  152,  152,  152,  160,  152,  152,
-      152,  152,  152,  152,  152,  152,  152,  152,  152,  152,
-      152,  152,  152,  150,  149,  152,  152,  152,  152,  152,
-      149,  152,  152,  152,  152,  152,  152,  152,    0,  149,
-      149,  149,  149,  149,  149,  149,  149,  149,  149,  149
+      158,    1,  158,  158,  158,  158,  158,  158,  159,  158,
+      158,  158,  158,  160,  161,  161,  161,  161,  161,  161,
+      161,  161,  161,  161,  161,  161,  161,  161,  161,  162,
+      158,  158,  158,  163,  159,  159,  164,  164,  158,  160,
+      165,  161,  161,  161,  161,  161,  161,  161,  161,  161,
+      161,  161,  161,  161,  161,  161,  161,  161,  161,  161,
+      161,  161,  161,  161,  161,  161,  162,  158,  158,  158,
+      158,  166,  158,  167,  158,  168,  169,  163,  159,  158,
+      158,  158,  161,  161,  161,  161,  161,  161,  161,  161,
+      170,  161,  161,  161,  161,  161,  161,  161,  161,  161,
+
+      161,  161,  161,  161,  161,  161,  161,  158,  158,  158,
+      166,  158,  167,  168,  169,  159,  158,  161,  161,  161,
+      161,  161,  161,  161,  161,  170,  161,  161,  161,  161,
+      161,  161,  161,  161,  161,  161,  161,  161,  161,  161,
+      161,  161,  159,  158,  161,  161,  161,  161,  161,  158,
+      161,  161,  161,  161,  161,  161,  161,    0,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158
     } ;
 
-static const flex_int16_t yy_nxt[352] =
+static const flex_int16_t yy_nxt[423] =
     {   0,
-        4,    5,    6,    7,    8,    4,    9,   10,   10,   11,
-       12,    4,   13,   14,   15,   16,   17,   18,   19,   20,
-       21,   18,   18,   18,   22,   18,   23,   24,   18,   25,
-       26,   18,   18,   27,   18,   18,   28,   18,   29,   31,
-       31,   31,   32,   31,   31,   31,   31,   31,   31,   34,
-       37,   37,   37,   37,   35,   37,   37,   37,   40,   37,
-       37,   37,   37,   37,   43,   62,   37,   76,   37,   39,
-       61,   37,   41,   54,   46,   44,   37,   49,   42,   45,
-       47,   48,   50,   37,   55,  149,   51,   56,   53,   37,
-       59,   78,   74,   52,   37,   57,   37,   37,   60,   31,
-
-       31,   31,   37,   77,   58,   63,   37,   81,   64,   65,
-       66,   67,   68,   69,   79,   37,   70,   83,   80,   37,
-       71,   37,   72,   37,   82,   37,   37,   37,   86,   37,
-       37,   37,   37,   84,   89,   37,   37,   93,   91,   37,
-       94,   37,   37,   88,   85,   37,   87,   92,   37,  149,
-       95,   90,  145,   97,   96,   98,  100,  100,  100,   99,
-      101,  101,  101,  102,  102,  102,  104,  104,  104,  108,
-       37,   37,  113,   37,  112,   37,   37,   37,   37,   37,
-      114,   37,  115,   37,  117,  110,   37,   37,  111,   37,
-      120,   37,   37,   37,   37,   37,   37,  116,  123,   37,
-
-       37,  133,  119,  126,   37,  122,  121,  132,  149,   38,
-       37,   37,  124,  129,  125,  128,  127,  131,   37,   37,
-      130,  100,  100,  100,  101,  101,  101,  102,  102,  102,
-      104,  104,  104,   37,  149,   37,  134,  136,   37,  141,
-      137,   37,   38,   37,  138,   37,   37,   37,   37,   37,
-       37,   37,  143,   37,  139,  140,  142,   37,  144,  148,
-       37,   37,   37,   37,   37,   37,   37,   37,   37,   37,
-      146,   37,   37,  147,   33,   33,   36,   37,   36,   36,
-       36,   38,   37,   38,   73,   37,   73,   73,   73,   37,
-      135,   37,  103,   37,  103,  105,  109,  105,  106,   37,
-
-      106,  107,   75,  107,  118,  149,  118,   30,   37,   30,
-      149,    3,  149,  149,  149,  149,  149,  149,  149,  149,
-      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
-      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
-      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
-      149
+        4,    5,    6,    7,    8,    4,    9,   10,   11,   12,
+       10,   13,   14,    4,   15,   16,   17,   18,   19,   20,
+       21,   22,   23,   20,   20,   20,   24,   20,   25,   26,
+       20,   27,   28,   20,   20,   29,   20,   20,   30,   20,
+       20,   31,   33,   33,   33,   33,   33,   34,   33,   33,
+       33,   33,   33,   41,   41,   41,   36,   33,   37,   33,
+       33,   33,   33,   33,   38,   33,   33,   33,   33,   33,
+       33,   33,   41,   41,   43,   41,   41,   39,   52,   41,
+       41,   44,   46,   41,   41,   41,   47,   41,   41,   41,
+       41,   84,   41,   41,   66,   45,   50,   48,   58,   64,
+
+       54,   49,   51,  158,   55,   53,   60,   65,   57,   59,
+       41,   56,   79,   41,   61,   41,   62,   33,   33,   33,
+       33,   33,   41,   63,   68,   83,   80,   69,   70,   71,
+       72,   73,   74,   81,   41,   75,   87,   86,   41,   76,
+       41,   77,   80,   80,   85,   41,   88,   41,   41,   81,
+       81,   89,   41,   41,   41,   41,   41,   93,   41,   41,
+       41,   90,   41,   96,   41,  100,   41,   41,   98,  101,
+       41,   41,   41,  102,   92,   94,   95,   41,   91,   99,
+       97,  125,   41,   41,  103,   41,  105,  107,  104,  118,
+      158,  106,  108,  108,  108,  108,  108,  109,  109,  109,
+
+      109,  109,  110,  110,  110,  110,  110,  112,  112,  112,
+      112,  112,  116,   41,  120,   41,   41,   41,   41,   42,
+       42,   41,   41,   41,   41,  122,   41,  123,   41,   41,
+       41,   41,  119,  128,   41,   41,   41,  131,   41,  134,
+       41,  121,  124,  127,   41,  158,  129,  138,   41,   41,
+      140,  130,  150,  132,  133,   41,  154,  136,  137,  158,
+       41,  141,  135,   41,   41,  139,  142,  142,  108,  108,
+      108,  108,  108,  109,  109,  109,  109,  109,  110,  110,
+      110,  110,  110,  112,  112,  112,  112,  112,  145,  143,
+       41,   41,   41,   41,   41,   41,   41,   42,   42,   41,
+
+       41,   41,   41,   41,   41,   41,   41,   41,  152,   41,
+       41,   41,   41,  151,  146,  148,  149,  153,  147,  157,
+       41,   41,   41,  155,   41,   41,   41,  144,  156,   35,
+       35,   35,   40,   41,   40,   40,   40,   40,   40,   42,
+      117,   42,   42,   67,   67,   78,   41,   78,   78,   78,
+       78,   78,   33,   82,   33,   41,  158,   41,   41,  111,
+       32,  111,  111,  113,   41,  113,  113,  114,   32,  114,
+      114,  115,  158,  115,  115,  126,  158,  126,  126,    3,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,  158
     } ;
 
-static const flex_int16_t yy_chk[352] =
+static const flex_int16_t yy_chk[423] =
     {   0,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    8,
-        8,    8,    9,   10,   10,   10,   11,   11,   11,    9,
-       13,   14,   15,   16,   11,   17,   19,   21,   14,   39,
-       20,   23,   41,   27,   16,  153,   24,   39,  148,   13,
-       27,   22,   14,   24,   19,   17,   25,   21,   15,   17,
-       19,   20,   22,   26,   24,   34,   22,   25,   23,   42,
-       26,   41,   34,   22,   40,   25,   46,   44,   26,   31,
-
-       31,   31,   47,   40,   25,   29,   43,   44,   29,   29,
-       29,   29,   29,   29,   42,   45,   29,   46,   43,   48,
-       29,   49,   29,   50,   45,   51,   52,   53,   49,   54,
-       55,   56,   58,   47,   51,   59,   60,   55,   53,   57,
-       56,   61,  140,   50,   48,   78,   49,   54,   79,   74,
-       57,   52,  140,   59,   58,   60,   63,   63,   63,   61,
-       64,   64,   64,   66,   66,   66,   68,   68,   68,   74,
-       76,   77,   79,   80,   78,   82,   83,   84,   85,   88,
-       80,   86,   82,   87,   83,   76,   93,   89,   77,   90,
-       86,   91,   92,   95,   94,   96,   98,   82,   89,   99,
-
-       97,   99,   85,   92,  146,   88,   87,   98,  108,   84,
-      118,  114,   90,   95,   91,   94,   93,   97,  115,  120,
-       96,  100,  100,  100,  101,  101,  101,  102,  102,  102,
-      104,  104,  104,  121,  134,  128,  108,  114,  136,  134,
-      115,  137,  118,  138,  120,  142,  144,  145,  147,  143,
-      139,  133,  137,  132,  121,  128,  136,  131,  138,  147,
-      130,  129,  127,  126,  125,  124,  123,  122,  119,  117,
-      142,  116,  113,  144,  150,  150,  151,  112,  151,  151,
-      151,  152,  111,  152,  154,  110,  154,  154,  154,  155,
-      109,  155,  156,   81,  156,  157,   75,  157,  158,   38,
-
-      158,  159,   35,  159,  160,   33,  160,   30,   18,    5,
-        3,  149,  149,  149,  149,  149,  149,  149,  149,  149,
-      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
-      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
-      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
-      149
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    8,    8,    8,    8,    8,    9,   10,   10,
+       10,   10,   10,   15,   17,   22,    9,   11,   11,   11,
+       11,   11,   12,   12,   12,   12,   12,   13,   13,   13,
+       13,   13,   16,   18,   15,   19,   21,   13,   22,   25,
+       44,   16,   17,   23,  157,   29,   18,   24,  155,   26,
+       28,   44,  154,   27,   29,   16,   21,   19,   26,   28,
+
+       24,   19,   21,   36,   24,   23,   27,   28,   25,   26,
+       46,   24,   36,   45,   27,   43,   27,   33,   33,   33,
+       33,   33,   47,   27,   31,   43,   37,   31,   31,   31,
+       31,   31,   31,   38,   48,   31,   47,   46,   50,   31,
+       49,   31,   37,   37,   45,   51,   48,   52,   53,   38,
+       38,   49,   55,   56,   54,   57,   59,   53,   60,   58,
+       61,   50,   62,   55,   63,   59,   64,   66,   57,   60,
+       65,   90,   83,   61,   52,   53,   54,  152,   51,   58,
+       56,   90,  148,   85,   62,   91,   64,   66,   63,   83,
+       79,   65,   68,   68,   68,   68,   68,   69,   69,   69,
+
+       69,   69,   71,   71,   71,   71,   71,   73,   73,   73,
+       73,   73,   79,   84,   85,   86,   87,   92,   89,   91,
+       91,   94,   93,   95,   96,   87,   99,   89,   97,   98,
+      100,  105,   84,   93,  101,  103,  102,   96,  104,   99,
+      142,   86,   89,   92,  149,  143,   94,  103,  106,  141,
+      105,   95,  143,   97,   98,  140,  149,  101,  102,  116,
+      122,  106,  100,  126,  107,  104,  107,  107,  108,  108,
+      108,  108,  108,  109,  109,  109,  109,  109,  110,  110,
+      110,  110,  110,  112,  112,  112,  112,  112,  122,  116,
+      123,  128,  129,  145,  136,  146,  151,  126,  126,  153,
+
+      147,  139,  138,  137,  135,  134,  156,  133,  146,  132,
+      131,  130,  127,  145,  123,  129,  136,  147,  128,  156,
+      125,  124,  121,  151,  120,  119,  118,  117,  153,  159,
+      159,  159,  160,   88,  160,  160,  160,  160,  160,  161,
+       82,  161,  161,  162,  162,  163,   42,  163,  163,  163,
+      163,  163,  164,   39,  164,  165,   35,  165,  165,  166,
+       32,  166,  166,  167,   20,  167,  167,  168,    5,  168,
+      168,  169,    3,  169,  169,  170,    0,  170,  170,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,  158
     } ;
 
 /* Table of booleans, true if rule could match eol. */
-static const flex_int32_t yy_rule_can_match_eol[49] =
+static const flex_int32_t yy_rule_can_match_eol[52] =
     {   0,
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-    0, 0, 0, 0, 0, 1, 0, 0, 0,     };
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,     };
 
 static yy_state_type yy_last_accepting_state;
 static char *yy_last_accepting_cpos;
@@ -881,8 +901,8 @@ char *yytext;
 #include "hypno/grammar.h"
 #include "hypno/tokens_mis.h"
 
-#line 884 "engines/hypno/lexer_mis.cpp"
-#line 885 "engines/hypno/lexer_mis.cpp"
+#line 904 "engines/hypno/lexer_mis.cpp"
+#line 905 "engines/hypno/lexer_mis.cpp"
 
 #define INITIAL 0
 
@@ -1099,7 +1119,7 @@ YY_DECL
 	{
 #line 41 "engines/hypno/lexer_mis.l"
 
-#line 1102 "engines/hypno/lexer_mis.cpp"
+#line 1122 "engines/hypno/lexer_mis.cpp"
 
 	while ( /*CONSTCOND*/1 )		/* loops until end-of-file is reached */
 		{
@@ -1126,13 +1146,13 @@ yy_match:
 			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 				{
 				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 150 )
+				if ( yy_current_state >= 159 )
 					yy_c = yy_meta[yy_c];
 				}
 			yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
 			++yy_cp;
 			}
-		while ( yy_current_state != 149 );
+		while ( yy_current_state != 158 );
 		yy_cp = (yy_last_accepting_cpos);
 		yy_current_state = (yy_last_accepting_state);
 
@@ -1245,165 +1265,180 @@ return PLAYTOK;
 case 17:
 YY_RULE_SETUP
 #line 58 "engines/hypno/lexer_mis.l"
-return TALKTOK;
+return SONDTOK;
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
 #line 59 "engines/hypno/lexer_mis.l"
-return INACTOK;
+return TALKTOK;
 	YY_BREAK
 case 19:
 YY_RULE_SETUP
 #line 60 "engines/hypno/lexer_mis.l"
-return FDTOK;
+return INACTOK;
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
 #line 61 "engines/hypno/lexer_mis.l"
-return BOXXTOK;
+return FDTOK;
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
 #line 62 "engines/hypno/lexer_mis.l"
-return MPTRTOK;
+return BOXXTOK;
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
 #line 63 "engines/hypno/lexer_mis.l"
-return ESCAPETOK;
+return MPTRTOK;
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
 #line 64 "engines/hypno/lexer_mis.l"
-return SECONDTOK;
+return ESCAPETOK;
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
 #line 65 "engines/hypno/lexer_mis.l"
-return INTROTOK;
+return SECONDTOK;
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
 #line 66 "engines/hypno/lexer_mis.l"
-return INTRTOK;
+return INTROTOK;
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
 #line 67 "engines/hypno/lexer_mis.l"
-return SWPTTOK;
+return INTRTOK;
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
 #line 68 "engines/hypno/lexer_mis.l"
-return DEFAULTTOK;
+return SWPTTOK;
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
 #line 69 "engines/hypno/lexer_mis.l"
-HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return WALNTOK;
+return DEFAULTTOK;
 	YY_BREAK
 case 29:
 YY_RULE_SETUP
 #line 70 "engines/hypno/lexer_mis.l"
-HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PS;
+HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return WALNTOK;
 	YY_BREAK
 case 30:
 YY_RULE_SETUP
 #line 71 "engines/hypno/lexer_mis.l"
-HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PG;
+HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PS;
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
 #line 72 "engines/hypno/lexer_mis.l"
-HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PP;
+HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PG;
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
 #line 73 "engines/hypno/lexer_mis.l"
-HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PI;
+HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PP;
 	YY_BREAK
 case 33:
 YY_RULE_SETUP
 #line 74 "engines/hypno/lexer_mis.l"
-HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PH;
+HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PI;
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
 #line 75 "engines/hypno/lexer_mis.l"
-HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PA;
+HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PH;
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
 #line 76 "engines/hypno/lexer_mis.l"
-HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PD;
+HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PA;
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
 #line 77 "engines/hypno/lexer_mis.l"
-HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PF;
+HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PD;
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
 #line 78 "engines/hypno/lexer_mis.l"
-return PE;
+HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PF;
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
 #line 79 "engines/hypno/lexer_mis.l"
-return PL;
+return PE;
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
 #line 80 "engines/hypno/lexer_mis.l"
-HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return GSSWITCH;
+return PL;
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
 #line 81 "engines/hypno/lexer_mis.l"
-return BBOXTOK;
+HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return ENCTOK;
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
 #line 82 "engines/hypno/lexer_mis.l"
-HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return FLAG;
+HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return ENCTOK;
 	YY_BREAK
 case 42:
 YY_RULE_SETUP
 #line 83 "engines/hypno/lexer_mis.l"
-HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return NAME;
+HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return GSSWITCH;
 	YY_BREAK
 case 43:
 YY_RULE_SETUP
 #line 84 "engines/hypno/lexer_mis.l"
-HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return FILENAME;
+return BBOXTOK;
 	YY_BREAK
 case 44:
 YY_RULE_SETUP
 #line 85 "engines/hypno/lexer_mis.l"
-HYPNO_MIS_lval.i = atoi(HYPNO_MIS_text); return NUM;
+HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return FLAG;
 	YY_BREAK
 case 45:
-/* rule 45 can match eol */
 YY_RULE_SETUP
 #line 86 "engines/hypno/lexer_mis.l"
-return RETTOK;
+HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return NAME;
 	YY_BREAK
 case 46:
 YY_RULE_SETUP
 #line 87 "engines/hypno/lexer_mis.l"
-/* ignore whitespace */;
+HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return FILENAME;
 	YY_BREAK
 case 47:
 YY_RULE_SETUP
 #line 88 "engines/hypno/lexer_mis.l"
-debugC(1, Hypno::kHypnoDebugParser, "<no match: %c>", *yytext); return *yytext;
+HYPNO_MIS_lval.i = atoi(HYPNO_MIS_text); return NUM;
 	YY_BREAK
 case 48:
+/* rule 48 can match eol */
 YY_RULE_SETUP
 #line 89 "engines/hypno/lexer_mis.l"
+return RETTOK;
+	YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 90 "engines/hypno/lexer_mis.l"
+/* ignore whitespace */;
+	YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 91 "engines/hypno/lexer_mis.l"
+debugC(1, Hypno::kHypnoDebugParser, "<no match: %c>", *yytext); return *yytext;
+	YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 92 "engines/hypno/lexer_mis.l"
 ECHO;
 	YY_BREAK
-#line 1406 "engines/hypno/lexer_mis.cpp"
+#line 1441 "engines/hypno/lexer_mis.cpp"
 case YY_STATE_EOF(INITIAL):
 	yyterminate();
 
@@ -1701,7 +1736,7 @@ static int yy_get_next_buffer (void)
 		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 			{
 			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 150 )
+			if ( yy_current_state >= 159 )
 				yy_c = yy_meta[yy_c];
 			}
 		yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -1729,11 +1764,11 @@ static int yy_get_next_buffer (void)
 	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 		{
 		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 150 )
+		if ( yy_current_state >= 159 )
 			yy_c = yy_meta[yy_c];
 		}
 	yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
-	yy_is_jam = (yy_current_state == 149);
+	yy_is_jam = (yy_current_state == 158);
 
 		return yy_is_jam ? 0 : yy_current_state;
 }
@@ -2380,7 +2415,7 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 89 "engines/hypno/lexer_mis.l"
+#line 92 "engines/hypno/lexer_mis.l"
 
 
 namespace Hypno {
diff --git a/engines/hypno/lexer_mis.l b/engines/hypno/lexer_mis.l
index 8e4d016d6ed..9bfcd028764 100644
--- a/engines/hypno/lexer_mis.l
+++ b/engines/hypno/lexer_mis.l
@@ -55,6 +55,7 @@ OVER						return OVERTOK;
 SMEN						return SMENTOK;
 ESCP						return ESCPTOK;
 PLAY						return PLAYTOK;
+SOND						return SONDTOK;
 TALK						return TALKTOK;
 INACTIVE					return INACTOK;
 4DBOX						return FDTOK;
@@ -77,6 +78,8 @@ WAL[0-1]					HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return WALNTOK;
 \|F[0-9]+					HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PF;
 \|E							return PE;
 \|L							return PL;
+22[k|K]						HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return ENCTOK;
+11[k|K]						HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return ENCTOK;
 GS_[A-Z_0-9]+				HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return GSSWITCH;
 \/BBOX\=					return BBOXTOK;
 \/[A-Za-z_0-9]*				HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return FLAG;
diff --git a/engines/hypno/scene.cpp b/engines/hypno/scene.cpp
index dd519ebf1a6..81a74b2d02b 100644
--- a/engines/hypno/scene.cpp
+++ b/engines/hypno/scene.cpp
@@ -80,6 +80,17 @@ void HypnoEngine::loadSceneLevel(const Common::String &current, const Common::St
 	free(buf);
 }
 
+void HypnoEngine::loadSceneLevel(const char *buf, const Common::String &name, const Common::String &next, const Common::String &prefix) {
+	debugC(1, kHypnoDebugParser, "Parsing %s", name.c_str());
+	debugC(1, kHypnoDebugParser, "%s", buf);
+	parse_mis(buf);
+	Scene *level = new Scene();
+	level->prefix = prefix;
+	level->levelIfWin = next;
+	level->hots = *g_parsedHots;
+	_levels[name] = level;
+}
+
 void HypnoEngine::resetSceneState() {
 	uint32 i = 0;
 	while (sceneVariables[i]) {
diff --git a/engines/hypno/tokens_mis.h b/engines/hypno/tokens_mis.h
index bf33c2cc3ea..40885bba795 100644
--- a/engines/hypno/tokens_mis.h
+++ b/engines/hypno/tokens_mis.h
@@ -69,47 +69,49 @@ extern int HYPNO_MIS_debug;
     GSSWITCH = 262,                /* GSSWITCH  */
     COMMAND = 263,                 /* COMMAND  */
     WALNTOK = 264,                 /* WALNTOK  */
-    NUM = 265,                     /* NUM  */
-    HOTSTOK = 266,                 /* HOTSTOK  */
-    CUTSTOK = 267,                 /* CUTSTOK  */
-    BACKTOK = 268,                 /* BACKTOK  */
-    INTRTOK = 269,                 /* INTRTOK  */
-    RETTOK = 270,                  /* RETTOK  */
-    TIMETOK = 271,                 /* TIMETOK  */
-    PALETOK = 272,                 /* PALETOK  */
-    BBOXTOK = 273,                 /* BBOXTOK  */
-    OVERTOK = 274,                 /* OVERTOK  */
-    MICETOK = 275,                 /* MICETOK  */
-    PLAYTOK = 276,                 /* PLAYTOK  */
-    ENDTOK = 277,                  /* ENDTOK  */
-    MENUTOK = 278,                 /* MENUTOK  */
-    SMENTOK = 279,                 /* SMENTOK  */
-    ESCPTOK = 280,                 /* ESCPTOK  */
-    NRTOK = 281,                   /* NRTOK  */
-    AMBITOK = 282,                 /* AMBITOK  */
-    SWPTTOK = 283,                 /* SWPTTOK  */
-    MPTRTOK = 284,                 /* MPTRTOK  */
-    GLOBTOK = 285,                 /* GLOBTOK  */
-    TONTOK = 286,                  /* TONTOK  */
-    TOFFTOK = 287,                 /* TOFFTOK  */
-    TALKTOK = 288,                 /* TALKTOK  */
-    INACTOK = 289,                 /* INACTOK  */
-    FDTOK = 290,                   /* FDTOK  */
-    BOXXTOK = 291,                 /* BOXXTOK  */
-    ESCAPETOK = 292,               /* ESCAPETOK  */
-    SECONDTOK = 293,               /* SECONDTOK  */
-    INTROTOK = 294,                /* INTROTOK  */
-    DEFAULTTOK = 295,              /* DEFAULTTOK  */
-    PG = 296,                      /* PG  */
-    PA = 297,                      /* PA  */
-    PD = 298,                      /* PD  */
-    PH = 299,                      /* PH  */
-    PF = 300,                      /* PF  */
-    PE = 301,                      /* PE  */
-    PP = 302,                      /* PP  */
-    PI = 303,                      /* PI  */
-    PL = 304,                      /* PL  */
-    PS = 305                       /* PS  */
+    ENCTOK = 265,                  /* ENCTOK  */
+    NUM = 266,                     /* NUM  */
+    HOTSTOK = 267,                 /* HOTSTOK  */
+    CUTSTOK = 268,                 /* CUTSTOK  */
+    BACKTOK = 269,                 /* BACKTOK  */
+    INTRTOK = 270,                 /* INTRTOK  */
+    RETTOK = 271,                  /* RETTOK  */
+    TIMETOK = 272,                 /* TIMETOK  */
+    PALETOK = 273,                 /* PALETOK  */
+    BBOXTOK = 274,                 /* BBOXTOK  */
+    OVERTOK = 275,                 /* OVERTOK  */
+    MICETOK = 276,                 /* MICETOK  */
+    SONDTOK = 277,                 /* SONDTOK  */
+    PLAYTOK = 278,                 /* PLAYTOK  */
+    ENDTOK = 279,                  /* ENDTOK  */
+    MENUTOK = 280,                 /* MENUTOK  */
+    SMENTOK = 281,                 /* SMENTOK  */
+    ESCPTOK = 282,                 /* ESCPTOK  */
+    NRTOK = 283,                   /* NRTOK  */
+    AMBITOK = 284,                 /* AMBITOK  */
+    SWPTTOK = 285,                 /* SWPTTOK  */
+    MPTRTOK = 286,                 /* MPTRTOK  */
+    GLOBTOK = 287,                 /* GLOBTOK  */
+    TONTOK = 288,                  /* TONTOK  */
+    TOFFTOK = 289,                 /* TOFFTOK  */
+    TALKTOK = 290,                 /* TALKTOK  */
+    INACTOK = 291,                 /* INACTOK  */
+    FDTOK = 292,                   /* FDTOK  */
+    BOXXTOK = 293,                 /* BOXXTOK  */
+    ESCAPETOK = 294,               /* ESCAPETOK  */
+    SECONDTOK = 295,               /* SECONDTOK  */
+    INTROTOK = 296,                /* INTROTOK  */
+    DEFAULTTOK = 297,              /* DEFAULTTOK  */
+    PG = 298,                      /* PG  */
+    PA = 299,                      /* PA  */
+    PD = 300,                      /* PD  */
+    PH = 301,                      /* PH  */
+    PF = 302,                      /* PF  */
+    PE = 303,                      /* PE  */
+    PP = 304,                      /* PP  */
+    PI = 305,                      /* PI  */
+    PL = 306,                      /* PL  */
+    PS = 307                       /* PS  */
   };
   typedef enum HYPNO_MIS_tokentype HYPNO_MIS_token_kind_t;
 #endif
@@ -118,12 +120,12 @@ extern int HYPNO_MIS_debug;
 #if ! defined HYPNO_MIS_STYPE && ! defined HYPNO_MIS_STYPE_IS_DECLARED
 union HYPNO_MIS_STYPE
 {
-#line 56 "engines/hypno/grammar_mis.y"
+#line 55 "engines/hypno/grammar_mis.y"
 
 	char *s; /* string value */
 	int i;	 /* integer value */
 
-#line 127 "engines/hypno/tokens_mis.h"
+#line 129 "engines/hypno/tokens_mis.h"
 
 };
 typedef union HYPNO_MIS_STYPE HYPNO_MIS_STYPE;


Commit: 56f69e40c5e636bc9ac416dc314b7711e38e35ba
    https://github.com/scummvm/scummvm/commit/56f69e40c5e636bc9ac416dc314b7711e38e35ba
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-07T08:26:07+02:00

Commit Message:
HYPNO: basic ammo handling in boyz

Changed paths:
    engines/hypno/boyz/arcade.cpp
    engines/hypno/boyz/boyz.cpp
    engines/hypno/hypno.h


diff --git a/engines/hypno/boyz/arcade.cpp b/engines/hypno/boyz/arcade.cpp
index 39891aa2ab0..440873efe4a 100644
--- a/engines/hypno/boyz/arcade.cpp
+++ b/engines/hypno/boyz/arcade.cpp
@@ -37,9 +37,9 @@ void BoyzEngine::runBeforeArcade(ArcadeShooting *arc) {
 	Common::Rect portraitBox(0, 40, 57, 94);
 
 	for (int i = 0; i < int(_playerFrames.size()); i++) {
-		_healthBar[i] = _playerFrames[i]->getSubArea(healthBarBox);
-		_ammoBar[i] = _playerFrames[i]->getSubArea(ammoBarBox);
-		_portrait[i] = _playerFrames[i]->getSubArea(portraitBox);
+		_healthBar[i+1] = _playerFrames[i]->getSubArea(healthBarBox);
+		_ammoBar[i+1] = _playerFrames[i]->getSubArea(ammoBarBox);
+		_portrait[i+1] = _playerFrames[i]->getSubArea(portraitBox);
 	}
 
 	_playerFrameSep = _playerFrames.size();
@@ -51,6 +51,11 @@ void BoyzEngine::runBeforeArcade(ArcadeShooting *arc) {
 	}
 
 	_currentScript = arc->script;
+	// Reload all weapons
+	for (Script::iterator it = _currentScript.begin(); it != _currentScript.end(); ++it) {
+		_ammoTeam[it->actor] = _weaponMaxAmmo[it->cursor];
+	}
+
 	updateFromScript();
 }
 
@@ -66,9 +71,9 @@ void BoyzEngine::updateFromScript() {
 		ScriptInfo si = *_currentScript.begin();
 		//debug("%d %d %d", si.time, _background->decoder->getCurFrame(), si.actor);
 		if (!_background || int(si.time) <= _background->decoder->getCurFrame()) {
-			_currentActor = si.actor - 1;
+			_currentActor = si.actor;
 			_currentMode = si.mode;
-			_currentWeapon = si.cursor - 1;
+			_currentWeapon = si.cursor;
 			_currentScript.pop_front();
 
 			if (_currentMode == NonInteractive)
@@ -108,10 +113,17 @@ void BoyzEngine::drawHealth() {
 void BoyzEngine::drawAmmo() {
 	updateFromScript();
 
-	Common::Rect ammoBarBox(320 - _ammoBar[_currentActor].w, 0, 320, _ammoBar[_currentActor].h/2);
+	float w = _ammoBar[_currentWeapon].w / _weaponMaxAmmo[_currentWeapon];
+
+	Common::Rect ammoBarBox(320 - int(_ammoTeam[_currentActor] * w), 0, 320, _ammoBar[_currentActor].h/2);
 	uint32 c = kHypnoColorGreen; // green
 	_compositeSurface->fillRect(ammoBarBox, c);
-	drawImage(_ammoBar[_currentActor], 320 - _ammoBar[_currentActor].w, 0, true);
+
+	drawImage(_ammoBar[_currentActor], 320 - _ammoBar[_currentWeapon].w, 0, true);
+	for (int i = 1; i < _weaponMaxAmmo[_currentWeapon]; i++) {
+		int x = 320 - _ammoBar[_currentWeapon].w + int (i * w);
+		_compositeSurface->drawLine(x, 2, x, 5, 0);
+	}
 }
 
 void BoyzEngine::hitPlayer() {
@@ -188,6 +200,10 @@ void BoyzEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc) {
 		return;
 	}
 
+	if (_ammoTeam[_currentActor] == 0)
+		return; // TODO: out of ammo sound is missing
+
+	_ammoTeam[_currentActor]--;
 	playSound(_soundPath + _weaponShootSound[_currentWeapon], 1);
 	incShotsFired();
 	int i = detectTarget(mousePos);
diff --git a/engines/hypno/boyz/boyz.cpp b/engines/hypno/boyz/boyz.cpp
index 19b0bcf4037..bacae6a315e 100644
--- a/engines/hypno/boyz/boyz.cpp
+++ b/engines/hypno/boyz/boyz.cpp
@@ -34,6 +34,11 @@ BoyzEngine::BoyzEngine(OSystem *syst, const ADGameDescription *gd) : HypnoEngine
 	_currentActor = 0;
 	_currentMode = NonInteractive;
 	_crosshairsPalette = nullptr;
+
+	for (int i = 0; i < 6; i++) {
+		_ammoTeam[i] = 0;
+		_weaponMaxAmmo[i] = 0;
+	}
 }
 
 static const char *selectBoyz = "\
@@ -89,12 +94,13 @@ void BoyzEngine::loadAssets() {
 
 	loadLib("sound/", "misc/sound.lib", true);
 
-	_weaponShootSound[0] = "pstlfire.raw";
-	_weaponShootSound[1] = "ak47fire.raw";
-	_weaponShootSound[2] = "dblfire.raw";
-	_weaponShootSound[3] = "m16fire.raw";
-	_weaponShootSound[4] = "shotfire.raw";
-	_weaponShootSound[5] = "glm60fr.raw";
+	_weaponShootSound[0] = "";
+	_weaponShootSound[1] = "pstlfire.raw";
+	_weaponShootSound[2] = "ak47fire.raw";
+	_weaponShootSound[3] = "dblfire.raw";
+	_weaponShootSound[4] = "m16fire.raw";
+	_weaponShootSound[5] = "shotfire.raw";
+	_weaponShootSound[6] = "glm60fr.raw";
 
 	Graphics::Surface *targets = decodeFrame("preload/targets.smk", 0, &_crosshairsPalette);
 
@@ -102,54 +108,54 @@ void BoyzEngine::loadAssets() {
 
 	// Pistol?
 	cursorBox = Common::Rect(62, 6, 83, 26);
-	_crosshairsInactive[0].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
-	_crosshairsInactive[0].copyRectToSurface(*targets, 0, 0, cursorBox);
+	_crosshairsInactive[1].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
+	_crosshairsInactive[1].copyRectToSurface(*targets, 0, 0, cursorBox);
 
 	cursorBox = Common::Rect(62, 38, 83, 58);
-	_crosshairsActive[0].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
-	_crosshairsActive[0].copyRectToSurface(*targets, 0, 0, cursorBox);
+	_crosshairsActive[1].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
+	_crosshairsActive[1].copyRectToSurface(*targets, 0, 0, cursorBox);
 
 	cursorBox = Common::Rect(62, 70, 83, 90);
-	_crosshairsTarget[0].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
-	_crosshairsTarget[0].copyRectToSurface(*targets, 0, 0, cursorBox);
+	_crosshairsTarget[1].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
+	_crosshairsTarget[1].copyRectToSurface(*targets, 0, 0, cursorBox);
 
 	cursorBox = Common::Rect(16, 8, 32, 24);
-	_crosshairsInactive[2].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
-	_crosshairsInactive[2].copyRectToSurface(*targets, 0, 0, cursorBox);
-
-	cursorBox = Common::Rect(16, 40, 32, 56);
-	_crosshairsActive[2].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
-	_crosshairsActive[2].copyRectToSurface(*targets, 0, 0, cursorBox);
-
-	cursorBox = Common::Rect(16, 72, 32, 88);
-	_crosshairsTarget[2].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
-	_crosshairsTarget[2].copyRectToSurface(*targets, 0, 0, cursorBox);
-
-	cursorBox = Common::Rect(163, 11, 173, 21);
 	_crosshairsInactive[3].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
 	_crosshairsInactive[3].copyRectToSurface(*targets, 0, 0, cursorBox);
 
-	cursorBox = Common::Rect(163, 43, 173, 53);
+	cursorBox = Common::Rect(16, 40, 32, 56);
 	_crosshairsActive[3].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
 	_crosshairsActive[3].copyRectToSurface(*targets, 0, 0, cursorBox);
 
-	cursorBox = Common::Rect(163, 75, 173, 85);
+	cursorBox = Common::Rect(16, 72, 32, 88);
 	_crosshairsTarget[3].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
 	_crosshairsTarget[3].copyRectToSurface(*targets, 0, 0, cursorBox);
 
-	// Shotgun
-	cursorBox = Common::Rect(104, 7, 136, 25);
+	cursorBox = Common::Rect(163, 11, 173, 21);
 	_crosshairsInactive[4].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
 	_crosshairsInactive[4].copyRectToSurface(*targets, 0, 0, cursorBox);
 
-	cursorBox = Common::Rect(104, 39, 136, 57);
+	cursorBox = Common::Rect(163, 43, 173, 53);
 	_crosshairsActive[4].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
 	_crosshairsActive[4].copyRectToSurface(*targets, 0, 0, cursorBox);
 
-	cursorBox = Common::Rect(104, 71, 136, 83);
+	cursorBox = Common::Rect(163, 75, 173, 85);
 	_crosshairsTarget[4].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
 	_crosshairsTarget[4].copyRectToSurface(*targets, 0, 0, cursorBox);
 
+	// Shotgun
+	cursorBox = Common::Rect(104, 7, 136, 25);
+	_crosshairsInactive[5].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
+	_crosshairsInactive[5].copyRectToSurface(*targets, 0, 0, cursorBox);
+
+	cursorBox = Common::Rect(104, 39, 136, 57);
+	_crosshairsActive[5].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
+	_crosshairsActive[5].copyRectToSurface(*targets, 0, 0, cursorBox);
+
+	cursorBox = Common::Rect(104, 71, 136, 83);
+	_crosshairsTarget[5].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
+	_crosshairsTarget[5].copyRectToSurface(*targets, 0, 0, cursorBox);
+
     // Double small
 	/*
 	cursorBox = Common::Rect(203, 11, 229, 21);
@@ -193,13 +199,21 @@ void BoyzEngine::loadAssets() {
 	_crosshairsTarget[6].copyRectToSurface(*targets, 0, 0, cursorBox);
 	*/
 
+	_weaponMaxAmmo[0] = 0;
+	_weaponMaxAmmo[1] = 10;
+	_weaponMaxAmmo[2] = 2; // large shotgun
+	_weaponMaxAmmo[3] = 8;
+	_weaponMaxAmmo[4] = 0;
+	_weaponMaxAmmo[5] = 6; // small shotgun
+	_weaponMaxAmmo[6] = 0;
+
 	targets->free();
 	delete targets;
 
 	loadLib("", "misc/fonts.lib", true);
 	loadFonts();
 
-	_nextLevel = "<start>";
+	_nextLevel = "c11.mi_";
 }
 
 void BoyzEngine::loadFonts() {
diff --git a/engines/hypno/hypno.h b/engines/hypno/hypno.h
index 972aed5660d..8e731b412e9 100644
--- a/engines/hypno/hypno.h
+++ b/engines/hypno/hypno.h
@@ -560,11 +560,13 @@ public:
 	private:
 	void runMainMenu(Code *code);
 
-	Graphics::Surface _healthBar[6];
-	Graphics::Surface _ammoBar[6];
-	Graphics::Surface _portrait[6];
+	int _ammoTeam[6];
+	Graphics::Surface _healthBar[7];
+	Graphics::Surface _ammoBar[7];
+	Graphics::Surface _portrait[7];
 
-	Filename _weaponShootSound[6];
+	Filename _weaponShootSound[7];
+	int _weaponMaxAmmo[7];
 
 	byte *_crosshairsPalette;
 	Graphics::Surface _crosshairsInactive[8];




More information about the Scummvm-git-logs mailing list