[Scummvm-git-logs] scummvm master -> a590352bf6414fd85d559624ab123f9ade7fd4c3

neuromancer neuromancer at users.noreply.github.com
Fri Nov 5 23:07:04 UTC 2021


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

Summary:
a590352bf6 HYPNO: improved parsing in arcade and scenes, and added some hard-coded scenes for several games


Commit: a590352bf6414fd85d559624ab123f9ade7fd4c3
    https://github.com/scummvm/scummvm/commit/a590352bf6414fd85d559624ab123f9ade7fd4c3
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2021-11-06T00:04:56+01:00

Commit Message:
HYPNO: improved parsing in arcade and scenes, and added some hard-coded scenes for several games

Changed paths:
    engines/hypno/actions.cpp
    engines/hypno/arcade.cpp
    engines/hypno/grammar.h
    engines/hypno/grammar_arc.cpp
    engines/hypno/grammar_arc.y
    engines/hypno/grammar_mis.cpp
    engines/hypno/grammar_mis.y
    engines/hypno/hypno.cpp
    engines/hypno/hypno.h
    engines/hypno/lexer_arc.cpp
    engines/hypno/lexer_arc.l
    engines/hypno/lexer_mis.cpp
    engines/hypno/lexer_mis.l
    engines/hypno/scene.cpp
    engines/hypno/spider/arcade.cpp
    engines/hypno/spider/spider.cpp
    engines/hypno/spider/talk.cpp
    engines/hypno/tokens_arc.h
    engines/hypno/tokens_mis.h
    engines/hypno/wet/wet.cpp


diff --git a/engines/hypno/actions.cpp b/engines/hypno/actions.cpp
index ec0cdf442d..1b21326cb8 100644
--- a/engines/hypno/actions.cpp
+++ b/engines/hypno/actions.cpp
@@ -63,9 +63,17 @@ void HypnoEngine::runMenu(Hotspots hs) {
 		loadImage("int_main/resume.smk", 0, 0, true);
 }
 
