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

neuromancer noreply at scummvm.org
Sun Feb 13 17:39:06 UTC 2022


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

Summary:
67ed302224 VIDEO: rewind when forceSeekToFrame is called with a frame near the start of the video
d92edf3ac9 HYPNO: added data structure to handle segments
ceeec7dbdd HYPNO: solve rebase conflicts in arcade code


Commit: 67ed3022243838b154320fec51adcee940ba3aff
    https://github.com/scummvm/scummvm/commit/67ed3022243838b154320fec51adcee940ba3aff
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-02-13T18:28:36+01:00

Commit Message:
VIDEO: rewind when forceSeekToFrame is called with a frame near the start of the video

Changed paths:
    video/smk_decoder.cpp


diff --git a/video/smk_decoder.cpp b/video/smk_decoder.cpp
index 0f18a8889f9..b6e3bf832fd 100644
--- a/video/smk_decoder.cpp
+++ b/video/smk_decoder.cpp
@@ -428,6 +428,11 @@ bool SmackerDecoder::rewind() {
 }
 
 void SmackerDecoder::forceSeekToFrame(uint frame) {
+	if (frame < 10) {
+		rewind();
+		return;
+	}
+
 	const uint seekFrame = MAX<uint>(frame - 10, 0);
 
 	if (!isVideoLoaded())


Commit: d92edf3ac960184323dd2f509a1d8eacd45571a7
    https://github.com/scummvm/scummvm/commit/d92edf3ac960184323dd2f509a1d8eacd45571a7
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-02-13T18:28:36+01:00

Commit Message:
HYPNO: added data structure to handle segments

Changed paths:
    engines/hypno/grammar.h


diff --git a/engines/hypno/grammar.h b/engines/hypno/grammar.h
index 008f5edaca0..68d869f782e 100644
--- a/engines/hypno/grammar.h
+++ b/engines/hypno/grammar.h
@@ -407,6 +407,16 @@ public:
 typedef Common::List<ShootInfo> ShootSequence;
 typedef Common::Array<Common::String> Sounds;
 
+enum SegmentType {
+	Straight,
+	Select3,
+	TurnLeft3,
+	Straight3,
+	TurnRight3,
+	Select2,
+	TurnLeft2,
+	TurnRight2,
+};
 
 class Segment {
 public:
@@ -432,6 +442,8 @@ public:
 		id = 0;
 		obj1KillsRequired = 0;
 		obj1MissesAllowed = 0;
+		obj2KillsRequired = 0;
+		obj2MissesAllowed = 0;
 		frameDelay = 0;
 	}
 	uint32 id;
@@ -443,6 +455,8 @@ public:
 	// Objectives
 	uint32 obj1KillsRequired;
 	uint32 obj1MissesAllowed;
+	uint32 obj2KillsRequired;
+	uint32 obj2MissesAllowed;
 
 	// Videos
 	Filename transitionVideo;


Commit: ceeec7dbddebc2bbff6f70c59db611c2fa7ef314
    https://github.com/scummvm/scummvm/commit/ceeec7dbddebc2bbff6f70c59db611c2fa7ef314
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-02-13T18:38:18+01:00

Commit Message:
HYPNO: solve rebase conflicts in arcade code

Changed paths:
    engines/hypno/arcade.cpp
    engines/hypno/grammar_arc.cpp
    engines/hypno/grammar_arc.y
    engines/hypno/lexer_arc.cpp
    engines/hypno/lexer_arc.l
    engines/hypno/tokens_arc.h


diff --git a/engines/hypno/arcade.cpp b/engines/hypno/arcade.cpp
index cc884aa5760..6a99c7548a1 100644
--- a/engines/hypno/arcade.cpp
+++ b/engines/hypno/arcade.cpp
@@ -41,7 +41,7 @@ void HypnoEngine::splitArcadeFile(const Common::String &filename, Common::String
 		if (x == 'X') {
 			while (!file.eos()) {
 				x = file.readByte();
-				if (x == 'Y')
+				if (x == 'Y' && list.size() > 0 && list[list.size()-1] == '\n')
 					break;
 				list += x;
 			}
@@ -69,6 +69,7 @@ void HypnoEngine::parseArcadeShooting(const Common::String &prefix, const Common
 	g_parsedArc->defeatNoEnergySecondVideo.clear();
 	g_parsedArc->beforeVideo.clear();
 	g_parsedArc->briefingVideo.clear();
+	g_parsedArc->segments.clear();
 }
 
 ShootSequence HypnoEngine::parseShootList(const Common::String &filename, const Common::String &data) {
@@ -144,6 +145,7 @@ void HypnoEngine::runArcade(ArcadeShooting *arc) {
 	_maxHealth = _health;
 	Segments segments = arc->segments;
 	uint32 segmentIdx = 0;
+	debugC(1, kHypnoDebugArcade, "Starting segment of type %x", segments[segmentIdx].type);
 	changeCursor("arcade");
 	_shoots.clear();
 	if (!arc->player.empty())
@@ -285,11 +287,38 @@ void HypnoEngine::runArcade(ArcadeShooting *arc) {
 			drawScreen();
 		}
 
-		if (background.decoder && background.decoder->getCurFrame() >= int(segments[segmentIdx].start + segments[segmentIdx].size)) {
-			debugC(1, kHypnoDebugArcade, "Finished segment %d", segmentIdx);
-			segmentIdx++;
+		if (background.decoder && background.decoder->getCurFrame() >= int(segments[segmentIdx].start + segments[segmentIdx].size - 1)) {
+			debugC(1, kHypnoDebugArcade, "Finished segment %d of type %x", segmentIdx, segments[segmentIdx].type);
+
+			if (segments[segmentIdx].type == 0xb3)
+				if (_rnd->getRandomBit() || segments.size() == 2)
+					segmentIdx = segmentIdx + 1;
+				else 
+					segmentIdx = segmentIdx + 5;
+			else if (segments[segmentIdx].type == 0xc5) {
+				if (mousePos.x <= 100)
+					segmentIdx = segmentIdx + 1;
+				else if (mousePos.x >= 300)
+					segmentIdx = segmentIdx + 3;
+				else 
+					segmentIdx = segmentIdx + 2;
+			} else if (segments[segmentIdx].type == 0xc2) {
+				if (mousePos.x <= 160)
+					segmentIdx = segmentIdx + 1;
+				else 
+					segmentIdx = segmentIdx + 2;
+			} else {
+				segmentIdx = 0;
+			}
+
 			if (segmentIdx >= segments.size())
 				error("Invalid segment %d", segmentIdx); 
+
+			debugC(1, kHypnoDebugArcade, "Starting segment %d of type %x at %d", segmentIdx, segments[segmentIdx].type, segments[segmentIdx].start);
+			if (segments[segmentIdx].type != 0x02) { // If it is not the end segment
+				background.decoder->forceSeekToFrame(segments[segmentIdx].start);
+				continue;
+			}
 		}
 
 		if (checkArcadeLevelCompleted(background, segments[segmentIdx])) {
@@ -488,7 +517,6 @@ void HypnoEngine::shoot(const Common::Point &mousePos) {
 				_shoots[i].video->position = Common::Point(mousePos.x - w / 2, mousePos.y - h / 2);
 			}
 		}
-
 	}
 }
 
diff --git a/engines/hypno/grammar_arc.cpp b/engines/hypno/grammar_arc.cpp
index e32d76b816c..4938866f87b 100644
--- a/engines/hypno/grammar_arc.cpp
+++ b/engines/hypno/grammar_arc.cpp
@@ -140,26 +140,26 @@ enum yysymbol_kind_t
   YYSYMBOL_YXTOK = 8,                      /* YXTOK  */
   YYSYMBOL_FNTOK = 9,                      /* FNTOK  */
   YYSYMBOL_ENCTOK = 10,                    /* ENCTOK  */
-  YYSYMBOL_NUM = 11,                       /* NUM  */
-  YYSYMBOL_BYTE = 12,                      /* BYTE  */
-  YYSYMBOL_COMMENT = 13,                   /* COMMENT  */
-  YYSYMBOL_CTOK = 14,                      /* CTOK  */
-  YYSYMBOL_DTOK = 15,                      /* DTOK  */
-  YYSYMBOL_HTOK = 16,                      /* HTOK  */
-  YYSYMBOL_HETOK = 17,                     /* HETOK  */
-  YYSYMBOL_HLTOK = 18,                     /* HLTOK  */
-  YYSYMBOL_HUTOK = 19,                     /* HUTOK  */
-  YYSYMBOL_RETTOK = 20,                    /* RETTOK  */
-  YYSYMBOL_QTOK = 21,                      /* QTOK  */
-  YYSYMBOL_RESTOK = 22,                    /* RESTOK  */
-  YYSYMBOL_PTOK = 23,                      /* PTOK  */
-  YYSYMBOL_FTOK = 24,                      /* FTOK  */
-  YYSYMBOL_TTOK = 25,                      /* TTOK  */
-  YYSYMBOL_TPTOK = 26,                     /* TPTOK  */
-  YYSYMBOL_ATOK = 27,                      /* ATOK  */
-  YYSYMBOL_VTOK = 28,                      /* VTOK  */
-  YYSYMBOL_OTOK = 29,                      /* OTOK  */
-  YYSYMBOL_ONTOK = 30,                     /* ONTOK  */
+  YYSYMBOL_ONTOK = 11,                     /* ONTOK  */
+  YYSYMBOL_NUM = 12,                       /* NUM  */
+  YYSYMBOL_BYTE = 13,                      /* BYTE  */
+  YYSYMBOL_COMMENT = 14,                   /* COMMENT  */
+  YYSYMBOL_CTOK = 15,                      /* CTOK  */
+  YYSYMBOL_DTOK = 16,                      /* DTOK  */
+  YYSYMBOL_HTOK = 17,                      /* HTOK  */
+  YYSYMBOL_HETOK = 18,                     /* HETOK  */
+  YYSYMBOL_HLTOK = 19,                     /* HLTOK  */
+  YYSYMBOL_HUTOK = 20,                     /* HUTOK  */
+  YYSYMBOL_RETTOK = 21,                    /* RETTOK  */
+  YYSYMBOL_QTOK = 22,                      /* QTOK  */
+  YYSYMBOL_RESTOK = 23,                    /* RESTOK  */
+  YYSYMBOL_PTOK = 24,                      /* PTOK  */
+  YYSYMBOL_FTOK = 25,                      /* FTOK  */
+  YYSYMBOL_TTOK = 26,                      /* TTOK  */
+  YYSYMBOL_TPTOK = 27,                     /* TPTOK  */
+  YYSYMBOL_ATOK = 28,                      /* ATOK  */
+  YYSYMBOL_VTOK = 29,                      /* VTOK  */
+  YYSYMBOL_OTOK = 30,                      /* OTOK  */
   YYSYMBOL_NTOK = 31,                      /* NTOK  */
   YYSYMBOL_NSTOK = 32,                     /* NSTOK  */
   YYSYMBOL_RTOK = 33,                      /* RTOK  */
@@ -509,7 +509,7 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  6
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   133
+#define YYLAST   138
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  45
@@ -572,13 +572,13 @@ static const yytype_int8 yytranslate[] =
 static const yytype_int16 yyrline[] =
 {
        0,    77,    77,    77,    78,    81,    82,    83,    86,    89,
-      90,    94,    95,    96,    97,    98,   103,   104,   105,   111,
-     116,   117,   121,   125,   128,   132,   133,   151,   171,   176,
-     179,   182,   189,   190,   193,   194,   195,   198,   206,   211,
-     216,   220,   224,   228,   232,   236,   240,   244,   248,   252,
-     256,   260,   264,   268,   272,   276,   280,   283,   287,   292,
-     293,   294,   298,   302,   305,   306,   309,   312,   316,   323,
-     324
+      90,    94,    95,    96,    97,    98,   103,   113,   114,   120,
+     125,   126,   130,   134,   137,   141,   142,   160,   180,   185,
+     190,   195,   202,   203,   206,   207,   208,   211,   219,   224,
+     229,   233,   237,   241,   245,   249,   253,   257,   261,   265,
+     269,   273,   277,   281,   285,   289,   293,   296,   300,   305,
+     306,   307,   311,   315,   318,   319,   322,   325,   329,   336,
+     337
 };
 #endif
 
@@ -595,11 +595,11 @@ static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
 static const char *const yytname[] =
 {
   "\"end of file\"", "error", "\"invalid token\"", "NAME", "FILENAME",
-  "BNTOK", "SNTOK", "KNTOK", "YXTOK", "FNTOK", "ENCTOK", "NUM", "BYTE",
-  "COMMENT", "CTOK", "DTOK", "HTOK", "HETOK", "HLTOK", "HUTOK", "RETTOK",
-  "QTOK", "RESTOK", "PTOK", "FTOK", "TTOK", "TPTOK", "ATOK", "VTOK",
-  "OTOK", "ONTOK", "NTOK", "NSTOK", "RTOK", "R0TOK", "ITOK", "JTOK",
-  "ZTOK", "NONETOK", "A0TOK", "P0TOK", "WTOK", "XTOK", "CB3TOK", "C02TOK",
+  "BNTOK", "SNTOK", "KNTOK", "YXTOK", "FNTOK", "ENCTOK", "ONTOK", "NUM",
+  "BYTE", "COMMENT", "CTOK", "DTOK", "HTOK", "HETOK", "HLTOK", "HUTOK",
+  "RETTOK", "QTOK", "RESTOK", "PTOK", "FTOK", "TTOK", "TPTOK", "ATOK",
+  "VTOK", "OTOK", "NTOK", "NSTOK", "RTOK", "R0TOK", "ITOK", "JTOK", "ZTOK",
+  "NONETOK", "A0TOK", "P0TOK", "WTOK", "XTOK", "CB3TOK", "C02TOK",
   "$accept", "start", "$@1", "header", "hline", "enc", "body", "bline", YY_NULLPTR
 };
 
@@ -610,7 +610,7 @@ yysymbol_name (yysymbol_kind_t yysymbol)
 }
 #endif
 
-#define YYPACT_NINF (-79)
+#define YYPACT_NINF (-77)
 
 #define yypact_value_is_default(Yyn) \
   ((Yyn) == YYPACT_NINF)
@@ -624,21 +624,21 @@ yysymbol_name (yysymbol_kind_t yysymbol)
    STATE-NUM.  */
 static const yytype_int8 yypact[] =
 {
-       5,   -79,     5,     8,    67,   -79,   -79,    10,    12,     6,
-       7,     0,    15,    30,    31,    67,    33,    34,    36,    -1,
-      19,    37,    11,    41,    42,    50,    51,    53,    57,     9,
-      67,   -79,    55,   -79,   -79,    52,    56,    58,    63,   -79,
-      64,    65,   -79,    66,    68,    69,    78,    90,   -79,    92,
-      93,   -79,   -79,   -79,   -79,    85,   -79,   -79,   -79,    95,
-      96,    97,    98,   -79,   -79,   -79,   -79,    74,   -79,   -79,
-     -79,   -79,    -5,   -79,   -79,   -79,   -79,   -79,    99,   107,
-     101,     1,   102,   103,   104,    -5,   112,   106,   -79,   108,
-     109,    35,   110,   -79,   111,   113,   114,    76,    -5,   115,
-      55,   116,   -79,   -79,   -79,   -79,   -79,   -79,   -79,   117,
-     118,   119,   -79,   -79,   -79,   -79,   -79,   -79,   -79,   -79,
-     -79,   -79,   -79,   -79,   -79,   -79,   -79,   -79,   -79,   120,
-     121,   -79,   -79,   -79,   -79,   -79,   -79,   -79,   -79,   -79,
-     -79,   -79
+      -2,   -77,    -2,     8,    67,   -77,   -77,     9,    10,     3,
+       5,     6,    11,    14,    29,    30,    67,    33,    34,    36,
+      -1,    19,    37,    21,    41,    43,    50,    51,    52,    25,
+      67,   -77,    48,    55,   -77,   -77,    57,    62,    63,    64,
+     -77,    65,    68,   -77,    69,    78,    89,    91,    92,   -77,
+      93,   -77,   -77,   -77,   -77,    58,   -77,   -77,   -77,   -77,
+      94,    95,    96,    97,   -77,   -77,   -77,   -77,    60,   -77,
+     -77,   -77,    -5,   -77,   -77,   -77,   -77,   -77,    98,   107,
+     100,     1,   101,   102,   103,    -5,   112,   105,   -77,   106,
+     108,    35,   109,   -77,   110,   111,   113,    77,    -5,   114,
+      48,   115,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   116,
+     117,   118,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,
+     -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   119,
+     120,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,   -77,
+     -77,   -77
 };
 
 /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -647,13 +647,13 @@ static const yytype_int8 yypact[] =
 static const yytype_int8 yydefact[] =
 {
        0,     2,     0,     0,     7,     4,     1,     0,     0,     0,
-       0,     0,     0,     0,     0,     7,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     7,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       7,    26,    33,     8,    10,     0,     0,     0,     0,     6,
-       0,     0,     9,     0,     0,     0,     0,     0,    14,     0,
-      17,    21,    22,    23,    24,     0,     5,    32,    27,     0,
-       0,     0,     0,    25,    11,    19,    20,     0,    12,    13,
-      15,    16,    36,    31,    28,    29,    30,    18,     0,     0,
+       7,    26,    33,    17,     8,    10,     0,     0,     0,     0,
+       6,     0,     0,     9,     0,     0,     0,     0,     0,    14,
+       0,    21,    22,    23,    24,     0,     5,    32,    27,    16,
+       0,     0,     0,     0,    25,    11,    19,    20,     0,    12,
+      13,    15,    36,    31,    28,    29,    30,    18,     0,     0,
        0,     0,     0,     0,     0,    36,     0,     0,    69,     0,
        0,     0,     0,    70,     0,     0,     0,     0,    36,     0,
       33,     0,    37,    38,    64,    67,    65,    35,    39,     0,
@@ -664,9 +664,9 @@ static const yytype_int8 yydefact[] =
 };
 
 /* YYPGOTO[NTERM-NUM].  */
-static const yytype_int16 yypgoto[] =
+static const yytype_int8 yypgoto[] =
 {
-     -79,   131,   -79,    -9,   -79,    23,   -78,   -79
+     -77,   122,   -77,    -9,   -77,    38,   -76,   -77
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
@@ -680,59 +680,59 @@ static const yytype_int8 yydefgoto[] =
    number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_uint8 yytable[] =
 {
-      78,    79,    80,    43,    81,   102,    39,   107,     6,    82,
-      83,    84,    35,     1,    31,    85,    32,    33,    34,    86,
-     133,    56,    47,    45,    87,     2,    88,    36,    89,    90,
-      91,    92,    93,    48,    94,    95,    96,    44,   112,   103,
-     113,   114,    37,    38,    40,    41,    55,    42,    46,   115,
-     116,   117,    49,    50,    51,    52,   118,    53,   119,   120,
-     121,    54,   122,    59,   123,    57,   124,    60,   125,    61,
-     126,   127,     7,     8,    62,    63,    64,    65,    77,    66,
-      67,     9,    10,    11,    12,    13,    14,    15,    16,    68,
-      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
-      27,    69,    28,    70,    71,    72,    73,    74,    75,    76,
-      99,   100,   101,   104,   105,   106,   108,   109,   132,   110,
-     111,   128,   129,   135,   130,   131,   134,   136,   137,   138,
-     139,   140,   141,     5
+      78,    79,    80,    44,    81,   102,     1,    40,     6,   107,
+      82,    83,    84,    31,    32,    33,    85,    34,    35,     2,
+      86,    56,   133,    46,    36,    87,    88,    37,    89,    90,
+      91,    92,    93,    48,    94,    95,    96,    45,   112,   103,
+     113,   114,    38,    39,    49,    41,    42,    51,    43,    47,
+     115,   116,   117,    50,    52,    53,    54,   118,    57,   119,
+     120,   121,    55,   122,    77,   123,   124,    59,   125,    60,
+     126,   127,     7,     8,    61,    62,    63,    64,     9,    72,
+      65,    66,    10,    11,    12,    13,    14,    15,    16,    17,
+      67,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    68,    28,    69,    70,    71,    73,    74,    75,    76,
+      99,   100,   101,   104,   105,   106,   108,   109,   110,   132,
+     111,   128,   129,   130,     5,   131,   134,   136,   137,   138,
+     139,   140,   141,     0,     0,     0,     0,     0,   135
 };
 
 static const yytype_int8 yycheck[] =
 {
-       5,     6,     7,     4,     9,     4,    15,    85,     0,    14,
-      15,    16,    12,     8,     4,    20,     4,    11,    11,    24,
-      98,    30,    11,     4,    29,    20,    31,    12,    33,    34,
-      35,    36,    37,    22,    39,    40,    41,    38,     3,    38,
-       5,     6,    12,    12,    11,    11,    37,    11,    11,    14,
-      15,    16,    11,    11,     4,     4,    21,     4,    23,    24,
-      25,     4,    27,    11,    29,    10,    31,    11,    33,    11,
-      35,    36,     5,     6,    11,    11,    11,    11,     4,    11,
-      11,    14,    15,    16,    17,    18,    19,    20,    21,    11,
-      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
-      33,    11,    35,    11,    11,    20,    11,    11,    11,    11,
-      11,     4,    11,    11,    11,    11,     4,    11,    42,    11,
-      11,    11,    11,   100,    11,    11,    11,    11,    11,    11,
-      11,    11,    11,     2
+       5,     6,     7,     4,     9,     4,     8,    16,     0,    85,
+      15,    16,    17,     4,     4,    12,    21,    12,    12,    21,
+      25,    30,    98,     4,    13,    30,    31,    13,    33,    34,
+      35,    36,    37,    12,    39,    40,    41,    38,     3,    38,
+       5,     6,    13,    13,    23,    12,    12,     4,    12,    12,
+      15,    16,    17,    12,     4,     4,     4,    22,    10,    24,
+      25,    26,    37,    28,     4,    30,    31,    12,    33,    12,
+      35,    36,     5,     6,    12,    12,    12,    12,    11,    21,
+      12,    12,    15,    16,    17,    18,    19,    20,    21,    22,
+      12,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    12,    35,    12,    12,    12,    12,    12,    12,    12,
+      12,     4,    12,    12,    12,    12,     4,    12,    12,    42,
+      12,    12,    12,    12,     2,    12,    12,    12,    12,    12,
+      12,    12,    12,    -1,    -1,    -1,    -1,    -1,   100
 };
 
 /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
    state STATE-NUM.  */
 static const yytype_int8 yystos[] =
 {
-       0,     8,    20,    46,    47,    46,     0,     5,     6,    14,
-      15,    16,    17,    18,    19,    20,    21,    23,    24,    25,
+       0,     8,    21,    46,    47,    46,     0,     5,     6,    11,
+      15,    16,    17,    18,    19,    20,    21,    22,    24,    25,
       26,    27,    28,    29,    30,    31,    32,    33,    35,    48,
-      49,     4,     4,    11,    11,    12,    12,    12,    12,    48,
-      11,    11,    11,     4,    38,     4,    11,    11,    22,    11,
-      11,     4,     4,     4,     4,    37,    48,    10,    50,    11,
-      11,    11,    11,    11,    11,    11,    11,    11,    11,    11,
-      11,    11,    20,    11,    11,    11,    11,     4,     5,     6,
-       7,     9,    14,    15,    16,    20,    24,    29,    31,    33,
-      34,    35,    36,    37,    39,    40,    41,    51,    52,    11,
-       4,    11,     4,    38,    11,    11,    11,    51,     4,    11,
-      11,    11,     3,     5,     6,    14,    15,    16,    21,    23,
-      24,    25,    27,    29,    31,    33,    35,    36,    11,    11,
-      11,    11,    42,    51,    11,    50,    11,    11,    11,    11,
-      11,    11
+      49,     4,     4,    12,    12,    12,    13,    13,    13,    13,
+      48,    12,    12,    12,     4,    38,     4,    12,    12,    23,
+      12,     4,     4,     4,     4,    37,    48,    10,    50,    12,
+      12,    12,    12,    12,    12,    12,    12,    12,    12,    12,
+      12,    12,    21,    12,    12,    12,    12,     4,     5,     6,
+       7,     9,    15,    16,    17,    21,    25,    30,    31,    33,
+      34,    35,    36,    37,    39,    40,    41,    51,    52,    12,
+       4,    12,     4,    38,    12,    12,    12,    51,     4,    12,
+      12,    12,     3,     5,     6,    15,    16,    17,    22,    24,
+      25,    26,    28,    30,    31,    33,    35,    36,    12,    12,
+      12,    12,    42,    51,    12,    50,    12,    12,    12,    12,
+      12,    12
 };
 
 /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM.  */
@@ -1286,86 +1286,95 @@ yyreduce:
 
   case 16: /* hline: ONTOK NUM NUM  */
 #line 103 "engines/hypno/grammar_arc.y"
-                        { debugC(1, kHypnoDebugParser, "ON %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1291 "engines/hypno/grammar_arc.cpp"
+                        { 
+		if (Common::String("O0") == (yyvsp[-2].s)) {
+			g_parsedArc->obj1KillsRequired = (yyvsp[-1].i);
+			g_parsedArc->obj1MissesAllowed = (yyvsp[0].i);
+		} else if (Common::String("O1") == (yyvsp[-2].s)) {
+			g_parsedArc->obj2KillsRequired = (yyvsp[-1].i);
+			g_parsedArc->obj2MissesAllowed = (yyvsp[0].i);
+		} else 
+			error("Invalid objective: '%s'", (yyvsp[-2].s));
+		debugC(1, kHypnoDebugParser, "ON %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
+#line 1300 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 17: /* hline: ONTOK NUM  */
-#line 104 "engines/hypno/grammar_arc.y"
+#line 113 "engines/hypno/grammar_arc.y"
                     { debugC(1, kHypnoDebugParser, "ON %d", (yyvsp[0].i)); }
-#line 1297 "engines/hypno/grammar_arc.cpp"
+#line 1306 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 18: /* hline: TPTOK FILENAME NUM FILENAME  */
-#line 105 "engines/hypno/grammar_arc.y"
+#line 114 "engines/hypno/grammar_arc.y"
                                       {
 		g_parsedArc->transitionVideo = (yyvsp[-2].s);
 		g_parsedArc->transitionTime = (yyvsp[-1].i);
 		g_parsedArc->transitionPalette = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "Tp %s %d %s", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].s)); 
 	}
-#line 1308 "engines/hypno/grammar_arc.cpp"
+#line 1317 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 19: /* hline: TTOK FILENAME NUM  */
-#line 111 "engines/hypno/grammar_arc.y"
+#line 120 "engines/hypno/grammar_arc.y"
                             { 
 		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 1318 "engines/hypno/grammar_arc.cpp"
+#line 1327 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 20: /* hline: TTOK NONETOK NUM  */
-#line 116 "engines/hypno/grammar_arc.y"
+#line 125 "engines/hypno/grammar_arc.y"
                            { debugC(1, kHypnoDebugParser, "T NONE %d", (yyvsp[0].i)); }
-#line 1324 "engines/hypno/grammar_arc.cpp"
+#line 1333 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 21: /* hline: NTOK FILENAME  */
-#line 117 "engines/hypno/grammar_arc.y"
+#line 126 "engines/hypno/grammar_arc.y"
                          { 
 		g_parsedArc->backgroundVideo = (yyvsp[0].s); 
 		debugC(1, kHypnoDebugParser, "N %s", (yyvsp[0].s)); 
 	}
-#line 1333 "engines/hypno/grammar_arc.cpp"
+#line 1342 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 22: /* hline: NSTOK FILENAME  */
-#line 121 "engines/hypno/grammar_arc.y"
+#line 130 "engines/hypno/grammar_arc.y"
                           { 
 		g_parsedArc->backgroundVideo = (yyvsp[0].s); 
 		debugC(1, kHypnoDebugParser, "N* %s", (yyvsp[0].s)); 
 	}
-#line 1342 "engines/hypno/grammar_arc.cpp"
+#line 1351 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 23: /* hline: RTOK FILENAME  */
-#line 125 "engines/hypno/grammar_arc.y"
+#line 134 "engines/hypno/grammar_arc.y"
                          {
 		g_parsedArc->backgroundPalette = (yyvsp[0].s); 
 		debugC(1, kHypnoDebugParser, "R %s", (yyvsp[0].s)); }
-#line 1350 "engines/hypno/grammar_arc.cpp"
+#line 1359 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 24: /* hline: ITOK FILENAME  */
-#line 128 "engines/hypno/grammar_arc.y"
+#line 137 "engines/hypno/grammar_arc.y"
                         { 
 		g_parsedArc->player = (yyvsp[0].s); 
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s)); 
 		}
-#line 1359 "engines/hypno/grammar_arc.cpp"
+#line 1368 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 25: /* hline: QTOK NUM NUM  */
-#line 132 "engines/hypno/grammar_arc.y"
+#line 141 "engines/hypno/grammar_arc.y"
                        { debugC(1, kHypnoDebugParser, "Q %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1365 "engines/hypno/grammar_arc.cpp"
+#line 1374 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 26: /* hline: BNTOK FILENAME  */
-#line 133 "engines/hypno/grammar_arc.y"
+#line 142 "engines/hypno/grammar_arc.y"
                          {
 		if (Common::String("B0") == (yyvsp[-1].s))
 			g_parsedArc->beforeVideo = (yyvsp[0].s);
@@ -1384,11 +1393,11 @@ yyreduce:
 
 		debugC(1, kHypnoDebugParser, "BN %s", (yyvsp[0].s)); 
 	}
-#line 1388 "engines/hypno/grammar_arc.cpp"
+#line 1397 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 27: /* hline: SNTOK FILENAME enc  */
-#line 151 "engines/hypno/grammar_arc.y"
+#line 160 "engines/hypno/grammar_arc.y"
                              {
 		uint32 sampleRate = 11025;
 		if (Common::String("22K") == (yyvsp[0].s) || Common::String("22k") == (yyvsp[0].s))
@@ -1409,59 +1418,63 @@ yyreduce:
 		}
 		debugC(1, kHypnoDebugParser, "SN %s", (yyvsp[-1].s)); 
 	}
-#line 1413 "engines/hypno/grammar_arc.cpp"
+#line 1422 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 28: /* hline: HETOK BYTE NUM NUM  */
-#line 171 "engines/hypno/grammar_arc.y"
+#line 180 "engines/hypno/grammar_arc.y"
                              {
-		Segment segment((yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
+		Segment segment((yyvsp[-2].i), (yyvsp[0].i), (yyvsp[-1].i));
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "HE %x %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i)); 
 	}
-#line 1423 "engines/hypno/grammar_arc.cpp"
+#line 1432 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 29: /* hline: HLTOK BYTE NUM NUM  */
-#line 176 "engines/hypno/grammar_arc.y"
-                             { 
+#line 185 "engines/hypno/grammar_arc.y"
+                             {
+		Segment segment((yyvsp[-2].i), (yyvsp[0].i), (yyvsp[-1].i));
+		g_parsedArc->segments.push_back(segment); 
 		debugC(1, kHypnoDebugParser, "HL %x %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i)); 
 	}
-#line 1431 "engines/hypno/grammar_arc.cpp"
+#line 1442 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 30: /* hline: HUTOK BYTE NUM NUM  */
-#line 179 "engines/hypno/grammar_arc.y"
-                             { 
+#line 190 "engines/hypno/grammar_arc.y"
+                             {
+		Segment segment((yyvsp[-2].i), (yyvsp[0].i), (yyvsp[-1].i));
+		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "HU %x %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i)); 
 	}
-#line 1439 "engines/hypno/grammar_arc.cpp"
+#line 1452 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 31: /* hline: HTOK BYTE NUM NUM  */
-#line 182 "engines/hypno/grammar_arc.y"
+#line 195 "engines/hypno/grammar_arc.y"
                             {
-		Segment segment((yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
+		Segment segment((yyvsp[-2].i), (yyvsp[0].i), (yyvsp[-1].i));
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "H %x %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i)); 
 	}
-#line 1449 "engines/hypno/grammar_arc.cpp"
+#line 1462 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 32: /* enc: ENCTOK  */
-#line 189 "engines/hypno/grammar_arc.y"
+#line 202 "engines/hypno/grammar_arc.y"
                      { (yyval.s) = (yyvsp[0].s); }
-#line 1455 "engines/hypno/grammar_arc.cpp"
+#line 1468 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 33: /* enc: %empty  */
-#line 190 "engines/hypno/grammar_arc.y"
+#line 203 "engines/hypno/grammar_arc.y"
                          { (yyval.s) = scumm_strdup(""); }
-#line 1461 "engines/hypno/grammar_arc.cpp"
+#line 1474 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 37: /* bline: FNTOK FILENAME  */
-#line 198 "engines/hypno/grammar_arc.y"
+#line 211 "engines/hypno/grammar_arc.y"
                       { 
 		shoot = new Shoot();
 		if (Common::String("F0") == (yyvsp[-1].s))
@@ -1470,271 +1483,271 @@ yyreduce:
 			shoot->explosionAnimation = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "FN %s", (yyvsp[0].s)); 
 	}
-#line 1474 "engines/hypno/grammar_arc.cpp"
+#line 1487 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 38: /* bline: FNTOK NONETOK  */
-#line 206 "engines/hypno/grammar_arc.y"
+#line 219 "engines/hypno/grammar_arc.y"
                         { 
 		shoot = new Shoot();
 		shoot->animation = "NONE";
 		debugC(1, kHypnoDebugParser, "FN NONE"); 
 	}
-#line 1484 "engines/hypno/grammar_arc.cpp"
+#line 1497 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 39: /* bline: FTOK FILENAME  */
-#line 211 "engines/hypno/grammar_arc.y"
+#line 224 "engines/hypno/grammar_arc.y"
                         { 
 		shoot = new Shoot();
 		shoot->animation = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "FN %s", (yyvsp[0].s)); 
 	}
-#line 1494 "engines/hypno/grammar_arc.cpp"
+#line 1507 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 40: /* bline: ITOK NAME  */
-#line 216 "engines/hypno/grammar_arc.y"
+#line 229 "engines/hypno/grammar_arc.y"
                      { 
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s)); 
 	}
-#line 1503 "engines/hypno/grammar_arc.cpp"
+#line 1516 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 41: /* bline: ITOK BNTOK  */
-#line 220 "engines/hypno/grammar_arc.y"
+#line 233 "engines/hypno/grammar_arc.y"
                       {  // Workaround for NAME == B1
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s)); 
 	}
-#line 1512 "engines/hypno/grammar_arc.cpp"
+#line 1525 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 42: /* bline: ITOK ATOK  */
-#line 224 "engines/hypno/grammar_arc.y"
+#line 237 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == A
 		shoot->name = "A";
 		debugC(1, kHypnoDebugParser, "I A"); 
 	}
-#line 1521 "engines/hypno/grammar_arc.cpp"
+#line 1534 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 43: /* bline: ITOK CTOK  */
-#line 228 "engines/hypno/grammar_arc.y"
+#line 241 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == C
 		shoot->name = "C";
 		debugC(1, kHypnoDebugParser, "I C"); 
 	}
-#line 1530 "engines/hypno/grammar_arc.cpp"
+#line 1543 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 44: /* bline: ITOK DTOK  */
-#line 232 "engines/hypno/grammar_arc.y"
+#line 245 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == D
 		shoot->name = "D";
 		debugC(1, kHypnoDebugParser, "I D"); 
 	}
-#line 1539 "engines/hypno/grammar_arc.cpp"
+#line 1552 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 45: /* bline: ITOK FTOK  */
-#line 236 "engines/hypno/grammar_arc.y"
+#line 249 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == F
 		shoot->name = "F";
 		debugC(1, kHypnoDebugParser, "I F"); 
 	}
-#line 1548 "engines/hypno/grammar_arc.cpp"
+#line 1561 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 46: /* bline: ITOK HTOK  */
-#line 240 "engines/hypno/grammar_arc.y"
+#line 253 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == H
 		shoot->name = "H";
 		debugC(1, kHypnoDebugParser, "I H"); 
 	}
-#line 1557 "engines/hypno/grammar_arc.cpp"
+#line 1570 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 47: /* bline: ITOK ITOK  */
-#line 244 "engines/hypno/grammar_arc.y"
+#line 257 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == I
 		shoot->name = "I";
 		debugC(1, kHypnoDebugParser, "I I"); 
 	}