-void HypnoEngine::runBackground(Background *a) {
-	if (a->condition.size() > 0 && !_sceneState[a->condition])
-		return;
+void HypnoEngine::runBackground(Background *a) {	
+	if (a->condition.size() > 0) {
+		bool condition = _sceneState[a->condition];
+
+		if (a->flag1 == "/NSTATE" || a->flag2 == "/NSTATE") 
+			condition = !condition;
+
+		if (!condition)
+			return;
+	}
+
 	loadImage(a->path, a->origin.x, a->origin.y, false);
 }
 
@@ -88,15 +96,20 @@ void HypnoEngine::runCutscene(Cutscene *a) {
 	_nextSequentialVideoToPlay.push_back(MVideo(a->path, Common::Point(0, 0), false, true, false));
 }
 
-void HypnoEngine::runGlobal(Global *a) {
+bool HypnoEngine::runGlobal(Global *a) {
 	if (a->command == "TURNON")
 		_sceneState[a->variable] = 1;
 	else if (a->command == "TURNOFF")
 		_sceneState[a->variable] = 0;
 	else if (a->command == "TOGGLE")
 		_sceneState[a->variable] = !_sceneState[a->variable];
+	else if (a->command == "CHECK")
+		return _sceneState[a->variable];
+	else if (a->command == "NCHECK")
+		return !_sceneState[a->variable];
 	else
 		error("Invalid command %s", a->command.c_str());
+	return true;
 }
 
 void HypnoEngine::runPlay(Play *a) {
@@ -144,6 +157,10 @@ void HypnoEngine::runChangeLevel(ChangeLevel *a) {
 }
 
 void HypnoEngine::runTalk(Talk *a) {
+	//_videosPlaying.clear();
+	//_nextParallelVideoToPlay.clear();
+	//_nextSequentialVideoToPlay.clear();
+
 	_conversation.push_back(a);
 	_refreshConversation = true;
 }
diff --git a/engines/hypno/arcade.cpp b/engines/hypno/arcade.cpp
index dffb769a12..ef5c59b6e9 100644
--- a/engines/hypno/arcade.cpp
+++ b/engines/hypno/arcade.cpp
@@ -89,6 +89,19 @@ ShootSequence HypnoEngine::parseShootList(const Common::String &filename, const
 	return seq;
 }
 
+void HypnoEngine::loadArcadeLevel(const Common::String &current, const Common::String &next, const Common::String &prefix) {
+	Common::String arclevel = current + _difficulty + ".mi_";
+	debugC(1, kHypnoDebugParser, "Parsing %s", arclevel.c_str());
+	Common::String arc;
+	Common::String list;
+	splitArcadeFile(arclevel, arc, list);
+	debug("%s", arc.c_str());
+	parseArcadeShooting("", arclevel, arc);
+	_levels[arclevel].arcade.shootSequence = parseShootList(arclevel, list);
+	_levels[arclevel].arcade.prefix = prefix;
+	_levels[arclevel].arcade.levelIfWin = next + _difficulty + ".mi_";;
+}
+
 void HypnoEngine::drawPlayer() { error("Function \"%s\" not implemented", __FUNCTION__); }
 void HypnoEngine::drawHealth() { error("Function \"%s\" not implemented", __FUNCTION__); }
 void HypnoEngine::drawShoot(const Common::Point &target) { error("Function \"%s\" not implemented", __FUNCTION__); }
@@ -100,7 +113,7 @@ void HypnoEngine::hitPlayer() {
 }
 
 void HypnoEngine::runArcade(ArcadeShooting &arc) {
-
+	_arcadeMode = arc.mode;
 	Common::Point mousePos;
 	Common::List<uint32> shootsToRemove;
 	ShootSequence shootSequence = arc.shootSequence;
@@ -115,7 +128,7 @@ void HypnoEngine::runArcade(ArcadeShooting &arc) {
 	_shoots.clear();
 	_playerFrames = decodeFrames(arc.player);
 	_playerFrameSep = 0;
-
+	_playerPosition = 0;
 
 	for (Frames::iterator it =_playerFrames.begin(); it != _playerFrames.end(); ++it) {
 		if ((*it)->getPixel(0, 0) == _pixelFormat.RGBToColor(0, 255, 255))
@@ -126,9 +139,11 @@ void HypnoEngine::runArcade(ArcadeShooting &arc) {
 		_playerFrameSep++;
 	}
 
-	if (_playerFrameSep == (int)_playerFrames.size())
-		error("No player separator frame found!");
-	debugC(1, kHypnoDebugArcade, "Separator frame found at %d", _playerFrameSep);
+	if (_playerFrameSep == (int)_playerFrames.size()) {
+		debugC(1, kHypnoDebugArcade, "No player separator frame found in %s! (size: %d)", arc.player.c_str(), _playerFrames.size());
+		//_playerFrameSep = -1;
+	} else 
+		debugC(1, kHypnoDebugArcade, "Separator frame found at %d", _playerFrameSep);
 
 	_playerFrameIdx = -1;
 
@@ -136,12 +151,14 @@ void HypnoEngine::runArcade(ArcadeShooting &arc) {
 
 	changeCursor("arcade");
 	playVideo(background);
+	background.decoder->setRate(1.5);
 	bool shootingPrimary = false;
 	bool shootingSecondary = false;
+	bool needsUpdate = true;
 
 	Common::Event event;
 	while (!shouldQuit()) {
-
+		needsUpdate = background.decoder->needsUpdate();
 		while (g_system->getEventManager()->pollEvent(event)) {
 			mousePos = g_system->getEventManager()->getMousePos();
 			// Events
@@ -156,6 +173,14 @@ void HypnoEngine::runArcade(ArcadeShooting &arc) {
 					background.decoder->pauseVideo(true);
 					showCredits();
 					background.decoder->pauseVideo(false);
+				} else if (event.kbd.keycode == Common::KEYCODE_LEFT) {
+					_playerPosition = 0;
+				} else if (event.kbd.keycode == Common::KEYCODE_DOWN) {
+					_playerPosition = 3;
+				} else if (event.kbd.keycode == Common::KEYCODE_RIGHT) {
+					_playerPosition = 7;
+				} else if (event.kbd.keycode == Common::KEYCODE_UP) {
+					_playerPosition = 11;
 				}
 				break;
 
@@ -182,17 +207,9 @@ void HypnoEngine::runArcade(ArcadeShooting &arc) {
 			}
 		}
 
-		if (background.decoder->needsUpdate()) {
+		if (needsUpdate) {
 			drawScreen();
 			updateScreen(background);
-			if (shootingPrimary || shootingSecondary) {
-				shoot(mousePos);
-				drawShoot(mousePos);
-				shootingPrimary = false;
-			}
-
-			drawPlayer();
-			drawHealth();
 		}
 
 		if (_health <= 0) {
@@ -257,7 +274,7 @@ void HypnoEngine::runArcade(ArcadeShooting &arc) {
 				} else if (frame > 0 && frame >= (int)(it->video->decoder->getFrameCount() - 2)) {
 					skipVideo(*it->video);
 					shootsToRemove.push_back(i);
-				} else if (it->video->decoder->needsUpdate()) {
+				} else if (it->video->decoder->needsUpdate() && needsUpdate) {
 					updateScreen(*it->video);
 				}
 			}
@@ -276,6 +293,17 @@ void HypnoEngine::runArcade(ArcadeShooting &arc) {
 			playSound(_music, 1);
 		}
 
+		if (needsUpdate) {
+			if (shootingPrimary || shootingSecondary) {
+				shoot(mousePos);
+				drawShoot(mousePos);
+				shootingPrimary = false;
+			}
+
+			drawPlayer();
+			drawHealth();
+		}
+
 		g_system->delayMillis(10);
 	}
 
diff --git a/engines/hypno/grammar.h b/engines/hypno/grammar.h
index 4c11e96e05..2d9af09bea 100644
--- a/engines/hypno/grammar.h
+++ b/engines/hypno/grammar.h
@@ -130,15 +130,19 @@ public:
 
 class Background : public Action {
 public:
-	Background(Filename path_, Common::Point origin_, Common::String condition_) {
+	Background(Filename path_, Common::Point origin_, Common::String condition_, Common::String flag1_, Common::String flag2_) {
 		type = BackgroundAction;
 		path = path_;
 		origin = origin_;
 		condition = condition_;
+		flag1 = flag1_;
+		flag2 = flag2_;
 	}
 	Filename path;
 	Common::Point origin;
 	Common::String condition;
+	Common::String flag1;
+	Common::String flag2;
 };
 
 class Overlay : public Action {
@@ -254,8 +258,10 @@ public:
 	TalkCommands commands;
 	bool active;
 	Filename background;
-	Common::Point position;
+	Common::Point backgroundPos;
 	Common::Rect rect;
+	Filename second;
+	Common::Point secondPos;
 };
 
 class ChangeLevel : public Action {
@@ -324,6 +330,7 @@ public:
 class ArcadeShooting {
 public:
 	uint32 id;
+	Common::String mode;
 	Common::String levelIfWin;
 	Common::String levelIfLose;
 	Filename transitionVideo;
diff --git a/engines/hypno/grammar_arc.cpp b/engines/hypno/grammar_arc.cpp
index fdda3a3a85..69bcb4c34b 100644
--- a/engines/hypno/grammar_arc.cpp
+++ b/engines/hypno/grammar_arc.cpp
@@ -144,37 +144,38 @@ extern int HYPNO_ARC_debug;
     FILENAME = 259,
     BNTOK = 260,
     SNTOK = 261,
-    NUM = 262,
-    COMMENT = 263,
-    YXTOK = 264,
-    CTOK = 265,
-    DTOK = 266,
-    HTOK = 267,
-    HETOK = 268,
-    RETTOK = 269,
-    QTOK = 270,
-    ENCTOK = 271,
-    PTOK = 272,
-    FTOK = 273,
-    TTOK = 274,
-    TPTOK = 275,
-    ATOK = 276,
-    VTOK = 277,
-    OTOK = 278,
-    O1TOK = 279,
-    NTOK = 280,
-    RTOK = 281,
-    ITOK = 282,
-    ZTOK = 283,
-    FNTOK = 284,
-    NONETOK = 285,
-    A0TOK = 286,
-    K0TOK = 287,
-    P0TOK = 288,
-    WTOK = 289,
-    XTOK = 290,
-    CB3TOK = 291,
-    C02TOK = 292
+    KNTOK = 262,
+    YXTOK = 263,
+    NUM = 264,
+    COMMENT = 265,
+    CTOK = 266,
+    DTOK = 267,
+    HTOK = 268,
+    HETOK = 269,
+    RETTOK = 270,
+    QTOK = 271,
+    ENCTOK = 272,
+    PTOK = 273,
+    FTOK = 274,
+    TTOK = 275,
+    TPTOK = 276,
+    ATOK = 277,
+    VTOK = 278,
+    OTOK = 279,
+    O1TOK = 280,
+    NTOK = 281,
+    RTOK = 282,
+    ITOK = 283,
+    JTOK = 284,
+    ZTOK = 285,
+    FNTOK = 286,
+    NONETOK = 287,
+    A0TOK = 288,
+    P0TOK = 289,
+    WTOK = 290,
+    XTOK = 291,
+    CB3TOK = 292,
+    C02TOK = 293
   };
 #endif
 
@@ -188,7 +189,7 @@ union HYPNO_ARC_STYPE
 	char *s; /* string value */
 	int i;	 /* integer value */
 
-#line 192 "engines/hypno/grammar_arc.cpp" /* yacc.c:355  */
+#line 193 "engines/hypno/grammar_arc.cpp" /* yacc.c:355  */
 };
 
 typedef union HYPNO_ARC_STYPE HYPNO_ARC_STYPE;
@@ -205,7 +206,7 @@ int HYPNO_ARC_parse (void);
 
 /* Copy the second part of user declarations.  */
 
-#line 209 "engines/hypno/grammar_arc.cpp" /* yacc.c:358  */
+#line 210 "engines/hypno/grammar_arc.cpp" /* yacc.c:358  */
 
 #ifdef short
 # undef short
@@ -445,23 +446,23 @@ union yyalloc
 #endif /* !YYCOPY_NEEDED */
 
 /* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  26
+#define YYFINAL  6
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   105
+#define YYLAST   123
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  38
+#define YYNTOKENS  39
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  7
+#define YYNNTS  8
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  48
+#define YYNRULES  65
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  111
+#define YYNSTATES  131
 
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   292
+#define YYMAXUTOK   293
 
 #define YYTRANSLATE(YYX)                                                \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -499,18 +500,20 @@ static const yytype_uint8 yytranslate[] =
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37
+      35,    36,    37,    38
 };
 
 #if HYPNO_ARC_DEBUG
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
-static const yytype_uint8 yyrline[] =
+static const yytype_uint16 yyrline[] =
 {
-       0,    76,    76,    77,    80,    81,    82,    85,    88,    89,
-      90,    91,    92,    93,    94,    95,   100,   105,   106,   110,
-     111,   115,   116,   126,   136,   137,   143,   144,   147,   148,
-     149,   152,   157,   162,   167,   171,   175,   179,   180,   181,
-     185,   186,   189,   190,   191,   192,   196,   203,   204
+       0,    76,    76,    76,    77,    80,    81,    82,    85,    88,
+      89,    90,    91,    92,    93,    94,    95,   100,   105,   106,
+     110,   111,   115,   116,   126,   136,   137,   138,   144,   145,
+     148,   149,   150,   153,   158,   163,   168,   172,   176,   180,
+     184,   188,   192,   196,   200,   204,   208,   212,   216,   220,
+     224,   228,   232,   235,   239,   240,   241,   246,   247,   250,
+     251,   252,   253,   257,   264,   265
 };
 #endif
 
@@ -520,11 +523,11 @@ static const yytype_uint8 yyrline[] =
 static const char *const yytname[] =
 {
   "$end", "error", "$undefined", "NAME", "FILENAME", "BNTOK", "SNTOK",
-  "NUM", "COMMENT", "YXTOK", "CTOK", "DTOK", "HTOK", "HETOK", "RETTOK",
-  "QTOK", "ENCTOK", "PTOK", "FTOK", "TTOK", "TPTOK", "ATOK", "VTOK",
-  "OTOK", "O1TOK", "NTOK", "RTOK", "ITOK", "ZTOK", "FNTOK", "NONETOK",
-  "A0TOK", "K0TOK", "P0TOK", "WTOK", "XTOK", "CB3TOK", "C02TOK", "$accept",
-  "start", "header", "hline", "enc", "body", "bline", YY_NULLPTR
+  "KNTOK", "YXTOK", "NUM", "COMMENT", "CTOK", "DTOK", "HTOK", "HETOK",
+  "RETTOK", "QTOK", "ENCTOK", "PTOK", "FTOK", "TTOK", "TPTOK", "ATOK",
+  "VTOK", "OTOK", "O1TOK", "NTOK", "RTOK", "ITOK", "JTOK", "ZTOK", "FNTOK",
+  "NONETOK", "A0TOK", "P0TOK", "WTOK", "XTOK", "CB3TOK", "C02TOK",
+  "$accept", "start", "$@1", "header", "hline", "enc", "body", "bline", YY_NULLPTR
 };
 #endif
 
@@ -536,14 +539,14 @@ static const yytype_uint16 yytoknum[] =
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
-     285,   286,   287,   288,   289,   290,   291,   292
+     285,   286,   287,   288,   289,   290,   291,   292,   293
 };
 # endif
 
-#define YYPACT_NINF -60
+#define YYPACT_NINF -72
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-60)))
+  (!!((Yystate) == (-72)))
 
 #define YYTABLE_NINF -1
 
@@ -554,18 +557,20 @@ static const yytype_uint16 yytoknum[] =
      STATE-NUM.  */
 static const yytype_int8 yypact[] =
 {
-       1,    26,     1,     3,     7,    10,    28,    35,    -3,    17,
-      26,    48,    49,    50,     0,    54,    52,    53,    55,    56,
-      57,    60,    61,    38,    26,   -60,   -60,   -60,    51,   -60,
-     -60,    62,    63,   -60,    64,    65,   -60,    66,    67,    68,
-      69,    70,    71,    72,   -60,   -60,   -60,    73,   -60,   -60,
-     -60,    74,    75,   -60,   -60,   -60,   -60,    76,   -60,   -60,
-     -60,   -60,    -5,   -60,   -60,   -60,    77,    79,    78,    81,
-      82,    -5,    86,    84,   -60,    85,    14,   -60,     4,    87,
-      88,    89,    90,    33,    -5,    91,    51,   -60,   -60,   -60,
-     -60,   -60,    92,    93,   -60,   -60,   -60,   -60,    94,    95,
-      96,   -60,   -60,   -60,   -60,   -60,   -60,   -60,   -60,   -60,
-     -60
+       1,   -72,     1,    13,    55,   -72,   -72,    11,    23,     8,
+      28,     2,   -26,    55,    29,    31,    35,    -1,    41,    38,
+      42,    44,    46,    58,    59,    60,    54,    55,   -72,    48,
+     -72,   -72,    63,    76,    77,   -72,    78,    79,   -72,    80,
+      81,    82,    83,    84,    85,    86,   -72,   -72,   -72,    87,
+     -72,   -72,   -72,    88,    89,    90,   -72,   -72,   -72,   -72,
+      92,   -72,   -72,   -72,   -72,    -5,   -72,   -72,   -72,   -72,
+      91,    97,    94,    95,    96,    98,    -5,   102,    99,   -72,
+     100,    30,   101,   -72,     0,   103,   104,   105,    75,    -5,
+     106,    48,   107,   -72,   -72,   -72,   -72,   -72,   108,   109,
+     -72,   -72,   -72,   -72,   -72,   -72,   -72,   -72,   -72,   -72,
+     -72,   -72,   -72,   -72,   -72,   -72,   -72,   -72,   -72,   110,
+     111,   -72,   -72,   -72,   -72,   -72,   -72,   -72,   -72,   -72,
+     -72
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -573,30 +578,32 @@ static const yytype_int8 yypact[] =
      means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
-       0,     6,     0,     0,     0,     0,     0,     0,     0,     0,
-       6,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     6,     3,     1,    22,    27,     7,
-       9,     0,     0,     5,     0,     0,     8,     0,     0,     0,
-       0,     0,     0,     0,    18,    19,    20,     0,     4,    26,
-      23,     0,     0,    21,    10,    16,    17,     0,    11,    12,
-      13,    14,    30,    25,    24,    15,     0,     0,     0,     0,
-       0,    30,     0,     0,    47,     0,     0,    48,     0,     0,
-       0,     0,     0,     0,    30,     0,    27,    42,    45,    43,
-      29,    33,     0,     0,    34,    35,    31,    32,     0,     0,
-       0,    44,     2,    28,    38,    46,    41,    37,    36,    39,
-      40
+       0,     2,     0,     0,     7,     4,     1,     0,     0,     0,
+       0,     0,     0,     7,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     7,    23,    29,
+       8,    10,     0,     0,     0,     6,     0,     0,     9,     0,
+       0,     0,     0,     0,     0,     0,    19,    20,    21,     0,
+       5,    28,    24,     0,     0,     0,    22,    11,    17,    18,
+       0,    12,    13,    14,    15,    32,    27,    26,    25,    16,
+       0,     0,     0,     0,     0,     0,    32,     0,     0,    64,
+       0,     0,     0,    65,     0,     0,     0,     0,     0,    32,
+       0,    29,     0,    59,    62,    60,    31,    35,     0,     0,
+      36,    37,    50,    39,    40,    42,    48,    47,    41,    51,
+      38,    46,    45,    49,    43,    44,    52,    33,    34,     0,
+       0,    61,     3,    30,    55,    63,    56,    58,    54,    53,
+      57
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int8 yypgoto[] =
 {
-     -60,   102,    -8,   -60,    19,   -59,   -60
+     -72,   119,   -72,     7,   -72,    32,   -71,   -72
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int8 yydefgoto[] =
 {
-      -1,     3,    23,    24,    50,    83,    84
+      -1,     3,     4,    26,    27,    52,    88,    89
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -604,70 +611,80 @@ static const yytype_int8 yydefgoto[] =
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_uint8 yytable[] =
 {
-      66,    67,    33,    26,    37,    68,    69,    70,    96,    71,
-       1,    27,    90,    72,    28,     2,    48,    94,    73,    95,
-      74,    75,    76,    77,    78,   103,    79,    80,    81,    82,
-      38,     4,     5,    31,    97,    29,     6,     7,     8,     9,
-      10,    11,    30,    12,    13,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    32,    34,    35,    36,    39,    40,
-      41,    44,    42,    43,    45,    46,    47,    49,   102,    51,
-      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
-      65,    63,    64,    86,    85,    87,     0,    62,    88,    89,
-      91,    92,    93,     0,    98,    99,   100,   101,   104,   106,
-     107,   108,   109,   110,    25,   105
+      70,    71,    72,    39,   117,    96,    73,    74,    75,     1,
+      76,    33,    34,     6,    77,    28,     2,    30,   123,    78,
+      35,    79,    80,    81,    82,    83,    84,    29,    85,    86,
+      87,    40,   118,   100,    50,   101,   102,    31,    36,    32,
+      37,   103,   104,   105,    38,    41,   106,    42,   107,   108,
+     109,    43,   110,    44,   111,    45,   112,   113,   114,   115,
+       7,     8,    46,    47,    48,    51,     9,    10,    11,    12,
+      13,    14,    53,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    49,    54,    55,    56,    57,    58,
+      59,    60,    61,    62,    63,    64,    69,    66,    67,    68,
+      90,    91,    65,    92,    93,    94,    97,    95,    98,    99,
+     116,   122,   119,   120,   121,   124,   126,   127,   128,   129,
+     130,     5,     0,   125
 };
 
 static const yytype_int8 yycheck[] =
 {
-       5,     6,    10,     0,     4,    10,    11,    12,     4,    14,
-       9,     4,    71,    18,     4,    14,    24,     3,    23,     5,
-      25,    26,    27,    28,    29,    84,    31,    32,    33,    34,
-      30,     5,     6,    36,    30,     7,    10,    11,    12,    13,
-      14,    15,     7,    17,    18,    19,    20,    21,    22,    23,
-      24,    25,    26,    27,    37,     7,     7,     7,     4,     7,
-       7,     4,     7,     7,     4,     4,    28,    16,    35,     7,
-       7,     7,     7,     7,     7,     7,     7,     7,     7,     7,
-       4,     7,     7,     4,     7,     7,    -1,    14,     7,     7,
-       4,     7,     7,    -1,     7,     7,     7,     7,     7,     7,
-       7,     7,     7,     7,     2,    86
+       5,     6,     7,     4,     4,    76,    11,    12,    13,     8,
+      15,    37,    38,     0,    19,     4,    15,     9,    89,    24,
+      13,    26,    27,    28,    29,    30,    31,     4,    33,    34,
+      35,    32,    32,     3,    27,     5,     6,     9,     9,    37,
+       9,    11,    12,    13,     9,     4,    16,     9,    18,    19,
+      20,     9,    22,     9,    24,     9,    26,    27,    28,    29,
+       5,     6,     4,     4,     4,    17,    11,    12,    13,    14,
+      15,    16,     9,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    30,     9,     9,     9,     9,     9,
+       9,     9,     9,     9,     9,     9,     4,     9,     9,     9,
+       9,     4,    15,     9,     9,     9,     4,     9,     9,     9,
+       9,    36,     9,     9,     9,     9,     9,     9,     9,     9,
+       9,     2,    -1,    91
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
      symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
-       0,     9,    14,    39,     5,     6,    10,    11,    12,    13,
-      14,    15,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    40,    41,    39,     0,     4,     4,     7,
-       7,    36,    37,    40,     7,     7,     7,     4,    30,     4,
-       7,     7,     7,     7,     4,     4,     4,    28,    40,    16,
-      42,     7,     7,     7,     7,     7,     7,     7,     7,     7,
-       7,     7,    14,     7,     7,     4,     5,     6,    10,    11,
-      12,    14,    18,    23,    25,    26,    27,    28,    29,    31,
-      32,    33,    34,    43,    44,     7,     4,     7,     7,     7,
-      43,     4,     7,     7,     3,     5,     4,    30,     7,     7,
-       7,     7,    35,    43,     7,    42,     7,     7,     7,     7,
-       7
+       0,     8,    15,    40,    41,    40,     0,     5,     6,    11,
+      12,    13,    14,    15,    16,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    28,    42,    43,     4,     4,
+       9,     9,    37,    37,    38,    42,     9,     9,     9,     4,
+      32,     4,     9,     9,     9,     9,     4,     4,     4,    30,
+      42,    17,    44,     9,     9,     9,     9,     9,     9,     9,
+       9,     9,     9,     9,     9,    15,     9,     9,     9,     4,
+       5,     6,     7,    11,    12,    13,    15,    19,    24,    26,
+      27,    28,    29,    30,    31,    33,    34,    35,    45,    46,
+       9,     4,     9,     9,     9,     9,    45,     4,     9,     9,
+       3,     5,     6,    11,    12,    13,    16,    18,    19,    20,
+      22,    24,    26,    27,    28,    29,     9,     4,    32,     9,
+       9,     9,    36,    45,     9,    44,     9,     9,     9,     9,
+       9
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
-       0,    38,    39,    39,    40,    40,    40,    41,    41,    41,
-      41,    41,    41,    41,    41,    41,    41,    41,    41,    41,
-      41,    41,    41,    41,    41,    41,    42,    42,    43,    43,
-      43,    44,    44,    44,    44,    44,    44,    44,    44,    44,
-      44,    44,    44,    44,    44,    44,    44,    44,    44
+       0,    39,    41,    40,    40,    42,    42,    42,    43,    43,
+      43,    43,    43,    43,    43,    43,    43,    43,    43,    43,
+      43,    43,    43,    43,    43,    43,    43,    43,    44,    44,
+      45,    45,    45,    46,    46,    46,    46,    46,    46,    46,
+      46,    46,    46,    46,    46,    46,    46,    46,    46,    46,
+      46,    46,    46,    46,    46,    46,    46,    46,    46,    46,
+      46,    46,    46,    46,    46,    46
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
 static const yytype_uint8 yyr2[] =
 {
-       0,     2,     6,     2,     2,     2,     0,     2,     2,     2,
-       3,     3,     3,     3,     3,     4,     3,     3,     2,     2,
-       2,     3,     2,     3,     4,     4,     1,     0,     2,     2,
-       0,     2,     2,     2,     2,     2,     3,     3,     3,     3,
-       3,     3,     2,     2,     2,     2,     3,     1,     1
+       0,     2,     0,     7,     2,     2,     2,     0,     2,     2,
+       2,     3,     3,     3,     3,     3,     4,     3,     3,     2,
+       2,     2,     3,     2,     3,     4,     4,     4,     1,     0,
+       2,     2,     0,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     3,     3,     3,     3,     3,     3,     2,
+       2,     2,     2,     3,     1,     1
 };
 
 
@@ -1343,113 +1360,119 @@ yyreduce:
   YY_REDUCE_PRINT (yyn);
   switch (yyn)
     {
-        case 7:
+        case 2:
+#line 76 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+    { g_parsedArc->mode = (yyvsp[0].s); }
+#line 1367 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+    break;
+
+  case 8:
 #line 85 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     {
 		g_parsedArc->id = (yyvsp[0].i); 
 		debugC(1, kHypnoDebugParser, "C %d", (yyvsp[0].i)); }
-#line 1352 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1375 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 8:
+  case 9:
 #line 88 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "F %d", (yyvsp[0].i)); }
-#line 1358 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1381 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 9:
+  case 10:
 #line 89 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "D %d", (yyvsp[0].i)); }
-#line 1364 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1387 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 10:
+  case 11:
 #line 90 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "P %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1370 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1393 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 11:
+  case 12:
 #line 91 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "A %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1376 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1399 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 12:
+  case 13:
 #line 92 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "V %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1382 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1405 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 13:
+  case 14:
 #line 93 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "O %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1388 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1411 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 14:
+  case 15:
 #line 94 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "O1 %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1394 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1417 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 15:
+  case 16:
 #line 95 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     {
 		g_parsedArc->transitionVideo = (yyvsp[-2].s);
 		g_parsedArc->transitionTime = (yyvsp[-1].i);
 		debugC(1, kHypnoDebugParser, "Tp %s %d %s", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].s)); 
 	}
-#line 1404 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1427 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 16:
+  case 17:
 #line 100 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { 
 		g_parsedArc->transitionVideo = (yyvsp[-1].s);
 		g_parsedArc->transitionTime = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "T %s %d", (yyvsp[-1].s), (yyvsp[0].i)); 
 	}
-#line 1414 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1437 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 17:
+  case 18:
 #line 105 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "T NONE %d", (yyvsp[0].i)); }
-#line 1420 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1443 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 18:
+  case 19:
 #line 106 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { 
 		g_parsedArc->background = (yyvsp[0].s); 
 		debugC(1, kHypnoDebugParser, "N %s", (yyvsp[0].s)); 
 	}
-#line 1429 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1452 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 19:
+  case 20:
 #line 110 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "R %s", (yyvsp[0].s)); }
-#line 1435 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1458 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 20:
+  case 21:
 #line 111 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { 
 		g_parsedArc->player = (yyvsp[0].s); 
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s)); 
 		}
-#line 1444 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1467 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 21:
+  case 22:
 #line 115 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "Q %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1450 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1473 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 22:
+  case 23:
 #line 116 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     {
 		if (Common::String("B0") == (yyvsp[-1].s))
@@ -1461,10 +1484,10 @@ yyreduce:
 
 		debugC(1, kHypnoDebugParser, "BN %s", (yyvsp[0].s)); 
 	}
-#line 1465 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1488 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 23:
+  case 24:
 #line 126 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     {
 		if (Common::String("S0") == (yyvsp[-2].s))
@@ -1476,145 +1499,286 @@ yyreduce:
 
 		debugC(1, kHypnoDebugParser, "SN %s", (yyvsp[-1].s)); 
 	}
-#line 1480 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1503 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 24:
+  case 25:
 #line 136 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "HE %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1486 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1509 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 25:
+  case 26:
 #line 137 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+    { debugC(1, kHypnoDebugParser, "HE %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
+#line 1515 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+    break;
+
+  case 27:
+#line 138 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { 
 		g_parsedArc->health = (yyvsp[-1].i);
 		debugC(1, kHypnoDebugParser, "H %d %d", (yyvsp[-1].i), (yyvsp[0].i)); 
 	}
-#line 1495 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1524 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 31:
-#line 152 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+  case 33:
+#line 153 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { 
 		shoot = new Shoot();
 		shoot->animation = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "FN %s", (yyvsp[0].s)); 
 	}
-#line 1505 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1534 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 32:
-#line 157 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+  case 34:
+#line 158 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { 
 		shoot = new Shoot();
 		shoot->animation = "NONE";
 		debugC(1, kHypnoDebugParser, "FN NONE"); 
 	}
-#line 1515 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1544 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 33:
-#line 162 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+  case 35:
+#line 163 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { 
 		shoot = new Shoot();
 		shoot->animation = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "FN %s", (yyvsp[0].s)); 
 	}
-#line 1525 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1554 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 34:
-#line 167 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+  case 36:
+#line 168 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { 
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s)); 
 	}
-#line 1534 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1563 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 35:
-#line 171 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+  case 37:
+#line 172 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     {  // Workaround for NAME == B1
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s)); 
 	}
-#line 1543 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1572 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 36:
-#line 175 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+  case 38:
+#line 176 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+    { // Workaround for NAME == A
+		shoot->name = "A";
+		debugC(1, kHypnoDebugParser, "I A"); 
+	}
+#line 1581 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+    break;
+
+  case 39:
+#line 180 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+    { // Workaround for NAME == C
+		shoot->name = "C";
+		debugC(1, kHypnoDebugParser, "I C"); 
+	}
+#line 1590 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+    break;
+
+  case 40:
+#line 184 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+    { // Workaround for NAME == D
+		shoot->name = "D";
+		debugC(1, kHypnoDebugParser, "I D"); 
+	}
+#line 1599 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+    break;
+
+  case 41:
+#line 188 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+    { // Workaround for NAME == F
+		shoot->name = "F";
+		debugC(1, kHypnoDebugParser, "I F"); 
+	}
+#line 1608 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+    break;
+
+  case 42:
+#line 192 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+    { // Workaround for NAME == H
+		shoot->name = "H";
+		debugC(1, kHypnoDebugParser, "I H"); 
+	}
+#line 1617 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+    break;
+
+  case 43:
+#line 196 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+    { // Workaround for NAME == I
+		shoot->name = "I";
+		debugC(1, kHypnoDebugParser, "I I"); 
+	}
+#line 1626 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+    break;
+
+  case 44:
+#line 200 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+    { // Workaround for NAME == I
+		shoot->name = "J";
+		debugC(1, kHypnoDebugParser, "I J"); 
+	}
+#line 1635 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+    break;
+
+  case 45:
+#line 204 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+    { // Workaround for NAME == N
+		shoot->name = "N";
+		debugC(1, kHypnoDebugParser, "I N"); 
+	}
+#line 1644 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+    break;
+
+  case 46:
+#line 208 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+    { // Workaround for NAME == O
+		shoot->name = "O";
+		debugC(1, kHypnoDebugParser, "I O"); 
+	}
+#line 1653 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+    break;
+
+  case 47:
+#line 212 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+    { // Workaround for NAME == P
+		shoot->name = "P";
+		debugC(1, kHypnoDebugParser, "I P"); 
+	}
+#line 1662 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+    break;
+
+  case 48:
+#line 216 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+    { // Workaround for NAME == Q
+		shoot->name = "Q";
+		debugC(1, kHypnoDebugParser, "I Q"); 
+	}
+#line 1671 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+    break;
+
+  case 49:
+#line 220 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+    { // Workaround for NAME == R
+		shoot->name = "R";
+		debugC(1, kHypnoDebugParser, "I R"); 
+	}
+#line 1680 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+    break;
+
+  case 50:
+#line 224 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+    {  // Workaround for NAME == S1
+		shoot->name = (yyvsp[0].s);
+		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s)); 
+	}
+#line 1689 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+    break;
+
+  case 51:
+#line 228 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+    { // Workaround for NAME == T
+		shoot->name = "T";
+		debugC(1, kHypnoDebugParser, "I T"); 
+	}
+#line 1698 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+    break;
+
+  case 52:
+#line 232 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+    {
+		debugC(1, kHypnoDebugParser, "J %d", (yyvsp[0].i)); 
+	}
+#line 1706 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+    break;
+
+  case 53:
+#line 235 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { 
 		shoot->position = Common::Point((yyvsp[-1].i), (yyvsp[0].i));
 		debugC(1, kHypnoDebugParser, "A0 %d %d", (yyvsp[-1].i), (yyvsp[0].i)); 
 	}
-#line 1552 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1715 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 37:
-#line 179 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+  case 54:
+#line 239 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "R %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1558 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1721 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 38:
-#line 180 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+  case 55:
+#line 240 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "BN %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1564 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1727 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 39:
-#line 181 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+  case 56:
+#line 241 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { 
+		//if (Common::String("K0") == $1)
 		shoot->explosionFrame = (yyvsp[0].i);
-		debugC(1, kHypnoDebugParser, "K0 %d %d", (yyvsp[-1].i), (yyvsp[0].i));
+		debugC(1, kHypnoDebugParser, "KN %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1573 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1737 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 40:
-#line 185 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+  case 57:
+#line 246 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "P0 %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1579 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1743 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 41:
-#line 186 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+  case 58:
+#line 247 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { 
 		debugC(1, kHypnoDebugParser, "O %d %d", (yyvsp[-1].i), (yyvsp[0].i)); 
 	}
-#line 1587 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1751 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 42:
-#line 189 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+  case 59:
+#line 250 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "C %d", (yyvsp[0].i)); }
-#line 1593 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1757 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 43:
-#line 190 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+  case 60:
+#line 251 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "H %d", (yyvsp[0].i)); }
-#line 1599 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1763 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 44:
-#line 191 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+  case 61:
+#line 252 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "W %d", (yyvsp[0].i)); }
-#line 1605 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1769 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 45:
-#line 192 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+  case 62:
+#line 253 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { 
 		shoot->damage = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "D %d", (yyvsp[0].i)); 
 	}
-#line 1614 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1778 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 46:
-#line 196 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+  case 63:
+#line 257 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { 
 		if (Common::String("S1") == (yyvsp[-2].s))
 			shoot->endSound = (yyvsp[-1].s);
@@ -1622,28 +1786,28 @@ yyreduce:
 		//	shoot->startSound = $2;
 		 
 		debugC(1, kHypnoDebugParser, "SN %s", (yyvsp[-1].s)); }
-#line 1626 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1790 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 47:
-#line 203 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+  case 64:
+#line 264 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "N"); }
-#line 1632 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1796 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
-  case 48:
-#line 204 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
+  case 65:
+#line 265 "engines/hypno/grammar_arc.y" /* yacc.c:1646  */
     {
 		g_parsedArc->shoots.push_back(*shoot); 
 		//delete shoot; 
 		//shoot = nullptr;
 		debugC(1, kHypnoDebugParser, "Z"); 
 	}
-#line 1643 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1807 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
     break;
 
 
-#line 1647 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
+#line 1811 "engines/hypno/grammar_arc.cpp" /* yacc.c:1646  */
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
diff --git a/engines/hypno/grammar_arc.y b/engines/hypno/grammar_arc.y
index 522b8e4b40..4ae9028807 100644
--- a/engines/hypno/grammar_arc.y
+++ b/engines/hypno/grammar_arc.y
@@ -56,14 +56,14 @@ using namespace Hypno;
 	int i;	 /* integer value */
 }
 
-%token<s> NAME FILENAME BNTOK SNTOK
+%token<s> NAME FILENAME BNTOK SNTOK KNTOK YXTOK
 %token<i> NUM
 // header
-%token COMMENT YXTOK CTOK DTOK HTOK HETOK RETTOK QTOK ENCTOK
-%token PTOK FTOK TTOK TPTOK ATOK VTOK OTOK O1TOK NTOK RTOK ITOK ZTOK
+%token COMMENT CTOK DTOK HTOK HETOK RETTOK QTOK ENCTOK
+%token PTOK FTOK TTOK TPTOK ATOK VTOK OTOK O1TOK NTOK RTOK ITOK JTOK ZTOK
 
 // body
-%token FNTOK NONETOK A0TOK K0TOK P0TOK WTOK
+%token FNTOK NONETOK A0TOK P0TOK WTOK
 
 // end
 %token XTOK
@@ -73,7 +73,7 @@ using namespace Hypno;
 
 %%
 
-start: YXTOK header ZTOK RETTOK body XTOK
+start: YXTOK { g_parsedArc->mode = $1; } header ZTOK RETTOK body XTOK
 	| RETTOK start
 	;
 
@@ -134,6 +134,7 @@ hline: 	CTOK NUM {
 		debugC(1, kHypnoDebugParser, "SN %s", $2); 
 	}
 	| HETOK C02TOK NUM NUM { debugC(1, kHypnoDebugParser, "HE %d %d", $3, $4); }
+	| HETOK CB3TOK NUM NUM { debugC(1, kHypnoDebugParser, "HE %d %d", $3, $4); }
 	| HTOK CB3TOK NUM NUM { 
 		g_parsedArc->health = $3;
 		debugC(1, kHypnoDebugParser, "H %d %d", $3, $4); 
@@ -172,15 +173,75 @@ bline: FNTOK FILENAME {
 		shoot->name = $2;
 		debugC(1, kHypnoDebugParser, "I %s", $2); 
 	}
+	| ITOK ATOK  { // Workaround for NAME == A
+		shoot->name = "A";
+		debugC(1, kHypnoDebugParser, "I A"); 
+	}
+	| ITOK CTOK  { // Workaround for NAME == C
+		shoot->name = "C";
+		debugC(1, kHypnoDebugParser, "I C"); 
+	}
+	| ITOK DTOK  { // Workaround for NAME == D
+		shoot->name = "D";
+		debugC(1, kHypnoDebugParser, "I D"); 
+	}
+	| ITOK FTOK  { // Workaround for NAME == F
+		shoot->name = "F";
+		debugC(1, kHypnoDebugParser, "I F"); 
+	}
+	| ITOK HTOK  { // Workaround for NAME == H
+		shoot->name = "H";
+		debugC(1, kHypnoDebugParser, "I H"); 
+	}
+	| ITOK ITOK  { // Workaround for NAME == I
+		shoot->name = "I";
+		debugC(1, kHypnoDebugParser, "I I"); 
+	}
+	| ITOK JTOK  { // Workaround for NAME == I
+		shoot->name = "J";
+		debugC(1, kHypnoDebugParser, "I J"); 
+	}
+	| ITOK NTOK  { // Workaround for NAME == N
+		shoot->name = "N";
+		debugC(1, kHypnoDebugParser, "I N"); 
+	}
+	| ITOK OTOK  { // Workaround for NAME == O
+		shoot->name = "O";
+		debugC(1, kHypnoDebugParser, "I O"); 
+	}
+	| ITOK PTOK  { // Workaround for NAME == P
+		shoot->name = "P";
+		debugC(1, kHypnoDebugParser, "I P"); 
+	}
+	| ITOK QTOK  { // Workaround for NAME == Q
+		shoot->name = "Q";
+		debugC(1, kHypnoDebugParser, "I Q"); 
+	}
+	| ITOK RTOK  { // Workaround for NAME == R
+		shoot->name = "R";
+		debugC(1, kHypnoDebugParser, "I R"); 
+	}
+	| ITOK SNTOK  {  // Workaround for NAME == S1
+		shoot->name = $2;
+		debugC(1, kHypnoDebugParser, "I %s", $2); 
+	}
+	| ITOK TTOK  { // Workaround for NAME == T
+		shoot->name = "T";
+		debugC(1, kHypnoDebugParser, "I T"); 
+	}
+	| JTOK NUM  {
+		debugC(1, kHypnoDebugParser, "J %d", $2); 
+	}
 	| A0TOK NUM NUM { 
 		shoot->position = Common::Point($2, $3);
 		debugC(1, kHypnoDebugParser, "A0 %d %d", $2, $3); 
 	}
 	| RTOK NUM NUM  { debugC(1, kHypnoDebugParser, "R %d %d", $2, $3); }
 	| BNTOK NUM NUM { debugC(1, kHypnoDebugParser, "BN %d %d", $2, $3); }
-	| K0TOK NUM NUM { 
+	| KNTOK NUM NUM { 
+		//if (Common::String("K0") == $1)
 		shoot->explosionFrame = $3;
-		debugC(1, kHypnoDebugParser, "K0 %d %d", $2, $3);
+		debugC(1, kHypnoDebugParser, "KN %d %d", $2, $3);
 	}
 	| P0TOK NUM NUM { debugC(1, kHypnoDebugParser, "P0 %d %d", $2, $3); }
 	| OTOK NUM NUM { 
diff --git a/engines/hypno/grammar_mis.cpp b/engines/hypno/grammar_mis.cpp
index b247ff427f..aee1000be4 100644
--- a/engines/hypno/grammar_mis.cpp
+++ b/engines/hypno/grammar_mis.cpp
@@ -153,41 +153,42 @@ extern int HYPNO_MIS_debug;
     HOTSTOK = 265,
     CUTSTOK = 266,
     BACKTOK = 267,
-    RETTOK = 268,
-    TIMETOK = 269,
-    PALETOK = 270,
-    BBOXTOK = 271,
-    OVERTOK = 272,
-    WALNTOK = 273,
-    MICETOK = 274,
-    PLAYTOK = 275,
-    ENDTOK = 276,
-    MENUTOK = 277,
-    SMENTOK = 278,
-    ESCPTOK = 279,
-    NRTOK = 280,
-    AMBITOK = 281,
-    GLOBTOK = 282,
-    TONTOK = 283,
-    TOFFTOK = 284,
-    TALKTOK = 285,
-    INACTOK = 286,
-    FDTOK = 287,
-    BOXXTOK = 288,
-    ESCAPETOK = 289,
-    SECONDTOK = 290,
-    INTROTOK = 291,
-    DEFAULTTOK = 292,
-    PG = 293,
-    PA = 294,
-    PD = 295,
-    PH = 296,
-    PF = 297,
-    PE = 298,
-    PP = 299,
-    PI = 300,
-    PL = 301,
-    PS = 302
+    INTRTOK = 268,
+    RETTOK = 269,
+    TIMETOK = 270,
+    PALETOK = 271,
+    BBOXTOK = 272,
+    OVERTOK = 273,
+    WALNTOK = 274,
+    MICETOK = 275,
+    PLAYTOK = 276,
+    ENDTOK = 277,
+    MENUTOK = 278,
+    SMENTOK = 279,
+    ESCPTOK = 280,
+    NRTOK = 281,
+    AMBITOK = 282,
+    GLOBTOK = 283,
+    TONTOK = 284,
+    TOFFTOK = 285,
+    TALKTOK = 286,
+    INACTOK = 287,
+    FDTOK = 288,
+    BOXXTOK = 289,
+    ESCAPETOK = 290,
+    SECONDTOK = 291,
+    INTROTOK = 292,
+    DEFAULTTOK = 293,
+    PG = 294,
+    PA = 295,
+    PD = 296,
+    PH = 297,
+    PF = 298,
+    PE = 299,
+    PP = 300,
+    PI = 301,
+    PL = 302,
+    PS = 303
   };
 #endif
 
@@ -201,7 +202,7 @@ union HYPNO_MIS_STYPE
 	char *s; /* string value */
 	int i;	 /* integer value */
 
-#line 205 "engines/hypno/grammar_mis.cpp" /* yacc.c:355  */
+#line 206 "engines/hypno/grammar_mis.cpp" /* yacc.c:355  */
 };
 
 typedef union HYPNO_MIS_STYPE HYPNO_MIS_STYPE;
@@ -218,7 +219,7 @@ int HYPNO_MIS_parse (void);
 
 /* Copy the second part of user declarations.  */
 
-#line 222 "engines/hypno/grammar_mis.cpp" /* yacc.c:358  */
+#line 223 "engines/hypno/grammar_mis.cpp" /* yacc.c:358  */
 
 #ifdef short
 # undef short
@@ -460,21 +461,21 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   107
+#define YYLAST   112
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  48
+#define YYNTOKENS  49
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  10
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  48
+#define YYNRULES  49
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  117
+#define YYNSTATES  121
 
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   302
+#define YYMAXUTOK   303
 
 #define YYTRANSLATE(YYX)                                                \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -513,7 +514,7 @@ static const yytype_uint8 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
+      45,    46,    47,    48
 };
 
 #if HYPNO_MIS_DEBUG
@@ -521,10 +522,10 @@ static const yytype_uint8 yytranslate[] =
 static const yytype_uint16 yyrline[] =
 {
        0,    74,    74,    77,    82,    83,    87,    99,   105,   120,
-     126,   127,   134,   141,   147,   153,   159,   166,   173,   179,
-     185,   191,   197,   200,   206,   209,   210,   214,   215,   216,
-     217,   218,   219,   225,   226,   232,   238,   244,   251,   258,
-     264,   265,   266,   269,   270,   273,   274,   277,   278
+     126,   127,   134,   141,   147,   153,   159,   166,   173,   180,
+     186,   192,   198,   204,   207,   213,   216,   217,   221,   222,
+     223,   227,   228,   229,   235,   236,   242,   248,   254,   261,
+     268,   274,   279,   280,   283,   284,   287,   288,   291,   292
 };
 #endif
 
@@ -534,13 +535,14 @@ static const yytype_uint16 yyrline[] =
 static const char *const yytname[] =
 {
   "$end", "error", "$undefined", "NAME", "FILENAME", "FLAG", "COMMENT",
-  "GSSWITCH", "COMMAND", "NUM", "HOTSTOK", "CUTSTOK", "BACKTOK", "RETTOK",
-  "TIMETOK", "PALETOK", "BBOXTOK", "OVERTOK", "WALNTOK", "MICETOK",
-  "PLAYTOK", "ENDTOK", "MENUTOK", "SMENTOK", "ESCPTOK", "NRTOK", "AMBITOK",
-  "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", "alloctalk", "talk", "mflag", "flag", "gsswitch", YY_NULLPTR
+  "GSSWITCH", "COMMAND", "NUM", "HOTSTOK", "CUTSTOK", "BACKTOK", "INTRTOK",
+  "RETTOK", "TIMETOK", "PALETOK", "BBOXTOK", "OVERTOK", "WALNTOK",
+  "MICETOK", "PLAYTOK", "ENDTOK", "MENUTOK", "SMENTOK", "ESCPTOK", "NRTOK",
+  "AMBITOK", "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", "alloctalk", "talk", "mflag", "flag",
+  "gsswitch", YY_NULLPTR
 };
 #endif
 