-#line 1566 "engines/hypno/grammar_arc.cpp"
+#line 1579 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 48: /* bline: ITOK JTOK  */
-#line 248 "engines/hypno/grammar_arc.y"
+#line 261 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == I
 		shoot->name = "J";
 		debugC(1, kHypnoDebugParser, "I J"); 
 	}
-#line 1575 "engines/hypno/grammar_arc.cpp"
+#line 1588 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 49: /* bline: ITOK NTOK  */
-#line 252 "engines/hypno/grammar_arc.y"
+#line 265 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == N
 		shoot->name = "N";
 		debugC(1, kHypnoDebugParser, "I N"); 
 	}
-#line 1584 "engines/hypno/grammar_arc.cpp"
+#line 1597 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 50: /* bline: ITOK OTOK  */
-#line 256 "engines/hypno/grammar_arc.y"
+#line 269 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == O
 		shoot->name = "O";
 		debugC(1, kHypnoDebugParser, "I O"); 
 	}
-#line 1593 "engines/hypno/grammar_arc.cpp"
+#line 1606 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 51: /* bline: ITOK PTOK  */
-#line 260 "engines/hypno/grammar_arc.y"
+#line 273 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == P
 		shoot->name = "P";
 		debugC(1, kHypnoDebugParser, "I P"); 
 	}