@@ -553,14 +555,14 @@ static const yytype_uint16 yytoknum[] =
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296,   297,   298,   299,   300,   301,   302
+     295,   296,   297,   298,   299,   300,   301,   302,   303
 };
 # endif
 
-#define YYPACT_NINF -71
+#define YYPACT_NINF -75
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-71)))
+  (!!((Yystate) == (-75)))
 
 #define YYTABLE_NINF -1
 
@@ -571,18 +573,19 @@ static const yytype_uint16 yytoknum[] =
      STATE-NUM.  */
 static const yytype_int8 yypact[] =
 {
-     -71,     5,    62,   -71,   -10,     8,     9,   -71,    10,    13,
-      14,    16,    18,    19,     1,    23,   -71,   -71,    25,    20,
-     -71,   -71,    62,    21,   -71,    22,   -71,   -71,    28,    29,
-      30,    31,   -71,   -71,    23,    33,    40,    24,   -71,    35,
-      37,    38,    39,   -71,    41,   -71,    42,   -71,    45,    24,
-      24,    43,   -71,    74,    83,    86,    24,    24,    24,    24,
-      24,   -71,    82,    84,    24,    24,   -71,    85,    26,    27,
-      26,    26,    27,    87,   -71,   -71,    88,    89,    90,    91,
-     -71,   -71,   -71,   -71,   -71,    92,    93,   -71,   -71,    94,
-     -71,    27,   -71,   -71,    27,    27,   -71,    95,   -71,    96,
-      97,    98,    24,    24,   -71,    27,   -71,   -71,    26,   -71,
-     -71,   -71,   -71,   -71,   -71,    27,   -71
+     -75,     5,    63,   -75,   -11,     8,     9,    10,   -75,    11,
+      13,    14,    15,    18,    19,    12,    25,   -75,   -75,    23,
+      22,   -75,   -75,    63,    21,   -75,    28,    29,   -75,   -75,
+      30,    31,    33,    34,   -75,   -75,    25,    35,    43,    24,
+     -75,    38,    39,    40,    41,    42,   -75,    44,   -75,    71,
+     -75,    27,    24,    24,    80,   -75,    48,    88,    89,    24,
+      24,    24,    24,    24,   -75,    86,    87,    24,    24,   -75,
+      90,    26,   -75,    92,    26,    26,    92,    91,   -75,   -75,
+      93,    94,    95,    96,   -75,   -75,   -75,   -75,   -75,    97,
+      98,   -75,   -75,    99,   -75,    92,   -75,   -75,    92,    92,
+     -75,   100,   -75,   101,   102,   103,    24,    24,   -75,    92,
+     -75,   -75,    26,   -75,   -75,   -75,   -75,   -75,   -75,    92,
+     -75
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -590,30 +593,31 @@ static const yytype_int8 yypact[] =
      means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
-       3,     0,     5,     1,     0,     0,     0,    22,     0,     0,
-       0,     0,     0,     0,     0,    44,     8,     9,     0,     0,
-      23,     2,     5,     0,    17,     0,    10,    16,     0,     0,
-       0,     0,    21,    43,    44,     0,     0,    42,     4,     0,
-       0,     0,     0,    19,     0,     6,     0,    12,     0,    42,
-      42,     0,    28,     0,     0,     0,    42,    42,    42,    42,
-      42,    41,     0,     0,    42,    42,    20,     0,    48,    46,
-      48,    48,    46,     0,    24,    25,     0,     0,     0,     0,
-      32,    35,    36,    33,    34,     0,     0,    40,    39,     0,
-      47,    46,    45,    15,    46,    46,    13,     0,    27,     0,
-       0,     0,    42,    42,     7,    46,    18,    14,    48,    29,
-      30,    31,    37,    38,    11,    46,    26
+       3,     0,     5,     1,     0,     0,     0,     0,    23,     0,
+       0,     0,     0,     0,     0,     0,    45,     8,     9,     0,
+       0,    24,     2,     5,     0,    18,     0,     0,    10,    16,
+       0,     0,     0,     0,    22,    44,    45,     0,     0,    43,
+       4,     0,     0,     0,     0,     0,    20,     0,     6,     0,
+      12,     0,    43,    43,     0,    29,     0,     0,     0,    43,
+      43,    43,    43,    43,    42,     0,     0,    43,    43,    21,
+       0,    49,    17,    47,    49,    49,    47,     0,    25,    26,
+       0,     0,     0,     0,    33,    36,    37,    34,    35,     0,
+       0,    41,    40,     0,    48,    47,    46,    15,    47,    47,
+      13,     0,    28,     0,     0,     0,    43,    43,     7,    47,
+      19,    14,    49,    30,    31,    32,    38,    39,    11,    47,
+      27
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int8 yypgoto[] =
 {
-     -71,   -71,   -71,     6,   -71,   -71,   -49,     0,   -70,   -67
+     -75,   -75,   -75,    75,   -75,   -75,   -52,    -4,   -74,   -71
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int8 yydefgoto[] =
 {
-      -1,     1,     2,    21,    22,    37,    66,    34,    93,    91
+      -1,     1,     2,    22,    23,    39,    69,    36,    97,    95
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -621,70 +625,73 @@ static const yytype_int8 yydefgoto[] =
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_uint8 yytable[] =
 {
-      74,    75,    96,    94,    95,     3,    23,    80,    81,    82,
-      83,    84,    24,    25,    32,    87,    88,    27,    28,    26,
-      29,   105,    30,    31,   106,   107,    33,    36,    38,    35,
-      39,    40,    92,    90,    45,   114,    48,    41,    42,    43,
-      44,   115,    46,    47,    67,   116,    68,    69,    70,    73,
-      71,    72,    76,   112,   113,    49,    50,    51,    52,    53,
-      54,    55,    56,    57,    58,    59,    60,    61,    62,    63,
-      64,    65,     4,     5,     6,     7,     8,     9,    77,    10,
-      11,    12,    13,    14,    15,    16,    17,    78,    18,    19,
-      79,    85,    20,    86,    89,     0,    97,    98,    99,   100,
-     101,   102,   103,   104,   108,   109,   110,   111
+      78,    79,   100,    98,    99,     3,    24,    84,    85,    86,
+      87,    88,    25,    26,    27,    91,    92,    29,    30,    31,
+      28,   109,    32,    33,   110,   111,    34,    37,    35,    38,
+      41,    77,    48,    94,     0,   118,    51,    42,    43,    44,
+      45,   119,    46,    47,    49,   120,    50,    70,    71,    72,
+      73,    74,    81,    75,   116,   117,    52,    53,    54,    55,
+      56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+      66,    67,    68,     4,     5,     6,     7,     8,     9,    10,
+      76,    11,    12,    13,    14,    15,    16,    17,    18,    80,
+      19,    20,    82,    83,    21,    89,    90,    96,    40,    93,
+     101,     0,   102,   103,   104,   105,   106,   107,   108,   112,
+     113,   114,   115
 };
 
 static const yytype_int8 yycheck[] =
 {
-      49,    50,    72,    70,    71,     0,    16,    56,    57,    58,
-      59,    60,     4,     4,    13,    64,    65,     4,     4,     9,
-       4,    91,     4,     4,    94,    95,     3,     7,    22,     4,
-       9,     9,     5,     7,    34,   105,    12,     9,     9,     9,
-       9,   108,     9,     3,     9,   115,     9,     9,     9,     4,
-       9,     9,     9,   102,   103,    31,    32,    33,    34,    35,
+      52,    53,    76,    74,    75,     0,    17,    59,    60,    61,
+      62,    63,     4,     4,     4,    67,    68,     4,     4,     4,
+       9,    95,     4,     4,    98,    99,    14,     4,     3,     7,
+       9,     4,    36,     7,    -1,   109,    12,     9,     9,     9,
+       9,   112,     9,     9,     9,   119,     3,     9,     9,     9,
+       9,     9,     4,     9,   106,   107,    32,    33,    34,    35,
       36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    47,    10,    11,    12,    13,    14,    15,     4,    17,
-      18,    19,    20,    21,    22,    23,    24,     4,    26,    27,
-       4,     9,    30,     9,     9,    -1,     9,     9,     9,     9,
-       9,     9,     9,     9,     9,     9,     9,     9
+      46,    47,    48,    10,    11,    12,    13,    14,    15,    16,
+       9,    18,    19,    20,    21,    22,    23,    24,    25,     9,
+      27,    28,     4,     4,    31,     9,     9,     5,    23,     9,
+       9,    -1,     9,     9,     9,     9,     9,     9,     9,     9,
+       9,     9,     9
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
      symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
-       0,    49,    50,     0,    10,    11,    12,    13,    14,    15,
-      17,    18,    19,    20,    21,    22,    23,    24,    26,    27,
-      30,    51,    52,    16,     4,     4,     9,     4,     4,     4,
-       4,     4,    13,     3,    55,     4,     7,    53,    51,     9,
-       9,     9,     9,     9,     9,    55,     9,     3,    12,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    47,    54,     9,     9,     9,
-       9,     9,     9,     4,    54,    54,     9,     4,     4,     4,
-      54,    54,    54,    54,    54,     9,     9,    54,    54,     9,
-       7,    57,     5,    56,    57,    57,    56,     9,     9,     9,
-       9,     9,     9,     9,     9,    56,    56,    56,     9,     9,
-       9,     9,    54,    54,    56,    57,    56
+       0,    50,    51,     0,    10,    11,    12,    13,    14,    15,
+      16,    18,    19,    20,    21,    22,    23,    24,    25,    27,
+      28,    31,    52,    53,    17,     4,     4,     4,     9,     4,
+       4,     4,     4,     4,    14,     3,    56,     4,     7,    54,
+      52,     9,     9,     9,     9,     9,     9,     9,    56,     9,
+       3,    12,    32,    33,    34,    35,    36,    37,    38,    39,
+      40,    41,    42,    43,    44,    45,    46,    47,    48,    55,
+       9,     9,     9,     9,     9,     9,     9,     4,    55,    55,
+       9,     4,     4,     4,    55,    55,    55,    55,    55,     9,
+       9,    55,    55,     9,     7,    58,     5,    57,    58,    58,
+      57,     9,     9,     9,     9,     9,     9,     9,     9,    57,
+      57,    57,     9,     9,     9,     9,    55,    55,    57,    58,
+      57
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
-       0,    48,    49,    50,    51,    51,    52,    52,    52,    52,
-      52,    52,    52,    52,    52,    52,    52,    52,    52,    52,
-      52,    52,    52,    53,    54,    54,    54,    54,    54,    54,
-      54,    54,    54,    54,    54,    54,    54,    54,    54,    54,
-      54,    54,    54,    55,    55,    56,    56,    57,    57
+       0,    49,    50,    51,    52,    52,    53,    53,    53,    53,
+      53,    53,    53,    53,    53,    53,    53,    53,    53,    53,
+      53,    53,    53,    53,    54,    55,    55,    55,    55,    55,
+      55,    55,    55,    55,    55,    55,    55,    55,    55,    55,
+      55,    55,    55,    55,    56,    56,    57,    57,    58,    58
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
 static const yytype_uint8 yyr2[] =
 {
        0,     2,     2,     0,     2,     0,     3,     6,     1,     1,
-       2,     7,     3,     5,     6,     5,     2,     2,     6,     3,
-       3,     2,     1,     0,     2,     2,     6,     3,     1,     4,
-       4,     4,     2,     2,     2,     2,     2,     4,     4,     2,
-       2,     1,     0,     1,     0,     1,     0,     1,     0
+       2,     7,     3,     5,     6,     5,     2,     4,     2,     6,
+       3,     3,     2,     1,     0,     2,     2,     6,     3,     1,
+       4,     4,     4,     2,     2,     2,     2,     2,     4,     4,
+       2,     2,     1,     0,     1,     0,     1,     0,     1,     0
 };
 
 
@@ -1366,7 +1373,7 @@ yyreduce:
 	smenu_idx.push_back(-1);
 	stack.push_back(new Hotspots());
 }
-#line 1370 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1377 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
   case 6:
@@ -1383,7 +1390,7 @@ yyreduce:
 		smenu_idx.pop_back();
 		smenu_idx.push_back(idx);
 	}
-#line 1387 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1394 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
   case 7:
@@ -1394,7 +1401,7 @@ yyreduce:
 		Hotspots *cur = stack.back();
 		cur->push_back(*hot); 
 	}
-#line 1398 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1405 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
   case 8:
@@ -1414,7 +1421,7 @@ yyreduce:
 		stack.push_back(hot->smenu);
 		debugC(1, kHypnoDebugParser, "SUBMENU"); 
 	}
-#line 1418 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1425 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
   case 9:
@@ -1425,25 +1432,25 @@ yyreduce:
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);
 		debugC(1, kHypnoDebugParser, "ESC SUBMENU"); }
-#line 1429 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1436 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
   case 10:
 #line 126 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "TIME %d", (yyvsp[0].i)); }
-#line 1435 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1442 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
   case 11:
 #line 127 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     {
-		Background *a = new Background((yyvsp[-5].s), Common::Point((yyvsp[-4].i), (yyvsp[-3].i)), (yyvsp[-2].s));
+		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();
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);
 		debugC(1, kHypnoDebugParser, "BACK");
 	}
-#line 1447 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1454 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
   case 12:
@@ -1455,7 +1462,7 @@ yyreduce:
 		hot->actions.push_back(a);
 		debugC(1, kHypnoDebugParser, "GLOB"); 
 	}
-#line 1459 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1466 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
   case 13:
@@ -1466,7 +1473,7 @@ yyreduce:
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);			
 		debugC(1, kHypnoDebugParser, "AMBI %d %d", (yyvsp[-2].i), (yyvsp[-1].i)); }
-#line 1470 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1477 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
   case 14:
@@ -1477,7 +1484,7 @@ yyreduce:
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);		  
 		debugC(1, kHypnoDebugParser, "PLAY %s.", (yyvsp[-4].s)); }
-#line 1481 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1488 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
   case 15:
@@ -1488,7 +1495,7 @@ yyreduce:
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);
 	}
-#line 1492 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1499 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
   case 16:
@@ -1500,11 +1507,23 @@ yyreduce:
 		hot->actions.push_back(a);
 		debugC(1, kHypnoDebugParser, "PALE");
 	}
-#line 1504 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1511 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
   case 17:
 #line 166 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+    { 
+		Cutscene *a = new Cutscene((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)); 
+	}
+#line 1523 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+    break;
+
+  case 18:
+#line 173 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { 
 		Cutscene *a = new Cutscene((yyvsp[0].s));
 		Hotspots *cur = stack.back();
@@ -1512,174 +1531,177 @@ yyreduce:
 		hot->actions.push_back(a);		  
 		debugC(1, kHypnoDebugParser, "CUTS %s", (yyvsp[0].s)); 
 	}
-#line 1516 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1535 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 18:
-#line 173 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 19:
+#line 180 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { 
 		WalN *a = new WalN((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);		  
 		debugC(1, kHypnoDebugParser, "WALN %s %d %d", (yyvsp[-4].s), (yyvsp[-3].i), (yyvsp[-2].i)); }
-#line 1527 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1546 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 19:
-#line 179 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 20:
+#line 186 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     {
 		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 1538 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1557 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 20:
-#line 185 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 21:
+#line 192 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { 
 		Hotspots *cur = stack.back();
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(talk_action);
 		talk_action = nullptr;
 		debugC(1, kHypnoDebugParser, "TALK"); }
-#line 1549 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1568 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 21:
-#line 191 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 22:
+#line 198 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { 
 		debugC(1, kHypnoDebugParser, "explicit END");
 		g_parsedHots = stack.back(); 
 		stack.pop_back();
 		smenu_idx.pop_back();
 	}
-#line 1560 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1579 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 22:
-#line 197 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 23:
+#line 204 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { debug("implicit END"); }
-#line 1566 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1585 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 23:
-#line 200 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 24:
+#line 207 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { 
 	assert(talk_action == nullptr);
 	talk_action = new Talk();
 	talk_action->active = true; 
 }
-#line 1576 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1595 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 24:
-#line 206 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 25:
+#line 213 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     {
 		talk_action->active = false; 
 		debugC(1, kHypnoDebugParser, "inactive"); }
-#line 1584 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1603 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 25:
-#line 209 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 26:
+#line 216 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "inactive"); }
-#line 1590 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1609 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 26:
-#line 210 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 27:
+#line 217 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { 
 		talk_action->background = (yyvsp[-4].s);
-		talk_action->position = Common::Point((yyvsp[-3].i), (yyvsp[-2].i));
+		talk_action->backgroundPos = Common::Point((yyvsp[-3].i), (yyvsp[-2].i));
 		debugC(1, kHypnoDebugParser, "BACK in TALK"); }
-#line 1599 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1618 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 27:
-#line 214 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 28:
+#line 221 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "BOXX %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1605 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1624 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 28:
-#line 215 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 29:
+#line 222 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "ESCAPE"); }
-#line 1611 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1630 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 29:
-#line 216 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
-    { debugC(1, kHypnoDebugParser, "SECOND %s %d %d", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1617 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+  case 30:
+#line 223 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+    {
+		talk_action->second = (yyvsp[-2].s);
+		talk_action->secondPos = Common::Point((yyvsp[-1].i), (yyvsp[0].i)); 
+		debugC(1, kHypnoDebugParser, "SECOND %s %d %d", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].i)); }
+#line 1639 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 30:
-#line 217 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 31:
+#line 227 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "INTRO %s %d %d", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1623 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1645 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 31:
-#line 218 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 32:
+#line 228 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "DEFAULT %s %d %d", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1629 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1651 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 32:
-#line 219 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 33:
+#line 229 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { 
 		TalkCommand talk_cmd;
 		talk_cmd.command = "G";
 		talk_cmd.path = (yyvsp[-1].s)+2;
 		talk_action->commands.push_back(talk_cmd); 
 		debugC(1, kHypnoDebugParser, "%s", (yyvsp[-1].s)); }
-#line 1640 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1662 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 33:
-#line 225 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 34:
+#line 235 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "%s", (yyvsp[-1].s)); }
-#line 1646 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1668 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 34:
-#line 226 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 35:
+#line 236 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { 
 		TalkCommand talk_cmd;
 		talk_cmd.command = "F";
 		talk_cmd.num = atoi((yyvsp[-1].s)+2)-1;
 		talk_action->commands.push_back(talk_cmd); 
 		debugC(1, kHypnoDebugParser, "%s", (yyvsp[-1].s)); }
-#line 1657 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1679 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 35:
-#line 232 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 36:
+#line 242 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { 
 		TalkCommand talk_cmd;
 		talk_cmd.command = "A";
 		talk_cmd.num = atoi((yyvsp[-1].s)+2)-1;
 		talk_action->commands.push_back(talk_cmd); 
 		debugC(1, kHypnoDebugParser, "|A%d", talk_cmd.num); }
-#line 1668 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1690 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 36:
-#line 238 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 37:
+#line 248 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { 
 		TalkCommand talk_cmd;
 		talk_cmd.command = "D";
 		talk_cmd.num = atoi((yyvsp[-1].s)+2)-1;
 		talk_action->commands.push_back(talk_cmd); 
 		debugC(1, kHypnoDebugParser, "%s", (yyvsp[-1].s)); }
-#line 1679 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1701 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 37:
-#line 244 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 38:
+#line 254 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { 
 		TalkCommand talk_cmd;
 		talk_cmd.command = "P";
@@ -1687,11 +1709,11 @@ yyreduce:
 		talk_cmd.position = Common::Point((yyvsp[-2].i), (yyvsp[-1].i));
 		talk_action->commands.push_back(talk_cmd);
 		debugC(1, kHypnoDebugParser, "%s %d %d", (yyvsp[-3].s), (yyvsp[-2].i), (yyvsp[-1].i)); }
-#line 1691 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1713 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 38:
-#line 251 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 39:
+#line 261 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { 
 		TalkCommand talk_cmd;
 		talk_cmd.command = "I";
@@ -1699,70 +1721,74 @@ yyreduce:
 		talk_cmd.position = Common::Point((yyvsp[-2].i), (yyvsp[-1].i));
 		talk_action->commands.push_back(talk_cmd);		  
 		debugC(1, kHypnoDebugParser, "%s %d %d", (yyvsp[-3].s), (yyvsp[-2].i), (yyvsp[-1].i)); }
-#line 1703 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1725 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 39:
-#line 258 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 40:
+#line 268 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { 
 		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 1714 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1736 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 40:
-#line 264 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
-    { debugC(1, kHypnoDebugParser, "|L"); }
-#line 1720 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+  case 41:
+#line 274 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+    { 
+		TalkCommand talk_cmd;
+		talk_cmd.command = "L";
+		talk_action->commands.push_back(talk_cmd);
+		debugC(1, kHypnoDebugParser, "|L"); }
+#line 1746 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 41:
-#line 265 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 42:
+#line 279 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { debugC(1, kHypnoDebugParser, "|E"); }
-#line 1726 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1752 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 43:
-#line 269 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 44:
+#line 283 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { (yyval.s) = (yyvsp[0].s); debugC(1, kHypnoDebugParser, "name: %s", (yyvsp[0].s)); }
-#line 1732 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1758 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 44:
-#line 270 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 45:
+#line 284 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { (yyval.s) = scumm_strdup(""); }
-#line 1738 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1764 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 45:
-#line 273 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 46:
+#line 287 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { (yyval.s) = (yyvsp[0].s); debugC(1, kHypnoDebugParser, "flag: %s", (yyvsp[0].s)); }
-#line 1744 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1770 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 46:
-#line 274 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 47:
+#line 288 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { (yyval.s) = scumm_strdup(""); }
-#line 1750 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1776 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 47:
-#line 277 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 48:
+#line 291 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { (yyval.s) = (yyvsp[0].s); debugC(1, kHypnoDebugParser, "switch %s", (yyvsp[0].s)); }
-#line 1756 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1782 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
-  case 48:
-#line 278 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
+  case 49:
+#line 292 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { (yyval.s) = scumm_strdup(""); }
-#line 1762 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1788 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
     break;
 
 
-#line 1766 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
+#line 1792 "engines/hypno/grammar_mis.cpp" /* yacc.c:1646  */
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
diff --git a/engines/hypno/grammar_mis.y b/engines/hypno/grammar_mis.y
index 99b0078994..6fc1010524 100644
--- a/engines/hypno/grammar_mis.y
+++ b/engines/hypno/grammar_mis.y
@@ -61,7 +61,7 @@ using namespace Hypno;
 
 %token<s> NAME FILENAME FLAG COMMENT GSSWITCH COMMAND
 %token<i> NUM
-%token HOTSTOK CUTSTOK BACKTOK RETTOK TIMETOK PALETOK BBOXTOK OVERTOK WALNTOK MICETOK PLAYTOK ENDTOK 
+%token HOTSTOK CUTSTOK BACKTOK INTRTOK RETTOK TIMETOK PALETOK BBOXTOK OVERTOK WALNTOK MICETOK PLAYTOK ENDTOK 
 %token MENUTOK SMENTOK ESCPTOK NRTOK AMBITOK
 %token GLOBTOK TONTOK TOFFTOK
 %token TALKTOK INACTOK FDTOK BOXXTOK ESCAPETOK SECONDTOK INTROTOK DEFAULTTOK
@@ -125,7 +125,7 @@ line: MENUTOK mflag mflag  {
 		debugC(1, kHypnoDebugParser, "ESC SUBMENU"); }
 	|  TIMETOK NUM  { debugC(1, kHypnoDebugParser, "TIME %d", $2); } 
 	|  BACKTOK FILENAME NUM NUM gsswitch flag flag {
-		Background *a = new Background($2, Common::Point($3, $4), $5);
+		Background *a = new Background($2, Common::Point($3, $4), $5, $6, $7);
 		Hotspots *cur = stack.back();
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);
@@ -163,6 +163,13 @@ line: MENUTOK mflag mflag  {
 		hot->actions.push_back(a);
 		debugC(1, kHypnoDebugParser, "PALE");
 	}
+	|  INTRTOK FILENAME NUM NUM { 
+		Cutscene *a = new Cutscene($2);
+		Hotspots *cur = stack.back();
+		Hotspot *hot = &cur->back();
+		hot->actions.push_back(a);
+		debugC(1, kHypnoDebugParser, "INTRO %s %d %d", $2, $3, $4); 
+	}
 	|  CUTSTOK FILENAME { 
 		Cutscene *a = new Cutscene($2);
 		Hotspots *cur = stack.back();
@@ -209,11 +216,14 @@ talk: INACTOK talk {
 	| FDTOK talk { debugC(1, kHypnoDebugParser, "inactive"); }
 	| BACKTOK FILENAME NUM NUM gsswitch flag { 
 		talk_action->background = $2;
-		talk_action->position = Common::Point($3, $4);
+		talk_action->backgroundPos = Common::Point($3, $4);
 		debugC(1, kHypnoDebugParser, "BACK in TALK"); }
 	| BOXXTOK NUM NUM { debugC(1, kHypnoDebugParser, "BOXX %d %d", $2, $3); }
 	| ESCAPETOK { debugC(1, kHypnoDebugParser, "ESCAPE"); }
-	| SECONDTOK FILENAME NUM NUM { debugC(1, kHypnoDebugParser, "SECOND %s %d %d", $2, $3, $4); }
+	| SECONDTOK FILENAME NUM NUM {
+		talk_action->second = $2;
+		talk_action->secondPos = Common::Point($3, $4); 
+		debugC(1, kHypnoDebugParser, "SECOND %s %d %d", $2, $3, $4); }
 	| INTROTOK FILENAME NUM NUM { debugC(1, kHypnoDebugParser, "INTRO %s %d %d", $2, $3, $4); }
 	| DEFAULTTOK FILENAME NUM NUM { debugC(1, kHypnoDebugParser, "DEFAULT %s %d %d", $2, $3, $4); }
 	| PG talk { 
@@ -261,7 +271,11 @@ talk: INACTOK talk {
 		talk_cmd.variable = $1+2;
 		talk_action->commands.push_back(talk_cmd);
 		debugC(1, kHypnoDebugParser, "%s", $1); }
-	| PL talk { debugC(1, kHypnoDebugParser, "|L"); }
+	| PL talk { 
+		TalkCommand talk_cmd;
+		talk_cmd.command = "L";
+		talk_action->commands.push_back(talk_cmd);
+		debugC(1, kHypnoDebugParser, "|L"); }
 	| PE { debugC(1, kHypnoDebugParser, "|E"); }
 	| /*nothing*/
 	;
diff --git a/engines/hypno/hypno.cpp b/engines/hypno/hypno.cpp
index 8d1d536b0d..81b0080f22 100644
--- a/engines/hypno/hypno.cpp
+++ b/engines/hypno/hypno.cpp
@@ -167,7 +167,7 @@ void HypnoEngine::runLevel(Common::String &name) {
 			MVideo v(_levels[name].arcade.intro, Common::Point(0, 0), false, true, false);
 			runIntro(v);
 		}
-		changeScreenMode("arcade");
+		changeScreenMode("320x200");
 		runArcade(_levels[name].arcade);
 	} else if (!_levels[name].code.name.empty()) {
 		debugC(1, kHypnoDebugScene, "Executing hardcoded level %s", name.c_str());
@@ -176,6 +176,7 @@ void HypnoEngine::runLevel(Common::String &name) {
 			MVideo v(_levels[name].arcade.intro, Common::Point(0, 0), false, true, false);
 			runIntro(v);
 		}
+		// Resolution depends on the game
 		runCode(_levels[name].code);
 	} else {
 		debugC(1, kHypnoDebugScene, "Executing scene level %s", name.c_str());
@@ -185,7 +186,7 @@ void HypnoEngine::runLevel(Common::String &name) {
 			MVideo v(_levels[name].scene.intro, Common::Point(0, 0), false, true, false);
 			runIntro(v);
 		}
-		changeScreenMode("scene");
+		changeScreenMode("640x480");
 		runScene(_levels[name].scene);
 	}
 }
@@ -225,7 +226,7 @@ void HypnoEngine::runIntro(MVideo &video) {
 	}
 }
 