-#line 1602 "engines/hypno/grammar_arc.cpp"
+#line 1615 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 52: /* bline: ITOK QTOK  */
-#line 264 "engines/hypno/grammar_arc.y"
+#line 277 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == Q
 		shoot->name = "Q";
 		debugC(1, kHypnoDebugParser, "I Q"); 
 	}
-#line 1611 "engines/hypno/grammar_arc.cpp"
+#line 1624 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 53: /* bline: ITOK RTOK  */
-#line 268 "engines/hypno/grammar_arc.y"
+#line 281 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == R
 		shoot->name = "R";
 		debugC(1, kHypnoDebugParser, "I R"); 
 	}
-#line 1620 "engines/hypno/grammar_arc.cpp"
+#line 1633 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 54: /* bline: ITOK SNTOK  */
-#line 272 "engines/hypno/grammar_arc.y"
+#line 285 "engines/hypno/grammar_arc.y"
                       {  // Workaround for NAME == S1
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s)); 
 	}
-#line 1629 "engines/hypno/grammar_arc.cpp"
+#line 1642 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 55: /* bline: ITOK TTOK  */
-#line 276 "engines/hypno/grammar_arc.y"
+#line 289 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == T
 		shoot->name = "T";
 		debugC(1, kHypnoDebugParser, "I T"); 
 	}