-void HypnoEngine::runCode(Code code) { error("Function \"%s\" not implemented", __FUNCTION__); }
+void HypnoEngine::runCode(Code &code) { error("Function \"%s\" not implemented", __FUNCTION__); }
 void HypnoEngine::showCredits() { error("Function \"%s\" not implemented", __FUNCTION__); }
 
 void HypnoEngine::loadImage(const Common::String &name, int x, int y, bool transparent, int frameNumber) {
@@ -326,7 +327,7 @@ Frames HypnoEngine::decodeFrames(const Common::String &name) {
 
 void HypnoEngine::changeScreenMode(const Common::String &mode) {
 	debugC(1, kHypnoDebugMedia, "%s(%s)", __FUNCTION__, mode.c_str());
-	if (mode == "scene") {
+	if (mode == "640x480") {
 		_screenW = 640;
 		_screenH = 480;
 
@@ -341,7 +342,7 @@ void HypnoEngine::changeScreenMode(const Common::String &mode) {
 		_transparentColor = _pixelFormat.RGBToColor(0, 0x82, 0);
 		_compositeSurface->setTransparentColor(_transparentColor);
 
-	} else if (mode == "arcade") {
+	} else if (mode == "320x200") {
 		_screenW = 320;
 		_screenH = 200;
 
@@ -390,6 +391,7 @@ void HypnoEngine::updateScreen(MVideo &video) {
 void HypnoEngine::drawScreen() {
 	g_system->copyRectToScreen(_compositeSurface->getPixels(), _compositeSurface->pitch, 0, 0, _screenW, _screenH);
 	g_system->updateScreen();
+	g_system->delayMillis(10);
 }
 
 // Video handling
@@ -406,8 +408,11 @@ void HypnoEngine::playVideo(MVideo &video) {
 
 	file = fixSmackerHeader(file);
 
-	if (video.decoder != nullptr)
-		error("Video %s was not previously closed and deallocated", video.path.c_str());
+	if (video.decoder != nullptr) {
+		debugC(1, kHypnoDebugMedia, "Restarting %s!!!!", video.path.c_str());
+		delete video.decoder;
+	}
+	//error("Video %s was not previously closed and deallocated", video.path.c_str());
 
 	video.decoder = new HypnoSmackerDecoder();
 
diff --git a/engines/hypno/hypno.h b/engines/hypno/hypno.h
index a0164b345e..3780bb2b4d 100644
--- a/engines/hypno/hypno.h
+++ b/engines/hypno/hypno.h
@@ -96,6 +96,7 @@ public:
 	void parseScene(const Common::String &prefix, const Common::String &filename);
 	void parseArcadeShooting(const Common::String &prefix, const Common::String &name, const Common::String &data);
 	ShootSequence parseShootList(const Common::String &name, const Common::String &data);
+	void loadArcadeLevel(const Common::String &current, const Common::String &next, const Common::String &prefix);
 	LibFile *loadLib(const Filename &prefix, const Filename &filename, bool encrypted);
 
 	// User input
@@ -143,7 +144,7 @@ public:
 	void runPlay(Play *a);
 	void runAmbient(Ambient *a);
 	void runWalN(WalN *a);
-	void runGlobal(Global *a);
+	bool runGlobal(Global *a);
 	void runTalk(Talk *a);
 	void runChangeLevel(ChangeLevel *a);
 
@@ -173,6 +174,7 @@ public:
 	// Movies
 	Videos _nextSequentialVideoToPlay;
 	Videos _nextParallelVideoToPlay;
+	Videos _nextLoopingVideoToPlay;
 	Videos _videosPlaying;
 
 	// Sounds
@@ -184,6 +186,8 @@ public:
 	bool _noStopSounds;
 
 	// Arcade
+	Common::String _arcadeMode;
+	uint32 _playerPosition;
 	int detectTarget(const Common::Point &mousePos);
 	virtual bool clickedPrimaryShoot(const Common::Point &mousePos);
 	virtual bool clickedSecondaryShoot(const Common::Point &mousePos);
@@ -213,7 +217,7 @@ public:
 	virtual void leftClickedConversation(const Common::Point &mousePos);
 
 	// For some menus and hardcoded puzzles
-	virtual void runCode(Code code);
+	virtual void runCode(Code &code);
 
 	// Transitions
 	void runTransition(Transition trans);
@@ -247,11 +251,10 @@ public:
 	void drawShoot(const Common::Point &target) override;
 	void drawPlayer() override;
 	void drawHealth() override;
-	void runCode(Code code) override;
+	void runCode(Code &code) override;
 
 private:
-	void loadLevel(const Common::String &current, const Common::String &next, const Common::String &prefix);
-	void runMainMenu(Code code);
+	void runMainMenu(Code &code);
 };
 
 class SpiderEngine : public HypnoEngine {
@@ -264,14 +267,14 @@ public:
 	void drawShoot(const Common::Point &target) override;
 	void drawPlayer() override;
 	void drawHealth() override;
-	void runCode(Code code) override;
+	void runCode(Code &code) override;
 
 	void showConversation() override;
 	void rightClickedConversation(const Common::Point &mousePos) override;
 	void leftClickedConversation(const Common::Point &mousePos) override;
 
 private:
-	void runMatrix(Code code);
+	void runMatrix(Code &code);
 };
 
 class BoyzEngine : public HypnoEngine {
diff --git a/engines/hypno/lexer_arc.cpp b/engines/hypno/lexer_arc.cpp
index e09952bc02..3c9cb5e67f 100644
--- a/engines/hypno/lexer_arc.cpp
+++ b/engines/hypno/lexer_arc.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 38
-#define YY_END_OF_BUFFER 39
+#define YY_NUM_RULES 41
+#define YY_END_OF_BUFFER 42
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -642,14 +642,15 @@ struct yy_trans_info
 	flex_int32_t yy_verify;
 	flex_int32_t yy_nxt;
 	};
-static const flex_int16_t yy_accept[59] =
+static const flex_int16_t yy_accept[67] =
     {   0,
-        0,    0,   39,   37,   34,   36,   32,   32,   37,   31,
-       31,   37,    7,   29,    2,    3,   29,   21,    5,   13,
-       29,   11,    9,    6,   14,   12,   29,   18,    8,   16,
-       17,   29,   15,   29,   33,   36,   31,   31,    0,   30,
-       23,   29,   24,   20,    4,   25,   29,   10,   26,   22,
-       19,   27,   29,   28,   35,   29,    1,    0
+        0,    0,   42,   40,   37,   39,   35,   35,   40,   31,
+       31,   31,   40,    7,   32,    2,    3,   32,   22,    5,
+       13,   14,   32,   11,    9,    6,   15,   12,   32,   19,
+        8,   17,   18,   32,   16,   32,   36,   39,   31,   34,
+       31,   31,   31,    0,   33,   24,   32,   25,   21,    4,
+       26,   32,   10,   27,   23,   20,   28,   32,   30,   30,
+       29,   29,   38,   32,    1,    0
     } ;
 
 static const YY_CHAR yy_ec[256] =
@@ -661,18 +662,18 @@ static const YY_CHAR yy_ec[256] =
         1,    1,    1,    1,    6,    7,    1,    8,    9,   10,
        11,   11,   11,   11,   11,   11,   11,    1,   12,    1,
         1,    1,    1,    1,   13,   14,   15,   16,   17,   18,
-       19,   20,   21,   19,   22,   19,   19,   23,   24,   25,
-       26,   27,   28,   29,   19,   30,   31,   32,   33,   34,
-        1,    7,    1,    1,   35,    1,   36,   36,   36,   36,
+       19,   20,   21,   22,   23,   19,   19,   24,   25,   26,
+       27,   28,   29,   30,   19,   31,   32,   33,   34,   35,
+        1,    7,    1,    1,   36,    1,   37,   37,   37,   37,
 
-       36,   36,   36,   36,   36,   36,   37,   36,   36,   36,
-       36,   38,   36,   36,   36,   36,   36,   36,   36,   36,
-       36,   36,    1,   39,    1,    1,    1,    1,    1,    1,
+       37,   37,   37,   37,   37,   37,   38,   37,   37,   37,
+       37,   39,   37,   37,   37,   37,   37,   37,   37,   37,
+       37,   37,    1,   40,    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,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,   40,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,   41,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
 
@@ -684,93 +685,101 @@ static const YY_CHAR yy_ec[256] =
         1,    1,    1,    1,    1
     } ;
 
-static const YY_CHAR yy_meta[41] =
+static const YY_CHAR yy_meta[42] =
     {   0,
         1,    1,    1,    2,    1,    1,    3,    4,    4,    4,
         4,    1,    4,    4,    4,    4,    4,    4,    4,    4,
         4,    4,    4,    4,    4,    4,    4,    4,    4,    4,
-        4,    4,    4,    4,    4,    4,    4,    4,    1,    1
+        4,    4,    4,    4,    4,    4,    4,    4,    4,    1,
+        1
     } ;
 
-static const flex_int16_t yy_base[64] =
+static const flex_int16_t yy_base[73] =
     {   0,
-        0,    0,  133,  155,  155,  129,  155,  155,   33,   37,
-       41,    0,   46,   48,  124,  123,  122,   60,   65,  121,
-       66,   53,   69,   72,  119,  118,   76,   68,  117,  116,
-      115,   74,  114,    0,  155,  117,   80,  105,  114,    0,
-      111,  110,  100,   98,   97,   95,   85,   94,   93,   92,
-       91,   90,    0,  155,   91,   86,   88,  155,  144,  146,
-      148,   90,  150
+        0,    0,  149,  173,  173,  145,  173,  173,   34,   38,
+       42,   46,    0,   51,   53,  140,  139,  138,   65,   70,
+      137,  135,   71,   58,   77,   81,  134,  133,   83,   78,
+      132,  131,  130,   88,  129,    0,  173,  132,   88,    0,
+       92,  120,   81,  129,    0,  126,  125,  116,  113,  111,
+      108,   98,  107,  106,  105,  104,  103,    0,    0,  173,
+        0,  173,  104,   99,  101,  173,  158,  162,  164,  166,
+      103,  168
     } ;
 
-static const flex_int16_t yy_def[64] =
+static const flex_int16_t yy_def[73] =
     {   0,
-       58,    1,   58,   58,   58,   58,   58,   58,   58,   58,
-       58,   59,   60,   60,   60,   60,   60,   60,   60,   60,
-       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
-       60,   61,   60,   62,   58,   58,   58,   58,   59,   63,
-       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
-       60,   60,   62,   58,   59,   60,   60,    0,   58,   58,
-       58,   58,   58
+       66,    1,   66,   66,   66,   66,   66,   66,   66,   67,
+       67,   67,   68,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   70,   69,   71,   66,   66,   66,   67,
+       67,   67,   42,   68,   72,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   71,   67,   66,
+       67,   66,   68,   69,   69,    0,   66,   66,   66,   66,
+       66,   66
     } ;
 
-static const flex_int16_t yy_nxt[196] =
+static const flex_int16_t yy_nxt[215] =
     {   0,
-        4,    5,    6,    7,    8,    9,    4,   10,   10,   11,
-       10,   12,   13,   14,   15,   16,   17,   18,   17,   19,
-       20,   21,   22,   23,   24,   25,   26,   27,   28,   29,
-       30,   31,   32,   33,   34,   17,   17,   17,    8,   35,
-       37,   37,   37,   37,   37,   37,   37,   37,   37,   37,
-       38,   37,   40,   41,   40,   43,   43,   43,   43,   40,
-       43,   43,   43,   43,   43,   43,   40,   44,   44,   44,
-       44,   40,   40,   46,   40,   40,   47,   48,   40,   49,
-       40,   45,   40,   50,   50,   50,   50,   37,   37,   37,
-       37,   40,   40,   53,   40,   55,   40,   40,   40,   40,
-
-       40,   40,   57,   40,   40,   51,   40,   56,   42,   42,
-       42,   42,   37,   37,   37,   37,   40,   40,   55,   36,
-       40,   40,   40,   40,   40,   40,   54,   40,   40,   40,
-       40,   36,   58,   58,   58,   58,   58,   58,   58,   58,
-       58,   54,   58,   54,   39,   58,   39,   39,   42,   42,
-       52,   52,   40,   40,    3,   58,   58,   58,   58,   58,
-       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
-       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
-       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
-       58,   58,   58,   58,   58
-
+        4,    5,    6,    7,    8,    9,    4,   10,   11,   12,
+       10,   13,   14,   15,   16,   17,   18,   19,   18,   20,
+       21,   22,   23,   24,   25,   26,   27,   28,   29,   30,
+       31,   32,   33,   34,   35,   36,   18,   18,   18,    8,
+       37,   39,   39,   39,   39,   41,   41,   41,   41,   41,
+       42,   41,   41,   41,   41,   43,   41,   45,   46,   45,
+       48,   48,   48,   48,   45,   48,   48,   48,   48,   48,
+       48,   45,   49,   49,   49,   49,   45,   45,   51,   51,
+       51,   51,   52,   45,   45,   53,   50,   45,   54,   45,
+       55,   55,   55,   55,   45,   39,   39,   39,   39,   41,
+
+       41,   41,   41,   61,   45,   45,   58,   45,   63,   45,
+       45,   45,   45,   45,   45,   65,   56,   45,   61,   45,
+       62,   64,   45,   47,   47,   47,   47,   41,   41,   41,
+       41,   45,   45,   63,   38,   45,   45,   45,   45,   45,
+       45,   45,   59,   45,   45,   45,   45,   38,   66,   66,
+       66,   66,   66,   66,   66,   66,   66,   59,   66,   60,
+       40,   40,   44,   66,   44,   44,   47,   47,   57,   57,
+       45,   45,    3,   66,   66,   66,   66,   66,   66,   66,
+       66,   66,   66,   66,   66,   66,   66,   66,   66,   66,
+       66,   66,   66,   66,   66,   66,   66,   66,   66,   66,
+
+       66,   66,   66,   66,   66,   66,   66,   66,   66,   66,
+       66,   66,   66,   66
     } ;
 
-static const flex_int16_t yy_chk[196] =
+static const flex_int16_t yy_chk[215] =
     {   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,    1,
-        9,    9,    9,    9,   10,   10,   10,   10,   11,   11,
-       11,   11,   13,   13,   14,   14,   14,   14,   14,   22,
-       14,   14,   14,   14,   14,   14,   18,   18,   18,   18,
-       18,   19,   21,   21,   28,   23,   22,   23,   24,   24,
-       32,   19,   27,   27,   27,   27,   27,   37,   37,   37,
-       37,   47,   56,   62,   57,   55,   52,   51,   50,   49,
-
-       48,   46,   56,   45,   44,   28,   43,   47,   32,   32,
-       32,   32,   38,   38,   38,   38,   42,   41,   39,   36,
-       33,   31,   30,   29,   26,   25,   38,   20,   17,   16,
-       15,    6,    3,    0,    0,    0,    0,    0,    0,    0,
-        0,   38,    0,   38,   59,    0,   59,   59,   60,   60,
-       61,   61,   63,   63,   58,   58,   58,   58,   58,   58,
-       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
-       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
-       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
-       58,   58,   58,   58,   58
-
+        1,    9,    9,    9,    9,   10,   10,   10,   10,   11,
+       11,   11,   11,   12,   12,   12,   12,   14,   14,   15,
+       15,   15,   15,   15,   24,   15,   15,   15,   15,   15,
+       15,   19,   19,   19,   19,   19,   20,   23,   23,   23,
+       23,   23,   24,   25,   30,   25,   20,   26,   26,   29,
+       29,   29,   29,   29,   34,   39,   39,   39,   39,   41,
+
+       41,   41,   41,   43,   52,   64,   71,   65,   63,   57,
+       56,   55,   54,   53,   51,   64,   30,   50,   43,   49,
+       43,   52,   48,   34,   34,   34,   34,   42,   42,   42,
+       42,   47,   46,   44,   38,   35,   33,   32,   31,   28,
+       27,   22,   42,   21,   18,   17,   16,    6,    3,    0,
+        0,    0,    0,    0,    0,    0,    0,   42,    0,   42,
+       67,   67,   68,    0,   68,   68,   69,   69,   70,   70,
+       72,   72,   66,   66,   66,   66,   66,   66,   66,   66,
+       66,   66,   66,   66,   66,   66,   66,   66,   66,   66,
+       66,   66,   66,   66,   66,   66,   66,   66,   66,   66,
+
+       66,   66,   66,   66,   66,   66,   66,   66,   66,   66,
+       66,   66,   66,   66
     } ;
 
 /* Table of booleans, true if rule could match eol. */
-static const flex_int32_t yy_rule_can_match_eol[39] =
+static const flex_int32_t yy_rule_can_match_eol[42] =
     {   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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 
+    0, 0,     };
 
 static yy_state_type yy_last_accepting_state;
 static char *yy_last_accepting_cpos;
@@ -818,8 +827,8 @@ char *yytext;
 #include "hypno/grammar.h"
 #include "hypno/tokens_arc.h"
 
-#line 822 "engines/hypno/lexer_arc.cpp"
-#line 823 "engines/hypno/lexer_arc.cpp"
+#line 831 "engines/hypno/lexer_arc.cpp"
+#line 832 "engines/hypno/lexer_arc.cpp"
 
 #define INITIAL 0
 
@@ -1036,7 +1045,7 @@ YY_DECL
 	{
 #line 43 "engines/hypno/lexer_arc.l"
 
-#line 1040 "engines/hypno/lexer_arc.cpp"
+#line 1049 "engines/hypno/lexer_arc.cpp"
 
 	while ( /*CONSTCOND*/1 )		/* loops until end-of-file is reached */
 		{
@@ -1063,13 +1072,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 >= 59 )
+				if ( yy_current_state >= 67 )
 					yy_c = yy_meta[yy_c];
 				}
 			yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
 			++yy_cp;
 			}
-		while ( yy_current_state != 58 );
+		while ( yy_current_state != 66 );
 		yy_cp = (yy_last_accepting_cpos);
 		yy_current_state = (yy_last_accepting_state);
 
@@ -1167,87 +1176,87 @@ return ITOK;
 case 14:
 YY_RULE_SETUP
 #line 57 "engines/hypno/lexer_arc.l"
-return QTOK;
+return JTOK;
 	YY_BREAK
 case 15:
 YY_RULE_SETUP
 #line 58 "engines/hypno/lexer_arc.l"
-return ZTOK;
+return QTOK;
 	YY_BREAK
 case 16:
 YY_RULE_SETUP
 #line 59 "engines/hypno/lexer_arc.l"
-return WTOK;
+return ZTOK;
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
 #line 60 "engines/hypno/lexer_arc.l"
-return XTOK;
+return WTOK;
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
 #line 61 "engines/hypno/lexer_arc.l"
-return TTOK;
+return XTOK;
 	YY_BREAK
 case 19:
 YY_RULE_SETUP
 #line 62 "engines/hypno/lexer_arc.l"
-return TPTOK;
+return TTOK;
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
 #line 63 "engines/hypno/lexer_arc.l"
-return FNTOK;
+return TPTOK;
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
 #line 64 "engines/hypno/lexer_arc.l"
-return FTOK;
+return FNTOK;
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
 #line 65 "engines/hypno/lexer_arc.l"
-HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return SNTOK;
+return FTOK;
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
 #line 66 "engines/hypno/lexer_arc.l"
-return A0TOK;
+HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return SNTOK;
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
 #line 67 "engines/hypno/lexer_arc.l"
-HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return BNTOK;
+return A0TOK;
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
 #line 68 "engines/hypno/lexer_arc.l"
-return K0TOK;
+HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return BNTOK;
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
 #line 69 "engines/hypno/lexer_arc.l"
-return P0TOK;
+return KNTOK;
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
 #line 70 "engines/hypno/lexer_arc.l"
-return YXTOK;
+return P0TOK;
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
 #line 71 "engines/hypno/lexer_arc.l"
-return ENCTOK;
+HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return YXTOK;
 	YY_BREAK
 case 29:
 YY_RULE_SETUP
 #line 72 "engines/hypno/lexer_arc.l"
-HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return NAME;
+return ENCTOK;
 	YY_BREAK
 case 30:
 YY_RULE_SETUP
 #line 73 "engines/hypno/lexer_arc.l"
-HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return FILENAME;
+return ENCTOK;
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
@@ -1255,42 +1264,57 @@ YY_RULE_SETUP
 HYPNO_ARC_lval.i = atoi(HYPNO_ARC_text); return NUM;
 	YY_BREAK
 case 32:
-/* rule 32 can match eol */
 YY_RULE_SETUP
 #line 75 "engines/hypno/lexer_arc.l"
-return RETTOK;
+HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return NAME;
 	YY_BREAK
 case 33:
 YY_RULE_SETUP
 #line 76 "engines/hypno/lexer_arc.l"
-return CB3TOK;
+HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return FILENAME;
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
 #line 77 "engines/hypno/lexer_arc.l"
-return C02TOK;
+HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return FILENAME;
 	YY_BREAK
 case 35:
+/* rule 35 can match eol */
 YY_RULE_SETUP
 #line 78 "engines/hypno/lexer_arc.l"
-/* ignore comment */
+return RETTOK;
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
 #line 79 "engines/hypno/lexer_arc.l"
-/* ignore whitespace */;
+return CB3TOK;
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
 #line 80 "engines/hypno/lexer_arc.l"
-debug("notparsed: 0x%d",*yytext); return *yytext;
+return C02TOK;
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
 #line 81 "engines/hypno/lexer_arc.l"
+/* ignore comment */
+	YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 82 "engines/hypno/lexer_arc.l"
+/* ignore whitespace */;
+	YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 83 "engines/hypno/lexer_arc.l"
+debug("notparsed: 0x%d",*yytext); return *yytext;
+	YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 84 "engines/hypno/lexer_arc.l"
 ECHO;
 	YY_BREAK
-#line 1294 "engines/hypno/lexer_arc.cpp"
+#line 1318 "engines/hypno/lexer_arc.cpp"
 case YY_STATE_EOF(INITIAL):
 	yyterminate();
 
@@ -1588,7 +1612,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 >= 59 )
+			if ( yy_current_state >= 67 )
 				yy_c = yy_meta[yy_c];
 			}
 		yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -1616,11 +1640,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 >= 59 )
+		if ( yy_current_state >= 67 )
 			yy_c = yy_meta[yy_c];
 		}
 	yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
-	yy_is_jam = (yy_current_state == 58);
+	yy_is_jam = (yy_current_state == 66);
 
 		return yy_is_jam ? 0 : yy_current_state;
 }
@@ -2267,7 +2291,7 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 81 "engines/hypno/lexer_arc.l"
+#line 84 "engines/hypno/lexer_arc.l"
 
 
 namespace Hypno {
diff --git a/engines/hypno/lexer_arc.l b/engines/hypno/lexer_arc.l
index 7432e6c81a..1081776755 100644
--- a/engines/hypno/lexer_arc.l
+++ b/engines/hypno/lexer_arc.l
@@ -54,6 +54,7 @@ O1							return O1TOK;
 N							return NTOK;
 R							return RTOK;
 I							return ITOK;
+J							return JTOK;
 Q							return QTOK;
 Z							return ZTOK;
 W							return WTOK;
@@ -65,13 +66,15 @@ F							return FTOK;
 S[0-9]						HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return SNTOK;
 A0							return A0TOK;
 B[0-9A-F]					HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return BNTOK;
-K0							return K0TOK;
+K[0-9]						return KNTOK;
 P0							return P0TOK;
-Y[A-Z0-9]					return YXTOK;
+Y[A-Z0-9]					HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return YXTOK;
 22[k|K]						return ENCTOK;
-[A-Za-z_][A-Za-z_0-9]*		HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return NAME;
-[A-Za-z][A-Za-z_0-9\\\.]*	HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return FILENAME;
+11[k|K]						return ENCTOK;
 [\-]?[0-9]+					HYPNO_ARC_lval.i = atoi(HYPNO_ARC_text); return NUM;
+[A-Za-z_][A-Za-z_0-9]*		HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return NAME;
+[A-Za-z][A-Za-z_0-9\\\.]+	HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return FILENAME;
+[0-9][A-Za-z_0-9\\\.]+		HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return FILENAME;
 [\n|\r\n]					return RETTOK;
 \xb3						return CB3TOK;
 \x02						return C02TOK;
diff --git a/engines/hypno/lexer_mis.cpp b/engines/hypno/lexer_mis.cpp
index 0825ef7063..86114b7e18 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 45
-#define YY_END_OF_BUFFER 46
+#define YY_NUM_RULES 46
+#define YY_END_OF_BUFFER 47
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -644,22 +644,22 @@ struct yy_trans_info
 	};
 static const flex_int16_t yy_accept[144] =
     {   0,
-        0,    0,   46,   44,   43,   42,   42,   44,   38,   41,
-       41,   44,   39,   39,   39,   39,   39,   39,   39,   39,
-       39,   39,   39,   39,   39,   39,   39,   39,   42,   43,
-       41,    0,   38,   38,    0,    1,   40,   39,   39,   39,
-       39,   39,   39,   39,   39,   39,   39,   39,   39,   39,
-       39,   39,   39,   39,   39,   39,   39,   39,   39,   39,
-        0,    0,   34,    0,    0,    0,    0,   35,    0,    0,
-        2,   38,    0,   39,   39,   39,   39,   39,   12,   39,
-       39,   39,   39,   39,   39,   39,   39,   39,   39,   39,
-       39,   39,   39,   39,   39,   31,   32,   33,   27,   30,
-
-       29,   28,   26,   38,    0,    4,    5,   21,    6,   39,
-       39,   16,    7,   36,    9,   39,   39,    3,   11,   14,
-        8,   17,   39,   15,   18,   13,   10,   38,   20,   39,
-       39,   39,   24,   39,   37,   39,   22,   39,   23,   25,
-       39,   19,    0
+        0,    0,   47,   45,   44,   43,   43,   45,   39,   42,
+       42,   45,   40,   40,   40,   40,   40,   40,   40,   40,
+       40,   40,   40,   40,   40,   40,   40,   40,   43,   44,
+       42,    0,   39,   39,    0,    1,   41,   40,   40,   40,
+       40,   40,   40,   40,   40,   40,   40,   40,   40,   40,
+       40,   40,   40,   40,   40,   40,   40,   40,   40,   40,
+        0,    0,   35,    0,    0,    0,    0,   36,    0,    0,
+        2,   39,    0,   40,   40,   40,   40,   40,   12,   40,
+       40,   40,   40,   40,   40,   40,   40,   40,   40,   40,
+       40,   40,   40,   40,   40,   32,   33,   34,   28,   31,
+
+       30,   29,   27,   39,    0,    4,    5,   21,    6,   40,
+       40,   16,    7,   37,    9,   40,   25,    3,   11,   14,
+        8,   17,   40,   15,   18,   13,   10,   39,   20,   40,
+       40,   40,   24,   40,   38,   40,   22,   40,   23,   26,
+       40,   19,    0
     } ;
 
 static const YY_CHAR yy_ec[256] =
@@ -827,11 +827,11 @@ static const flex_int16_t yy_chk[340] =
     } ;
 
 /* Table of booleans, true if rule could match eol. */
-static const flex_int32_t yy_rule_can_match_eol[46] =
+static const flex_int32_t yy_rule_can_match_eol[47] =
     {   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, 1, 0, 0, 0,     };
 
 static yy_state_type yy_last_accepting_state;
 static char *yy_last_accepting_cpos;
@@ -1282,110 +1282,115 @@ return INTROTOK;
 case 25:
 YY_RULE_SETUP
 #line 67 "engines/hypno/lexer_mis.l"
-return DEFAULTTOK;
+return INTRTOK;
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
 #line 68 "engines/hypno/lexer_mis.l"
-HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PS;
+return DEFAULTTOK;
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
 #line 69 "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 28:
 YY_RULE_SETUP
 #line 70 "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 29:
 YY_RULE_SETUP
 #line 71 "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 30:
 YY_RULE_SETUP
 #line 72 "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 31:
 YY_RULE_SETUP
 #line 73 "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 32:
 YY_RULE_SETUP
 #line 74 "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 33:
 YY_RULE_SETUP
 #line 75 "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 34:
 YY_RULE_SETUP
 #line 76 "engines/hypno/lexer_mis.l"
-return PE;
+HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PF;
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
 #line 77 "engines/hypno/lexer_mis.l"
-return PL;
+return PE;
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
 #line 78 "engines/hypno/lexer_mis.l"
-HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return GSSWITCH;
+return PL;
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
 #line 79 "engines/hypno/lexer_mis.l"
-return BBOXTOK;
+HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return GSSWITCH;
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
 #line 80 "engines/hypno/lexer_mis.l"
-HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return FLAG;
+return BBOXTOK;
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
 #line 81 "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 FLAG;
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
 #line 82 "engines/hypno/lexer_mis.l"
-HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return FILENAME;
+HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return NAME;
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
 #line 83 "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 FILENAME;
 	YY_BREAK
 case 42:
-/* rule 42 can match eol */
 YY_RULE_SETUP
 #line 84 "engines/hypno/lexer_mis.l"
-return RETTOK;
+HYPNO_MIS_lval.i = atoi(HYPNO_MIS_text); return NUM;
 	YY_BREAK
 case 43:
+/* rule 43 can match eol */
 YY_RULE_SETUP
 #line 85 "engines/hypno/lexer_mis.l"
-/* ignore whitespace */;
+return RETTOK;
 	YY_BREAK
 case 44:
 YY_RULE_SETUP
 #line 86 "engines/hypno/lexer_mis.l"
-debug("<no match: %c>", *yytext); return *yytext;
+/* ignore whitespace */;
 	YY_BREAK
 case 45:
 YY_RULE_SETUP
 #line 87 "engines/hypno/lexer_mis.l"
+debug("<no match: %c>", *yytext); return *yytext;
+	YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 88 "engines/hypno/lexer_mis.l"
 ECHO;
 	YY_BREAK
-#line 1389 "engines/hypno/lexer_mis.cpp"
+#line 1394 "engines/hypno/lexer_mis.cpp"
 case YY_STATE_EOF(INITIAL):
 	yyterminate();
 