-#line 1638 "engines/hypno/grammar_arc.cpp"
+#line 1651 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 56: /* bline: JTOK NUM  */
-#line 280 "engines/hypno/grammar_arc.y"
+#line 293 "engines/hypno/grammar_arc.y"
                     {
 		debugC(1, kHypnoDebugParser, "J %d", (yyvsp[0].i)); 
 	}
-#line 1646 "engines/hypno/grammar_arc.cpp"
+#line 1659 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 57: /* bline: A0TOK NUM NUM  */
-#line 283 "engines/hypno/grammar_arc.y"
+#line 296 "engines/hypno/grammar_arc.y"
                         { 
 		shoot->position = Common::Point((yyvsp[-1].i), (yyvsp[0].i));
 		debugC(1, kHypnoDebugParser, "A0 %d %d", (yyvsp[-1].i), (yyvsp[0].i)); 
 	}
-#line 1655 "engines/hypno/grammar_arc.cpp"
+#line 1668 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 58: /* bline: RTOK NUM NUM  */
-#line 287 "engines/hypno/grammar_arc.y"
+#line 300 "engines/hypno/grammar_arc.y"
                         {
 		shoot->obj1KillsCount = (yyvsp[-1].i);
 		shoot->obj1MissesCount = (yyvsp[0].i); 
 		debugC(1, kHypnoDebugParser, "R %d %d", (yyvsp[-1].i), (yyvsp[0].i)); 
 	}