@@ -2362,7 +2367,7 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 87 "engines/hypno/lexer_mis.l"
+#line 88 "engines/hypno/lexer_mis.l"
 
 
 namespace Hypno {
diff --git a/engines/hypno/lexer_mis.l b/engines/hypno/lexer_mis.l
index 508e5167f3..171010b59b 100644
--- a/engines/hypno/lexer_mis.l
+++ b/engines/hypno/lexer_mis.l
@@ -64,6 +64,7 @@ BOXX						return BOXXTOK;
 ESCAPE						return ESCAPETOK;
 SECOND						return SECONDTOK;
 INTRO						return INTROTOK;
+INTR						return INTRTOK;
 DEFAULT						return DEFAULTTOK;
 \|S[A-Za-z_0-9\\\.]+		HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PS;
 \|G[A-Za-z_0-9\\\.]+		HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PG;
diff --git a/engines/hypno/scene.cpp b/engines/hypno/scene.cpp
index 6915c32637..845add4708 100644
--- a/engines/hypno/scene.cpp
+++ b/engines/hypno/scene.cpp
@@ -126,7 +126,12 @@ void HypnoEngine::clickedHotspot(Common::Point mousePos) {
 		_nextHotsToAdd = selected.smenu;
 	}
 
-	for (Actions::const_iterator itt = selected.actions.begin(); itt != selected.actions.end(); ++itt) {
+	_videosPlaying.clear();
+	_nextParallelVideoToPlay.clear();
+	_nextSequentialVideoToPlay.clear();
+
+	bool cont = true;
+	for (Actions::const_iterator itt = selected.actions.begin(); itt != selected.actions.end() && cont; ++itt) {
 		Action *action = *itt;
 		switch (action->type) {
 			case ChangeLevelAction:
@@ -150,7 +155,7 @@ void HypnoEngine::clickedHotspot(Common::Point mousePos) {
 			break;
 		
 			case GlobalAction:
-				runGlobal((Global *)action);
+				cont = runGlobal((Global *)action);
 			break;
 
 			case TalkAction:
@@ -233,6 +238,10 @@ void HypnoEngine::runTransition(Transition trans) {
 
 
 void HypnoEngine::runScene(Scene &scene) {
+	_nextLoopingVideoToPlay.clear();
+	_nextParallelVideoToPlay.clear();
+	_nextSequentialVideoToPlay.clear();
+
 	_refreshConversation = false;
 	_conversation.clear();
 	Common::Event event;
@@ -257,7 +266,9 @@ void HypnoEngine::runScene(Scene &scene) {
 					}
 					_videosPlaying.clear();
 
-					if (!stack.empty()) {
+					if (!_conversation.empty()) {
+						_refreshConversation = true;
+					} else if (!stack.empty()) {
 						runMenu(*stack.back());
 						drawScreen();
 					}
@@ -308,7 +319,10 @@ void HypnoEngine::runScene(Scene &scene) {
 			}
 		}
 
-		if (_refreshConversation && !_conversation.empty() && _nextSequentialVideoToPlay.empty()) {
+		if (_refreshConversation && !_conversation.empty() && 
+		    _nextSequentialVideoToPlay.empty() && 
+			_nextParallelVideoToPlay.empty() &&
+			_videosPlaying.empty()) {
 			showConversation();
 			drawScreen();
 			_refreshConversation = false;
@@ -316,6 +330,15 @@ void HypnoEngine::runScene(Scene &scene) {
 		}
 
 		// Movies
+
+		if (!_nextParallelVideoToPlay.empty()) {
+			for (Videos::iterator it = _nextParallelVideoToPlay.begin(); it != _nextParallelVideoToPlay.end(); ++it) {
+				playVideo(*it);
+				_videosPlaying.push_back(*it);
+			}
+			_nextParallelVideoToPlay.clear();
+		}
+
 		if (!_nextSequentialVideoToPlay.empty() && _videosPlaying.empty()) {
 			playVideo(*_nextSequentialVideoToPlay.begin());
 			_videosPlaying.push_back(*_nextSequentialVideoToPlay.begin());
@@ -361,6 +384,10 @@ void HypnoEngine::runScene(Scene &scene) {
 			}
 		}
 
+		if (checkSceneCompleted() && _conversation.empty()) {
+			_nextLevel = scene.levelIfWin;
+		}
+
 		if (!_videosPlaying.empty() || !_nextSequentialVideoToPlay.empty()) {
 			drawScreen();
 			continue;
@@ -385,11 +412,8 @@ void HypnoEngine::runScene(Scene &scene) {
 			playSound(_music, 1);
 		}
 
-		if (checkSceneCompleted())
-			_nextLevel = scene.levelIfWin;
-
 		g_system->updateScreen();
-		g_system->delayMillis(10);
+		g_system->delayMillis(30);
 	}
 
 	// Deallocate videos
diff --git a/engines/hypno/spider/arcade.cpp b/engines/hypno/spider/arcade.cpp
index 5d0229094e..b5d5cf8351 100644
--- a/engines/hypno/spider/arcade.cpp
+++ b/engines/hypno/spider/arcade.cpp
@@ -45,16 +45,30 @@ void SpiderEngine::drawShoot(const Common::Point &target) {
 
 void SpiderEngine::drawPlayer() {
 
+	if (_arcadeMode == "YC") {
+		drawImage(*_playerFrames[_playerPosition], 0, 0, true);
+		return;
+	}
+
+	// if (_playerFrameSep == -1) {
+	// 	Common::Point mousePos = g_system->getEventManager()->getMousePos();
+	// 	drawImage(*_playerFrames[0], MIN(MAX(10, int(mousePos.x)), _screenH-10), 129, true);
+	// 	return;
+	// }
+
+
 	if (_playerFrameIdx < _playerFrameSep) {
 		Common::Point mousePos = g_system->getEventManager()->getMousePos();
-		uint32 idx = MIN(2, mousePos.x / (_screenW / 3)) + 3 * MIN(2, mousePos.y / (_screenH / 3));
-		_playerFrameIdx = orientationIndex[idx];
+		//uint32 idx = MIN(2, mousePos.x / (_screenW / 3)) + 3 * MIN(2, mousePos.y / (_screenH / 3));
+		_playerFrameIdx = 4 - mousePos.x / (_screenW / 4);
+		//debug("selecting index %d", _playerFrameIdx);
+		//_playerFrameIdx = orientationIndex[idx];
 	} else {
 		_playerFrameIdx++;
 		if (_playerFrameIdx >= (int)_playerFrames.size())
 			_playerFrameIdx = 0;
 	}
-	drawImage(*_playerFrames[_playerFrameIdx], 60, 129, true);
+	drawImage(*_playerFrames[_playerFrameIdx], _screenW/2 - 15, _screenH-50, true);
 }
 
 void SpiderEngine::drawHealth() {
diff --git a/engines/hypno/spider/spider.cpp b/engines/hypno/spider/spider.cpp
index 54d4a97e27..61399d9314 100644
--- a/engines/hypno/spider/spider.cpp
+++ b/engines/hypno/spider/spider.cpp
@@ -68,6 +68,25 @@ void SpiderEngine::loadAssetsFullGame() {
 
 	parseScene("", "mv0t.mi_");
 	_levels["mv0t.mi_"].scene.prefix = "spider";
+	_levels["mv0t.mi_"].scene.intro = "cine/ints001s.smk";
+	_levels["mv0t.mi_"].scene.levelIfWin = "roof.mi_";
+
+	parseScene("", "roof.mi_");
+	_levels["roof.mi_"].scene.prefix = "spider";
+	_levels["roof.mi_"].scene.levelIfWin = "decide1.mi_";
+
+
+	parseScene("", "decide1.mi_");
+	_levels["decide1.mi_"].scene.prefix = "spider";
+
+	// loadArcadeLevel("c1", "", "spider");
+	// loadArcadeLevel("c2", "", "spider");
+	// loadArcadeLevel("c3", "", "spider");
+	// loadArcadeLevel("c4", "", "spider");
+	// loadArcadeLevel("c5", "", "spider");
+	// //loadArcadeLevel("c6", "", "spider");
+	// loadArcadeLevel("c8", "", "spider");
+	// loadArcadeLevel("c9", "", "spider");
 
 	// start level
 	Level start;
@@ -87,6 +106,24 @@ void SpiderEngine::loadAssetsFullGame() {
 
 	cl = new ChangeLevel("combmenu.mi_");
 	_levels["options.mi_"].scene.hots[1].actions.push_back(cl);
+
+	cl = new ChangeLevel("options.mi_");
+	_levels["combmenu.mi_"].scene.hots[1].actions.push_back(cl);
+
+	cl = new ChangeLevel("c1.mi_");
+	_levels["combmenu.mi_"].scene.hots[2].actions.push_back(cl);
+
+	cl = new ChangeLevel("c2.mi_");
+	_levels["combmenu.mi_"].scene.hots[3].actions.push_back(cl);
+
+	cl = new ChangeLevel("c5.mi_");
+	_levels["combmenu.mi_"].scene.hots[6].actions.push_back(cl);
+
+	cl = new ChangeLevel("c8.mi_");
+	_levels["combmenu.mi_"].scene.hots[7].actions.push_back(cl);
+	
+	cl = new ChangeLevel("c9.mi_");
+	_levels["combmenu.mi_"].scene.hots[8].actions.push_back(cl);
 }
 
 void SpiderEngine::loadAssetsDemo() {
@@ -108,31 +145,7 @@ void SpiderEngine::loadAssetsDemo() {
 	start.trans.intros.push_back("sixdemo/demo/dcine2.smk");
 	_levels["<start>"] = start;
 
-	Common::String arc;
-	Common::String list;
-	Common::String arclevel = files.front()->getName();
-	Common::SeekableReadStream *file = files.front()->createReadStream();
-
-	while (!file->eos()) {
-		byte x = file->readByte();
-		arc += x;
-		if (x == 'X') {
-			while (!file->eos()) {
-				x = file->readByte();
-				if (x == 'Y')
-					break;
-				list += x;
-			}
-			break; // No need to keep parsing
-		}
-	}
-	delete file;
-
-	arclevel = "sixdemo/c_misc/missions.lib/" + arclevel;
-	parseArcadeShooting("sixdemo", arclevel, arc);
-	_levels[arclevel].arcade.shootSequence = parseShootList(arclevel, list);
-	_levels[arclevel].arcade.levelIfWin = "sixdemo/mis/demo.mis";
-	_levels[arclevel].arcade.levelIfLose = "sixdemo/mis/demo.mis";
+	loadArcadeLevel("c1", "sixdemo/mis/demo.mis", "sixdemo");
 
 	loadLib("", "sixdemo/c_misc/fonts.lib", true);
 	loadLib("sixdemo/c_misc/sound.lib/", "sixdemo/c_misc/sound.lib", true);
@@ -140,7 +153,7 @@ void SpiderEngine::loadAssetsDemo() {
 
 	// Read assets from mis files
 	parseScene("sixdemo", "mis/demo.mis");
-	ChangeLevel *cl = new ChangeLevel("sixdemo/c_misc/missions.lib/c1.mi_");
+	ChangeLevel *cl = new ChangeLevel("c1.mi_");
 	_levels["sixdemo/mis/demo.mis"].scene.hots[1].actions.push_back(cl);
 
 	cl = new ChangeLevel("sixdemo/mis/alley.mis");
@@ -177,14 +190,15 @@ void SpiderEngine::loadAssetsDemo() {
 	_soundPath = "c_misc/sound.lib/";
 }
 
-void SpiderEngine::runCode(Code code) {
+void SpiderEngine::runCode(Code &code) {
 	if (code.name == "sixdemo/puz_matr")
 		runMatrix(code);
 	else
 		error("invalid puzzle");
 }
 
-void SpiderEngine::runMatrix(Code code) {
+void SpiderEngine::runMatrix(Code &code) {
+	changeScreenMode("640x480");
 	Common::Point mousePos;
 	Common::Event event;
 
diff --git a/engines/hypno/spider/talk.cpp b/engines/hypno/spider/talk.cpp
index bc3eb09bd4..e678556723 100644
--- a/engines/hypno/spider/talk.cpp
+++ b/engines/hypno/spider/talk.cpp
@@ -30,6 +30,7 @@ void SpiderEngine::showConversation() {
 	uint32 x = 18;
 	uint32 y = 20;
 	Graphics::Surface *speaker = decodeFrame("dialog/speaker3.smk", 0);
+	bool activeFound = false;
 	for (Actions::const_iterator itt = _conversation.begin(); itt != _conversation.end(); ++itt) {
 		Talk *a = (Talk *)*itt;
 		if (a->active) {
@@ -43,6 +44,7 @@ void SpiderEngine::showConversation() {
 				}
 			}
 			if (!path.empty()) {
+				activeFound = true;
 				frame = frame;
 				Graphics::Surface *surf = decodeFrame("dialog/" + path, frame);
 
@@ -56,17 +58,26 @@ void SpiderEngine::showConversation() {
 			}
 		}
 	}
+	if (!activeFound) {
+		for (Actions::const_iterator it = _conversation.begin(); it != _conversation.end(); ++it) {
+			Talk *a = (Talk *)*it;
+			if (!a->second.empty())
+				_nextParallelVideoToPlay.push_back(MVideo(a->second, a->secondPos, false, false, false));
+		}
+		debugC(1, kHypnoDebugScene, "Clearing conversation");
+		_conversation.clear();
+		runMenu(*stack.back());
+		drawScreen();
+	} 
 	speaker->free();
 	delete speaker;
 }
 
 void SpiderEngine::leftClickedConversation(const Common::Point &mousePos) {
 	Talk *t;
-	bool activeFound = false;
 	for (Actions::const_iterator itt = _conversation.begin(); itt != _conversation.end(); ++itt) {
 		Talk *a = (Talk *)*itt;
 		if (a->active && a->rect.contains(mousePos)) {
-			activeFound = true;
 			a->active = false;
 			for (TalkCommands::const_iterator it = a->commands.begin(); it != a->commands.end(); ++it) {
 				if (it->command == "A") {
@@ -81,19 +92,24 @@ void SpiderEngine::leftClickedConversation(const Common::Point &mousePos) {
 					_refreshConversation = true;
 				} else if (it->command == "P") {
 					debugC(1, kHypnoDebugScene, "Playing %s", it->path.c_str());
-					_nextSequentialVideoToPlay.push_back(MVideo(it->path, it->position, false, false, false));
+					_nextParallelVideoToPlay.push_back(MVideo(it->path, it->position, false, false, false));
+				} else if (it->command == "S") {
+					debugC(1, kHypnoDebugScene, "Enabling variable %s", it->variable.c_str());
+					_sceneState[it->variable] = 1;
+					_refreshConversation = true;
+				} else if (it->command == "L") {
+					Common::String variable = "GS_LEVELCOMPLETE";
+					debugC(1, kHypnoDebugScene, "Enabling variable %s", variable.c_str());
+					_sceneState[variable] = 1;
+					_refreshConversation = true;
 				}
+
 			}
 		}
 		if (!a->background.empty()) {
-			loadImage(a->background, a->position.x, a->position.y, false);
+			loadImage(a->background, a->backgroundPos.x, a->backgroundPos.y, false);
 		}
 	}
-	if (!activeFound) {
-		_conversation.clear();
-		runMenu(*stack.back());
-		drawScreen();
-	}
 }
 
 void SpiderEngine::rightClickedConversation(const Common::Point &mousePos) {
diff --git a/engines/hypno/tokens_arc.h b/engines/hypno/tokens_arc.h
index b2a4960476..7793598630 100644
--- a/engines/hypno/tokens_arc.h
+++ b/engines/hypno/tokens_arc.h
@@ -57,37 +57,38 @@ extern int HYPNO_ARC_debug;
     FILENAME = 259,
     BNTOK = 260,
     SNTOK = 261,
-    NUM = 262,
-    COMMENT = 263,
-    YXTOK = 264,
-    CTOK = 265,
-    DTOK = 266,
-    HTOK = 267,
-    HETOK = 268,
-    RETTOK = 269,
-    QTOK = 270,
-    ENCTOK = 271,
-    PTOK = 272,
-    FTOK = 273,
-    TTOK = 274,
-    TPTOK = 275,
-    ATOK = 276,
-    VTOK = 277,
-    OTOK = 278,
-    O1TOK = 279,
-    NTOK = 280,
-    RTOK = 281,
-    ITOK = 282,
-    ZTOK = 283,
-    FNTOK = 284,
-    NONETOK = 285,
-    A0TOK = 286,
-    K0TOK = 287,
-    P0TOK = 288,
-    WTOK = 289,
-    XTOK = 290,
-    CB3TOK = 291,
-    C02TOK = 292
+    KNTOK = 262,
+    YXTOK = 263,
+    NUM = 264,
+    COMMENT = 265,
+    CTOK = 266,
+    DTOK = 267,
+    HTOK = 268,
+    HETOK = 269,
+    RETTOK = 270,
+    QTOK = 271,
+    ENCTOK = 272,
+    PTOK = 273,
+    FTOK = 274,
+    TTOK = 275,
+    TPTOK = 276,
+    ATOK = 277,
+    VTOK = 278,
+    OTOK = 279,
+    O1TOK = 280,
+    NTOK = 281,
+    RTOK = 282,
+    ITOK = 283,
+    JTOK = 284,
+    ZTOK = 285,
+    FNTOK = 286,
+    NONETOK = 287,
+    A0TOK = 288,
+    P0TOK = 289,
+    WTOK = 290,
+    XTOK = 291,
+    CB3TOK = 292,
+    C02TOK = 293
   };
 #endif
 
@@ -101,7 +102,7 @@ union HYPNO_ARC_STYPE
 	char *s; /* string value */
 	int i;	 /* integer value */
 
-#line 105 "engines/hypno/tokens_arc.h" /* yacc.c:1909  */
+#line 106 "engines/hypno/tokens_arc.h" /* yacc.c:1909  */
 };
 
 typedef union HYPNO_ARC_STYPE HYPNO_ARC_STYPE;
diff --git a/engines/hypno/tokens_mis.h b/engines/hypno/tokens_mis.h
index 568e0f85e1..a5d61d7156 100644
--- a/engines/hypno/tokens_mis.h
+++ b/engines/hypno/tokens_mis.h
@@ -63,41 +63,42 @@ extern int HYPNO_MIS_debug;
     HOTSTOK = 265,
     CUTSTOK = 266,
     BACKTOK = 267,
-    RETTOK = 268,
-    TIMETOK = 269,
-    PALETOK = 270,
-    BBOXTOK = 271,
-    OVERTOK = 272,
-    WALNTOK = 273,
-    MICETOK = 274,
-    PLAYTOK = 275,
-    ENDTOK = 276,
-    MENUTOK = 277,
-    SMENTOK = 278,
-    ESCPTOK = 279,
-    NRTOK = 280,
-    AMBITOK = 281,
-    GLOBTOK = 282,
-    TONTOK = 283,
-    TOFFTOK = 284,
-    TALKTOK = 285,
-    INACTOK = 286,
-    FDTOK = 287,
-    BOXXTOK = 288,
-    ESCAPETOK = 289,
-    SECONDTOK = 290,
-    INTROTOK = 291,
-    DEFAULTTOK = 292,
-    PG = 293,
-    PA = 294,
-    PD = 295,
-    PH = 296,
-    PF = 297,
-    PE = 298,
-    PP = 299,
-    PI = 300,
-    PL = 301,
-    PS = 302
+    INTRTOK = 268,
+    RETTOK = 269,
+    TIMETOK = 270,
+    PALETOK = 271,
+    BBOXTOK = 272,
+    OVERTOK = 273,
+    WALNTOK = 274,
+    MICETOK = 275,
+    PLAYTOK = 276,
+    ENDTOK = 277,
+    MENUTOK = 278,
+    SMENTOK = 279,
+    ESCPTOK = 280,
+    NRTOK = 281,
+    AMBITOK = 282,
+    GLOBTOK = 283,
+    TONTOK = 284,
+    TOFFTOK = 285,
+    TALKTOK = 286,
+    INACTOK = 287,
+    FDTOK = 288,
+    BOXXTOK = 289,
+    ESCAPETOK = 290,
+    SECONDTOK = 291,
+    INTROTOK = 292,
+    DEFAULTTOK = 293,
+    PG = 294,
+    PA = 295,
+    PD = 296,
+    PH = 297,
+    PF = 298,
+    PE = 299,
+    PP = 300,
+    PI = 301,
+    PL = 302,
+    PS = 303
   };
 #endif
 
@@ -111,7 +112,7 @@ union HYPNO_MIS_STYPE
 	char *s; /* string value */
 	int i;	 /* integer value */
 
-#line 115 "engines/hypno/tokens_mis.h" /* yacc.c:1909  */
+#line 116 "engines/hypno/tokens_mis.h" /* yacc.c:1909  */
 };
 
 typedef union HYPNO_MIS_STYPE HYPNO_MIS_STYPE;
diff --git a/engines/hypno/wet/wet.cpp b/engines/hypno/wet/wet.cpp
index 2e6a77930a..386240c47c 100644
--- a/engines/hypno/wet/wet.cpp
+++ b/engines/hypno/wet/wet.cpp
@@ -105,7 +105,7 @@ void WetEngine::loadAssetsDemoDisc() {
 	_levels["<start>"] = start;
 
 	Level intro;
-	intro.trans.level = "c31.mi_";
+	intro.trans.level = "c52.mi_";
 	intro.trans.intros.push_back("movie/nw_logo.smk");
 	intro.trans.intros.push_back("movie/hypnotix.smk");
 	intro.trans.intros.push_back("movie/wetlogo.smk");
@@ -135,8 +135,8 @@ void WetEngine::loadAssetsDemoDisc() {
 	movies.trans.frameNumber = 0;
 	_levels["<movies>"] = movies;
 
-	loadLevel("c31", "c52", "wetlands");
-	loadLevel("c52", "<gameover>", "wetlands");
+	loadArcadeLevel("c31", "c52", "wetlands");
+	loadArcadeLevel("c52", "<gameover>", "wetlands");
 
 	Level over;
 	over.trans.level = "<quit>";
@@ -162,15 +162,7 @@ void WetEngine::loadAssetsPCW() {
 	intro.trans.frameImage.clear();
 	_levels["<start>"] = intro;
 
-	Common::String arclevel = "c11.mis";
-	Common::String arc;
-	Common::String list;
-	splitArcadeFile(arclevel, arc, list);
-	parseArcadeShooting("wetlands", arclevel, arc);
-	_levels[arclevel].arcade.shootSequence = parseShootList(arclevel, list);
-	_levels[arclevel].arcade.prefix = "";
-	_levels[arclevel].arcade.levelIfWin = "<gameover>";
-	_levels[arclevel].arcade.levelIfLose = "<gameover>";
+	loadArcadeLevel("c11", "<gameover>", "");
 
 	Level over;
 	over.trans.level = "<quit>";
@@ -195,16 +187,7 @@ void WetEngine::loadAssetsPCG() {
 	intro.trans.frameImage.clear();
 	_levels["<start>"] = intro;
 
-	Common::String arclevel = "c31.mi_";
-	debugC(1, kHypnoDebugParser, "Parsing %s", arclevel.c_str());
-	Common::String arc;
-	Common::String list;
-	splitArcadeFile(arclevel, arc, list);
-	parseArcadeShooting("wetlands", arclevel, arc);
-	_levels[arclevel].arcade.shootSequence = parseShootList(arclevel, list);
-	_levels[arclevel].arcade.prefix = "";
-	_levels[arclevel].arcade.levelIfWin = "<gameover>";
-	_levels[arclevel].arcade.levelIfLose = "<gameover>";
+	loadArcadeLevel("c31", "<gameover>", "");
 
 	Level over;
 	over.trans.level = "<quit>";
@@ -214,19 +197,6 @@ void WetEngine::loadAssetsPCG() {
 	loadLib("", "sound.lib", false);
 }
 
-void WetEngine::loadLevel(const Common::String &current, const Common::String &next, const Common::String &prefix) {
-	Common::String arclevel = current + _difficulty + ".mi_";
-	debugC(1, kHypnoDebugParser, "Parsing %s", arclevel.c_str());
-	Common::String arc;
-	Common::String list;
-	splitArcadeFile(arclevel, arc, list);
-	debug("%s", arc.c_str());
-	parseArcadeShooting("", arclevel, arc);
-	_levels[arclevel].arcade.shootSequence = parseShootList(arclevel, list);
-	_levels[arclevel].arcade.prefix = prefix;
-	_levels[arclevel].arcade.levelIfWin = next + _difficulty + ".mi_";;
-}
-
 void WetEngine::loadAssetsFullGame() {
 	LibFile *missions = loadLib("", "c_misc/missions.lib", true);
 	Common::ArchiveMemberList files;
@@ -252,8 +222,8 @@ void WetEngine::loadAssetsFullGame() {
 	_levels["<intro>"] = intro;
 
 	//loadLevel("c10", "c11", "");
-	loadLevel("c11", "c20", "");
-	loadLevel("c20", "", "");
+	loadArcadeLevel("c11", "c20", "");
+	loadArcadeLevel("c20", "", "");
 
 	loadLib("", "c_misc/fonts.lib", true);
 	loadLib("sound/", "c_misc/sound.lib", true);
@@ -264,15 +234,15 @@ void WetEngine::showCredits() {
 	runIntro(video);
 }
 
-void WetEngine::runCode(Code code) {
-	changeScreenMode("arcade"); // everything runs in 320x200
+void WetEngine::runCode(Code &code) {
+	changeScreenMode("320x200");
 	if (code.name == "wetlands/main_menu.mis")
 		runMainMenu(code);
 	else
 		error("invalid hardcoded level: %s", code.name.c_str());
 }
 
-void WetEngine::runMainMenu(Code code) {
+void WetEngine::runMainMenu(Code &code) {
 	Common::Event event;
 	_font = FontMan.getFontByUsage(Graphics::FontManager::kConsoleFont);
 	uint32 c = _pixelFormat.RGBToColor(0, 252, 0);




More information about the Scummvm-git-logs mailing list