-#line 1665 "engines/hypno/grammar_arc.cpp"
+#line 1678 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 59: /* bline: R0TOK NUM NUM  */
-#line 292 "engines/hypno/grammar_arc.y"
+#line 305 "engines/hypno/grammar_arc.y"
                          { debugC(1, kHypnoDebugParser, "R0 %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1671 "engines/hypno/grammar_arc.cpp"
+#line 1684 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 60: /* bline: BNTOK NUM NUM  */
-#line 293 "engines/hypno/grammar_arc.y"
+#line 306 "engines/hypno/grammar_arc.y"
                         { debugC(1, kHypnoDebugParser, "BN %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1677 "engines/hypno/grammar_arc.cpp"
+#line 1690 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 61: /* bline: KNTOK NUM NUM  */
-#line 294 "engines/hypno/grammar_arc.y"
+#line 307 "engines/hypno/grammar_arc.y"
                         { 
 		shoot->explosionFrames.push_front((yyvsp[0].i));
 		debugC(1, kHypnoDebugParser, "KN %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1686 "engines/hypno/grammar_arc.cpp"
+#line 1699 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 62: /* bline: P0TOK NUM NUM  */
-#line 298 "engines/hypno/grammar_arc.y"
+#line 311 "engines/hypno/grammar_arc.y"
                         { 
 		shoot->paletteSize = (yyvsp[-1].i);
 		shoot->paletteOffset = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "P0 %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1695 "engines/hypno/grammar_arc.cpp"
+#line 1708 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 63: /* bline: OTOK NUM NUM  */
-#line 302 "engines/hypno/grammar_arc.y"
+#line 315 "engines/hypno/grammar_arc.y"
                        { 
 		debugC(1, kHypnoDebugParser, "O %d %d", (yyvsp[-1].i), (yyvsp[0].i)); 
 	}
-#line 1703 "engines/hypno/grammar_arc.cpp"
+#line 1716 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 64: /* bline: CTOK NUM  */
-#line 305 "engines/hypno/grammar_arc.y"
+#line 318 "engines/hypno/grammar_arc.y"
                     { debugC(1, kHypnoDebugParser, "C %d", (yyvsp[0].i)); }
-#line 1709 "engines/hypno/grammar_arc.cpp"
+#line 1722 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 65: /* bline: HTOK NUM  */
-#line 306 "engines/hypno/grammar_arc.y"
+#line 319 "engines/hypno/grammar_arc.y"
                     {
 		shoot->attackFrames.push_back((yyvsp[0].i)); 
 		debugC(1, kHypnoDebugParser, "H %d", (yyvsp[0].i)); }
-#line 1717 "engines/hypno/grammar_arc.cpp"
+#line 1730 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 66: /* bline: WTOK NUM  */
-#line 309 "engines/hypno/grammar_arc.y"
+#line 322 "engines/hypno/grammar_arc.y"
                     {
 		shoot->attackWeight = (yyvsp[0].i);  
 		debugC(1, kHypnoDebugParser, "W %d", (yyvsp[0].i)); }
-#line 1725 "engines/hypno/grammar_arc.cpp"
+#line 1738 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 67: /* bline: DTOK NUM  */
-#line 312 "engines/hypno/grammar_arc.y"
+#line 325 "engines/hypno/grammar_arc.y"
                     {
 		shoot->pointsToShoot = (yyvsp[0].i);  
 		debugC(1, kHypnoDebugParser, "D %d", (yyvsp[0].i)); 
 	}
-#line 1734 "engines/hypno/grammar_arc.cpp"
+#line 1747 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 68: /* bline: SNTOK FILENAME enc  */
-#line 316 "engines/hypno/grammar_arc.y"
+#line 329 "engines/hypno/grammar_arc.y"
                              { 
 		if (Common::String("S1") == (yyvsp[-2].s))
 			shoot->deathSound = (yyvsp[-1].s);
@@ -1742,28 +1755,28 @@ yyreduce:
 			shoot->hitSound = (yyvsp[-1].s);
 		 
 		debugC(1, kHypnoDebugParser, "SN %s", (yyvsp[-1].s)); }
-#line 1746 "engines/hypno/grammar_arc.cpp"
+#line 1759 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 69: /* bline: NTOK  */
-#line 323 "engines/hypno/grammar_arc.y"
+#line 336 "engines/hypno/grammar_arc.y"
                { debugC(1, kHypnoDebugParser, "N"); }
-#line 1752 "engines/hypno/grammar_arc.cpp"
+#line 1765 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 70: /* bline: ZTOK  */
-#line 324 "engines/hypno/grammar_arc.y"
+#line 337 "engines/hypno/grammar_arc.y"
                {
 		g_parsedArc->shoots.push_back(*shoot); 
 		//delete shoot; 
 		//shoot = nullptr;
 		debugC(1, kHypnoDebugParser, "Z"); 
 	}
-#line 1763 "engines/hypno/grammar_arc.cpp"
+#line 1776 "engines/hypno/grammar_arc.cpp"
     break;
 
 
-#line 1767 "engines/hypno/grammar_arc.cpp"
+#line 1780 "engines/hypno/grammar_arc.cpp"
 
       default: break;
     }
diff --git a/engines/hypno/grammar_arc.y b/engines/hypno/grammar_arc.y
index 4693930c16d..cc22f3a152a 100644
--- a/engines/hypno/grammar_arc.y
+++ b/engines/hypno/grammar_arc.y
@@ -55,11 +55,11 @@ using namespace Hypno;
 	int i;	 /* integer value */
 }
 
-%token<s> NAME FILENAME BNTOK SNTOK KNTOK YXTOK FNTOK ENCTOK
+%token<s> NAME FILENAME BNTOK SNTOK KNTOK YXTOK FNTOK ENCTOK ONTOK
 %token<i> NUM BYTE
 // header
 %token COMMENT CTOK DTOK HTOK HETOK HLTOK HUTOK RETTOK QTOK RESTOK
-%token PTOK FTOK TTOK TPTOK ATOK VTOK OTOK ONTOK NTOK NSTOK RTOK R0TOK ITOK JTOK ZTOK
+%token PTOK FTOK TTOK TPTOK ATOK VTOK OTOK NTOK NSTOK RTOK R0TOK ITOK JTOK ZTOK
 
 // body
 %token NONETOK A0TOK P0TOK WTOK
@@ -100,7 +100,16 @@ hline: 	CTOK NUM {
 		g_parsedArc->obj1MissesAllowed = $3;
 		debugC(1, kHypnoDebugParser, "O %d %d", $2, $3);
 	}
-	| ONTOK NUM NUM { debugC(1, kHypnoDebugParser, "ON %d %d", $2, $3); }
+	| ONTOK NUM NUM { 
+		if (Common::String("O0") == $1) {
+			g_parsedArc->obj1KillsRequired = $2;
+			g_parsedArc->obj1MissesAllowed = $3;
+		} else if (Common::String("O1") == $1) {
+			g_parsedArc->obj2KillsRequired = $2;
+			g_parsedArc->obj2MissesAllowed = $3;
+		} else 
+			error("Invalid objective: '%s'", $1);
+		debugC(1, kHypnoDebugParser, "ON %d %d", $2, $3); }
 	| ONTOK NUM { debugC(1, kHypnoDebugParser, "ON %d", $2); }
 	| TPTOK FILENAME NUM FILENAME {
 		g_parsedArc->transitionVideo = $2;
@@ -169,18 +178,22 @@ hline: 	CTOK NUM {
 		debugC(1, kHypnoDebugParser, "SN %s", $2); 
 	}
 	| HETOK BYTE NUM NUM {
-		Segment segment($2, $3, $4);
+		Segment segment($2, $4, $3);
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "HE %x %d %d", $2, $3, $4); 
 	}
-	| HLTOK BYTE NUM NUM { 
+	| HLTOK BYTE NUM NUM {
+		Segment segment($2, $4, $3);
+		g_parsedArc->segments.push_back(segment); 
 		debugC(1, kHypnoDebugParser, "HL %x %d %d", $2, $3, $4); 
 	}
-	| HUTOK BYTE NUM NUM { 
+	| HUTOK BYTE NUM NUM {
+		Segment segment($2, $4, $3);
+		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "HU %x %d %d", $2, $3, $4); 
 	}
 	| HTOK BYTE NUM NUM {
-		Segment segment($2, $3, $4);
+		Segment segment($2, $4, $3);
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "H %x %d %d", $2, $3, $4); 
 	}
diff --git a/engines/hypno/lexer_arc.cpp b/engines/hypno/lexer_arc.cpp
index 23bae163621..cd03e0f9abf 100644
--- a/engines/hypno/lexer_arc.cpp
+++ b/engines/hypno/lexer_arc.cpp
@@ -1174,7 +1174,7 @@ return OTOK;
 case 12:
 YY_RULE_SETUP
 #line 54 "engines/hypno/lexer_arc.l"
-return ONTOK;
+HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return ONTOK;
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
diff --git a/engines/hypno/lexer_arc.l b/engines/hypno/lexer_arc.l
index fd4297a8ad3..c2a80b8cb6f 100644
--- a/engines/hypno/lexer_arc.l
+++ b/engines/hypno/lexer_arc.l
@@ -51,7 +51,7 @@ P							return PTOK;
 A							return ATOK;
 V							return VTOK;
 O							return OTOK;
-O[0-1]						return ONTOK;
+O[0-1]						HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return ONTOK;
 N							return NTOK;
 N\*							return NSTOK;
 R							return RTOK;
diff --git a/engines/hypno/tokens_arc.h b/engines/hypno/tokens_arc.h
index b5ddf045274..14ade8ae84a 100644
--- a/engines/hypno/tokens_arc.h
+++ b/engines/hypno/tokens_arc.h
@@ -70,26 +70,26 @@ extern int HYPNO_ARC_debug;
     YXTOK = 263,                   /* YXTOK  */
     FNTOK = 264,                   /* FNTOK  */
     ENCTOK = 265,                  /* ENCTOK  */
-    NUM = 266,                     /* NUM  */
-    BYTE = 267,                    /* BYTE  */
-    COMMENT = 268,                 /* COMMENT  */
-    CTOK = 269,                    /* CTOK  */
-    DTOK = 270,                    /* DTOK  */
-    HTOK = 271,                    /* HTOK  */
-    HETOK = 272,                   /* HETOK  */
-    HLTOK = 273,                   /* HLTOK  */
-    HUTOK = 274,                   /* HUTOK  */
-    RETTOK = 275,                  /* RETTOK  */
-    QTOK = 276,                    /* QTOK  */
-    RESTOK = 277,                  /* RESTOK  */
-    PTOK = 278,                    /* PTOK  */
-    FTOK = 279,                    /* FTOK  */
-    TTOK = 280,                    /* TTOK  */
-    TPTOK = 281,                   /* TPTOK  */
-    ATOK = 282,                    /* ATOK  */
-    VTOK = 283,                    /* VTOK  */
-    OTOK = 284,                    /* OTOK  */
-    ONTOK = 285,                   /* ONTOK  */
+    ONTOK = 266,                   /* ONTOK  */
+    NUM = 267,                     /* NUM  */
+    BYTE = 268,                    /* BYTE  */
+    COMMENT = 269,                 /* COMMENT  */
+    CTOK = 270,                    /* CTOK  */
+    DTOK = 271,                    /* DTOK  */
+    HTOK = 272,                    /* HTOK  */
+    HETOK = 273,                   /* HETOK  */
+    HLTOK = 274,                   /* HLTOK  */
+    HUTOK = 275,                   /* HUTOK  */
+    RETTOK = 276,                  /* RETTOK  */
+    QTOK = 277,                    /* QTOK  */
+    RESTOK = 278,                  /* RESTOK  */
+    PTOK = 279,                    /* PTOK  */
+    FTOK = 280,                    /* FTOK  */
+    TTOK = 281,                    /* TTOK  */
+    TPTOK = 282,                   /* TPTOK  */
+    ATOK = 283,                    /* ATOK  */
+    VTOK = 284,                    /* VTOK  */
+    OTOK = 285,                    /* OTOK  */
     NTOK = 286,                    /* NTOK  */
     NSTOK = 287,                   /* NSTOK  */
     RTOK = 288,                    /* RTOK  */




More information about the Scummvm-git-logs mailing list