[Scummvm-git-logs] scummvm master -> 1789c4d2e056bb454755ffa95dd29e030da998e0

neuromancer noreply at scummvm.org
Thu May 12 18:43:50 UTC 2022


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

Summary:
a357b9a971 HYPNO: implement basic key handling (cheats, jump to scummvm menu) in boyz
9aea99b53e HYPNO: refactor shoot handling and implement basic reloading in boyz
234116ee6d HYPNO: basic implementation of left click in boyz
3d06c5b8e6 HYPNO: crossair and playback fixes in boyz
21a2a0d8df HYPNO: load select_c3 level in boyz
0e786346bf HYPNO: added additional sounds when interacting with people/animals in boyz
4c71465c69 HYPNO: avoid hitting the player when missing animation is 0 in boyz
dcb6e4fd86 HYPNO: play interaction video when talking with civilians in boyz
8341c5db0f HYPNO: add segment size to debug message
009398ef26 HYPNO: improved interactions with civilians/animals in boyz
dc62139c93 HYPNO: make sure enemy sounds are always played
a7ae041c1b HYPNO: avoid crashing when interaction frame is zero in boyz
8d912d9226 HYPNO: added no ammo sound in boyz
9275d8dc6a HYPNO: simplified and improved mask handling in boyz
a806795e11 HYPNO: added reload sound for every weapon in boyz
e4dfe8d1d8 HYPNO: implemented some transitions with a fixed sound in boyz
1789c4d2e0 HYPNO: make sure sounds are played in the correct rate in boyz


Commit: a357b9a971d66c9ec7329859c8b812e04e182a90
    https://github.com/scummvm/scummvm/commit/a357b9a971d66c9ec7329859c8b812e04e182a90
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-12T20:43:58+02:00

Commit Message:
HYPNO: implement basic key handling (cheats, jump to scummvm menu) in boyz

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


diff --git a/engines/hypno/boyz/arcade.cpp b/engines/hypno/boyz/arcade.cpp
index 6b541a43501..de72715e270 100644
--- a/engines/hypno/boyz/arcade.cpp
+++ b/engines/hypno/boyz/arcade.cpp
@@ -66,6 +66,19 @@ void BoyzEngine::runAfterArcade(ArcadeShooting *arc) {
 	}
 }
 
+void BoyzEngine::pressedKey(const int keycode) {
+	if (keycode == Common::KEYCODE_c) {
+		if (_cheatsEnabled) {
+			_skipLevel = true;
+			return;
+		}
+	} else if (keycode == Common::KEYCODE_k) { // Added for testing
+		_health = 0;
+	} else if (keycode == Common::KEYCODE_ESCAPE) {
+		openMainMenuDialog();
+	}
+}
+
 void BoyzEngine::updateFromScript() {
 	if (_currentScript.size() > 0) {
 		ScriptInfo si = *_currentScript.begin();
diff --git a/engines/hypno/hypno.h b/engines/hypno/hypno.h
index e95db7c7e5e..c1d0bd4fa74 100644
--- a/engines/hypno/hypno.h
+++ b/engines/hypno/hypno.h
@@ -543,6 +543,7 @@ public:
 
 	void runBeforeArcade(ArcadeShooting *arc) override;
 	void runAfterArcade(ArcadeShooting *arc) override;
+	void pressedKey(const int keycode) override;
 	int detectTarget(const Common::Point &mousePos) override;
 	void drawCursorArcade(const Common::Point &mousePos) override;
 	void shoot(const Common::Point &mousePos, ArcadeShooting *arc) override;


Commit: 9aea99b53eb1a3c98dac19b159502178c5ec8d26
    https://github.com/scummvm/scummvm/commit/9aea99b53eb1a3c98dac19b159502178c5ec8d26
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-12T20:43:58+02:00

Commit Message:
HYPNO: refactor shoot handling and implement basic reloading in boyz

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


diff --git a/engines/hypno/arcade.cpp b/engines/hypno/arcade.cpp
index 7ebcd7c5235..9bf90bce3fe 100644
--- a/engines/hypno/arcade.cpp
+++ b/engines/hypno/arcade.cpp
@@ -535,14 +535,9 @@ void HypnoEngine::runArcade(ArcadeShooting *arc) {
 
 		if (needsUpdate) {
 			if (shootingPrimary) {
-				shoot(mousePos, arc);
-				drawShoot(mousePos);
-				shootingPrimary = false;
+				shootingPrimary = shoot(mousePos, arc, false);
 			} else if (shootingSecondary) {
-				shoot(mousePos, arc);
-				if (_background->decoder->getCurFrame() % 2 == 0)
-					drawShoot(mousePos);
-				shootingSecondary = clickedSecondaryShoot(mousePos);
+				shootingSecondary = shoot(mousePos, arc, true);
 			}
 
 			drawPlayer();
@@ -625,7 +620,7 @@ void HypnoEngine::drawCursorArcade(const Common::Point &mousePos) {
 
 bool HypnoEngine::clickedPrimaryShoot(const Common::Point &mousePos) { return true; }
 
-void HypnoEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc) {
+bool HypnoEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc, bool secondary) {
 	incShotsFired();
 	int i = detectTarget(mousePos);
 	if (i < 0) {
@@ -639,7 +634,7 @@ void HypnoEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc) {
 			_shoots[i].timesToShoot = _shoots[i].timesToShoot - 1;
 			// Redraw cursor
 			drawCursorArcade(mousePos);
-			return;
+			goto end;
 		}
 
 		if (!_shoots[i].deathSound.empty())
@@ -712,6 +707,15 @@ void HypnoEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc) {
 		// Redraw cursor
 		drawCursorArcade(mousePos);
 	}
+	end:
+	if (secondary) {
+		if (_background->decoder->getCurFrame() % 2 == 0)
+			drawShoot(mousePos);
+		return clickedSecondaryShoot(mousePos);
+	} else {
+		drawShoot(mousePos);
+		return false;
+	}
 }
 
 void HypnoEngine::incBonus(int inc) {
diff --git a/engines/hypno/boyz/arcade.cpp b/engines/hypno/boyz/arcade.cpp
index de72715e270..7694c1e9118 100644
--- a/engines/hypno/boyz/arcade.cpp
+++ b/engines/hypno/boyz/arcade.cpp
@@ -218,13 +218,13 @@ int BoyzEngine::detectTarget(const Common::Point &mousePos) {
 	return -1;
 }
 
-void BoyzEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc) {
+bool BoyzEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc, bool secondary) {
 	if (_currentMode == NonInteractive) {
-		return;
+		return false;
 	}
 
 	if (_ammoTeam[_currentActor] == 0)
-		return; // TODO: out of ammo sound is missing
+		return false; // TODO: out of ammo sound is missing
 	if (!_infiniteAmmoCheat)
 		_ammoTeam[_currentActor]--;
 	playSound(_soundPath + _weaponShootSound[_currentWeapon], 1);
@@ -249,6 +249,7 @@ void BoyzEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc) {
 		_shoots.clear();
 		changeCursor(_crosshairsActive[_currentWeapon], _crosshairsPalette, true);
 	}
+	return false;
 }
 
 void BoyzEngine::missedTarget(Shoot *s, ArcadeShooting *arc) {
@@ -267,4 +268,18 @@ void BoyzEngine::missedTarget(Shoot *s, ArcadeShooting *arc) {
 	_masks->decoder->forceSeekToFrame(s->missedAnimation);
 }
 
+bool BoyzEngine::clickedSecondaryShoot(const Common::Point &mousePos) {
+	if (_currentMode == NonInteractive) {
+		return false;
+	}
+
+	Common::Rect ammoBarBox(320 - _ammoBar[_currentActor].w, 0, 320, _ammoBar[_currentActor].h);
+	if (ammoBarBox.contains(mousePos)) {
+		_ammoTeam[_currentActor] = _weaponMaxAmmo[_currentWeapon];
+		// TODO: play reload sound
+		return false;
+	}
+	return true;
+}
+
 } // namespace Hypno
\ No newline at end of file
diff --git a/engines/hypno/hypno.h b/engines/hypno/hypno.h
index c1d0bd4fa74..c8f2b6d8941 100644
--- a/engines/hypno/hypno.h
+++ b/engines/hypno/hypno.h
@@ -258,7 +258,7 @@ public:
 	virtual bool clickedPrimaryShoot(const Common::Point &mousePos);
 	virtual bool clickedSecondaryShoot(const Common::Point &mousePos);
 	virtual void drawShoot(const Common::Point &mousePos);
-	virtual void shoot(const Common::Point &mousePos, ArcadeShooting *arc);
+	virtual bool shoot(const Common::Point &mousePos, ArcadeShooting *arc, bool secondary);
 	virtual void hitPlayer();
 	virtual void missedTarget(Shoot *s, ArcadeShooting *arc);
 	virtual void missNoTarget(ArcadeShooting *arc);
@@ -546,7 +546,8 @@ public:
 	void pressedKey(const int keycode) override;
 	int detectTarget(const Common::Point &mousePos) override;
 	void drawCursorArcade(const Common::Point &mousePos) override;
-	void shoot(const Common::Point &mousePos, ArcadeShooting *arc) override;
+	bool shoot(const Common::Point &mousePos, ArcadeShooting *arc, bool secondary) override;
+	bool clickedSecondaryShoot(const Common::Point &mousePos) override;
 
 	void missedTarget(Shoot *s, ArcadeShooting *arc) override;
 	void drawHealth() override;


Commit: 234116ee6d370d48d1192d5531c1be60402f609e
    https://github.com/scummvm/scummvm/commit/234116ee6d370d48d1192d5531c1be60402f609e
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-12T20:43:58+02:00

Commit Message:
HYPNO: basic implementation of left click in boyz

Changed paths:
    engines/hypno/boyz/arcade.cpp
    engines/hypno/boyz/boyz.cpp
    engines/hypno/grammar.h
    engines/hypno/grammar_arc.cpp
    engines/hypno/grammar_arc.y
    engines/hypno/hypno.h


diff --git a/engines/hypno/boyz/arcade.cpp b/engines/hypno/boyz/arcade.cpp
index 7694c1e9118..53b7fa24e2d 100644
--- a/engines/hypno/boyz/arcade.cpp
+++ b/engines/hypno/boyz/arcade.cpp
@@ -212,8 +212,7 @@ int BoyzEngine::detectTarget(const Common::Point &mousePos) {
 	Common::Point target = computeTargetPosition(mousePos);
 	assert(_shoots.size() <= 1);
 	for (Shoots::iterator it = _shoots.begin(); it != _shoots.end(); ++it) {
-		if (_mask->getPixel(target.x, target.y) == 1)
-			return 0;
+		return _mask->getPixel(target.x, target.y) - 1;
 	}
 	return -1;
 }
@@ -223,29 +222,81 @@ bool BoyzEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc, bool
 		return false;
 	}
 
-	if (_ammoTeam[_currentActor] == 0)
-		return false; // TODO: out of ammo sound is missing
-	if (!_infiniteAmmoCheat)
-		_ammoTeam[_currentActor]--;
-	playSound(_soundPath + _weaponShootSound[_currentWeapon], 1);
-	incShotsFired();
+	if (!secondary) {
+		if (_ammoTeam[_currentActor] == 0)
+			return false; // TODO: out of ammo sound is missing
+		if (!_infiniteAmmoCheat)
+			_ammoTeam[_currentActor]--;
+		playSound(_soundPath + _weaponShootSound[_currentWeapon], 1);
+		incShotsFired();
+	}
 	int i = detectTarget(mousePos);
 	if (i < 0) {
 		missNoTarget(arc);
 	} else {
-		if (!_shoots[i].hitSound.empty())
+
+		if (i == 9 && secondary) {
+			if (_shoots[0].isAnimal)
+				return false;
+
+			_background->decoder->pauseVideo(true);
+			MVideo video(arc->missBoss2Video, Common::Point(0, 0), false, true, false);
+			disableCursor();
+			runIntro(video);
+			// Should be currentPalette?
+			loadPalette(arc->backgroundPalette);
+			_background->decoder->pauseVideo(false);
+			updateScreen(*_background);
+			drawScreen();
+			if (!_music.empty())
+				playSound(_music, 0, arc->musicRate); // restore music
+
+			return false;
+		} else if (i == 9 && !secondary) {
+
+			Common::String filename;
+			if (_shoots[0].isAnimal)
+				filename = _warningAnimals;
+			else {
+				filename = _warningCivilians[_civiliansShoot];
+				_civiliansShoot++;
+			}
+
+			_background->decoder->pauseVideo(true);
+			MVideo video(filename, Common::Point(0, 0), false, true, false);
+			disableCursor();
+			runIntro(video);
+			// Should be currentPalette?
+			loadPalette(arc->backgroundPalette);
+			_background->decoder->pauseVideo(false);
+			updateScreen(*_background);
+			drawScreen();
+			if (!_music.empty())
+				playSound(_music, 0, arc->musicRate); // restore music
+
+			_healthTeam[_currentActor] = _healthTeam[_currentActor] - 10;
+			return false;
+		} else if (i == 0 && secondary) {
+			// Nothing
+			return false;
+		}
+
+		if (i != 0 || secondary)
+			error("Invalid target %d", i);
+
+		if (!_shoots[0].hitSound.empty())
 			playSound(_soundPath + _shoots[i].hitSound, 1);
 
 		incEnemyHits();
-		if (!_shoots[i].deathSound.empty())
+		if (!_shoots[0].deathSound.empty())
 			playSound(_soundPath + _shoots[i].deathSound, 1);
 
 		incTargetsDestroyed();
-		incScore(_shoots[i].pointsToShoot);
-		incBonus(_shoots[i].pointsToShoot);
+		incScore(_shoots[0].pointsToShoot);
+		incBonus(_shoots[0].pointsToShoot);
 		_shoots[i].destroyed = true;
-		_background->decoder->forceSeekToFrame(_shoots[i].explosionFrames[0].start - 3);
-		_masks->decoder->forceSeekToFrame(_shoots[i].explosionFrames[0].start - 3);
+		_background->decoder->forceSeekToFrame(_shoots[0].explosionFrames[0].start - 3);
+		_masks->decoder->forceSeekToFrame(_shoots[0].explosionFrames[0].start - 3);
 		_shoots.clear();
 		changeCursor(_crosshairsActive[_currentWeapon], _crosshairsPalette, true);
 	}
diff --git a/engines/hypno/boyz/boyz.cpp b/engines/hypno/boyz/boyz.cpp
index c33d97505fd..d453501f86b 100644
--- a/engines/hypno/boyz/boyz.cpp
+++ b/engines/hypno/boyz/boyz.cpp
@@ -79,8 +79,8 @@ void BoyzEngine::loadAssets() {
 	loadArcadeLevel("c19.mi_", "c11.mi_", "??", "");
 	loadArcadeLevel("c11.mi_", "c12.mi_", "??", "");
 	loadArcadeLevel("c12.mi_", "c14.mi_", "??", "");
-	loadArcadeLevel("c13.mi_", "??", "??", "");
-	loadArcadeLevel("c14.mi_", "c15.mi_", "??", "");
+	loadArcadeLevel("c14.mi_", "c13.mi_", "??", "");
+	loadArcadeLevel("c13.mi_", "c15.mi_", "??", "");
 	loadArcadeLevel("c15.mi_", "c16.mi_", "??", "");
 	loadArcadeLevel("c16.mi_", "c17.mi_", "??", "");
 	loadArcadeLevel("c17.mi_", "c18.mi_", "??", "");
@@ -233,6 +233,12 @@ void BoyzEngine::loadAssets() {
 	_weaponMaxAmmo[6] = 0;
 
 	_maxHealth = 100;
+	_civiliansShoot = 0;
+	_warningAnimals = "warnings/w01s.smk";
+	_warningCivilians.push_back("warnings/w02s.smk");
+	_warningCivilians.push_back("warnings/w03s.smk");
+	_warningCivilians.push_back("warnings/w04s.smk");
+	_warningCivilians.push_back("warnings/w05s.smk");
 
 	// Set initial health for the team
 	for (int i = 0; i < 7; i++) {
diff --git a/engines/hypno/grammar.h b/engines/hypno/grammar.h
index b21b249ccfc..1f4fdd7741a 100644
--- a/engines/hypno/grammar.h
+++ b/engines/hypno/grammar.h
@@ -424,6 +424,7 @@ public:
 		startFrame = 0;
 		lastFrame = 1024;
 		noEnemySound = false;
+		isAnimal = false;
 	}
 	Common::String name;
 	Filename animation;
@@ -461,6 +462,7 @@ public:
 	Filename explosionAnimation;
 	bool destroyed;
 	bool noEnemySound;
+	bool isAnimal;
 };
 
 typedef Common::Array<Shoot> Shoots;
diff --git a/engines/hypno/grammar_arc.cpp b/engines/hypno/grammar_arc.cpp
index 99a7cadf9d2..ebd9c2e43bc 100644
--- a/engines/hypno/grammar_arc.cpp
+++ b/engines/hypno/grammar_arc.cpp
@@ -626,7 +626,7 @@ static const yytype_int16 yyrline[] =
      424,   428,   432,   435,   439,   444,   449,   452,   457,   462,
      466,   472,   476,   479,   480,   481,   484,   488,   491,   496,
      499,   500,   504,   507,   511,   520,   524,   525,   528,   531,
-     534,   537,   540,   542
+     535,   538,   541,   543
 };
 #endif
 
@@ -2225,47 +2225,48 @@ yyreduce:
   case 109: /* bline: TTOK  */
 #line 531 "engines/hypno/grammar_arc.y"
                {
+		shoot->isAnimal = true;
 		debugC(1, kHypnoDebugParser, "T");
 	}
-#line 2231 "engines/hypno/grammar_arc.cpp"
+#line 2232 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 110: /* bline: MTOK  */
-#line 534 "engines/hypno/grammar_arc.y"
+#line 535 "engines/hypno/grammar_arc.y"
                {
 		debugC(1, kHypnoDebugParser, "M");
 	}
-#line 2239 "engines/hypno/grammar_arc.cpp"
+#line 2240 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 111: /* bline: NTOK  */
-#line 537 "engines/hypno/grammar_arc.y"
+#line 538 "engines/hypno/grammar_arc.y"
                {
 		shoot->noEnemySound = true;
 		debugC(1, kHypnoDebugParser, "N"); }
-#line 2247 "engines/hypno/grammar_arc.cpp"
+#line 2248 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 112: /* bline: NRTOK  */
-#line 540 "engines/hypno/grammar_arc.y"
+#line 541 "engines/hypno/grammar_arc.y"
                 {
 		debugC(1, kHypnoDebugParser, "NR"); }
-#line 2254 "engines/hypno/grammar_arc.cpp"
+#line 2255 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 113: /* bline: ZTOK  */
-#line 542 "engines/hypno/grammar_arc.y"
+#line 543 "engines/hypno/grammar_arc.y"
                {
 		g_parsedArc->shoots.push_back(*shoot);
 		//delete shoot;
 		//shoot = nullptr;
 		debugC(1, kHypnoDebugParser, "Z");
 	}
-#line 2265 "engines/hypno/grammar_arc.cpp"
+#line 2266 "engines/hypno/grammar_arc.cpp"
     break;
 
 
-#line 2269 "engines/hypno/grammar_arc.cpp"
+#line 2270 "engines/hypno/grammar_arc.cpp"
 
       default: break;
     }
diff --git a/engines/hypno/grammar_arc.y b/engines/hypno/grammar_arc.y
index 66a62703717..9a7e59c7df8 100644
--- a/engines/hypno/grammar_arc.y
+++ b/engines/hypno/grammar_arc.y
@@ -529,6 +529,7 @@ bline: FNTOK FILENAME {
 		debugC(1, kHypnoDebugParser, "T %d", $2);
 	}
 	| TTOK {
+		shoot->isAnimal = true;
 		debugC(1, kHypnoDebugParser, "T");
 	}
 	| MTOK {
diff --git a/engines/hypno/hypno.h b/engines/hypno/hypno.h
index c8f2b6d8941..eb518112a6b 100644
--- a/engines/hypno/hypno.h
+++ b/engines/hypno/hypno.h
@@ -585,6 +585,9 @@ public:
 	ScriptMode _currentMode;
 	uint32 _currentActor;
 	uint32 _currentWeapon;
+	uint32 _civiliansShoot;
+	Filename _warningAnimals;
+	Common::Array<Filename> _warningCivilians;
 
 	Common::BitArray _font05;
 	Common::BitArray _font08;


Commit: 3d06c5b8e6e299e422225d3823af653497135aae
    https://github.com/scummvm/scummvm/commit/3d06c5b8e6e299e422225d3823af653497135aae
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-12T20:43:58+02:00

Commit Message:
HYPNO: crossair and playback fixes in boyz

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


diff --git a/engines/hypno/arcade.cpp b/engines/hypno/arcade.cpp
index 9bf90bce3fe..67c523d4915 100644
--- a/engines/hypno/arcade.cpp
+++ b/engines/hypno/arcade.cpp
@@ -251,8 +251,10 @@ void HypnoEngine::runArcade(ArcadeShooting *arc) {
 	loadPalette(_currentPalette);
 
 	if (segments[_segmentIdx].start > 1) {
-		_background->decoder->forceSeekToFrame(segments[_segmentIdx].start - 10);
-		segments[_segmentIdx].size -= segments[_segmentIdx].start;
+		int start = segments[_segmentIdx].start;
+		_background->decoder->forceSeekToFrame(start);
+		_masks->decoder->forceSeekToFrame(start);
+		segments[_segmentIdx].size -= start;
 		segments[_segmentIdx].start = 1;
 	}
 
diff --git a/engines/hypno/boyz/boyz.cpp b/engines/hypno/boyz/boyz.cpp
index d453501f86b..a4f113b87ab 100644
--- a/engines/hypno/boyz/boyz.cpp
+++ b/engines/hypno/boyz/boyz.cpp
@@ -87,7 +87,7 @@ void BoyzEngine::loadAssets() {
 	loadArcadeLevel("c18.mi_", "c21.mi_", "??", "");
 
 	loadArcadeLevel("c21.mi_", "c22.mi_", "??", "");
-	loadArcadeLevel("c22.mi_", "c23.mi_", "??", "");
+	loadArcadeLevel("c22.mi_", "c31.mi_", "??", "");
 	loadArcadeLevel("c31.mi_", "c32.mi_", "??", "");
 	loadArcadeLevel("c32.mi_", "c33.mi_", "??", "");
 	loadArcadeLevel("c33.mi_", "c34.mi_", "??", "");
@@ -144,6 +144,19 @@ void BoyzEngine::loadAssets() {
 	_crosshairsTarget[1].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
 	_crosshairsTarget[1].copyRectToSurface(*targets, 0, 0, cursorBox);
 
+	// Double big crossair, shotgun?
+	cursorBox = Common::Rect(104, 7, 136, 25);
+	_crosshairsInactive[2].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
+	_crosshairsInactive[2].copyRectToSurface(*targets, 0, 0, cursorBox);
+
+	cursorBox = Common::Rect(104, 39, 136, 57);
+	_crosshairsActive[2].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
+	_crosshairsActive[2].copyRectToSurface(*targets, 0, 0, cursorBox);
+
+	cursorBox = Common::Rect(104, 71, 136, 83);
+	_crosshairsTarget[2].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
+	_crosshairsTarget[2].copyRectToSurface(*targets, 0, 0, cursorBox);
+
 	cursorBox = Common::Rect(16, 8, 32, 24);
 	_crosshairsInactive[3].create(cursorBox.width(), cursorBox.height(), _pixelFormat);
 	_crosshairsInactive[3].copyRectToSurface(*targets, 0, 0, cursorBox);
@@ -251,7 +264,7 @@ void BoyzEngine::loadAssets() {
 	loadLib("", "misc/fonts.lib", true);
 	loadFonts();
 
-	_nextLevel = "c11.mi_";
+	_nextLevel = "<start>";
 }
 
 void BoyzEngine::loadFonts() {
diff --git a/engines/hypno/hypno.h b/engines/hypno/hypno.h
index eb518112a6b..4d823de482b 100644
--- a/engines/hypno/hypno.h
+++ b/engines/hypno/hypno.h
@@ -565,7 +565,7 @@ public:
 	private:
 	void runMainMenu(Code *code);
 
-	int _ammoTeam[6];
+	int _ammoTeam[7];
 	int _healthTeam[7];
 	Graphics::Surface _healthBar[7];
 	Graphics::Surface _ammoBar[7];


Commit: 21a2a0d8df5b4085ce156be737b22b07752617c6
    https://github.com/scummvm/scummvm/commit/21a2a0d8df5b4085ce156be737b22b07752617c6
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-12T20:43:58+02:00

Commit Message:
HYPNO: load select_c3 level in boyz

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


diff --git a/engines/hypno/boyz/boyz.cpp b/engines/hypno/boyz/boyz.cpp
index a4f113b87ab..09f1deeda2a 100644
--- a/engines/hypno/boyz/boyz.cpp
+++ b/engines/hypno/boyz/boyz.cpp
@@ -59,6 +59,20 @@ HOTS /BBOX= 262 172 312 194\n\
 SOND pstlfire.raw\n\
 END\n";
 
+static const char *selectC3 = "\
+MENU preload\\slct_c3.smk\n\
+HOTS /BBOX= 143 78 286 138\n\
+SOND tollopz2.raw 22K\n\
+HOTS /BBOX=  159 141 319 197\n\
+SOND tolbuts3.raw 22K\n\
+HOTS /BBOX= 26 14 126 89\n\
+SOND tolvasq1.raw 22K\n\
+HOTS /BBOX= 24 114 126 190\n\
+SOND tolmons1.raw 22K\n\
+HOTS /BBOX= 190 4 292 76\n\
+SOND tollamb1.raw  22K\n\
+END\n";
+
 void BoyzEngine::loadAssets() {
 	LibFile *missions = loadLib("", "preload/missions.lib", true);
 	Common::ArchiveMemberList files;
@@ -117,6 +131,8 @@ void BoyzEngine::loadAssets() {
 	ChangeLevel *cl = new ChangeLevel("c19.mi_");
 	sc->hots[7].actions.push_back(cl);
 
+	loadSceneLevel(selectC3, "<select_c3>", "", "");
+
 	loadLib("sound/", "misc/sound.lib", true);
 
 	_weaponShootSound[0] = "";


Commit: 0e786346bfc7176385b7b9c966bea3a6069570c7
    https://github.com/scummvm/scummvm/commit/0e786346bfc7176385b7b9c966bea3a6069570c7
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-12T20:43:59+02:00

Commit Message:
HYPNO: added additional sounds when interacting with people/animals in boyz

Changed paths:
    engines/hypno/boyz/arcade.cpp
    engines/hypno/boyz/boyz.cpp
    engines/hypno/grammar.h
    engines/hypno/grammar_arc.cpp
    engines/hypno/grammar_arc.y
    engines/hypno/hypno.h


diff --git a/engines/hypno/boyz/arcade.cpp b/engines/hypno/boyz/arcade.cpp
index 53b7fa24e2d..b821a1ddb34 100644
--- a/engines/hypno/boyz/arcade.cpp
+++ b/engines/hypno/boyz/arcade.cpp
@@ -236,8 +236,12 @@ bool BoyzEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc, bool
 	} else {
 
 		if (i == 9 && secondary) {
-			if (_shoots[0].isAnimal)
+			playSound(_soundPath + _heySound[_currentActor], 1);
+
+			if (_shoots[0].isAnimal) {
+				playSound(_soundPath + _shoots[0].animalSound, 1);
 				return false;
+			}
 
 			_background->decoder->pauseVideo(true);
 			MVideo video(arc->missBoss2Video, Common::Point(0, 0), false, true, false);
diff --git a/engines/hypno/boyz/boyz.cpp b/engines/hypno/boyz/boyz.cpp
index 09f1deeda2a..abe5b7382fe 100644
--- a/engines/hypno/boyz/boyz.cpp
+++ b/engines/hypno/boyz/boyz.cpp
@@ -143,6 +143,14 @@ void BoyzEngine::loadAssets() {
 	_weaponShootSound[5] = "shotfire.raw";
 	_weaponShootSound[6] = "glm60fr.raw";
 
+	_heySound[0] = "";
+	_heySound[1] = "lopzheys.raw";
+	_heySound[2] = "lambheys.raw";
+	_heySound[3] = "vasqheyl.raw";
+	_heySound[4] = "butsheyl.raw";
+	_heySound[5] = "bropheys.raw";
+	_heySound[6] = "monsheys.raw";
+
 	Graphics::Surface *targets = decodeFrame("preload/targets.smk", 0, &_crosshairsPalette);
 
 	Common::Rect cursorBox;
diff --git a/engines/hypno/grammar.h b/engines/hypno/grammar.h
index 1f4fdd7741a..c72a3f8a0c7 100644
--- a/engines/hypno/grammar.h
+++ b/engines/hypno/grammar.h
@@ -425,6 +425,7 @@ public:
 		lastFrame = 1024;
 		noEnemySound = false;
 		isAnimal = false;
+		animalSound = "";
 	}
 	Common::String name;
 	Filename animation;
@@ -452,6 +453,7 @@ public:
 	Filename enemySound;
 	Filename deathSound;
 	Filename hitSound;
+	Filename animalSound;
 
 	MVideo *video;
 	Common::List<uint32> attackFrames;
diff --git a/engines/hypno/grammar_arc.cpp b/engines/hypno/grammar_arc.cpp
index ebd9c2e43bc..86842612d5e 100644
--- a/engines/hypno/grammar_arc.cpp
+++ b/engines/hypno/grammar_arc.cpp
@@ -625,8 +625,8 @@ static const yytype_int16 yyrline[] =
      384,   388,   392,   396,   400,   404,   408,   412,   416,   420,
      424,   428,   432,   435,   439,   444,   449,   452,   457,   462,
      466,   472,   476,   479,   480,   481,   484,   488,   491,   496,
-     499,   500,   504,   507,   511,   520,   524,   525,   528,   531,
-     535,   538,   541,   543
+     499,   500,   504,   507,   511,   522,   526,   527,   530,   533,
+     537,   540,   543,   545
 };
 #endif
 
@@ -2187,86 +2187,88 @@ yyreduce:
 			shoot->deathSound = (yyvsp[-1].s);
 		else if (Common::String("S2") == (yyvsp[-2].s))
 			shoot->hitSound = (yyvsp[-1].s);
+		else if (Common::String("S4") == (yyvsp[-2].s))
+			shoot->animalSound = (yyvsp[-1].s);
 
 		debugC(1, kHypnoDebugParser, "SN %s", (yyvsp[-1].s)); }
-#line 2193 "engines/hypno/grammar_arc.cpp"
+#line 2195 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 105: /* bline: SNTOK  */
-#line 520 "engines/hypno/grammar_arc.y"
+#line 522 "engines/hypno/grammar_arc.y"
                 {
 		debugC(1, kHypnoDebugParser, "SN");
 	}
-#line 2201 "engines/hypno/grammar_arc.cpp"
+#line 2203 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 106: /* bline: GTOK  */
-#line 524 "engines/hypno/grammar_arc.y"
+#line 526 "engines/hypno/grammar_arc.y"
                { debugC(1, kHypnoDebugParser, "G"); }
-#line 2207 "engines/hypno/grammar_arc.cpp"
+#line 2209 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 107: /* bline: TTOK NUM NUM NUM  */
-#line 525 "engines/hypno/grammar_arc.y"
+#line 527 "engines/hypno/grammar_arc.y"
                            {
 		debugC(1, kHypnoDebugParser, "T %d %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2215 "engines/hypno/grammar_arc.cpp"
+#line 2217 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 108: /* bline: TTOK NUM  */
-#line 528 "engines/hypno/grammar_arc.y"
+#line 530 "engines/hypno/grammar_arc.y"
                    {
 		debugC(1, kHypnoDebugParser, "T %d", (yyvsp[0].i));
 	}
-#line 2223 "engines/hypno/grammar_arc.cpp"
+#line 2225 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 109: /* bline: TTOK  */
-#line 531 "engines/hypno/grammar_arc.y"
+#line 533 "engines/hypno/grammar_arc.y"
                {
 		shoot->isAnimal = true;
 		debugC(1, kHypnoDebugParser, "T");
 	}
-#line 2232 "engines/hypno/grammar_arc.cpp"
+#line 2234 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 110: /* bline: MTOK  */
-#line 535 "engines/hypno/grammar_arc.y"
+#line 537 "engines/hypno/grammar_arc.y"
                {
 		debugC(1, kHypnoDebugParser, "M");
 	}
-#line 2240 "engines/hypno/grammar_arc.cpp"
+#line 2242 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 111: /* bline: NTOK  */
-#line 538 "engines/hypno/grammar_arc.y"
+#line 540 "engines/hypno/grammar_arc.y"
                {
 		shoot->noEnemySound = true;
 		debugC(1, kHypnoDebugParser, "N"); }
-#line 2248 "engines/hypno/grammar_arc.cpp"
+#line 2250 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 112: /* bline: NRTOK  */
-#line 541 "engines/hypno/grammar_arc.y"
+#line 543 "engines/hypno/grammar_arc.y"
                 {
 		debugC(1, kHypnoDebugParser, "NR"); }
-#line 2255 "engines/hypno/grammar_arc.cpp"
+#line 2257 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 113: /* bline: ZTOK  */
-#line 543 "engines/hypno/grammar_arc.y"
+#line 545 "engines/hypno/grammar_arc.y"
                {
 		g_parsedArc->shoots.push_back(*shoot);
 		//delete shoot;
 		//shoot = nullptr;
 		debugC(1, kHypnoDebugParser, "Z");
 	}
-#line 2266 "engines/hypno/grammar_arc.cpp"
+#line 2268 "engines/hypno/grammar_arc.cpp"
     break;
 
 
-#line 2270 "engines/hypno/grammar_arc.cpp"
+#line 2272 "engines/hypno/grammar_arc.cpp"
 
       default: break;
     }
diff --git a/engines/hypno/grammar_arc.y b/engines/hypno/grammar_arc.y
index 9a7e59c7df8..0e3e1b1283a 100644
--- a/engines/hypno/grammar_arc.y
+++ b/engines/hypno/grammar_arc.y
@@ -515,6 +515,8 @@ bline: FNTOK FILENAME {
 			shoot->deathSound = $2;
 		else if (Common::String("S2") == $1)
 			shoot->hitSound = $2;
+		else if (Common::String("S4") == $1)
+			shoot->animalSound = $2;
 
 		debugC(1, kHypnoDebugParser, "SN %s", $2); }
 	| SNTOK {
diff --git a/engines/hypno/hypno.h b/engines/hypno/hypno.h
index 4d823de482b..88f3371b938 100644
--- a/engines/hypno/hypno.h
+++ b/engines/hypno/hypno.h
@@ -572,6 +572,7 @@ public:
 	Graphics::Surface _portrait[7];
 
 	Filename _weaponShootSound[7];
+	Filename _heySound[7];
 	int _weaponMaxAmmo[7];
 
 	byte *_crosshairsPalette;


Commit: 4c71465c698c6560be53f62ed2358c81d72a2af5
    https://github.com/scummvm/scummvm/commit/4c71465c698c6560be53f62ed2358c81d72a2af5
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-12T20:43:59+02:00

Commit Message:
HYPNO: avoid hitting the player when missing animation is 0 in boyz

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


diff --git a/engines/hypno/boyz/arcade.cpp b/engines/hypno/boyz/arcade.cpp
index b821a1ddb34..eaf57492da7 100644
--- a/engines/hypno/boyz/arcade.cpp
+++ b/engines/hypno/boyz/arcade.cpp
@@ -308,19 +308,18 @@ bool BoyzEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc, bool
 }
 
 void BoyzEngine::missedTarget(Shoot *s, ArcadeShooting *arc) {
-	hitPlayer();
-	if (s->missedAnimation == 0)
+	if (s->missedAnimation == 0) {
 		return;
-	else if (s->missedAnimation == uint32(-1)) {
+	} else if (s->missedAnimation == uint32(-1)) {
 		uint32 last = _background->decoder->getFrameCount()-1;
 		_background->decoder->forceSeekToFrame(last);
 		_masks->decoder->forceSeekToFrame(last);
-		return;
+	} else {
+		s->missedAnimation = s->missedAnimation + 3;
+		_background->decoder->forceSeekToFrame(s->missedAnimation);
+		_masks->decoder->forceSeekToFrame(s->missedAnimation);
 	}
-
-	s->missedAnimation = s->missedAnimation + 3;
-	_background->decoder->forceSeekToFrame(s->missedAnimation);
-	_masks->decoder->forceSeekToFrame(s->missedAnimation);
+	hitPlayer();
 }
 
 bool BoyzEngine::clickedSecondaryShoot(const Common::Point &mousePos) {


Commit: dcb6e4fd86fea6958f82d57a0bb9ae44de482846
    https://github.com/scummvm/scummvm/commit/dcb6e4fd86fea6958f82d57a0bb9ae44de482846
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-12T20:43:59+02:00

Commit Message:
HYPNO: play interaction video when talking with civilians in boyz

Changed paths:
    engines/hypno/boyz/arcade.cpp
    engines/hypno/grammar.h
    engines/hypno/grammar_arc.cpp
    engines/hypno/grammar_arc.y


diff --git a/engines/hypno/boyz/arcade.cpp b/engines/hypno/boyz/arcade.cpp
index eaf57492da7..244d04b6170 100644
--- a/engines/hypno/boyz/arcade.cpp
+++ b/engines/hypno/boyz/arcade.cpp
@@ -243,18 +243,17 @@ bool BoyzEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc, bool
 				return false;
 			}
 
-			_background->decoder->pauseVideo(true);
-			MVideo video(arc->missBoss2Video, Common::Point(0, 0), false, true, false);
-			disableCursor();
-			runIntro(video);
-			// Should be currentPalette?
-			loadPalette(arc->backgroundPalette);
-			_background->decoder->pauseVideo(false);
+			assert(_shoots[0].interactionFrame > 0);
+			_background->decoder->forceSeekToFrame(_shoots[0].interactionFrame);
+			_masks->decoder->forceSeekToFrame(_shoots[0].interactionFrame);
+			_shoots[0].video = new MVideo(arc->missBoss2Video, Common::Point(0, 0), true, false, false);
+			_shoots[0].lastFrame = _background->decoder->getFrameCount();
+			_shoots[0].destroyed = true;
+			playVideo(*_shoots[0].video);
+
 			updateScreen(*_background);
+			updateScreen(*_shoots[0].video);
 			drawScreen();
-			if (!_music.empty())
-				playSound(_music, 0, arc->musicRate); // restore music
-
 			return false;
 		} else if (i == 9 && !secondary) {
 
@@ -298,7 +297,7 @@ bool BoyzEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc, bool
 		incTargetsDestroyed();
 		incScore(_shoots[0].pointsToShoot);
 		incBonus(_shoots[0].pointsToShoot);
-		_shoots[i].destroyed = true;
+		_shoots[0].destroyed = true;
 		_background->decoder->forceSeekToFrame(_shoots[0].explosionFrames[0].start - 3);
 		_masks->decoder->forceSeekToFrame(_shoots[0].explosionFrames[0].start - 3);
 		_shoots.clear();
diff --git a/engines/hypno/grammar.h b/engines/hypno/grammar.h
index c72a3f8a0c7..10ae4ed50c5 100644
--- a/engines/hypno/grammar.h
+++ b/engines/hypno/grammar.h
@@ -423,6 +423,7 @@ public:
 		explosionAnimation = "";
 		startFrame = 0;
 		lastFrame = 1024;
+		interactionFrame = 0;
 		noEnemySound = false;
 		isAnimal = false;
 		animalSound = "";
@@ -461,6 +462,7 @@ public:
 	Common::Array<FrameInfo> explosionFrames;
 	uint32 startFrame;
 	uint32 lastFrame;
+	uint32 interactionFrame;
 	Filename explosionAnimation;
 	bool destroyed;
 	bool noEnemySound;
diff --git a/engines/hypno/grammar_arc.cpp b/engines/hypno/grammar_arc.cpp
index 86842612d5e..8895f31b953 100644
--- a/engines/hypno/grammar_arc.cpp
+++ b/engines/hypno/grammar_arc.cpp
@@ -625,8 +625,8 @@ static const yytype_int16 yyrline[] =
      384,   388,   392,   396,   400,   404,   408,   412,   416,   420,
      424,   428,   432,   435,   439,   444,   449,   452,   457,   462,
      466,   472,   476,   479,   480,   481,   484,   488,   491,   496,
-     499,   500,   504,   507,   511,   522,   526,   527,   530,   533,
-     537,   540,   543,   545
+     499,   500,   504,   507,   511,   522,   526,   527,   530,   534,
+     538,   541,   544,   546
 };
 #endif
 
@@ -2219,56 +2219,57 @@ yyreduce:
   case 108: /* bline: TTOK NUM  */
 #line 530 "engines/hypno/grammar_arc.y"
                    {
+		shoot->interactionFrame = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "T %d", (yyvsp[0].i));
 	}
-#line 2225 "engines/hypno/grammar_arc.cpp"
+#line 2226 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 109: /* bline: TTOK  */
-#line 533 "engines/hypno/grammar_arc.y"
+#line 534 "engines/hypno/grammar_arc.y"
                {
 		shoot->isAnimal = true;
 		debugC(1, kHypnoDebugParser, "T");
 	}
-#line 2234 "engines/hypno/grammar_arc.cpp"
+#line 2235 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 110: /* bline: MTOK  */
-#line 537 "engines/hypno/grammar_arc.y"
+#line 538 "engines/hypno/grammar_arc.y"
                {
 		debugC(1, kHypnoDebugParser, "M");
 	}
-#line 2242 "engines/hypno/grammar_arc.cpp"
+#line 2243 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 111: /* bline: NTOK  */
-#line 540 "engines/hypno/grammar_arc.y"
+#line 541 "engines/hypno/grammar_arc.y"
                {
 		shoot->noEnemySound = true;
 		debugC(1, kHypnoDebugParser, "N"); }
-#line 2250 "engines/hypno/grammar_arc.cpp"
+#line 2251 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 112: /* bline: NRTOK  */
-#line 543 "engines/hypno/grammar_arc.y"
+#line 544 "engines/hypno/grammar_arc.y"
                 {
 		debugC(1, kHypnoDebugParser, "NR"); }
-#line 2257 "engines/hypno/grammar_arc.cpp"
+#line 2258 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 113: /* bline: ZTOK  */
-#line 545 "engines/hypno/grammar_arc.y"
+#line 546 "engines/hypno/grammar_arc.y"
                {
 		g_parsedArc->shoots.push_back(*shoot);
 		//delete shoot;
 		//shoot = nullptr;
 		debugC(1, kHypnoDebugParser, "Z");
 	}
-#line 2268 "engines/hypno/grammar_arc.cpp"
+#line 2269 "engines/hypno/grammar_arc.cpp"
     break;
 
 
-#line 2272 "engines/hypno/grammar_arc.cpp"
+#line 2273 "engines/hypno/grammar_arc.cpp"
 
       default: break;
     }
diff --git a/engines/hypno/grammar_arc.y b/engines/hypno/grammar_arc.y
index 0e3e1b1283a..1ee5338c624 100644
--- a/engines/hypno/grammar_arc.y
+++ b/engines/hypno/grammar_arc.y
@@ -528,6 +528,7 @@ bline: FNTOK FILENAME {
 		debugC(1, kHypnoDebugParser, "T %d %d %d", $2, $3, $4);
 	}
 	| TTOK NUM {
+		shoot->interactionFrame = $2;
 		debugC(1, kHypnoDebugParser, "T %d", $2);
 	}
 	| TTOK {


Commit: 8341c5db0fc35600a513115cabb44277a9eba069
    https://github.com/scummvm/scummvm/commit/8341c5db0fc35600a513115cabb44277a9eba069
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-12T20:43:59+02:00

Commit Message:
HYPNO: add segment size to debug message

Changed paths:
    engines/hypno/arcade.cpp


diff --git a/engines/hypno/arcade.cpp b/engines/hypno/arcade.cpp
index 67c523d4915..7de5ff26093 100644
--- a/engines/hypno/arcade.cpp
+++ b/engines/hypno/arcade.cpp
@@ -219,7 +219,7 @@ void HypnoEngine::runArcade(ArcadeShooting *arc) {
 	_additionalSound = arc->additionalSound;
 	_health = arc->health;
 	_maxHealth = _health;
-	debugC(1, kHypnoDebugArcade, "Starting segment of type %x", segments[_segmentIdx].type);
+	debugC(1, kHypnoDebugArcade, "Starting segment of type %x of size %d", segments[_segmentIdx].type, segments[_segmentIdx].size);
 	_shoots.clear();
 	_skipLevel = false;
 	_loseLevel = false;


Commit: 009398ef2610b3c13796fee5b6a994e3f3b18d84
    https://github.com/scummvm/scummvm/commit/009398ef2610b3c13796fee5b6a994e3f3b18d84
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-12T20:43:59+02:00

Commit Message:
HYPNO: improved interactions with civilians/animals in boyz

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


diff --git a/engines/hypno/boyz/arcade.cpp b/engines/hypno/boyz/arcade.cpp
index 244d04b6170..ab0e754c174 100644
--- a/engines/hypno/boyz/arcade.cpp
+++ b/engines/hypno/boyz/arcade.cpp
@@ -277,7 +277,10 @@ bool BoyzEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc, bool
 			if (!_music.empty())
 				playSound(_music, 0, arc->musicRate); // restore music
 
-			_healthTeam[_currentActor] = _healthTeam[_currentActor] - 10;
+			hitPlayer();
+
+			_background->decoder->forceSeekToFrame(_shoots[0].explosionFrames[0].start - 3);
+			_masks->decoder->forceSeekToFrame(_shoots[0].explosionFrames[0].start - 3);
 			return false;
 		} else if (i == 0 && secondary) {
 			// Nothing
@@ -318,7 +321,8 @@ void BoyzEngine::missedTarget(Shoot *s, ArcadeShooting *arc) {
 		_background->decoder->forceSeekToFrame(s->missedAnimation);
 		_masks->decoder->forceSeekToFrame(s->missedAnimation);
 	}
-	hitPlayer();
+	if (s->interactionFrame == 0)
+		hitPlayer();
 }
 
 bool BoyzEngine::clickedSecondaryShoot(const Common::Point &mousePos) {


Commit: dc62139c93014a25f54df4f897b513293a906115
    https://github.com/scummvm/scummvm/commit/dc62139c93014a25f54df4f897b513293a906115
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-12T20:43:59+02:00

Commit Message:
HYPNO: make sure enemy sounds are always played

Changed paths:
    engines/hypno/arcade.cpp


diff --git a/engines/hypno/arcade.cpp b/engines/hypno/arcade.cpp
index 7de5ff26093..de716131b45 100644
--- a/engines/hypno/arcade.cpp
+++ b/engines/hypno/arcade.cpp
@@ -467,13 +467,12 @@ void HypnoEngine::runArcade(ArcadeShooting *arc) {
 							s.lastFrame = s.bodyFrames[s.bodyFrames.size() - 1].lastFrame();
 							loadPalette(s.video->decoder->getPalette() + 3*s.paletteOffset, s.paletteOffset, s.paletteSize);
 							_shoots.push_back(s);
-
-							if (!s.noEnemySound) {
-								if (!s.enemySound.empty())
-									playSound(_soundPath + s.enemySound, 1);
-								else if (!arc->enemySound.empty())
-									playSound(_soundPath + arc->enemySound, 1);
-							}
+						}
+						if (!s.noEnemySound) {
+							if (!s.enemySound.empty())
+								playSound(_soundPath + s.enemySound, 1);
+							else if (!arc->enemySound.empty())
+								playSound(_soundPath + arc->enemySound, 1);
 						}
 					}
 				}


Commit: a7ae041c1bd30bb99183e186b37584e72a8deb54
    https://github.com/scummvm/scummvm/commit/a7ae041c1bd30bb99183e186b37584e72a8deb54
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-12T20:43:59+02:00

Commit Message:
HYPNO: avoid crashing when interaction frame is zero in boyz

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


diff --git a/engines/hypno/boyz/arcade.cpp b/engines/hypno/boyz/arcade.cpp
index ab0e754c174..260916432fc 100644
--- a/engines/hypno/boyz/arcade.cpp
+++ b/engines/hypno/boyz/arcade.cpp
@@ -243,17 +243,18 @@ bool BoyzEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc, bool
 				return false;
 			}
 
-			assert(_shoots[0].interactionFrame > 0);
-			_background->decoder->forceSeekToFrame(_shoots[0].interactionFrame);
-			_masks->decoder->forceSeekToFrame(_shoots[0].interactionFrame);
-			_shoots[0].video = new MVideo(arc->missBoss2Video, Common::Point(0, 0), true, false, false);
-			_shoots[0].lastFrame = _background->decoder->getFrameCount();
-			_shoots[0].destroyed = true;
-			playVideo(*_shoots[0].video);
-
-			updateScreen(*_background);
-			updateScreen(*_shoots[0].video);
-			drawScreen();
+			if (_shoots[0].interactionFrame > 0) {
+				_background->decoder->forceSeekToFrame(_shoots[0].interactionFrame);
+				_masks->decoder->forceSeekToFrame(_shoots[0].interactionFrame);
+				_shoots[0].video = new MVideo(arc->missBoss2Video, Common::Point(0, 0), true, false, false);
+				_shoots[0].lastFrame = _background->decoder->getFrameCount();
+				_shoots[0].destroyed = true;
+				playVideo(*_shoots[0].video);
+
+				updateScreen(*_background);
+				updateScreen(*_shoots[0].video);
+				drawScreen();
+			}
 			return false;
 		} else if (i == 9 && !secondary) {
 


Commit: 8d912d92267b684bf59adc3a8a5074e399cc9a69
    https://github.com/scummvm/scummvm/commit/8d912d92267b684bf59adc3a8a5074e399cc9a69
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-12T20:43:59+02:00

Commit Message:
HYPNO: added no ammo sound in boyz

Changed paths:
    engines/hypno/boyz/arcade.cpp
    engines/hypno/grammar.h
    engines/hypno/grammar_arc.cpp
    engines/hypno/grammar_arc.y
    engines/hypno/tokens_arc.h


diff --git a/engines/hypno/boyz/arcade.cpp b/engines/hypno/boyz/arcade.cpp
index 260916432fc..afab3684c8f 100644
--- a/engines/hypno/boyz/arcade.cpp
+++ b/engines/hypno/boyz/arcade.cpp
@@ -223,8 +223,11 @@ bool BoyzEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc, bool
 	}
 
 	if (!secondary) {
-		if (_ammoTeam[_currentActor] == 0)
-			return false; // TODO: out of ammo sound is missing
+		if (_ammoTeam[_currentActor] == 0) {
+			if (!arc->noAmmoSound.empty())
+				playSound(_soundPath + arc->noAmmoSound, 1, arc->noAmmoSoundRate);
+			return false;
+		}
 		if (!_infiniteAmmoCheat)
 			_ammoTeam[_currentActor]--;
 		playSound(_soundPath + _weaponShootSound[_currentWeapon], 1);
diff --git a/engines/hypno/grammar.h b/engines/hypno/grammar.h
index 10ae4ed50c5..cf578c23570 100644
--- a/engines/hypno/grammar.h
+++ b/engines/hypno/grammar.h
@@ -574,6 +574,7 @@ public:
 		briefingVideo.clear();
 		additionalVideo.clear();
 		additionalSound.clear();
+		noAmmoSound.clear();
 		segments.clear();
 		script.clear();
 		objKillsRequired[0] = 0;
@@ -585,6 +586,7 @@ public:
 		shootSoundRate = 0;
 		enemySoundRate = 0;
 		hitSoundRate = 0;
+		noAmmoSoundRate = 0;
 	}
 
 	uint32 id;
@@ -634,6 +636,8 @@ public:
 	uint32 hitSoundRate;
 	Filename additionalSound;
 	uint32 additionalSoundRate;
+	Filename noAmmoSound;
+	uint32 noAmmoSoundRate;
 };
 
 class Transition : public Level {
diff --git a/engines/hypno/grammar_arc.cpp b/engines/hypno/grammar_arc.cpp
index 8895f31b953..b0b6eec3873 100644
--- a/engines/hypno/grammar_arc.cpp
+++ b/engines/hypno/grammar_arc.cpp
@@ -122,12 +122,15 @@ void parseSN(const char *sn, const char *path, const char *enc, const char *flag
 	} else if (Common::String("S5") == sn) {
 		g_parsedArc->additionalSound = path;
 		g_parsedArc->additionalSoundRate = sampleRate;
+	} else if (Common::String("S7") == sn) {
+		g_parsedArc->noAmmoSound = path;
+		g_parsedArc->noAmmoSoundRate = sampleRate;
 	}
 	debugC(1, kHypnoDebugParser, "SN %s", path);
 }
 
 
-#line 131 "engines/hypno/grammar_arc.cpp"
+#line 134 "engines/hypno/grammar_arc.cpp"
 
 # ifndef YY_CAST
 #  ifdef __cplusplus
@@ -615,18 +618,18 @@ static const yytype_int8 yytranslate[] =
 /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_int16 yyrline[] =
 {
-       0,   104,   104,   104,   105,   108,   109,   110,   113,   117,
-     121,   125,   126,   127,   131,   136,   140,   144,   149,   159,
-     168,   173,   176,   181,   186,   191,   192,   196,   200,   203,
-     207,   210,   211,   239,   242,   245,   251,   256,   261,   267,
-     272,   277,   282,   287,   292,   299,   300,   303,   304,   307,
-     308,   309,   312,   320,   323,   326,   329,   331,   334,   339,
-     344,   348,   352,   356,   360,   364,   368,   372,   376,   380,
-     384,   388,   392,   396,   400,   404,   408,   412,   416,   420,
-     424,   428,   432,   435,   439,   444,   449,   452,   457,   462,
-     466,   472,   476,   479,   480,   481,   484,   488,   491,   496,
-     499,   500,   504,   507,   511,   522,   526,   527,   530,   534,
-     538,   541,   544,   546
+       0,   107,   107,   107,   108,   111,   112,   113,   116,   120,
+     124,   128,   129,   130,   134,   139,   143,   147,   152,   162,
+     171,   176,   179,   184,   189,   194,   195,   199,   203,   206,
+     210,   213,   214,   242,   245,   248,   254,   259,   264,   270,
+     275,   280,   285,   290,   295,   302,   303,   306,   307,   310,
+     311,   312,   315,   323,   326,   329,   332,   334,   337,   342,
+     347,   351,   355,   359,   363,   367,   371,   375,   379,   383,
+     387,   391,   395,   399,   403,   407,   411,   415,   419,   423,
+     427,   431,   435,   438,   442,   447,   452,   455,   460,   465,
+     469,   475,   479,   482,   483,   484,   487,   491,   494,   499,
+     502,   503,   507,   510,   514,   525,   529,   530,   533,   537,
+     541,   544,   547,   549
 };
 #endif
 
@@ -1321,99 +1324,99 @@ yyreduce:
   switch (yyn)
     {
   case 2: /* $@1: %empty  */
-#line 104 "engines/hypno/grammar_arc.y"
+#line 107 "engines/hypno/grammar_arc.y"
              { g_parsedArc->mode = (yyvsp[0].s); }
-#line 1327 "engines/hypno/grammar_arc.cpp"
+#line 1330 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 8: /* hline: CTOK NUM  */
-#line 113 "engines/hypno/grammar_arc.y"
+#line 116 "engines/hypno/grammar_arc.y"
                  {
 		g_parsedArc->id = (yyvsp[0].i);
 		HYPNO_ARC_default_sound_rate = 0;
 		debugC(1, kHypnoDebugParser, "C %d", (yyvsp[0].i)); }
-#line 1336 "engines/hypno/grammar_arc.cpp"
+#line 1339 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 9: /* hline: FTOK NUM  */
-#line 117 "engines/hypno/grammar_arc.y"
+#line 120 "engines/hypno/grammar_arc.y"
                    {
 		HYPNO_ARC_default_sound_rate = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "F %d", (yyvsp[0].i));
 	}
-#line 1345 "engines/hypno/grammar_arc.cpp"
+#line 1348 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 10: /* hline: DTOK NUM  */
-#line 121 "engines/hypno/grammar_arc.y"
+#line 124 "engines/hypno/grammar_arc.y"
                     {
 		g_parsedArc->frameDelay = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "D %d", (yyvsp[0].i));
 	}
-#line 1354 "engines/hypno/grammar_arc.cpp"
+#line 1357 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 11: /* hline: PTOK NUM NUM  */
-#line 125 "engines/hypno/grammar_arc.y"
+#line 128 "engines/hypno/grammar_arc.y"
                        { debugC(1, kHypnoDebugParser, "P %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1360 "engines/hypno/grammar_arc.cpp"
+#line 1363 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 12: /* hline: ATOK NUM NUM  */
-#line 126 "engines/hypno/grammar_arc.y"
+#line 129 "engines/hypno/grammar_arc.y"
                        { debugC(1, kHypnoDebugParser, "A %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1366 "engines/hypno/grammar_arc.cpp"
+#line 1369 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 13: /* hline: MTOK FILENAME  */
-#line 127 "engines/hypno/grammar_arc.y"
+#line 130 "engines/hypno/grammar_arc.y"
                         {
 		debugC(1, kHypnoDebugParser, "M %s", (yyvsp[0].s));
 		g_parsedArc->maskVideo = (yyvsp[0].s);
 	}
-#line 1375 "engines/hypno/grammar_arc.cpp"
+#line 1378 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 14: /* hline: UTOK NUM NUM NUM NUM  */
-#line 131 "engines/hypno/grammar_arc.y"
+#line 134 "engines/hypno/grammar_arc.y"
                                {
 		debugC(1, kHypnoDebugParser, "U %d %d %d %d", (yyvsp[-3].i), (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 		ScriptInfo si((yyvsp[-3].i), (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 		g_parsedArc->script.push_back(si);
 	}
-#line 1385 "engines/hypno/grammar_arc.cpp"
+#line 1388 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 15: /* hline: VTOK NUM NUM  */
-#line 136 "engines/hypno/grammar_arc.y"
+#line 139 "engines/hypno/grammar_arc.y"
                        {
 		debugC(1, kHypnoDebugParser, "V %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 		g_parsedArc->mouseBox = Common::Rect(0, 0, (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1394 "engines/hypno/grammar_arc.cpp"
+#line 1397 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 16: /* hline: VTOK RESTOK  */
-#line 140 "engines/hypno/grammar_arc.y"
+#line 143 "engines/hypno/grammar_arc.y"
                       {
 		debugC(1, kHypnoDebugParser, "V 320,200");
 		g_parsedArc->mouseBox = Common::Rect(0, 0, 320, 200);
 	}
-#line 1403 "engines/hypno/grammar_arc.cpp"
+#line 1406 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 17: /* hline: OTOK NUM NUM  */
-#line 144 "engines/hypno/grammar_arc.y"
+#line 147 "engines/hypno/grammar_arc.y"
                        {
 		g_parsedArc->objKillsRequired[0] = (yyvsp[-1].i);
 		g_parsedArc->objMissesAllowed[0] = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "O %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1413 "engines/hypno/grammar_arc.cpp"
+#line 1416 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 18: /* hline: ONTOK NUM NUM  */
-#line 149 "engines/hypno/grammar_arc.y"
+#line 152 "engines/hypno/grammar_arc.y"
                         {
 		if (Common::String("O0") == (yyvsp[-2].s)) {
 			g_parsedArc->objKillsRequired[0] = (yyvsp[-1].i);
@@ -1424,11 +1427,11 @@ yyreduce:
 		} else
 			error("Invalid objective: '%s'", (yyvsp[-2].s));
 		debugC(1, kHypnoDebugParser, "ON %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1428 "engines/hypno/grammar_arc.cpp"
+#line 1431 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 19: /* hline: ONTOK NUM  */
-#line 159 "engines/hypno/grammar_arc.y"
+#line 162 "engines/hypno/grammar_arc.y"
                     {
 		if (Common::String("O0") == (yyvsp[-1].s)) {
 			g_parsedArc->objKillsRequired[0] = (yyvsp[0].i);
@@ -1438,114 +1441,114 @@ yyreduce:
 			error("Invalid objective: '%s'", (yyvsp[-1].s));
 		debugC(1, kHypnoDebugParser, "ON %d", (yyvsp[0].i));
 	}
-#line 1442 "engines/hypno/grammar_arc.cpp"
+#line 1445 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 20: /* hline: TPTOK NONETOK NUM FILENAME  */
-#line 168 "engines/hypno/grammar_arc.y"
+#line 171 "engines/hypno/grammar_arc.y"
                                      {
 		ArcadeTransition at("NONE", (yyvsp[0].s), "", (yyvsp[-1].i));
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "Tp %s %d %s", "NONE", (yyvsp[-1].i), (yyvsp[0].s));
 	}
-#line 1452 "engines/hypno/grammar_arc.cpp"
+#line 1455 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 21: /* hline: TSTOK FILENAME NUM NUM  */
-#line 173 "engines/hypno/grammar_arc.y"
+#line 176 "engines/hypno/grammar_arc.y"
                                  {
 		debugC(1, kHypnoDebugParser, "Ts %s %d %d", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1460 "engines/hypno/grammar_arc.cpp"
+#line 1463 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 22: /* hline: TPTOK FILENAME NUM FILENAME  */
-#line 176 "engines/hypno/grammar_arc.y"
+#line 179 "engines/hypno/grammar_arc.y"
                                       {
 		ArcadeTransition at((yyvsp[-2].s), (yyvsp[0].s), "", (yyvsp[-1].i));
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "Tp %s %d %s", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].s));
 	}
-#line 1470 "engines/hypno/grammar_arc.cpp"
+#line 1473 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 23: /* hline: TATOK NUM FILENAME flag enc  */
-#line 181 "engines/hypno/grammar_arc.y"
+#line 184 "engines/hypno/grammar_arc.y"
                                       {
 		ArcadeTransition at("", "", (yyvsp[-2].s), (yyvsp[-3].i));
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "Ta %d %s", (yyvsp[-3].i), (yyvsp[-2].s));
 	}
-#line 1480 "engines/hypno/grammar_arc.cpp"
+#line 1483 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 24: /* hline: TTOK FILENAME NUM  */
-#line 186 "engines/hypno/grammar_arc.y"
+#line 189 "engines/hypno/grammar_arc.y"
                             {
 		ArcadeTransition at((yyvsp[-1].s), "", "", (yyvsp[0].i));
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "T %s %d", (yyvsp[-1].s), (yyvsp[0].i));
 	}
-#line 1490 "engines/hypno/grammar_arc.cpp"
+#line 1493 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 25: /* hline: TTOK NONETOK NUM  */
-#line 191 "engines/hypno/grammar_arc.y"
+#line 194 "engines/hypno/grammar_arc.y"
                            { debugC(1, kHypnoDebugParser, "T NONE %d", (yyvsp[0].i)); }
-#line 1496 "engines/hypno/grammar_arc.cpp"
+#line 1499 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 26: /* hline: NTOK FILENAME  */
-#line 192 "engines/hypno/grammar_arc.y"
+#line 195 "engines/hypno/grammar_arc.y"
                          {
 		g_parsedArc->backgroundVideo = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "N %s", (yyvsp[0].s));
 	}
-#line 1505 "engines/hypno/grammar_arc.cpp"
+#line 1508 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 27: /* hline: NSTOK FILENAME  */
-#line 196 "engines/hypno/grammar_arc.y"
+#line 199 "engines/hypno/grammar_arc.y"
                           {
 		g_parsedArc->backgroundVideo = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "N* %s", (yyvsp[0].s));
 	}
-#line 1514 "engines/hypno/grammar_arc.cpp"
+#line 1517 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 28: /* hline: RTOK FILENAME  */
-#line 200 "engines/hypno/grammar_arc.y"
+#line 203 "engines/hypno/grammar_arc.y"
                          {
 		g_parsedArc->backgroundPalette = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "R %s", (yyvsp[0].s)); }
-#line 1522 "engines/hypno/grammar_arc.cpp"
+#line 1525 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 29: /* hline: ITOK FILENAME  */
-#line 203 "engines/hypno/grammar_arc.y"
+#line 206 "engines/hypno/grammar_arc.y"
                         {
 		g_parsedArc->player = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1531 "engines/hypno/grammar_arc.cpp"
+#line 1534 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 30: /* hline: I1TOK FILENAME  */
-#line 207 "engines/hypno/grammar_arc.y"
+#line 210 "engines/hypno/grammar_arc.y"
                          {
 		debugC(1, kHypnoDebugParser, "I1 %s", (yyvsp[0].s));
 	}
-#line 1539 "engines/hypno/grammar_arc.cpp"
+#line 1542 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 31: /* hline: QTOK NUM NUM  */
-#line 210 "engines/hypno/grammar_arc.y"
+#line 213 "engines/hypno/grammar_arc.y"
                        { debugC(1, kHypnoDebugParser, "Q %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1545 "engines/hypno/grammar_arc.cpp"
+#line 1548 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 32: /* hline: BNTOK FILENAME  */
-#line 211 "engines/hypno/grammar_arc.y"
+#line 214 "engines/hypno/grammar_arc.y"
                          {
 		if (Common::String("B0") == (yyvsp[-1].s))
 			g_parsedArc->beforeVideo = (yyvsp[0].s);
@@ -1574,153 +1577,153 @@ yyreduce:
 
 		debugC(1, kHypnoDebugParser, "BN %s", (yyvsp[0].s));
 	}
-#line 1578 "engines/hypno/grammar_arc.cpp"
+#line 1581 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 33: /* hline: SNTOK FILENAME enc flag  */
-#line 239 "engines/hypno/grammar_arc.y"
+#line 242 "engines/hypno/grammar_arc.y"
                                   {
 		parseSN((yyvsp[-3].s), (yyvsp[-2].s), (yyvsp[-1].s), (yyvsp[0].s));
 	}
-#line 1586 "engines/hypno/grammar_arc.cpp"
+#line 1589 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 34: /* hline: SNTOK FILENAME flag enc  */
-#line 242 "engines/hypno/grammar_arc.y"
+#line 245 "engines/hypno/grammar_arc.y"
                                   {
 		parseSN((yyvsp[-3].s), (yyvsp[-2].s), (yyvsp[0].s), (yyvsp[-1].s));
 	}
-#line 1594 "engines/hypno/grammar_arc.cpp"
+#line 1597 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 35: /* hline: HETOK BYTE NUM NUM  */
-#line 245 "engines/hypno/grammar_arc.y"
+#line 248 "engines/hypno/grammar_arc.y"
                              {
 		Segment segment((yyvsp[-2].i), (yyvsp[0].i), (yyvsp[-1].i));
 		segment.end = true;
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "HE %x %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1605 "engines/hypno/grammar_arc.cpp"
+#line 1608 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 36: /* hline: HLTOK BYTE NUM NUM  */
-#line 251 "engines/hypno/grammar_arc.y"
+#line 254 "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 1615 "engines/hypno/grammar_arc.cpp"
+#line 1618 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 37: /* hline: HUTOK BYTE NUM NUM  */
-#line 256 "engines/hypno/grammar_arc.y"
+#line 259 "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 1625 "engines/hypno/grammar_arc.cpp"
+#line 1628 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 38: /* hline: HTOK NAME NUM NUM  */
-#line 261 "engines/hypno/grammar_arc.y"
+#line 264 "engines/hypno/grammar_arc.y"
                             {
 		assert(Common::String((yyvsp[-2].s)).size() == 1);
 		Segment segment((yyvsp[-2].s)[0], (yyvsp[0].i), (yyvsp[-1].i));
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "H %s %d %d", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1636 "engines/hypno/grammar_arc.cpp"
+#line 1639 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 39: /* hline: HTOK RTOK NUM NUM  */
-#line 267 "engines/hypno/grammar_arc.y"
+#line 270 "engines/hypno/grammar_arc.y"
                             { // Workaround for BYTE == R
 		Segment segment('R', (yyvsp[0].i), (yyvsp[-1].i));
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "H R %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1646 "engines/hypno/grammar_arc.cpp"
+#line 1649 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 40: /* hline: HTOK ATOK NUM NUM  */
-#line 272 "engines/hypno/grammar_arc.y"
+#line 275 "engines/hypno/grammar_arc.y"
                             { // Workaround for BYTE == A
 		Segment segment('A', (yyvsp[0].i), (yyvsp[-1].i));
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "H A %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1656 "engines/hypno/grammar_arc.cpp"
+#line 1659 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 41: /* hline: HTOK PTOK NUM NUM  */
-#line 277 "engines/hypno/grammar_arc.y"
+#line 280 "engines/hypno/grammar_arc.y"
                             { // Workaround for BYTE == P
 		Segment segment('P', (yyvsp[0].i), (yyvsp[-1].i));
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "H P %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1666 "engines/hypno/grammar_arc.cpp"
+#line 1669 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 42: /* hline: HTOK LTOK NUM NUM  */
-#line 282 "engines/hypno/grammar_arc.y"
+#line 285 "engines/hypno/grammar_arc.y"
                             { // Workaround for BYTE == P
 		Segment segment('L', (yyvsp[0].i), (yyvsp[-1].i));
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "H P %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1676 "engines/hypno/grammar_arc.cpp"
+#line 1679 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 43: /* hline: H12TOK BYTE NUM NUM  */
-#line 287 "engines/hypno/grammar_arc.y"
+#line 290 "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, "HN %x %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1686 "engines/hypno/grammar_arc.cpp"
+#line 1689 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 44: /* hline: HTOK BYTE NUM NUM  */
-#line 292 "engines/hypno/grammar_arc.y"
+#line 295 "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, "H %x %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1696 "engines/hypno/grammar_arc.cpp"
+#line 1699 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 45: /* enc: ENCTOK  */
-#line 299 "engines/hypno/grammar_arc.y"
+#line 302 "engines/hypno/grammar_arc.y"
                      { (yyval.s) = (yyvsp[0].s); }
-#line 1702 "engines/hypno/grammar_arc.cpp"
+#line 1705 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 46: /* enc: %empty  */
-#line 300 "engines/hypno/grammar_arc.y"
+#line 303 "engines/hypno/grammar_arc.y"
                          { (yyval.s) = scumm_strdup(""); }
-#line 1708 "engines/hypno/grammar_arc.cpp"
+#line 1711 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 47: /* flag: NAME  */
-#line 303 "engines/hypno/grammar_arc.y"
+#line 306 "engines/hypno/grammar_arc.y"
                      { (yyval.s) = (yyvsp[0].s); }
-#line 1714 "engines/hypno/grammar_arc.cpp"
+#line 1717 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 48: /* flag: %empty  */
-#line 304 "engines/hypno/grammar_arc.y"
+#line 307 "engines/hypno/grammar_arc.y"
                          { (yyval.s) = scumm_strdup(""); }
-#line 1720 "engines/hypno/grammar_arc.cpp"
+#line 1723 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 52: /* bline: FNTOK FILENAME  */
-#line 312 "engines/hypno/grammar_arc.y"
+#line 315 "engines/hypno/grammar_arc.y"
                       {
 		shoot = new Shoot();
 		if (Common::String("F0") == (yyvsp[-1].s))
@@ -1729,457 +1732,457 @@ yyreduce:
 			shoot->explosionAnimation = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "FN %s", (yyvsp[0].s));
 	}
-#line 1733 "engines/hypno/grammar_arc.cpp"
+#line 1736 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 53: /* bline: AVTOK NUM  */
-#line 320 "engines/hypno/grammar_arc.y"
+#line 323 "engines/hypno/grammar_arc.y"
                     {
 		debugC(1, kHypnoDebugParser, "AV %d", (yyvsp[0].i));
 	}
-#line 1741 "engines/hypno/grammar_arc.cpp"
+#line 1744 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 54: /* bline: ALTOK NUM  */
-#line 323 "engines/hypno/grammar_arc.y"
+#line 326 "engines/hypno/grammar_arc.y"
                     {
 		debugC(1, kHypnoDebugParser, "AL %d", (yyvsp[0].i));
 	}
-#line 1749 "engines/hypno/grammar_arc.cpp"
+#line 1752 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 55: /* bline: ABTOK NUM  */
-#line 326 "engines/hypno/grammar_arc.y"
+#line 329 "engines/hypno/grammar_arc.y"
                     {
 		debugC(1, kHypnoDebugParser, "AB %d", (yyvsp[0].i));
 	}
-#line 1757 "engines/hypno/grammar_arc.cpp"
+#line 1760 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 56: /* bline: DTOK LTOK  */
-#line 329 "engines/hypno/grammar_arc.y"
+#line 332 "engines/hypno/grammar_arc.y"
                      { debugC(1, kHypnoDebugParser, "D L");
 	}
-#line 1764 "engines/hypno/grammar_arc.cpp"
+#line 1767 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 57: /* bline: J0TOK NUM  */
-#line 331 "engines/hypno/grammar_arc.y"
+#line 334 "engines/hypno/grammar_arc.y"
                     {
 		debugC(1, kHypnoDebugParser, "J0 %d", (yyvsp[0].i));
 	}
-#line 1772 "engines/hypno/grammar_arc.cpp"
+#line 1775 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 58: /* bline: FNTOK NONETOK  */
-#line 334 "engines/hypno/grammar_arc.y"
+#line 337 "engines/hypno/grammar_arc.y"
                         {
 		shoot = new Shoot();
 		shoot->animation = "NONE";
 		debugC(1, kHypnoDebugParser, "FN NONE");
 	}
-#line 1782 "engines/hypno/grammar_arc.cpp"
+#line 1785 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 59: /* bline: FTOK FILENAME  */
-#line 339 "engines/hypno/grammar_arc.y"
+#line 342 "engines/hypno/grammar_arc.y"
                         {
 		shoot = new Shoot();
 		shoot->animation = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "FN %s", (yyvsp[0].s));
 	}
-#line 1792 "engines/hypno/grammar_arc.cpp"
+#line 1795 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 60: /* bline: ITOK NAME  */
-#line 344 "engines/hypno/grammar_arc.y"
+#line 347 "engines/hypno/grammar_arc.y"
                      {
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1801 "engines/hypno/grammar_arc.cpp"
+#line 1804 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 61: /* bline: ITOK BNTOK  */
-#line 348 "engines/hypno/grammar_arc.y"
+#line 351 "engines/hypno/grammar_arc.y"
                       {  // Workaround for NAME == B1
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1810 "engines/hypno/grammar_arc.cpp"
+#line 1813 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 62: /* bline: ITOK ATOK  */
-#line 352 "engines/hypno/grammar_arc.y"
+#line 355 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == A
 		shoot->name = "A";
 		debugC(1, kHypnoDebugParser, "I A");
 	}
-#line 1819 "engines/hypno/grammar_arc.cpp"
+#line 1822 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 63: /* bline: ITOK CTOK  */
-#line 356 "engines/hypno/grammar_arc.y"
+#line 359 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == C
 		shoot->name = "C";
 		debugC(1, kHypnoDebugParser, "I C");
 	}
-#line 1828 "engines/hypno/grammar_arc.cpp"
+#line 1831 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 64: /* bline: ITOK DTOK  */
-#line 360 "engines/hypno/grammar_arc.y"
+#line 363 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == D
 		shoot->name = "D";
 		debugC(1, kHypnoDebugParser, "I D");
 	}
-#line 1837 "engines/hypno/grammar_arc.cpp"
+#line 1840 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 65: /* bline: ITOK FTOK  */
-#line 364 "engines/hypno/grammar_arc.y"
+#line 367 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == F
 		shoot->name = "F";
 		debugC(1, kHypnoDebugParser, "I F");
 	}
-#line 1846 "engines/hypno/grammar_arc.cpp"
+#line 1849 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 66: /* bline: ITOK GTOK  */
-#line 368 "engines/hypno/grammar_arc.y"
+#line 371 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == G
 		shoot->name = "G";
 		debugC(1, kHypnoDebugParser, "I G");
 	}
-#line 1855 "engines/hypno/grammar_arc.cpp"
+#line 1858 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 67: /* bline: ITOK HTOK  */
-#line 372 "engines/hypno/grammar_arc.y"
+#line 375 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == H
 		shoot->name = "H";
 		debugC(1, kHypnoDebugParser, "I H");
 	}
-#line 1864 "engines/hypno/grammar_arc.cpp"
+#line 1867 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 68: /* bline: ITOK H12TOK  */
-#line 376 "engines/hypno/grammar_arc.y"
+#line 379 "engines/hypno/grammar_arc.y"
                        { // Workaround for NAME == H1/H2
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1873 "engines/hypno/grammar_arc.cpp"
+#line 1876 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 69: /* bline: ITOK ITOK  */
-#line 380 "engines/hypno/grammar_arc.y"
+#line 383 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == I
 		shoot->name = "I";
 		debugC(1, kHypnoDebugParser, "I I");
 	}
-#line 1882 "engines/hypno/grammar_arc.cpp"
+#line 1885 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 70: /* bline: ITOK JTOK  */
-#line 384 "engines/hypno/grammar_arc.y"
+#line 387 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == J
 		shoot->name = "J";
 		debugC(1, kHypnoDebugParser, "I J");
 	}
-#line 1891 "engines/hypno/grammar_arc.cpp"
+#line 1894 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 71: /* bline: ITOK KTOK  */
-#line 388 "engines/hypno/grammar_arc.y"
+#line 391 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == K
 		shoot->name = "K";
 		debugC(1, kHypnoDebugParser, "I K");
 	}
-#line 1900 "engines/hypno/grammar_arc.cpp"
+#line 1903 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 72: /* bline: ITOK NTOK  */
-#line 392 "engines/hypno/grammar_arc.y"
+#line 395 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == N
 		shoot->name = "N";
 		debugC(1, kHypnoDebugParser, "I N");
 	}
-#line 1909 "engines/hypno/grammar_arc.cpp"
+#line 1912 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 73: /* bline: ITOK OTOK  */
-#line 396 "engines/hypno/grammar_arc.y"
+#line 399 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == O
 		shoot->name = "O";
 		debugC(1, kHypnoDebugParser, "I O");
 	}
-#line 1918 "engines/hypno/grammar_arc.cpp"
+#line 1921 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 74: /* bline: ITOK PTOK  */
-#line 400 "engines/hypno/grammar_arc.y"
+#line 403 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == P
 		shoot->name = "P";
 		debugC(1, kHypnoDebugParser, "I P");
 	}
-#line 1927 "engines/hypno/grammar_arc.cpp"
+#line 1930 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 75: /* bline: ITOK QTOK  */
-#line 404 "engines/hypno/grammar_arc.y"
+#line 407 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == Q
 		shoot->name = "Q";
 		debugC(1, kHypnoDebugParser, "I Q");
 	}
-#line 1936 "engines/hypno/grammar_arc.cpp"
+#line 1939 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 76: /* bline: ITOK RTOK  */
-#line 408 "engines/hypno/grammar_arc.y"
+#line 411 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == R
 		shoot->name = "R";
 		debugC(1, kHypnoDebugParser, "I R");
 	}
-#line 1945 "engines/hypno/grammar_arc.cpp"
+#line 1948 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 77: /* bline: ITOK SNTOK  */
-#line 412 "engines/hypno/grammar_arc.y"
+#line 415 "engines/hypno/grammar_arc.y"
                       {  // Workaround for NAME == S1
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1954 "engines/hypno/grammar_arc.cpp"
+#line 1957 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 78: /* bline: ITOK TTOK  */
-#line 416 "engines/hypno/grammar_arc.y"
+#line 419 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == T
 		shoot->name = "T";
 		debugC(1, kHypnoDebugParser, "I T");
 	}
-#line 1963 "engines/hypno/grammar_arc.cpp"
+#line 1966 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 79: /* bline: ITOK LTOK  */
-#line 420 "engines/hypno/grammar_arc.y"
+#line 423 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == L
 		shoot->name = "L";
 		debugC(1, kHypnoDebugParser, "I L");
 	}
-#line 1972 "engines/hypno/grammar_arc.cpp"
+#line 1975 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 80: /* bline: ITOK MTOK  */
-#line 424 "engines/hypno/grammar_arc.y"
+#line 427 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == M
 		shoot->name = "M";
 		debugC(1, kHypnoDebugParser, "I M");
 	}
-#line 1981 "engines/hypno/grammar_arc.cpp"
+#line 1984 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 81: /* bline: ITOK UTOK  */
-#line 428 "engines/hypno/grammar_arc.y"
+#line 431 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == U
 		shoot->name = "U";
 		debugC(1, kHypnoDebugParser, "I U");
 	}
-#line 1990 "engines/hypno/grammar_arc.cpp"
+#line 1993 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 82: /* bline: JTOK NUM  */
-#line 432 "engines/hypno/grammar_arc.y"
+#line 435 "engines/hypno/grammar_arc.y"
                     {
 		debugC(1, kHypnoDebugParser, "J %d", (yyvsp[0].i));
 	}
-#line 1998 "engines/hypno/grammar_arc.cpp"
+#line 2001 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 83: /* bline: A0TOK NUM NUM  */
-#line 435 "engines/hypno/grammar_arc.y"
+#line 438 "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 2007 "engines/hypno/grammar_arc.cpp"
+#line 2010 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 84: /* bline: RTOK NUM NUM  */
-#line 439 "engines/hypno/grammar_arc.y"
+#line 442 "engines/hypno/grammar_arc.y"
                         {
 		shoot->objKillsCount = (yyvsp[-1].i);
 		shoot->objMissesCount = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "R %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2017 "engines/hypno/grammar_arc.cpp"
+#line 2020 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 85: /* bline: R0TOK NUM NUM  */
-#line 444 "engines/hypno/grammar_arc.y"
+#line 447 "engines/hypno/grammar_arc.y"
                          {
 		shoot->objKillsCount = (yyvsp[-1].i);
 		shoot->objMissesCount = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "R0 %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2027 "engines/hypno/grammar_arc.cpp"
+#line 2030 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 86: /* bline: R1TOK NUM NUM  */
-#line 449 "engines/hypno/grammar_arc.y"
+#line 452 "engines/hypno/grammar_arc.y"
                          {
 		debugC(1, kHypnoDebugParser, "R1 %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2035 "engines/hypno/grammar_arc.cpp"
+#line 2038 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 87: /* bline: BNTOK NUM NUM  */
-#line 452 "engines/hypno/grammar_arc.y"
+#line 455 "engines/hypno/grammar_arc.y"
                         {
 		FrameInfo fi((yyvsp[0].i), (yyvsp[-1].i));
 		shoot->bodyFrames.push_back(fi);
 		debugC(1, kHypnoDebugParser, "BN %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2045 "engines/hypno/grammar_arc.cpp"
+#line 2048 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 88: /* bline: KNTOK NUM NUM  */
-#line 457 "engines/hypno/grammar_arc.y"
+#line 460 "engines/hypno/grammar_arc.y"
                         {
 		FrameInfo fi((yyvsp[0].i), (yyvsp[-1].i));
 		shoot->explosionFrames.push_back(fi);
 		debugC(1, kHypnoDebugParser, "KN %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2055 "engines/hypno/grammar_arc.cpp"
+#line 2058 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 89: /* bline: P0TOK NUM NUM  */
-#line 462 "engines/hypno/grammar_arc.y"
+#line 465 "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 2064 "engines/hypno/grammar_arc.cpp"
+#line 2067 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 90: /* bline: OTOK NUM NUM  */
-#line 466 "engines/hypno/grammar_arc.y"
+#line 469 "engines/hypno/grammar_arc.y"
                        {
 		if ((yyvsp[-1].i) == 0 && (yyvsp[0].i) == 0)
 			error("Invalid O command (0, 0)");
 		shoot->deathPosition = Common::Point((yyvsp[-1].i), (yyvsp[0].i));
 		debugC(1, kHypnoDebugParser, "O %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2075 "engines/hypno/grammar_arc.cpp"
+#line 2078 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 91: /* bline: CTOK NUM  */
-#line 472 "engines/hypno/grammar_arc.y"
+#line 475 "engines/hypno/grammar_arc.y"
                     {
 		shoot->timesToShoot = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "C %d", (yyvsp[0].i));
 	}
-#line 2084 "engines/hypno/grammar_arc.cpp"
+#line 2087 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 92: /* bline: HTOK NUM  */
-#line 476 "engines/hypno/grammar_arc.y"
+#line 479 "engines/hypno/grammar_arc.y"
                     {
 		shoot->attackFrames.push_back((yyvsp[0].i));
 		debugC(1, kHypnoDebugParser, "H %d", (yyvsp[0].i)); }
-#line 2092 "engines/hypno/grammar_arc.cpp"
+#line 2095 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 93: /* bline: VTOK NUM  */
-#line 479 "engines/hypno/grammar_arc.y"
+#line 482 "engines/hypno/grammar_arc.y"
                     { debugC(1, kHypnoDebugParser, "V %d", (yyvsp[0].i)); }
-#line 2098 "engines/hypno/grammar_arc.cpp"
+#line 2101 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 94: /* bline: VTOK  */
-#line 480 "engines/hypno/grammar_arc.y"
+#line 483 "engines/hypno/grammar_arc.y"
                { debugC(1, kHypnoDebugParser, "V"); }
-#line 2104 "engines/hypno/grammar_arc.cpp"
+#line 2107 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 95: /* bline: WTOK NUM  */
-#line 481 "engines/hypno/grammar_arc.y"
+#line 484 "engines/hypno/grammar_arc.y"
                     {
 		shoot->attackWeight = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "W %d", (yyvsp[0].i)); }
-#line 2112 "engines/hypno/grammar_arc.cpp"
+#line 2115 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 96: /* bline: DTOK NUM  */
-#line 484 "engines/hypno/grammar_arc.y"
+#line 487 "engines/hypno/grammar_arc.y"
                     {
 		shoot->pointsToShoot = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "D %d", (yyvsp[0].i));
 	}
-#line 2121 "engines/hypno/grammar_arc.cpp"
+#line 2124 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 97: /* bline: LTOK NUM NUM  */
-#line 488 "engines/hypno/grammar_arc.y"
+#line 491 "engines/hypno/grammar_arc.y"
                        {
 		debugC(1, kHypnoDebugParser, "L %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2129 "engines/hypno/grammar_arc.cpp"
+#line 2132 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 98: /* bline: LTOK NUM  */
-#line 491 "engines/hypno/grammar_arc.y"
+#line 494 "engines/hypno/grammar_arc.y"
                    {
 		debugC(1, kHypnoDebugParser, "L %d", (yyvsp[0].i));
 		FrameInfo fi((yyvsp[0].i)-1, 0);
 		shoot->bodyFrames.push_back(fi);
 	}
-#line 2139 "engines/hypno/grammar_arc.cpp"
+#line 2142 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 99: /* bline: MTOK NUM  */
-#line 496 "engines/hypno/grammar_arc.y"
+#line 499 "engines/hypno/grammar_arc.y"
                    { debugC(1, kHypnoDebugParser, "M %d", (yyvsp[0].i));
 		shoot->missedAnimation = (yyvsp[0].i);
 	}
-#line 2147 "engines/hypno/grammar_arc.cpp"
+#line 2150 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 100: /* bline: KTOK  */
-#line 499 "engines/hypno/grammar_arc.y"
+#line 502 "engines/hypno/grammar_arc.y"
                { debugC(1, kHypnoDebugParser, "K"); }
-#line 2153 "engines/hypno/grammar_arc.cpp"
+#line 2156 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 101: /* bline: KTOK NUM  */
-#line 500 "engines/hypno/grammar_arc.y"
+#line 503 "engines/hypno/grammar_arc.y"
                    { debugC(1, kHypnoDebugParser, "K %d", (yyvsp[0].i));
 		FrameInfo fi((yyvsp[0].i), 1);
 		shoot->explosionFrames.push_back(fi);
 	}
-#line 2162 "engines/hypno/grammar_arc.cpp"
+#line 2165 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 102: /* bline: KTOK NUM NUM NUM  */
-#line 504 "engines/hypno/grammar_arc.y"
+#line 507 "engines/hypno/grammar_arc.y"
                            {
 		debugC(1, kHypnoDebugParser, "K %d %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2170 "engines/hypno/grammar_arc.cpp"
+#line 2173 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 103: /* bline: KTOK NUM NUM  */
-#line 507 "engines/hypno/grammar_arc.y"
+#line 510 "engines/hypno/grammar_arc.y"
                        { debugC(1, kHypnoDebugParser, "K %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 		FrameInfo fi((yyvsp[-1].i), 1);
 		shoot->explosionFrames.push_back(fi);
 	}
-#line 2179 "engines/hypno/grammar_arc.cpp"
+#line 2182 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 104: /* bline: SNTOK FILENAME enc  */
-#line 511 "engines/hypno/grammar_arc.y"
+#line 514 "engines/hypno/grammar_arc.y"
                              {
 		if (Common::String("S0") == (yyvsp[-2].s))
 			shoot->enemySound = (yyvsp[-1].s);
@@ -2191,85 +2194,85 @@ yyreduce:
 			shoot->animalSound = (yyvsp[-1].s);
 
 		debugC(1, kHypnoDebugParser, "SN %s", (yyvsp[-1].s)); }
-#line 2195 "engines/hypno/grammar_arc.cpp"
+#line 2198 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 105: /* bline: SNTOK  */
-#line 522 "engines/hypno/grammar_arc.y"
+#line 525 "engines/hypno/grammar_arc.y"
                 {
 		debugC(1, kHypnoDebugParser, "SN");
 	}
-#line 2203 "engines/hypno/grammar_arc.cpp"
+#line 2206 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 106: /* bline: GTOK  */
-#line 526 "engines/hypno/grammar_arc.y"
+#line 529 "engines/hypno/grammar_arc.y"
                { debugC(1, kHypnoDebugParser, "G"); }
-#line 2209 "engines/hypno/grammar_arc.cpp"
+#line 2212 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 107: /* bline: TTOK NUM NUM NUM  */
-#line 527 "engines/hypno/grammar_arc.y"
+#line 530 "engines/hypno/grammar_arc.y"
                            {
 		debugC(1, kHypnoDebugParser, "T %d %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2217 "engines/hypno/grammar_arc.cpp"
+#line 2220 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 108: /* bline: TTOK NUM  */
-#line 530 "engines/hypno/grammar_arc.y"
+#line 533 "engines/hypno/grammar_arc.y"
                    {
 		shoot->interactionFrame = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "T %d", (yyvsp[0].i));
 	}
-#line 2226 "engines/hypno/grammar_arc.cpp"
+#line 2229 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 109: /* bline: TTOK  */
-#line 534 "engines/hypno/grammar_arc.y"
+#line 537 "engines/hypno/grammar_arc.y"
                {
 		shoot->isAnimal = true;
 		debugC(1, kHypnoDebugParser, "T");
 	}
-#line 2235 "engines/hypno/grammar_arc.cpp"
+#line 2238 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 110: /* bline: MTOK  */
-#line 538 "engines/hypno/grammar_arc.y"
+#line 541 "engines/hypno/grammar_arc.y"
                {
 		debugC(1, kHypnoDebugParser, "M");
 	}
-#line 2243 "engines/hypno/grammar_arc.cpp"
+#line 2246 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 111: /* bline: NTOK  */
-#line 541 "engines/hypno/grammar_arc.y"
+#line 544 "engines/hypno/grammar_arc.y"
                {
 		shoot->noEnemySound = true;
 		debugC(1, kHypnoDebugParser, "N"); }
-#line 2251 "engines/hypno/grammar_arc.cpp"
+#line 2254 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 112: /* bline: NRTOK  */
-#line 544 "engines/hypno/grammar_arc.y"
+#line 547 "engines/hypno/grammar_arc.y"
                 {
 		debugC(1, kHypnoDebugParser, "NR"); }
-#line 2258 "engines/hypno/grammar_arc.cpp"
+#line 2261 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 113: /* bline: ZTOK  */
-#line 546 "engines/hypno/grammar_arc.y"
+#line 549 "engines/hypno/grammar_arc.y"
                {
 		g_parsedArc->shoots.push_back(*shoot);
 		//delete shoot;
 		//shoot = nullptr;
 		debugC(1, kHypnoDebugParser, "Z");
 	}
-#line 2269 "engines/hypno/grammar_arc.cpp"
+#line 2272 "engines/hypno/grammar_arc.cpp"
     break;
 
 
-#line 2273 "engines/hypno/grammar_arc.cpp"
+#line 2276 "engines/hypno/grammar_arc.cpp"
 
       default: break;
     }
diff --git a/engines/hypno/grammar_arc.y b/engines/hypno/grammar_arc.y
index 1ee5338c624..0b22e012886 100644
--- a/engines/hypno/grammar_arc.y
+++ b/engines/hypno/grammar_arc.y
@@ -70,6 +70,9 @@ void parseSN(const char *sn, const char *path, const char *enc, const char *flag
 	} else if (Common::String("S5") == sn) {
 		g_parsedArc->additionalSound = path;
 		g_parsedArc->additionalSoundRate = sampleRate;
+	} else if (Common::String("S7") == sn) {
+		g_parsedArc->noAmmoSound = path;
+		g_parsedArc->noAmmoSoundRate = sampleRate;
 	}
 	debugC(1, kHypnoDebugParser, "SN %s", path);
 }
diff --git a/engines/hypno/tokens_arc.h b/engines/hypno/tokens_arc.h
index ccae1f669ce..c27291342d0 100644
--- a/engines/hypno/tokens_arc.h
+++ b/engines/hypno/tokens_arc.h
@@ -127,7 +127,7 @@ extern int HYPNO_ARC_debug;
 #if ! defined HYPNO_ARC_STYPE && ! defined HYPNO_ARC_STYPE_IS_DECLARED
 union HYPNO_ARC_STYPE
 {
-#line 79 "engines/hypno/grammar_arc.y"
+#line 82 "engines/hypno/grammar_arc.y"
 
 	char *s; /* string value */
 	int i;	 /* integer value */


Commit: 9275d8dc6a4609518e763f2019d3aa2fbf746f74
    https://github.com/scummvm/scummvm/commit/9275d8dc6a4609518e763f2019d3aa2fbf746f74
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-12T20:43:59+02:00

Commit Message:
HYPNO: simplified and improved mask handling in boyz

Changed paths:
    engines/hypno/arcade.cpp
    engines/hypno/boyz/arcade.cpp
    engines/hypno/grammar.h
    engines/hypno/grammar_arc.cpp
    engines/hypno/grammar_arc.y
    engines/hypno/hypno.cpp
    engines/hypno/hypno.h


diff --git a/engines/hypno/arcade.cpp b/engines/hypno/arcade.cpp
index de716131b45..f4af4906bcd 100644
--- a/engines/hypno/arcade.cpp
+++ b/engines/hypno/arcade.cpp
@@ -353,6 +353,8 @@ void HypnoEngine::runArcade(ArcadeShooting *arc) {
 			updateScreen(*_background);
 			if (!arc->maskVideo.empty() && _masks->decoder->needsUpdate())
 				_mask = _masks->decoder->decodeNextFrame();
+			if (_additionalVideo && _additionalVideo->decoder->needsUpdate())
+				_additionalVideo->decoder->decodeNextFrame(); // only audio?
 		}
 
 		if (_health <= 0) {
@@ -447,10 +449,7 @@ void HypnoEngine::runArcade(ArcadeShooting *arc) {
 						s.startFrame = si.timestamp;
 						if (_masks) {
 							s.startFrame = 0;
-							if (_shoots.size() == 0)
-								_shoots.push_back(s);
-							else
-								_shoots[0] = s;
+							_shoots.push_back(s);
 						} else if (it->animation == "NONE") {
 							byte *c = getTargetColor(it->name, _levelId);
 							assert(s.paletteSize == 1 || s.paletteSize == 0);
@@ -570,6 +569,12 @@ void HypnoEngine::runArcade(ArcadeShooting *arc) {
 		_masks = nullptr;
 	}
 
+	if (_additionalVideo) {
+		skipVideo(*_additionalVideo);
+		delete _additionalVideo;
+		_additionalVideo = nullptr;
+	}
+
 	_timerStarted = false;
 	removeTimers();
 	stopSound();
diff --git a/engines/hypno/boyz/arcade.cpp b/engines/hypno/boyz/arcade.cpp
index afab3684c8f..872f286c2d8 100644
--- a/engines/hypno/boyz/arcade.cpp
+++ b/engines/hypno/boyz/arcade.cpp
@@ -210,11 +210,23 @@ bool BoyzEngine::checkTransition(ArcadeTransitions &transitions, ArcadeShooting
 
 int BoyzEngine::detectTarget(const Common::Point &mousePos) {
 	Common::Point target = computeTargetPosition(mousePos);
-	assert(_shoots.size() <= 1);
+	if (!_mask)
+		return -1;
+
+	uint32 m = _mask->getPixel(target.x, target.y);
+	if (m == 0)
+		return -1;
+
+	int i = 0;
 	for (Shoots::iterator it = _shoots.begin(); it != _shoots.end(); ++it) {
-		return _mask->getPixel(target.x, target.y) - 1;
+		if (m == it->paletteOffset && !_shoots[i].destroyed)
+			return i;
+		i++;
 	}
-	return -1;
+	if (i == int(_shoots.size()))
+		return -1;
+
+	error("Invalid mask state (%d)!", m);
 }
 
 bool BoyzEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc, bool secondary) {
@@ -237,32 +249,31 @@ bool BoyzEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc, bool
 	if (i < 0) {
 		missNoTarget(arc);
 	} else {
-
-		if (i == 9 && secondary) {
+		debug("Shoot target %s, flag: %d", _shoots[i].name.c_str(), _shoots[i].playInteractionAudio);
+		if (_shoots[i].nonHostile && secondary) {
 			playSound(_soundPath + _heySound[_currentActor], 1);
 
-			if (_shoots[0].isAnimal) {
-				playSound(_soundPath + _shoots[0].animalSound, 1);
+			if (_shoots[i].isAnimal) {
+				playSound(_soundPath + _shoots[i].animalSound, 1);
 				return false;
 			}
 
-			if (_shoots[0].interactionFrame > 0) {
-				_background->decoder->forceSeekToFrame(_shoots[0].interactionFrame);
-				_masks->decoder->forceSeekToFrame(_shoots[0].interactionFrame);
-				_shoots[0].video = new MVideo(arc->missBoss2Video, Common::Point(0, 0), true, false, false);
-				_shoots[0].lastFrame = _background->decoder->getFrameCount();
-				_shoots[0].destroyed = true;
-				playVideo(*_shoots[0].video);
+			if (_shoots[i].interactionFrame > 0) {
+				_background->decoder->forceSeekToFrame(_shoots[i].interactionFrame);
+				_masks->decoder->forceSeekToFrame(_shoots[i].interactionFrame);
+				_additionalVideo = new MVideo(arc->missBoss2Video, Common::Point(0, 0), true, false, false);
+				playVideo(*_additionalVideo);
+				//_shoots[i].lastFrame = _background->decoder->getFrameCount();
+				_shoots[i].destroyed = true;
 
 				updateScreen(*_background);
-				updateScreen(*_shoots[0].video);
 				drawScreen();
 			}
 			return false;
-		} else if (i == 9 && !secondary) {
+		} else if (_shoots[i].nonHostile && !secondary) {
 
 			Common::String filename;
-			if (_shoots[0].isAnimal)
+			if (_shoots[i].isAnimal)
 				filename = _warningAnimals;
 			else {
 				filename = _warningCivilians[_civiliansShoot];
@@ -283,31 +294,32 @@ bool BoyzEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc, bool
 
 			hitPlayer();
 
-			_background->decoder->forceSeekToFrame(_shoots[0].explosionFrames[0].start - 3);
-			_masks->decoder->forceSeekToFrame(_shoots[0].explosionFrames[0].start - 3);
+			_background->decoder->forceSeekToFrame(_shoots[i].explosionFrames[0].start - 3);
+			_masks->decoder->forceSeekToFrame(_shoots[i].explosionFrames[0].start - 3);
 			return false;
-		} else if (i == 0 && secondary) {
+		} else if (!_shoots[i].nonHostile && secondary) {
 			// Nothing
 			return false;
 		}
 
-		if (i != 0 || secondary)
-			error("Invalid target %d", i);
-
-		if (!_shoots[0].hitSound.empty())
+		if (!_shoots[i].hitSound.empty())
 			playSound(_soundPath + _shoots[i].hitSound, 1);
 
 		incEnemyHits();
-		if (!_shoots[0].deathSound.empty())
+		if (!_shoots[i].deathSound.empty())
 			playSound(_soundPath + _shoots[i].deathSound, 1);
 
+		if (_shoots[i].playInteractionAudio) {
+			_additionalVideo = new MVideo(arc->missBoss2Video, Common::Point(0, 0), true, false, false);
+			playVideo(*_additionalVideo);
+		}
+
 		incTargetsDestroyed();
-		incScore(_shoots[0].pointsToShoot);
-		incBonus(_shoots[0].pointsToShoot);
-		_shoots[0].destroyed = true;
-		_background->decoder->forceSeekToFrame(_shoots[0].explosionFrames[0].start - 3);
-		_masks->decoder->forceSeekToFrame(_shoots[0].explosionFrames[0].start - 3);
-		_shoots.clear();
+		incScore(_shoots[i].pointsToShoot);
+		incBonus(_shoots[i].pointsToShoot);
+		_shoots[i].destroyed = true;
+		_background->decoder->forceSeekToFrame(_shoots[i].explosionFrames[0].start - 3);
+		_masks->decoder->forceSeekToFrame(_shoots[i].explosionFrames[0].start - 3);
 		changeCursor(_crosshairsActive[_currentWeapon], _crosshairsPalette, true);
 	}
 	return false;
diff --git a/engines/hypno/grammar.h b/engines/hypno/grammar.h
index cf578c23570..938374bfb69 100644
--- a/engines/hypno/grammar.h
+++ b/engines/hypno/grammar.h
@@ -426,6 +426,8 @@ public:
 		interactionFrame = 0;
 		noEnemySound = false;
 		isAnimal = false;
+		nonHostile = false;
+		playInteractionAudio = false;
 		animalSound = "";
 	}
 	Common::String name;
@@ -464,8 +466,10 @@ public:
 	uint32 lastFrame;
 	uint32 interactionFrame;
 	Filename explosionAnimation;
+	bool playInteractionAudio;
 	bool destroyed;
 	bool noEnemySound;
+	bool nonHostile;
 	bool isAnimal;
 };
 
diff --git a/engines/hypno/grammar_arc.cpp b/engines/hypno/grammar_arc.cpp
index b0b6eec3873..4c093f44b59 100644
--- a/engines/hypno/grammar_arc.cpp
+++ b/engines/hypno/grammar_arc.cpp
@@ -623,13 +623,13 @@ static const yytype_int16 yyrline[] =
      171,   176,   179,   184,   189,   194,   195,   199,   203,   206,
      210,   213,   214,   242,   245,   248,   254,   259,   264,   270,
      275,   280,   285,   290,   295,   302,   303,   306,   307,   310,
-     311,   312,   315,   323,   326,   329,   332,   334,   337,   342,
-     347,   351,   355,   359,   363,   367,   371,   375,   379,   383,
-     387,   391,   395,   399,   403,   407,   411,   415,   419,   423,
-     427,   431,   435,   438,   442,   447,   452,   455,   460,   465,
-     469,   475,   479,   482,   483,   484,   487,   491,   494,   499,
-     502,   503,   507,   510,   514,   525,   529,   530,   533,   537,
-     541,   544,   547,   549
+     311,   312,   315,   323,   328,   331,   336,   338,   341,   346,
+     351,   355,   359,   363,   367,   371,   375,   379,   383,   387,
+     391,   395,   399,   403,   407,   411,   415,   419,   423,   427,
+     431,   435,   439,   442,   446,   451,   456,   459,   464,   469,
+     473,   479,   483,   486,   487,   488,   491,   495,   498,   503,
+     506,   507,   511,   514,   518,   529,   533,   534,   537,   541,
+     545,   548,   551,   553
 };
 #endif
 
@@ -1738,451 +1738,455 @@ yyreduce:
   case 53: /* bline: AVTOK NUM  */
 #line 323 "engines/hypno/grammar_arc.y"
                     {
+		assert((yyvsp[0].i) == 0);
+		shoot->nonHostile = true;
 		debugC(1, kHypnoDebugParser, "AV %d", (yyvsp[0].i));
 	}
-#line 1744 "engines/hypno/grammar_arc.cpp"
+#line 1746 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 54: /* bline: ALTOK NUM  */
-#line 326 "engines/hypno/grammar_arc.y"
+#line 328 "engines/hypno/grammar_arc.y"
                     {
 		debugC(1, kHypnoDebugParser, "AL %d", (yyvsp[0].i));
 	}
-#line 1752 "engines/hypno/grammar_arc.cpp"
+#line 1754 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 55: /* bline: ABTOK NUM  */
-#line 329 "engines/hypno/grammar_arc.y"
+#line 331 "engines/hypno/grammar_arc.y"
                     {
+		assert((yyvsp[0].i) == 1);
+		shoot->playInteractionAudio = true;
 		debugC(1, kHypnoDebugParser, "AB %d", (yyvsp[0].i));
 	}
-#line 1760 "engines/hypno/grammar_arc.cpp"
+#line 1764 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 56: /* bline: DTOK LTOK  */
-#line 332 "engines/hypno/grammar_arc.y"
+#line 336 "engines/hypno/grammar_arc.y"
                      { debugC(1, kHypnoDebugParser, "D L");
 	}
-#line 1767 "engines/hypno/grammar_arc.cpp"
+#line 1771 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 57: /* bline: J0TOK NUM  */
-#line 334 "engines/hypno/grammar_arc.y"
+#line 338 "engines/hypno/grammar_arc.y"
                     {
 		debugC(1, kHypnoDebugParser, "J0 %d", (yyvsp[0].i));
 	}
-#line 1775 "engines/hypno/grammar_arc.cpp"
+#line 1779 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 58: /* bline: FNTOK NONETOK  */
-#line 337 "engines/hypno/grammar_arc.y"
+#line 341 "engines/hypno/grammar_arc.y"
                         {
 		shoot = new Shoot();
 		shoot->animation = "NONE";
 		debugC(1, kHypnoDebugParser, "FN NONE");
 	}
-#line 1785 "engines/hypno/grammar_arc.cpp"
+#line 1789 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 59: /* bline: FTOK FILENAME  */
-#line 342 "engines/hypno/grammar_arc.y"
+#line 346 "engines/hypno/grammar_arc.y"
                         {
 		shoot = new Shoot();
 		shoot->animation = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "FN %s", (yyvsp[0].s));
 	}
-#line 1795 "engines/hypno/grammar_arc.cpp"
+#line 1799 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 60: /* bline: ITOK NAME  */
-#line 347 "engines/hypno/grammar_arc.y"
+#line 351 "engines/hypno/grammar_arc.y"
                      {
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1804 "engines/hypno/grammar_arc.cpp"
+#line 1808 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 61: /* bline: ITOK BNTOK  */
-#line 351 "engines/hypno/grammar_arc.y"
+#line 355 "engines/hypno/grammar_arc.y"
                       {  // Workaround for NAME == B1
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1813 "engines/hypno/grammar_arc.cpp"
+#line 1817 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 62: /* bline: ITOK ATOK  */
-#line 355 "engines/hypno/grammar_arc.y"
+#line 359 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == A
 		shoot->name = "A";
 		debugC(1, kHypnoDebugParser, "I A");
 	}
-#line 1822 "engines/hypno/grammar_arc.cpp"
+#line 1826 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 63: /* bline: ITOK CTOK  */
-#line 359 "engines/hypno/grammar_arc.y"
+#line 363 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == C
 		shoot->name = "C";
 		debugC(1, kHypnoDebugParser, "I C");
 	}
-#line 1831 "engines/hypno/grammar_arc.cpp"
+#line 1835 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 64: /* bline: ITOK DTOK  */
-#line 363 "engines/hypno/grammar_arc.y"
+#line 367 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == D
 		shoot->name = "D";
 		debugC(1, kHypnoDebugParser, "I D");
 	}
-#line 1840 "engines/hypno/grammar_arc.cpp"
+#line 1844 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 65: /* bline: ITOK FTOK  */
-#line 367 "engines/hypno/grammar_arc.y"
+#line 371 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == F
 		shoot->name = "F";
 		debugC(1, kHypnoDebugParser, "I F");
 	}
-#line 1849 "engines/hypno/grammar_arc.cpp"
+#line 1853 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 66: /* bline: ITOK GTOK  */
-#line 371 "engines/hypno/grammar_arc.y"
+#line 375 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == G
 		shoot->name = "G";
 		debugC(1, kHypnoDebugParser, "I G");
 	}
-#line 1858 "engines/hypno/grammar_arc.cpp"
+#line 1862 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 67: /* bline: ITOK HTOK  */
-#line 375 "engines/hypno/grammar_arc.y"
+#line 379 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == H
 		shoot->name = "H";
 		debugC(1, kHypnoDebugParser, "I H");
 	}
-#line 1867 "engines/hypno/grammar_arc.cpp"
+#line 1871 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 68: /* bline: ITOK H12TOK  */
-#line 379 "engines/hypno/grammar_arc.y"
+#line 383 "engines/hypno/grammar_arc.y"
                        { // Workaround for NAME == H1/H2
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1876 "engines/hypno/grammar_arc.cpp"
+#line 1880 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 69: /* bline: ITOK ITOK  */
-#line 383 "engines/hypno/grammar_arc.y"
+#line 387 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == I
 		shoot->name = "I";
 		debugC(1, kHypnoDebugParser, "I I");
 	}
-#line 1885 "engines/hypno/grammar_arc.cpp"
+#line 1889 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 70: /* bline: ITOK JTOK  */
-#line 387 "engines/hypno/grammar_arc.y"
+#line 391 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == J
 		shoot->name = "J";
 		debugC(1, kHypnoDebugParser, "I J");
 	}
-#line 1894 "engines/hypno/grammar_arc.cpp"
+#line 1898 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 71: /* bline: ITOK KTOK  */
-#line 391 "engines/hypno/grammar_arc.y"
+#line 395 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == K
 		shoot->name = "K";
 		debugC(1, kHypnoDebugParser, "I K");
 	}
-#line 1903 "engines/hypno/grammar_arc.cpp"
+#line 1907 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 72: /* bline: ITOK NTOK  */
-#line 395 "engines/hypno/grammar_arc.y"
+#line 399 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == N
 		shoot->name = "N";
 		debugC(1, kHypnoDebugParser, "I N");
 	}
-#line 1912 "engines/hypno/grammar_arc.cpp"
+#line 1916 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 73: /* bline: ITOK OTOK  */
-#line 399 "engines/hypno/grammar_arc.y"
+#line 403 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == O
 		shoot->name = "O";
 		debugC(1, kHypnoDebugParser, "I O");
 	}
-#line 1921 "engines/hypno/grammar_arc.cpp"
+#line 1925 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 74: /* bline: ITOK PTOK  */
-#line 403 "engines/hypno/grammar_arc.y"
+#line 407 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == P
 		shoot->name = "P";
 		debugC(1, kHypnoDebugParser, "I P");
 	}
-#line 1930 "engines/hypno/grammar_arc.cpp"
+#line 1934 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 75: /* bline: ITOK QTOK  */
-#line 407 "engines/hypno/grammar_arc.y"
+#line 411 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == Q
 		shoot->name = "Q";
 		debugC(1, kHypnoDebugParser, "I Q");
 	}
-#line 1939 "engines/hypno/grammar_arc.cpp"
+#line 1943 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 76: /* bline: ITOK RTOK  */
-#line 411 "engines/hypno/grammar_arc.y"
+#line 415 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == R
 		shoot->name = "R";
 		debugC(1, kHypnoDebugParser, "I R");
 	}
-#line 1948 "engines/hypno/grammar_arc.cpp"
+#line 1952 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 77: /* bline: ITOK SNTOK  */
-#line 415 "engines/hypno/grammar_arc.y"
+#line 419 "engines/hypno/grammar_arc.y"
                       {  // Workaround for NAME == S1
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1957 "engines/hypno/grammar_arc.cpp"
+#line 1961 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 78: /* bline: ITOK TTOK  */
-#line 419 "engines/hypno/grammar_arc.y"
+#line 423 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == T
 		shoot->name = "T";
 		debugC(1, kHypnoDebugParser, "I T");
 	}
-#line 1966 "engines/hypno/grammar_arc.cpp"
+#line 1970 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 79: /* bline: ITOK LTOK  */
-#line 423 "engines/hypno/grammar_arc.y"
+#line 427 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == L
 		shoot->name = "L";
 		debugC(1, kHypnoDebugParser, "I L");
 	}
-#line 1975 "engines/hypno/grammar_arc.cpp"
+#line 1979 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 80: /* bline: ITOK MTOK  */
-#line 427 "engines/hypno/grammar_arc.y"
+#line 431 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == M
 		shoot->name = "M";
 		debugC(1, kHypnoDebugParser, "I M");
 	}
-#line 1984 "engines/hypno/grammar_arc.cpp"
+#line 1988 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 81: /* bline: ITOK UTOK  */
-#line 431 "engines/hypno/grammar_arc.y"
+#line 435 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == U
 		shoot->name = "U";
 		debugC(1, kHypnoDebugParser, "I U");
 	}
-#line 1993 "engines/hypno/grammar_arc.cpp"
+#line 1997 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 82: /* bline: JTOK NUM  */
-#line 435 "engines/hypno/grammar_arc.y"
+#line 439 "engines/hypno/grammar_arc.y"
                     {
 		debugC(1, kHypnoDebugParser, "J %d", (yyvsp[0].i));
 	}
-#line 2001 "engines/hypno/grammar_arc.cpp"
+#line 2005 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 83: /* bline: A0TOK NUM NUM  */
-#line 438 "engines/hypno/grammar_arc.y"
+#line 442 "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 2010 "engines/hypno/grammar_arc.cpp"
+#line 2014 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 84: /* bline: RTOK NUM NUM  */
-#line 442 "engines/hypno/grammar_arc.y"
+#line 446 "engines/hypno/grammar_arc.y"
                         {
 		shoot->objKillsCount = (yyvsp[-1].i);
 		shoot->objMissesCount = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "R %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2020 "engines/hypno/grammar_arc.cpp"
+#line 2024 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 85: /* bline: R0TOK NUM NUM  */
-#line 447 "engines/hypno/grammar_arc.y"
+#line 451 "engines/hypno/grammar_arc.y"
                          {
 		shoot->objKillsCount = (yyvsp[-1].i);
 		shoot->objMissesCount = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "R0 %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2030 "engines/hypno/grammar_arc.cpp"
+#line 2034 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 86: /* bline: R1TOK NUM NUM  */
-#line 452 "engines/hypno/grammar_arc.y"
+#line 456 "engines/hypno/grammar_arc.y"
                          {
 		debugC(1, kHypnoDebugParser, "R1 %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2038 "engines/hypno/grammar_arc.cpp"
+#line 2042 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 87: /* bline: BNTOK NUM NUM  */
-#line 455 "engines/hypno/grammar_arc.y"
+#line 459 "engines/hypno/grammar_arc.y"
                         {
 		FrameInfo fi((yyvsp[0].i), (yyvsp[-1].i));
 		shoot->bodyFrames.push_back(fi);
 		debugC(1, kHypnoDebugParser, "BN %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2048 "engines/hypno/grammar_arc.cpp"
+#line 2052 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 88: /* bline: KNTOK NUM NUM  */
-#line 460 "engines/hypno/grammar_arc.y"
+#line 464 "engines/hypno/grammar_arc.y"
                         {
 		FrameInfo fi((yyvsp[0].i), (yyvsp[-1].i));
 		shoot->explosionFrames.push_back(fi);
 		debugC(1, kHypnoDebugParser, "KN %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2058 "engines/hypno/grammar_arc.cpp"
+#line 2062 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 89: /* bline: P0TOK NUM NUM  */
-#line 465 "engines/hypno/grammar_arc.y"
+#line 469 "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 2067 "engines/hypno/grammar_arc.cpp"
+#line 2071 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 90: /* bline: OTOK NUM NUM  */
-#line 469 "engines/hypno/grammar_arc.y"
+#line 473 "engines/hypno/grammar_arc.y"
                        {
 		if ((yyvsp[-1].i) == 0 && (yyvsp[0].i) == 0)
 			error("Invalid O command (0, 0)");
 		shoot->deathPosition = Common::Point((yyvsp[-1].i), (yyvsp[0].i));
 		debugC(1, kHypnoDebugParser, "O %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2078 "engines/hypno/grammar_arc.cpp"
+#line 2082 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 91: /* bline: CTOK NUM  */
-#line 475 "engines/hypno/grammar_arc.y"
+#line 479 "engines/hypno/grammar_arc.y"
                     {
 		shoot->timesToShoot = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "C %d", (yyvsp[0].i));
 	}
-#line 2087 "engines/hypno/grammar_arc.cpp"
+#line 2091 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 92: /* bline: HTOK NUM  */
-#line 479 "engines/hypno/grammar_arc.y"
+#line 483 "engines/hypno/grammar_arc.y"
                     {
 		shoot->attackFrames.push_back((yyvsp[0].i));
 		debugC(1, kHypnoDebugParser, "H %d", (yyvsp[0].i)); }
-#line 2095 "engines/hypno/grammar_arc.cpp"
+#line 2099 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 93: /* bline: VTOK NUM  */
-#line 482 "engines/hypno/grammar_arc.y"
+#line 486 "engines/hypno/grammar_arc.y"
                     { debugC(1, kHypnoDebugParser, "V %d", (yyvsp[0].i)); }
-#line 2101 "engines/hypno/grammar_arc.cpp"
+#line 2105 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 94: /* bline: VTOK  */
-#line 483 "engines/hypno/grammar_arc.y"
+#line 487 "engines/hypno/grammar_arc.y"
                { debugC(1, kHypnoDebugParser, "V"); }
-#line 2107 "engines/hypno/grammar_arc.cpp"
+#line 2111 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 95: /* bline: WTOK NUM  */
-#line 484 "engines/hypno/grammar_arc.y"
+#line 488 "engines/hypno/grammar_arc.y"
                     {
 		shoot->attackWeight = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "W %d", (yyvsp[0].i)); }
-#line 2115 "engines/hypno/grammar_arc.cpp"
+#line 2119 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 96: /* bline: DTOK NUM  */
-#line 487 "engines/hypno/grammar_arc.y"
+#line 491 "engines/hypno/grammar_arc.y"
                     {
 		shoot->pointsToShoot = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "D %d", (yyvsp[0].i));
 	}
-#line 2124 "engines/hypno/grammar_arc.cpp"
+#line 2128 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 97: /* bline: LTOK NUM NUM  */
-#line 491 "engines/hypno/grammar_arc.y"
+#line 495 "engines/hypno/grammar_arc.y"
                        {
 		debugC(1, kHypnoDebugParser, "L %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2132 "engines/hypno/grammar_arc.cpp"
+#line 2136 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 98: /* bline: LTOK NUM  */
-#line 494 "engines/hypno/grammar_arc.y"
+#line 498 "engines/hypno/grammar_arc.y"
                    {
 		debugC(1, kHypnoDebugParser, "L %d", (yyvsp[0].i));
 		FrameInfo fi((yyvsp[0].i)-1, 0);
 		shoot->bodyFrames.push_back(fi);
 	}
-#line 2142 "engines/hypno/grammar_arc.cpp"
+#line 2146 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 99: /* bline: MTOK NUM  */
-#line 499 "engines/hypno/grammar_arc.y"
+#line 503 "engines/hypno/grammar_arc.y"
                    { debugC(1, kHypnoDebugParser, "M %d", (yyvsp[0].i));
 		shoot->missedAnimation = (yyvsp[0].i);
 	}
-#line 2150 "engines/hypno/grammar_arc.cpp"
+#line 2154 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 100: /* bline: KTOK  */
-#line 502 "engines/hypno/grammar_arc.y"
+#line 506 "engines/hypno/grammar_arc.y"
                { debugC(1, kHypnoDebugParser, "K"); }
-#line 2156 "engines/hypno/grammar_arc.cpp"
+#line 2160 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 101: /* bline: KTOK NUM  */
-#line 503 "engines/hypno/grammar_arc.y"
+#line 507 "engines/hypno/grammar_arc.y"
                    { debugC(1, kHypnoDebugParser, "K %d", (yyvsp[0].i));
 		FrameInfo fi((yyvsp[0].i), 1);
 		shoot->explosionFrames.push_back(fi);
 	}
-#line 2165 "engines/hypno/grammar_arc.cpp"
+#line 2169 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 102: /* bline: KTOK NUM NUM NUM  */
-#line 507 "engines/hypno/grammar_arc.y"
+#line 511 "engines/hypno/grammar_arc.y"
                            {
 		debugC(1, kHypnoDebugParser, "K %d %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2173 "engines/hypno/grammar_arc.cpp"
+#line 2177 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 103: /* bline: KTOK NUM NUM  */
-#line 510 "engines/hypno/grammar_arc.y"
+#line 514 "engines/hypno/grammar_arc.y"
                        { debugC(1, kHypnoDebugParser, "K %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 		FrameInfo fi((yyvsp[-1].i), 1);
 		shoot->explosionFrames.push_back(fi);
 	}
-#line 2182 "engines/hypno/grammar_arc.cpp"
+#line 2186 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 104: /* bline: SNTOK FILENAME enc  */
-#line 514 "engines/hypno/grammar_arc.y"
+#line 518 "engines/hypno/grammar_arc.y"
                              {
 		if (Common::String("S0") == (yyvsp[-2].s))
 			shoot->enemySound = (yyvsp[-1].s);
@@ -2194,85 +2198,85 @@ yyreduce:
 			shoot->animalSound = (yyvsp[-1].s);
 
 		debugC(1, kHypnoDebugParser, "SN %s", (yyvsp[-1].s)); }
-#line 2198 "engines/hypno/grammar_arc.cpp"
+#line 2202 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 105: /* bline: SNTOK  */
-#line 525 "engines/hypno/grammar_arc.y"
+#line 529 "engines/hypno/grammar_arc.y"
                 {
 		debugC(1, kHypnoDebugParser, "SN");
 	}
-#line 2206 "engines/hypno/grammar_arc.cpp"
+#line 2210 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 106: /* bline: GTOK  */
-#line 529 "engines/hypno/grammar_arc.y"
+#line 533 "engines/hypno/grammar_arc.y"
                { debugC(1, kHypnoDebugParser, "G"); }
-#line 2212 "engines/hypno/grammar_arc.cpp"
+#line 2216 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 107: /* bline: TTOK NUM NUM NUM  */
-#line 530 "engines/hypno/grammar_arc.y"
+#line 534 "engines/hypno/grammar_arc.y"
                            {
 		debugC(1, kHypnoDebugParser, "T %d %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2220 "engines/hypno/grammar_arc.cpp"
+#line 2224 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 108: /* bline: TTOK NUM  */
-#line 533 "engines/hypno/grammar_arc.y"
+#line 537 "engines/hypno/grammar_arc.y"
                    {
 		shoot->interactionFrame = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "T %d", (yyvsp[0].i));
 	}
-#line 2229 "engines/hypno/grammar_arc.cpp"
+#line 2233 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 109: /* bline: TTOK  */
-#line 537 "engines/hypno/grammar_arc.y"
+#line 541 "engines/hypno/grammar_arc.y"
                {
 		shoot->isAnimal = true;
 		debugC(1, kHypnoDebugParser, "T");
 	}
-#line 2238 "engines/hypno/grammar_arc.cpp"
+#line 2242 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 110: /* bline: MTOK  */
-#line 541 "engines/hypno/grammar_arc.y"
+#line 545 "engines/hypno/grammar_arc.y"
                {
 		debugC(1, kHypnoDebugParser, "M");
 	}
-#line 2246 "engines/hypno/grammar_arc.cpp"
+#line 2250 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 111: /* bline: NTOK  */
-#line 544 "engines/hypno/grammar_arc.y"
+#line 548 "engines/hypno/grammar_arc.y"
                {
 		shoot->noEnemySound = true;
 		debugC(1, kHypnoDebugParser, "N"); }
-#line 2254 "engines/hypno/grammar_arc.cpp"
+#line 2258 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 112: /* bline: NRTOK  */
-#line 547 "engines/hypno/grammar_arc.y"
+#line 551 "engines/hypno/grammar_arc.y"
                 {
 		debugC(1, kHypnoDebugParser, "NR"); }
-#line 2261 "engines/hypno/grammar_arc.cpp"
+#line 2265 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 113: /* bline: ZTOK  */
-#line 549 "engines/hypno/grammar_arc.y"
+#line 553 "engines/hypno/grammar_arc.y"
                {
 		g_parsedArc->shoots.push_back(*shoot);
 		//delete shoot;
 		//shoot = nullptr;
 		debugC(1, kHypnoDebugParser, "Z");
 	}
-#line 2272 "engines/hypno/grammar_arc.cpp"
+#line 2276 "engines/hypno/grammar_arc.cpp"
     break;
 
 
-#line 2276 "engines/hypno/grammar_arc.cpp"
+#line 2280 "engines/hypno/grammar_arc.cpp"
 
       default: break;
     }
diff --git a/engines/hypno/grammar_arc.y b/engines/hypno/grammar_arc.y
index 0b22e012886..d088078258f 100644
--- a/engines/hypno/grammar_arc.y
+++ b/engines/hypno/grammar_arc.y
@@ -321,12 +321,16 @@ bline: FNTOK FILENAME {
 		debugC(1, kHypnoDebugParser, "FN %s", $2);
 	}
 	| AVTOK NUM {
+		assert($2 == 0);
+		shoot->nonHostile = true;
 		debugC(1, kHypnoDebugParser, "AV %d", $2);
 	}
 	| ALTOK NUM {
 		debugC(1, kHypnoDebugParser, "AL %d", $2);
 	}
 	| ABTOK NUM {
+		assert($2 == 1);
+		shoot->playInteractionAudio = true;
 		debugC(1, kHypnoDebugParser, "AB %d", $2);
 	}
 	| DTOK LTOK  { debugC(1, kHypnoDebugParser, "D L");
diff --git a/engines/hypno/hypno.cpp b/engines/hypno/hypno.cpp
index ba2f79ac8a0..86f51a34d6a 100644
--- a/engines/hypno/hypno.cpp
+++ b/engines/hypno/hypno.cpp
@@ -54,7 +54,8 @@ HypnoEngine::HypnoEngine(OSystem *syst, const ADGameDescription *gd)
 	  _playerFrameIdx(0), _playerFrameSep(0), _refreshConversation(false),
 	  _countdown(0), _timerStarted(false), _score(0), _lives(0),
 	  _defaultCursor(""), _defaultCursorIdx(0),  _skipDefeatVideo(false),
-	  _background(nullptr), _masks(nullptr), _ammo(0), _maxAmmo(0),
+	  _background(nullptr), _masks(nullptr),
+	  _additionalVideo(nullptr), _ammo(0), _maxAmmo(0),
 	  _doNotStopSounds(false), _screenW(0), _screenH(0) { // Every games initializes its own resolution
 	_rnd = new Common::RandomSource("hypno");
 	_checkpoint = "";
diff --git a/engines/hypno/hypno.h b/engines/hypno/hypno.h
index 88f3371b938..765d71a3c37 100644
--- a/engines/hypno/hypno.h
+++ b/engines/hypno/hypno.h
@@ -235,6 +235,7 @@ public:
 	Videos _videosPlaying;
 	Videos _videosLooping;
 	MVideo *_masks;
+	MVideo *_additionalVideo;
 	const Graphics::Surface *_mask;
 
 	// Sounds


Commit: a806795e11bed1dec1eb8403f78a255f042e02c1
    https://github.com/scummvm/scummvm/commit/a806795e11bed1dec1eb8403f78a255f042e02c1
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-12T20:43:59+02:00

Commit Message:
HYPNO: added reload sound for every weapon in boyz

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


diff --git a/engines/hypno/boyz/arcade.cpp b/engines/hypno/boyz/arcade.cpp
index 872f286c2d8..a7de7c11812 100644
--- a/engines/hypno/boyz/arcade.cpp
+++ b/engines/hypno/boyz/arcade.cpp
@@ -349,7 +349,7 @@ bool BoyzEngine::clickedSecondaryShoot(const Common::Point &mousePos) {
 	Common::Rect ammoBarBox(320 - _ammoBar[_currentActor].w, 0, 320, _ammoBar[_currentActor].h);
 	if (ammoBarBox.contains(mousePos)) {
 		_ammoTeam[_currentActor] = _weaponMaxAmmo[_currentWeapon];
-		// TODO: play reload sound
+		playSound(_soundPath + _weaponReloadSound[_currentWeapon], 1);
 		return false;
 	}
 	return true;
diff --git a/engines/hypno/boyz/boyz.cpp b/engines/hypno/boyz/boyz.cpp
index abe5b7382fe..9b8068644cf 100644
--- a/engines/hypno/boyz/boyz.cpp
+++ b/engines/hypno/boyz/boyz.cpp
@@ -143,6 +143,14 @@ void BoyzEngine::loadAssets() {
 	_weaponShootSound[5] = "shotfire.raw";
 	_weaponShootSound[6] = "glm60fr.raw";
 
+	_weaponReloadSound[0] = "";
+	_weaponReloadSound[1] = "pstlload.raw";
+	_weaponReloadSound[2] = "ak47load.raw";
+	_weaponReloadSound[3] = "dblload.raw";
+	_weaponReloadSound[4] = "m16load.raw";
+	_weaponReloadSound[5] = "shotload.raw";
+	_weaponReloadSound[6] = "glm60rl.raw";
+
 	_heySound[0] = "";
 	_heySound[1] = "lopzheys.raw";
 	_heySound[2] = "lambheys.raw";
diff --git a/engines/hypno/hypno.h b/engines/hypno/hypno.h
index 765d71a3c37..ab40ae50e26 100644
--- a/engines/hypno/hypno.h
+++ b/engines/hypno/hypno.h
@@ -573,6 +573,7 @@ public:
 	Graphics::Surface _portrait[7];
 
 	Filename _weaponShootSound[7];
+	Filename _weaponReloadSound[7];
 	Filename _heySound[7];
 	int _weaponMaxAmmo[7];
 


Commit: e4dfe8d1d8c798f6a7d35cd17fa92ce69de4d22a
    https://github.com/scummvm/scummvm/commit/e4dfe8d1d8c798f6a7d35cd17fa92ce69de4d22a
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-12T20:43:59+02:00

Commit Message:
HYPNO: implemented some transitions with a fixed sound in boyz

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


diff --git a/engines/hypno/boyz/arcade.cpp b/engines/hypno/boyz/arcade.cpp
index a7de7c11812..8d4a47458e2 100644
--- a/engines/hypno/boyz/arcade.cpp
+++ b/engines/hypno/boyz/arcade.cpp
@@ -179,7 +179,10 @@ bool BoyzEngine::checkTransition(ArcadeTransitions &transitions, ArcadeShooting
 	ArcadeTransition at = *transitions.begin();
 	int ttime = at.time;
 	if (_background->decoder->getCurFrame() > ttime) {
-		if (!at.video.empty()) {
+		if (at.video == "NONE") {
+			if (!arc->additionalSound.empty())
+				playSound(arc->additionalSound, 1, arc->additionalSoundRate);
+		} else if (!at.video.empty()) {
 			_background->decoder->pauseVideo(true);
 			debugC(1, kHypnoDebugArcade, "Playing transition %s", at.video.c_str());
 			MVideo video(at.video, Common::Point(0, 0), false, true, false);
@@ -249,7 +252,6 @@ bool BoyzEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc, bool
 	if (i < 0) {
 		missNoTarget(arc);
 	} else {
-		debug("Shoot target %s, flag: %d", _shoots[i].name.c_str(), _shoots[i].playInteractionAudio);
 		if (_shoots[i].nonHostile && secondary) {
 			playSound(_soundPath + _heySound[_currentActor], 1);
 
diff --git a/engines/hypno/grammar_arc.cpp b/engines/hypno/grammar_arc.cpp
index 4c093f44b59..42949f3164c 100644
--- a/engines/hypno/grammar_arc.cpp
+++ b/engines/hypno/grammar_arc.cpp
@@ -125,12 +125,15 @@ void parseSN(const char *sn, const char *path, const char *enc, const char *flag
 	} else if (Common::String("S7") == sn) {
 		g_parsedArc->noAmmoSound = path;
 		g_parsedArc->noAmmoSoundRate = sampleRate;
+	} else if (Common::String("S8") == sn) {
+		g_parsedArc->additionalSound = path;
+		g_parsedArc->additionalSoundRate = sampleRate;
 	}
 	debugC(1, kHypnoDebugParser, "SN %s", path);
 }
 
 
-#line 134 "engines/hypno/grammar_arc.cpp"
+#line 137 "engines/hypno/grammar_arc.cpp"
 
 # ifndef YY_CAST
 #  ifdef __cplusplus
@@ -618,18 +621,18 @@ static const yytype_int8 yytranslate[] =
 /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_int16 yyrline[] =
 {
-       0,   107,   107,   107,   108,   111,   112,   113,   116,   120,
-     124,   128,   129,   130,   134,   139,   143,   147,   152,   162,
-     171,   176,   179,   184,   189,   194,   195,   199,   203,   206,
-     210,   213,   214,   242,   245,   248,   254,   259,   264,   270,
-     275,   280,   285,   290,   295,   302,   303,   306,   307,   310,
-     311,   312,   315,   323,   328,   331,   336,   338,   341,   346,
-     351,   355,   359,   363,   367,   371,   375,   379,   383,   387,
-     391,   395,   399,   403,   407,   411,   415,   419,   423,   427,
-     431,   435,   439,   442,   446,   451,   456,   459,   464,   469,
-     473,   479,   483,   486,   487,   488,   491,   495,   498,   503,
-     506,   507,   511,   514,   518,   529,   533,   534,   537,   541,
-     545,   548,   551,   553
+       0,   110,   110,   110,   111,   114,   115,   116,   119,   123,
+     127,   131,   132,   133,   137,   142,   146,   150,   155,   165,
+     174,   179,   182,   187,   192,   197,   201,   205,   209,   212,
+     216,   219,   220,   248,   251,   254,   260,   265,   270,   276,
+     281,   286,   291,   296,   301,   308,   309,   312,   313,   316,
+     317,   318,   321,   329,   334,   337,   342,   344,   347,   352,
+     357,   361,   365,   369,   373,   377,   381,   385,   389,   393,
+     397,   401,   405,   409,   413,   417,   421,   425,   429,   433,
+     437,   441,   445,   448,   452,   457,   462,   465,   470,   475,
+     479,   485,   489,   492,   493,   494,   497,   501,   504,   509,
+     512,   513,   517,   520,   524,   535,   539,   540,   543,   547,
+     551,   554,   557,   559
 };
 #endif
 
@@ -1324,99 +1327,99 @@ yyreduce:
   switch (yyn)
     {
   case 2: /* $@1: %empty  */
-#line 107 "engines/hypno/grammar_arc.y"
+#line 110 "engines/hypno/grammar_arc.y"
              { g_parsedArc->mode = (yyvsp[0].s); }
-#line 1330 "engines/hypno/grammar_arc.cpp"
+#line 1333 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 8: /* hline: CTOK NUM  */
-#line 116 "engines/hypno/grammar_arc.y"
+#line 119 "engines/hypno/grammar_arc.y"
                  {
 		g_parsedArc->id = (yyvsp[0].i);
 		HYPNO_ARC_default_sound_rate = 0;
 		debugC(1, kHypnoDebugParser, "C %d", (yyvsp[0].i)); }
-#line 1339 "engines/hypno/grammar_arc.cpp"
+#line 1342 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 9: /* hline: FTOK NUM  */
-#line 120 "engines/hypno/grammar_arc.y"
+#line 123 "engines/hypno/grammar_arc.y"
                    {
 		HYPNO_ARC_default_sound_rate = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "F %d", (yyvsp[0].i));
 	}
-#line 1348 "engines/hypno/grammar_arc.cpp"
+#line 1351 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 10: /* hline: DTOK NUM  */
-#line 124 "engines/hypno/grammar_arc.y"
+#line 127 "engines/hypno/grammar_arc.y"
                     {
 		g_parsedArc->frameDelay = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "D %d", (yyvsp[0].i));
 	}
-#line 1357 "engines/hypno/grammar_arc.cpp"
+#line 1360 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 11: /* hline: PTOK NUM NUM  */
-#line 128 "engines/hypno/grammar_arc.y"
+#line 131 "engines/hypno/grammar_arc.y"
                        { debugC(1, kHypnoDebugParser, "P %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1363 "engines/hypno/grammar_arc.cpp"
+#line 1366 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 12: /* hline: ATOK NUM NUM  */
-#line 129 "engines/hypno/grammar_arc.y"
+#line 132 "engines/hypno/grammar_arc.y"
                        { debugC(1, kHypnoDebugParser, "A %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1369 "engines/hypno/grammar_arc.cpp"
+#line 1372 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 13: /* hline: MTOK FILENAME  */
-#line 130 "engines/hypno/grammar_arc.y"
+#line 133 "engines/hypno/grammar_arc.y"
                         {
 		debugC(1, kHypnoDebugParser, "M %s", (yyvsp[0].s));
 		g_parsedArc->maskVideo = (yyvsp[0].s);
 	}
-#line 1378 "engines/hypno/grammar_arc.cpp"
+#line 1381 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 14: /* hline: UTOK NUM NUM NUM NUM  */
-#line 134 "engines/hypno/grammar_arc.y"
+#line 137 "engines/hypno/grammar_arc.y"
                                {
 		debugC(1, kHypnoDebugParser, "U %d %d %d %d", (yyvsp[-3].i), (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 		ScriptInfo si((yyvsp[-3].i), (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 		g_parsedArc->script.push_back(si);
 	}
-#line 1388 "engines/hypno/grammar_arc.cpp"
+#line 1391 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 15: /* hline: VTOK NUM NUM  */
-#line 139 "engines/hypno/grammar_arc.y"
+#line 142 "engines/hypno/grammar_arc.y"
                        {
 		debugC(1, kHypnoDebugParser, "V %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 		g_parsedArc->mouseBox = Common::Rect(0, 0, (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1397 "engines/hypno/grammar_arc.cpp"
+#line 1400 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 16: /* hline: VTOK RESTOK  */
-#line 143 "engines/hypno/grammar_arc.y"
+#line 146 "engines/hypno/grammar_arc.y"
                       {
 		debugC(1, kHypnoDebugParser, "V 320,200");
 		g_parsedArc->mouseBox = Common::Rect(0, 0, 320, 200);
 	}
-#line 1406 "engines/hypno/grammar_arc.cpp"
+#line 1409 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 17: /* hline: OTOK NUM NUM  */
-#line 147 "engines/hypno/grammar_arc.y"
+#line 150 "engines/hypno/grammar_arc.y"
                        {
 		g_parsedArc->objKillsRequired[0] = (yyvsp[-1].i);
 		g_parsedArc->objMissesAllowed[0] = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "O %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1416 "engines/hypno/grammar_arc.cpp"
+#line 1419 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 18: /* hline: ONTOK NUM NUM  */
-#line 152 "engines/hypno/grammar_arc.y"
+#line 155 "engines/hypno/grammar_arc.y"
                         {
 		if (Common::String("O0") == (yyvsp[-2].s)) {
 			g_parsedArc->objKillsRequired[0] = (yyvsp[-1].i);
@@ -1427,11 +1430,11 @@ yyreduce:
 		} else
 			error("Invalid objective: '%s'", (yyvsp[-2].s));
 		debugC(1, kHypnoDebugParser, "ON %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1431 "engines/hypno/grammar_arc.cpp"
+#line 1434 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 19: /* hline: ONTOK NUM  */
-#line 162 "engines/hypno/grammar_arc.y"
+#line 165 "engines/hypno/grammar_arc.y"
                     {
 		if (Common::String("O0") == (yyvsp[-1].s)) {
 			g_parsedArc->objKillsRequired[0] = (yyvsp[0].i);
@@ -1441,114 +1444,117 @@ yyreduce:
 			error("Invalid objective: '%s'", (yyvsp[-1].s));
 		debugC(1, kHypnoDebugParser, "ON %d", (yyvsp[0].i));
 	}
-#line 1445 "engines/hypno/grammar_arc.cpp"
+#line 1448 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 20: /* hline: TPTOK NONETOK NUM FILENAME  */
-#line 171 "engines/hypno/grammar_arc.y"
+#line 174 "engines/hypno/grammar_arc.y"
                                      {
 		ArcadeTransition at("NONE", (yyvsp[0].s), "", (yyvsp[-1].i));
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "Tp %s %d %s", "NONE", (yyvsp[-1].i), (yyvsp[0].s));
 	}
-#line 1455 "engines/hypno/grammar_arc.cpp"
+#line 1458 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 21: /* hline: TSTOK FILENAME NUM NUM  */
-#line 176 "engines/hypno/grammar_arc.y"
+#line 179 "engines/hypno/grammar_arc.y"
                                  {
 		debugC(1, kHypnoDebugParser, "Ts %s %d %d", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1463 "engines/hypno/grammar_arc.cpp"
+#line 1466 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 22: /* hline: TPTOK FILENAME NUM FILENAME  */
-#line 179 "engines/hypno/grammar_arc.y"
+#line 182 "engines/hypno/grammar_arc.y"
                                       {
 		ArcadeTransition at((yyvsp[-2].s), (yyvsp[0].s), "", (yyvsp[-1].i));
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "Tp %s %d %s", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].s));
 	}
-#line 1473 "engines/hypno/grammar_arc.cpp"
+#line 1476 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 23: /* hline: TATOK NUM FILENAME flag enc  */
-#line 184 "engines/hypno/grammar_arc.y"
+#line 187 "engines/hypno/grammar_arc.y"
                                       {
 		ArcadeTransition at("", "", (yyvsp[-2].s), (yyvsp[-3].i));
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "Ta %d %s", (yyvsp[-3].i), (yyvsp[-2].s));
 	}
-#line 1483 "engines/hypno/grammar_arc.cpp"
+#line 1486 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 24: /* hline: TTOK FILENAME NUM  */
-#line 189 "engines/hypno/grammar_arc.y"
+#line 192 "engines/hypno/grammar_arc.y"
                             {
 		ArcadeTransition at((yyvsp[-1].s), "", "", (yyvsp[0].i));
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "T %s %d", (yyvsp[-1].s), (yyvsp[0].i));
 	}
-#line 1493 "engines/hypno/grammar_arc.cpp"
+#line 1496 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 25: /* hline: TTOK NONETOK NUM  */
-#line 194 "engines/hypno/grammar_arc.y"
-                           { debugC(1, kHypnoDebugParser, "T NONE %d", (yyvsp[0].i)); }
-#line 1499 "engines/hypno/grammar_arc.cpp"
+#line 197 "engines/hypno/grammar_arc.y"
+                           {
+		ArcadeTransition at("NONE", "", "", (yyvsp[0].i));
+		g_parsedArc->transitions.push_back(at);
+		debugC(1, kHypnoDebugParser, "T NONE %d", (yyvsp[0].i)); }
+#line 1505 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 26: /* hline: NTOK FILENAME  */
-#line 195 "engines/hypno/grammar_arc.y"
+#line 201 "engines/hypno/grammar_arc.y"
                          {
 		g_parsedArc->backgroundVideo = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "N %s", (yyvsp[0].s));
 	}
-#line 1508 "engines/hypno/grammar_arc.cpp"
+#line 1514 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 27: /* hline: NSTOK FILENAME  */
-#line 199 "engines/hypno/grammar_arc.y"
+#line 205 "engines/hypno/grammar_arc.y"
                           {
 		g_parsedArc->backgroundVideo = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "N* %s", (yyvsp[0].s));
 	}
-#line 1517 "engines/hypno/grammar_arc.cpp"
+#line 1523 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 28: /* hline: RTOK FILENAME  */
-#line 203 "engines/hypno/grammar_arc.y"
+#line 209 "engines/hypno/grammar_arc.y"
                          {
 		g_parsedArc->backgroundPalette = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "R %s", (yyvsp[0].s)); }
-#line 1525 "engines/hypno/grammar_arc.cpp"
+#line 1531 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 29: /* hline: ITOK FILENAME  */
-#line 206 "engines/hypno/grammar_arc.y"
+#line 212 "engines/hypno/grammar_arc.y"
                         {
 		g_parsedArc->player = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1534 "engines/hypno/grammar_arc.cpp"
+#line 1540 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 30: /* hline: I1TOK FILENAME  */
-#line 210 "engines/hypno/grammar_arc.y"
+#line 216 "engines/hypno/grammar_arc.y"
                          {
 		debugC(1, kHypnoDebugParser, "I1 %s", (yyvsp[0].s));
 	}
-#line 1542 "engines/hypno/grammar_arc.cpp"
+#line 1548 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 31: /* hline: QTOK NUM NUM  */
-#line 213 "engines/hypno/grammar_arc.y"
+#line 219 "engines/hypno/grammar_arc.y"
                        { debugC(1, kHypnoDebugParser, "Q %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1548 "engines/hypno/grammar_arc.cpp"
+#line 1554 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 32: /* hline: BNTOK FILENAME  */
-#line 214 "engines/hypno/grammar_arc.y"
+#line 220 "engines/hypno/grammar_arc.y"
                          {
 		if (Common::String("B0") == (yyvsp[-1].s))
 			g_parsedArc->beforeVideo = (yyvsp[0].s);
@@ -1577,153 +1583,153 @@ yyreduce:
 
 		debugC(1, kHypnoDebugParser, "BN %s", (yyvsp[0].s));
 	}
-#line 1581 "engines/hypno/grammar_arc.cpp"
+#line 1587 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 33: /* hline: SNTOK FILENAME enc flag  */
-#line 242 "engines/hypno/grammar_arc.y"
+#line 248 "engines/hypno/grammar_arc.y"
                                   {
 		parseSN((yyvsp[-3].s), (yyvsp[-2].s), (yyvsp[-1].s), (yyvsp[0].s));
 	}
-#line 1589 "engines/hypno/grammar_arc.cpp"
+#line 1595 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 34: /* hline: SNTOK FILENAME flag enc  */
-#line 245 "engines/hypno/grammar_arc.y"
+#line 251 "engines/hypno/grammar_arc.y"
                                   {
 		parseSN((yyvsp[-3].s), (yyvsp[-2].s), (yyvsp[0].s), (yyvsp[-1].s));
 	}
-#line 1597 "engines/hypno/grammar_arc.cpp"
+#line 1603 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 35: /* hline: HETOK BYTE NUM NUM  */
-#line 248 "engines/hypno/grammar_arc.y"
+#line 254 "engines/hypno/grammar_arc.y"
                              {
 		Segment segment((yyvsp[-2].i), (yyvsp[0].i), (yyvsp[-1].i));
 		segment.end = true;
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "HE %x %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1608 "engines/hypno/grammar_arc.cpp"
+#line 1614 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 36: /* hline: HLTOK BYTE NUM NUM  */
-#line 254 "engines/hypno/grammar_arc.y"
+#line 260 "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 1618 "engines/hypno/grammar_arc.cpp"
+#line 1624 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 37: /* hline: HUTOK BYTE NUM NUM  */
-#line 259 "engines/hypno/grammar_arc.y"
+#line 265 "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 1628 "engines/hypno/grammar_arc.cpp"
+#line 1634 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 38: /* hline: HTOK NAME NUM NUM  */
-#line 264 "engines/hypno/grammar_arc.y"
+#line 270 "engines/hypno/grammar_arc.y"
                             {
 		assert(Common::String((yyvsp[-2].s)).size() == 1);
 		Segment segment((yyvsp[-2].s)[0], (yyvsp[0].i), (yyvsp[-1].i));
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "H %s %d %d", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1639 "engines/hypno/grammar_arc.cpp"
+#line 1645 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 39: /* hline: HTOK RTOK NUM NUM  */
-#line 270 "engines/hypno/grammar_arc.y"
+#line 276 "engines/hypno/grammar_arc.y"
                             { // Workaround for BYTE == R
 		Segment segment('R', (yyvsp[0].i), (yyvsp[-1].i));
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "H R %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1649 "engines/hypno/grammar_arc.cpp"
+#line 1655 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 40: /* hline: HTOK ATOK NUM NUM  */
-#line 275 "engines/hypno/grammar_arc.y"
+#line 281 "engines/hypno/grammar_arc.y"
                             { // Workaround for BYTE == A
 		Segment segment('A', (yyvsp[0].i), (yyvsp[-1].i));
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "H A %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1659 "engines/hypno/grammar_arc.cpp"
+#line 1665 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 41: /* hline: HTOK PTOK NUM NUM  */
-#line 280 "engines/hypno/grammar_arc.y"
+#line 286 "engines/hypno/grammar_arc.y"
                             { // Workaround for BYTE == P
 		Segment segment('P', (yyvsp[0].i), (yyvsp[-1].i));
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "H P %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1669 "engines/hypno/grammar_arc.cpp"
+#line 1675 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 42: /* hline: HTOK LTOK NUM NUM  */
-#line 285 "engines/hypno/grammar_arc.y"
+#line 291 "engines/hypno/grammar_arc.y"
                             { // Workaround for BYTE == P
 		Segment segment('L', (yyvsp[0].i), (yyvsp[-1].i));
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "H P %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1679 "engines/hypno/grammar_arc.cpp"
+#line 1685 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 43: /* hline: H12TOK BYTE NUM NUM  */
-#line 290 "engines/hypno/grammar_arc.y"
+#line 296 "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, "HN %x %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1689 "engines/hypno/grammar_arc.cpp"
+#line 1695 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 44: /* hline: HTOK BYTE NUM NUM  */
-#line 295 "engines/hypno/grammar_arc.y"
+#line 301 "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, "H %x %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1699 "engines/hypno/grammar_arc.cpp"
+#line 1705 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 45: /* enc: ENCTOK  */
-#line 302 "engines/hypno/grammar_arc.y"
+#line 308 "engines/hypno/grammar_arc.y"
                      { (yyval.s) = (yyvsp[0].s); }
-#line 1705 "engines/hypno/grammar_arc.cpp"
+#line 1711 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 46: /* enc: %empty  */
-#line 303 "engines/hypno/grammar_arc.y"
+#line 309 "engines/hypno/grammar_arc.y"
                          { (yyval.s) = scumm_strdup(""); }
-#line 1711 "engines/hypno/grammar_arc.cpp"
+#line 1717 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 47: /* flag: NAME  */
-#line 306 "engines/hypno/grammar_arc.y"
+#line 312 "engines/hypno/grammar_arc.y"
                      { (yyval.s) = (yyvsp[0].s); }
-#line 1717 "engines/hypno/grammar_arc.cpp"
+#line 1723 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 48: /* flag: %empty  */
-#line 307 "engines/hypno/grammar_arc.y"
+#line 313 "engines/hypno/grammar_arc.y"
                          { (yyval.s) = scumm_strdup(""); }
-#line 1723 "engines/hypno/grammar_arc.cpp"
+#line 1729 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 52: /* bline: FNTOK FILENAME  */
-#line 315 "engines/hypno/grammar_arc.y"
+#line 321 "engines/hypno/grammar_arc.y"
                       {
 		shoot = new Shoot();
 		if (Common::String("F0") == (yyvsp[-1].s))
@@ -1732,461 +1738,461 @@ yyreduce:
 			shoot->explosionAnimation = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "FN %s", (yyvsp[0].s));
 	}
-#line 1736 "engines/hypno/grammar_arc.cpp"
+#line 1742 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 53: /* bline: AVTOK NUM  */
-#line 323 "engines/hypno/grammar_arc.y"
+#line 329 "engines/hypno/grammar_arc.y"
                     {
 		assert((yyvsp[0].i) == 0);
 		shoot->nonHostile = true;
 		debugC(1, kHypnoDebugParser, "AV %d", (yyvsp[0].i));
 	}
-#line 1746 "engines/hypno/grammar_arc.cpp"
+#line 1752 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 54: /* bline: ALTOK NUM  */
-#line 328 "engines/hypno/grammar_arc.y"
+#line 334 "engines/hypno/grammar_arc.y"
                     {
 		debugC(1, kHypnoDebugParser, "AL %d", (yyvsp[0].i));
 	}
-#line 1754 "engines/hypno/grammar_arc.cpp"
+#line 1760 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 55: /* bline: ABTOK NUM  */
-#line 331 "engines/hypno/grammar_arc.y"
+#line 337 "engines/hypno/grammar_arc.y"
                     {
 		assert((yyvsp[0].i) == 1);
 		shoot->playInteractionAudio = true;
 		debugC(1, kHypnoDebugParser, "AB %d", (yyvsp[0].i));
 	}
-#line 1764 "engines/hypno/grammar_arc.cpp"
+#line 1770 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 56: /* bline: DTOK LTOK  */
-#line 336 "engines/hypno/grammar_arc.y"
+#line 342 "engines/hypno/grammar_arc.y"
                      { debugC(1, kHypnoDebugParser, "D L");
 	}
-#line 1771 "engines/hypno/grammar_arc.cpp"
+#line 1777 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 57: /* bline: J0TOK NUM  */
-#line 338 "engines/hypno/grammar_arc.y"
+#line 344 "engines/hypno/grammar_arc.y"
                     {
 		debugC(1, kHypnoDebugParser, "J0 %d", (yyvsp[0].i));
 	}
-#line 1779 "engines/hypno/grammar_arc.cpp"
+#line 1785 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 58: /* bline: FNTOK NONETOK  */
-#line 341 "engines/hypno/grammar_arc.y"
+#line 347 "engines/hypno/grammar_arc.y"
                         {
 		shoot = new Shoot();
 		shoot->animation = "NONE";
 		debugC(1, kHypnoDebugParser, "FN NONE");
 	}
-#line 1789 "engines/hypno/grammar_arc.cpp"
+#line 1795 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 59: /* bline: FTOK FILENAME  */
-#line 346 "engines/hypno/grammar_arc.y"
+#line 352 "engines/hypno/grammar_arc.y"
                         {
 		shoot = new Shoot();
 		shoot->animation = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "FN %s", (yyvsp[0].s));
 	}
-#line 1799 "engines/hypno/grammar_arc.cpp"
+#line 1805 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 60: /* bline: ITOK NAME  */
-#line 351 "engines/hypno/grammar_arc.y"
+#line 357 "engines/hypno/grammar_arc.y"
                      {
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1808 "engines/hypno/grammar_arc.cpp"
+#line 1814 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 61: /* bline: ITOK BNTOK  */
-#line 355 "engines/hypno/grammar_arc.y"
+#line 361 "engines/hypno/grammar_arc.y"
                       {  // Workaround for NAME == B1
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1817 "engines/hypno/grammar_arc.cpp"
+#line 1823 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 62: /* bline: ITOK ATOK  */
-#line 359 "engines/hypno/grammar_arc.y"
+#line 365 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == A
 		shoot->name = "A";
 		debugC(1, kHypnoDebugParser, "I A");
 	}
-#line 1826 "engines/hypno/grammar_arc.cpp"
+#line 1832 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 63: /* bline: ITOK CTOK  */
-#line 363 "engines/hypno/grammar_arc.y"
+#line 369 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == C
 		shoot->name = "C";
 		debugC(1, kHypnoDebugParser, "I C");
 	}
-#line 1835 "engines/hypno/grammar_arc.cpp"
+#line 1841 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 64: /* bline: ITOK DTOK  */
-#line 367 "engines/hypno/grammar_arc.y"
+#line 373 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == D
 		shoot->name = "D";
 		debugC(1, kHypnoDebugParser, "I D");
 	}
-#line 1844 "engines/hypno/grammar_arc.cpp"
+#line 1850 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 65: /* bline: ITOK FTOK  */
-#line 371 "engines/hypno/grammar_arc.y"
+#line 377 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == F
 		shoot->name = "F";
 		debugC(1, kHypnoDebugParser, "I F");
 	}
-#line 1853 "engines/hypno/grammar_arc.cpp"
+#line 1859 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 66: /* bline: ITOK GTOK  */
-#line 375 "engines/hypno/grammar_arc.y"
+#line 381 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == G
 		shoot->name = "G";
 		debugC(1, kHypnoDebugParser, "I G");
 	}
-#line 1862 "engines/hypno/grammar_arc.cpp"
+#line 1868 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 67: /* bline: ITOK HTOK  */
-#line 379 "engines/hypno/grammar_arc.y"
+#line 385 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == H
 		shoot->name = "H";
 		debugC(1, kHypnoDebugParser, "I H");
 	}
-#line 1871 "engines/hypno/grammar_arc.cpp"
+#line 1877 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 68: /* bline: ITOK H12TOK  */
-#line 383 "engines/hypno/grammar_arc.y"
+#line 389 "engines/hypno/grammar_arc.y"
                        { // Workaround for NAME == H1/H2
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1880 "engines/hypno/grammar_arc.cpp"
+#line 1886 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 69: /* bline: ITOK ITOK  */
-#line 387 "engines/hypno/grammar_arc.y"
+#line 393 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == I
 		shoot->name = "I";
 		debugC(1, kHypnoDebugParser, "I I");
 	}
-#line 1889 "engines/hypno/grammar_arc.cpp"
+#line 1895 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 70: /* bline: ITOK JTOK  */
-#line 391 "engines/hypno/grammar_arc.y"
+#line 397 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == J
 		shoot->name = "J";
 		debugC(1, kHypnoDebugParser, "I J");
 	}
-#line 1898 "engines/hypno/grammar_arc.cpp"
+#line 1904 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 71: /* bline: ITOK KTOK  */
-#line 395 "engines/hypno/grammar_arc.y"
+#line 401 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == K
 		shoot->name = "K";
 		debugC(1, kHypnoDebugParser, "I K");
 	}
-#line 1907 "engines/hypno/grammar_arc.cpp"
+#line 1913 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 72: /* bline: ITOK NTOK  */
-#line 399 "engines/hypno/grammar_arc.y"
+#line 405 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == N
 		shoot->name = "N";
 		debugC(1, kHypnoDebugParser, "I N");
 	}
-#line 1916 "engines/hypno/grammar_arc.cpp"
+#line 1922 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 73: /* bline: ITOK OTOK  */
-#line 403 "engines/hypno/grammar_arc.y"
+#line 409 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == O
 		shoot->name = "O";
 		debugC(1, kHypnoDebugParser, "I O");
 	}
-#line 1925 "engines/hypno/grammar_arc.cpp"
+#line 1931 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 74: /* bline: ITOK PTOK  */
-#line 407 "engines/hypno/grammar_arc.y"
+#line 413 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == P
 		shoot->name = "P";
 		debugC(1, kHypnoDebugParser, "I P");
 	}
-#line 1934 "engines/hypno/grammar_arc.cpp"
+#line 1940 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 75: /* bline: ITOK QTOK  */
-#line 411 "engines/hypno/grammar_arc.y"
+#line 417 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == Q
 		shoot->name = "Q";
 		debugC(1, kHypnoDebugParser, "I Q");
 	}
-#line 1943 "engines/hypno/grammar_arc.cpp"
+#line 1949 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 76: /* bline: ITOK RTOK  */
-#line 415 "engines/hypno/grammar_arc.y"
+#line 421 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == R
 		shoot->name = "R";
 		debugC(1, kHypnoDebugParser, "I R");
 	}
-#line 1952 "engines/hypno/grammar_arc.cpp"
+#line 1958 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 77: /* bline: ITOK SNTOK  */
-#line 419 "engines/hypno/grammar_arc.y"
+#line 425 "engines/hypno/grammar_arc.y"
                       {  // Workaround for NAME == S1
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1961 "engines/hypno/grammar_arc.cpp"
+#line 1967 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 78: /* bline: ITOK TTOK  */
-#line 423 "engines/hypno/grammar_arc.y"
+#line 429 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == T
 		shoot->name = "T";
 		debugC(1, kHypnoDebugParser, "I T");
 	}
-#line 1970 "engines/hypno/grammar_arc.cpp"
+#line 1976 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 79: /* bline: ITOK LTOK  */
-#line 427 "engines/hypno/grammar_arc.y"
+#line 433 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == L
 		shoot->name = "L";
 		debugC(1, kHypnoDebugParser, "I L");
 	}
-#line 1979 "engines/hypno/grammar_arc.cpp"
+#line 1985 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 80: /* bline: ITOK MTOK  */
-#line 431 "engines/hypno/grammar_arc.y"
+#line 437 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == M
 		shoot->name = "M";
 		debugC(1, kHypnoDebugParser, "I M");
 	}
-#line 1988 "engines/hypno/grammar_arc.cpp"
+#line 1994 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 81: /* bline: ITOK UTOK  */
-#line 435 "engines/hypno/grammar_arc.y"
+#line 441 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == U
 		shoot->name = "U";
 		debugC(1, kHypnoDebugParser, "I U");
 	}
-#line 1997 "engines/hypno/grammar_arc.cpp"
+#line 2003 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 82: /* bline: JTOK NUM  */
-#line 439 "engines/hypno/grammar_arc.y"
+#line 445 "engines/hypno/grammar_arc.y"
                     {
 		debugC(1, kHypnoDebugParser, "J %d", (yyvsp[0].i));
 	}
-#line 2005 "engines/hypno/grammar_arc.cpp"
+#line 2011 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 83: /* bline: A0TOK NUM NUM  */
-#line 442 "engines/hypno/grammar_arc.y"
+#line 448 "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 2014 "engines/hypno/grammar_arc.cpp"
+#line 2020 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 84: /* bline: RTOK NUM NUM  */
-#line 446 "engines/hypno/grammar_arc.y"
+#line 452 "engines/hypno/grammar_arc.y"
                         {
 		shoot->objKillsCount = (yyvsp[-1].i);
 		shoot->objMissesCount = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "R %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2024 "engines/hypno/grammar_arc.cpp"
+#line 2030 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 85: /* bline: R0TOK NUM NUM  */
-#line 451 "engines/hypno/grammar_arc.y"
+#line 457 "engines/hypno/grammar_arc.y"
                          {
 		shoot->objKillsCount = (yyvsp[-1].i);
 		shoot->objMissesCount = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "R0 %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2034 "engines/hypno/grammar_arc.cpp"
+#line 2040 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 86: /* bline: R1TOK NUM NUM  */
-#line 456 "engines/hypno/grammar_arc.y"
+#line 462 "engines/hypno/grammar_arc.y"
                          {
 		debugC(1, kHypnoDebugParser, "R1 %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2042 "engines/hypno/grammar_arc.cpp"
+#line 2048 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 87: /* bline: BNTOK NUM NUM  */
-#line 459 "engines/hypno/grammar_arc.y"
+#line 465 "engines/hypno/grammar_arc.y"
                         {
 		FrameInfo fi((yyvsp[0].i), (yyvsp[-1].i));
 		shoot->bodyFrames.push_back(fi);
 		debugC(1, kHypnoDebugParser, "BN %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2052 "engines/hypno/grammar_arc.cpp"
+#line 2058 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 88: /* bline: KNTOK NUM NUM  */
-#line 464 "engines/hypno/grammar_arc.y"
+#line 470 "engines/hypno/grammar_arc.y"
                         {
 		FrameInfo fi((yyvsp[0].i), (yyvsp[-1].i));
 		shoot->explosionFrames.push_back(fi);
 		debugC(1, kHypnoDebugParser, "KN %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2062 "engines/hypno/grammar_arc.cpp"
+#line 2068 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 89: /* bline: P0TOK NUM NUM  */
-#line 469 "engines/hypno/grammar_arc.y"
+#line 475 "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 2071 "engines/hypno/grammar_arc.cpp"
+#line 2077 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 90: /* bline: OTOK NUM NUM  */
-#line 473 "engines/hypno/grammar_arc.y"
+#line 479 "engines/hypno/grammar_arc.y"
                        {
 		if ((yyvsp[-1].i) == 0 && (yyvsp[0].i) == 0)
 			error("Invalid O command (0, 0)");
 		shoot->deathPosition = Common::Point((yyvsp[-1].i), (yyvsp[0].i));
 		debugC(1, kHypnoDebugParser, "O %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2082 "engines/hypno/grammar_arc.cpp"
+#line 2088 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 91: /* bline: CTOK NUM  */
-#line 479 "engines/hypno/grammar_arc.y"
+#line 485 "engines/hypno/grammar_arc.y"
                     {
 		shoot->timesToShoot = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "C %d", (yyvsp[0].i));
 	}
-#line 2091 "engines/hypno/grammar_arc.cpp"
+#line 2097 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 92: /* bline: HTOK NUM  */
-#line 483 "engines/hypno/grammar_arc.y"
+#line 489 "engines/hypno/grammar_arc.y"
                     {
 		shoot->attackFrames.push_back((yyvsp[0].i));
 		debugC(1, kHypnoDebugParser, "H %d", (yyvsp[0].i)); }
-#line 2099 "engines/hypno/grammar_arc.cpp"
+#line 2105 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 93: /* bline: VTOK NUM  */
-#line 486 "engines/hypno/grammar_arc.y"
+#line 492 "engines/hypno/grammar_arc.y"
                     { debugC(1, kHypnoDebugParser, "V %d", (yyvsp[0].i)); }
-#line 2105 "engines/hypno/grammar_arc.cpp"
+#line 2111 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 94: /* bline: VTOK  */
-#line 487 "engines/hypno/grammar_arc.y"
+#line 493 "engines/hypno/grammar_arc.y"
                { debugC(1, kHypnoDebugParser, "V"); }
-#line 2111 "engines/hypno/grammar_arc.cpp"
+#line 2117 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 95: /* bline: WTOK NUM  */
-#line 488 "engines/hypno/grammar_arc.y"
+#line 494 "engines/hypno/grammar_arc.y"
                     {
 		shoot->attackWeight = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "W %d", (yyvsp[0].i)); }
-#line 2119 "engines/hypno/grammar_arc.cpp"
+#line 2125 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 96: /* bline: DTOK NUM  */
-#line 491 "engines/hypno/grammar_arc.y"
+#line 497 "engines/hypno/grammar_arc.y"
                     {
 		shoot->pointsToShoot = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "D %d", (yyvsp[0].i));
 	}
-#line 2128 "engines/hypno/grammar_arc.cpp"
+#line 2134 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 97: /* bline: LTOK NUM NUM  */
-#line 495 "engines/hypno/grammar_arc.y"
+#line 501 "engines/hypno/grammar_arc.y"
                        {
 		debugC(1, kHypnoDebugParser, "L %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2136 "engines/hypno/grammar_arc.cpp"
+#line 2142 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 98: /* bline: LTOK NUM  */
-#line 498 "engines/hypno/grammar_arc.y"
+#line 504 "engines/hypno/grammar_arc.y"
                    {
 		debugC(1, kHypnoDebugParser, "L %d", (yyvsp[0].i));
 		FrameInfo fi((yyvsp[0].i)-1, 0);
 		shoot->bodyFrames.push_back(fi);
 	}
-#line 2146 "engines/hypno/grammar_arc.cpp"
+#line 2152 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 99: /* bline: MTOK NUM  */
-#line 503 "engines/hypno/grammar_arc.y"
+#line 509 "engines/hypno/grammar_arc.y"
                    { debugC(1, kHypnoDebugParser, "M %d", (yyvsp[0].i));
 		shoot->missedAnimation = (yyvsp[0].i);
 	}
-#line 2154 "engines/hypno/grammar_arc.cpp"
+#line 2160 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 100: /* bline: KTOK  */
-#line 506 "engines/hypno/grammar_arc.y"
+#line 512 "engines/hypno/grammar_arc.y"
                { debugC(1, kHypnoDebugParser, "K"); }
-#line 2160 "engines/hypno/grammar_arc.cpp"
+#line 2166 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 101: /* bline: KTOK NUM  */
-#line 507 "engines/hypno/grammar_arc.y"
+#line 513 "engines/hypno/grammar_arc.y"
                    { debugC(1, kHypnoDebugParser, "K %d", (yyvsp[0].i));
 		FrameInfo fi((yyvsp[0].i), 1);
 		shoot->explosionFrames.push_back(fi);
 	}
-#line 2169 "engines/hypno/grammar_arc.cpp"
+#line 2175 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 102: /* bline: KTOK NUM NUM NUM  */
-#line 511 "engines/hypno/grammar_arc.y"
+#line 517 "engines/hypno/grammar_arc.y"
                            {
 		debugC(1, kHypnoDebugParser, "K %d %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2177 "engines/hypno/grammar_arc.cpp"
+#line 2183 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 103: /* bline: KTOK NUM NUM  */
-#line 514 "engines/hypno/grammar_arc.y"
+#line 520 "engines/hypno/grammar_arc.y"
                        { debugC(1, kHypnoDebugParser, "K %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 		FrameInfo fi((yyvsp[-1].i), 1);
 		shoot->explosionFrames.push_back(fi);
 	}
-#line 2186 "engines/hypno/grammar_arc.cpp"
+#line 2192 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 104: /* bline: SNTOK FILENAME enc  */
-#line 518 "engines/hypno/grammar_arc.y"
+#line 524 "engines/hypno/grammar_arc.y"
                              {
 		if (Common::String("S0") == (yyvsp[-2].s))
 			shoot->enemySound = (yyvsp[-1].s);
@@ -2198,85 +2204,85 @@ yyreduce:
 			shoot->animalSound = (yyvsp[-1].s);
 
 		debugC(1, kHypnoDebugParser, "SN %s", (yyvsp[-1].s)); }
-#line 2202 "engines/hypno/grammar_arc.cpp"
+#line 2208 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 105: /* bline: SNTOK  */
-#line 529 "engines/hypno/grammar_arc.y"
+#line 535 "engines/hypno/grammar_arc.y"
                 {
 		debugC(1, kHypnoDebugParser, "SN");
 	}
-#line 2210 "engines/hypno/grammar_arc.cpp"
+#line 2216 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 106: /* bline: GTOK  */
-#line 533 "engines/hypno/grammar_arc.y"
+#line 539 "engines/hypno/grammar_arc.y"
                { debugC(1, kHypnoDebugParser, "G"); }
-#line 2216 "engines/hypno/grammar_arc.cpp"
+#line 2222 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 107: /* bline: TTOK NUM NUM NUM  */
-#line 534 "engines/hypno/grammar_arc.y"
+#line 540 "engines/hypno/grammar_arc.y"
                            {
 		debugC(1, kHypnoDebugParser, "T %d %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2224 "engines/hypno/grammar_arc.cpp"
+#line 2230 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 108: /* bline: TTOK NUM  */
-#line 537 "engines/hypno/grammar_arc.y"
+#line 543 "engines/hypno/grammar_arc.y"
                    {
 		shoot->interactionFrame = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "T %d", (yyvsp[0].i));
 	}
-#line 2233 "engines/hypno/grammar_arc.cpp"
+#line 2239 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 109: /* bline: TTOK  */
-#line 541 "engines/hypno/grammar_arc.y"
+#line 547 "engines/hypno/grammar_arc.y"
                {
 		shoot->isAnimal = true;
 		debugC(1, kHypnoDebugParser, "T");
 	}
-#line 2242 "engines/hypno/grammar_arc.cpp"
+#line 2248 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 110: /* bline: MTOK  */
-#line 545 "engines/hypno/grammar_arc.y"
+#line 551 "engines/hypno/grammar_arc.y"
                {
 		debugC(1, kHypnoDebugParser, "M");
 	}
-#line 2250 "engines/hypno/grammar_arc.cpp"
+#line 2256 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 111: /* bline: NTOK  */
-#line 548 "engines/hypno/grammar_arc.y"
+#line 554 "engines/hypno/grammar_arc.y"
                {
 		shoot->noEnemySound = true;
 		debugC(1, kHypnoDebugParser, "N"); }
-#line 2258 "engines/hypno/grammar_arc.cpp"
+#line 2264 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 112: /* bline: NRTOK  */
-#line 551 "engines/hypno/grammar_arc.y"
+#line 557 "engines/hypno/grammar_arc.y"
                 {
 		debugC(1, kHypnoDebugParser, "NR"); }
-#line 2265 "engines/hypno/grammar_arc.cpp"
+#line 2271 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 113: /* bline: ZTOK  */
-#line 553 "engines/hypno/grammar_arc.y"
+#line 559 "engines/hypno/grammar_arc.y"
                {
 		g_parsedArc->shoots.push_back(*shoot);
 		//delete shoot;
 		//shoot = nullptr;
 		debugC(1, kHypnoDebugParser, "Z");
 	}
-#line 2276 "engines/hypno/grammar_arc.cpp"
+#line 2282 "engines/hypno/grammar_arc.cpp"
     break;
 
 
-#line 2280 "engines/hypno/grammar_arc.cpp"
+#line 2286 "engines/hypno/grammar_arc.cpp"
 
       default: break;
     }
diff --git a/engines/hypno/grammar_arc.y b/engines/hypno/grammar_arc.y
index d088078258f..baf7c5de1b2 100644
--- a/engines/hypno/grammar_arc.y
+++ b/engines/hypno/grammar_arc.y
@@ -73,6 +73,9 @@ void parseSN(const char *sn, const char *path, const char *enc, const char *flag
 	} else if (Common::String("S7") == sn) {
 		g_parsedArc->noAmmoSound = path;
 		g_parsedArc->noAmmoSoundRate = sampleRate;
+	} else if (Common::String("S8") == sn) {
+		g_parsedArc->additionalSound = path;
+		g_parsedArc->additionalSoundRate = sampleRate;
 	}
 	debugC(1, kHypnoDebugParser, "SN %s", path);
 }
@@ -191,7 +194,10 @@ hline: 	CTOK NUM {
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "T %s %d", $2, $3);
 	}
-	| TTOK NONETOK NUM { debugC(1, kHypnoDebugParser, "T NONE %d", $3); }
+	| TTOK NONETOK NUM {
+		ArcadeTransition at("NONE", "", "", $3);
+		g_parsedArc->transitions.push_back(at);
+		debugC(1, kHypnoDebugParser, "T NONE %d", $3); }
 	| NTOK FILENAME  {
 		g_parsedArc->backgroundVideo = $2;
 		debugC(1, kHypnoDebugParser, "N %s", $2);
diff --git a/engines/hypno/tokens_arc.h b/engines/hypno/tokens_arc.h
index c27291342d0..2fefefeebd4 100644
--- a/engines/hypno/tokens_arc.h
+++ b/engines/hypno/tokens_arc.h
@@ -127,7 +127,7 @@ extern int HYPNO_ARC_debug;
 #if ! defined HYPNO_ARC_STYPE && ! defined HYPNO_ARC_STYPE_IS_DECLARED
 union HYPNO_ARC_STYPE
 {
-#line 82 "engines/hypno/grammar_arc.y"
+#line 85 "engines/hypno/grammar_arc.y"
 
 	char *s; /* string value */
 	int i;	 /* integer value */


Commit: 1789c4d2e056bb454755ffa95dd29e030da998e0
    https://github.com/scummvm/scummvm/commit/1789c4d2e056bb454755ffa95dd29e030da998e0
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-05-12T20:43:59+02:00

Commit Message:
HYPNO: make sure sounds are played in the correct rate in boyz

Changed paths:
    engines/hypno/boyz/arcade.cpp
    engines/hypno/grammar.h
    engines/hypno/grammar_arc.cpp
    engines/hypno/grammar_arc.y


diff --git a/engines/hypno/boyz/arcade.cpp b/engines/hypno/boyz/arcade.cpp
index 8d4a47458e2..1d42f721682 100644
--- a/engines/hypno/boyz/arcade.cpp
+++ b/engines/hypno/boyz/arcade.cpp
@@ -194,18 +194,19 @@ bool BoyzEngine::checkTransition(ArcadeTransitions &transitions, ArcadeShooting
 
 			loadPalette(_currentPalette);
 			_background->decoder->pauseVideo(false);
+			if (!_music.empty())
+				playSound(_music, 0, arc->musicRate); // restore music
 			drawPlayer();
 			updateScreen(*_background);
 			drawScreen();
 			drawCursorArcade(g_system->getEventManager()->getMousePos());
 		} else if (!at.sound.empty()) {
-			playSound(at.sound, 1);
+			playSound(at.sound, 1, at.soundRate);
 		} else
 			error ("Invalid transition at %d", ttime);
 
 		transitions.pop_front();
-		if (!_music.empty())
-			playSound(_music, 0, arc->musicRate); // restore music
+
 		return true;
 	}
 	return false;
diff --git a/engines/hypno/grammar.h b/engines/hypno/grammar.h
index 938374bfb69..f2eaf0fa62f 100644
--- a/engines/hypno/grammar.h
+++ b/engines/hypno/grammar.h
@@ -525,16 +525,18 @@ typedef Common::Array<Segment> Segments;
 
 class ArcadeTransition {
 public:
-	ArcadeTransition(Filename video_, Filename palette_, Filename sound_, uint32 time_)  {
+	ArcadeTransition(Filename video_, Filename palette_, Filename sound_, uint32 soundRate_, uint32 time_)  {
 		video = video_;
 		palette = palette_;
 		sound = sound_;
+		soundRate = soundRate_;
 		time = time_;
 	}
 
 	Filename video;
 	Filename palette;
 	Filename sound;
+	uint32 soundRate;
 	uint32 time;
 };
 
diff --git a/engines/hypno/grammar_arc.cpp b/engines/hypno/grammar_arc.cpp
index 42949f3164c..49e986508e2 100644
--- a/engines/hypno/grammar_arc.cpp
+++ b/engines/hypno/grammar_arc.cpp
@@ -623,16 +623,16 @@ static const yytype_int16 yyrline[] =
 {
        0,   110,   110,   110,   111,   114,   115,   116,   119,   123,
      127,   131,   132,   133,   137,   142,   146,   150,   155,   165,
-     174,   179,   182,   187,   192,   197,   201,   205,   209,   212,
-     216,   219,   220,   248,   251,   254,   260,   265,   270,   276,
-     281,   286,   291,   296,   301,   308,   309,   312,   313,   316,
-     317,   318,   321,   329,   334,   337,   342,   344,   347,   352,
-     357,   361,   365,   369,   373,   377,   381,   385,   389,   393,
-     397,   401,   405,   409,   413,   417,   421,   425,   429,   433,
-     437,   441,   445,   448,   452,   457,   462,   465,   470,   475,
-     479,   485,   489,   492,   493,   494,   497,   501,   504,   509,
-     512,   513,   517,   520,   524,   535,   539,   540,   543,   547,
-     551,   554,   557,   559
+     174,   179,   182,   187,   196,   201,   205,   209,   213,   216,
+     220,   223,   224,   252,   255,   258,   264,   269,   274,   280,
+     285,   290,   295,   300,   305,   312,   313,   316,   317,   320,
+     321,   322,   325,   333,   338,   341,   346,   348,   351,   356,
+     361,   365,   369,   373,   377,   381,   385,   389,   393,   397,
+     401,   405,   409,   413,   417,   421,   425,   429,   433,   437,
+     441,   445,   449,   452,   456,   461,   466,   469,   474,   479,
+     483,   489,   493,   496,   497,   498,   501,   505,   508,   513,
+     516,   517,   521,   524,   528,   539,   543,   544,   547,   551,
+     555,   558,   561,   563
 };
 #endif
 
@@ -1450,7 +1450,7 @@ yyreduce:
   case 20: /* hline: TPTOK NONETOK NUM FILENAME  */
 #line 174 "engines/hypno/grammar_arc.y"
                                      {
-		ArcadeTransition at("NONE", (yyvsp[0].s), "", (yyvsp[-1].i));
+		ArcadeTransition at("NONE", (yyvsp[0].s), "", 0, (yyvsp[-1].i));
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "Tp %s %d %s", "NONE", (yyvsp[-1].i), (yyvsp[0].s));
 	}
@@ -1468,7 +1468,7 @@ yyreduce:
   case 22: /* hline: TPTOK FILENAME NUM FILENAME  */
 #line 182 "engines/hypno/grammar_arc.y"
                                       {
-		ArcadeTransition at((yyvsp[-2].s), (yyvsp[0].s), "", (yyvsp[-1].i));
+		ArcadeTransition at((yyvsp[-2].s), (yyvsp[0].s), "", 0, (yyvsp[-1].i));
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "Tp %s %d %s", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].s));
 	}
@@ -1478,83 +1478,87 @@ yyreduce:
   case 23: /* hline: TATOK NUM FILENAME flag enc  */
 #line 187 "engines/hypno/grammar_arc.y"
                                       {
-		ArcadeTransition at("", "", (yyvsp[-2].s), (yyvsp[-3].i));
+		uint32 sampleRate = 11025;
+		if (Common::String("22K") == (yyvsp[0].s) || Common::String("22k") == (yyvsp[0].s))
+			sampleRate = 22050;
+
+		ArcadeTransition at("", "", (yyvsp[-2].s), sampleRate, (yyvsp[-3].i));
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "Ta %d %s", (yyvsp[-3].i), (yyvsp[-2].s));
 	}
-#line 1486 "engines/hypno/grammar_arc.cpp"
+#line 1490 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 24: /* hline: TTOK FILENAME NUM  */
-#line 192 "engines/hypno/grammar_arc.y"
+#line 196 "engines/hypno/grammar_arc.y"
                             {
-		ArcadeTransition at((yyvsp[-1].s), "", "", (yyvsp[0].i));
+		ArcadeTransition at((yyvsp[-1].s), "", "", 0, (yyvsp[0].i));
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "T %s %d", (yyvsp[-1].s), (yyvsp[0].i));
 	}
-#line 1496 "engines/hypno/grammar_arc.cpp"
+#line 1500 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 25: /* hline: TTOK NONETOK NUM  */
-#line 197 "engines/hypno/grammar_arc.y"
+#line 201 "engines/hypno/grammar_arc.y"
                            {
-		ArcadeTransition at("NONE", "", "", (yyvsp[0].i));
+		ArcadeTransition at("NONE", "", "", 0, (yyvsp[0].i));
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "T NONE %d", (yyvsp[0].i)); }
-#line 1505 "engines/hypno/grammar_arc.cpp"
+#line 1509 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 26: /* hline: NTOK FILENAME  */
-#line 201 "engines/hypno/grammar_arc.y"
+#line 205 "engines/hypno/grammar_arc.y"
                          {
 		g_parsedArc->backgroundVideo = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "N %s", (yyvsp[0].s));
 	}
-#line 1514 "engines/hypno/grammar_arc.cpp"
+#line 1518 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 27: /* hline: NSTOK FILENAME  */
-#line 205 "engines/hypno/grammar_arc.y"
+#line 209 "engines/hypno/grammar_arc.y"
                           {
 		g_parsedArc->backgroundVideo = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "N* %s", (yyvsp[0].s));
 	}
-#line 1523 "engines/hypno/grammar_arc.cpp"
+#line 1527 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 28: /* hline: RTOK FILENAME  */
-#line 209 "engines/hypno/grammar_arc.y"
+#line 213 "engines/hypno/grammar_arc.y"
                          {
 		g_parsedArc->backgroundPalette = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "R %s", (yyvsp[0].s)); }
-#line 1531 "engines/hypno/grammar_arc.cpp"
+#line 1535 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 29: /* hline: ITOK FILENAME  */
-#line 212 "engines/hypno/grammar_arc.y"
+#line 216 "engines/hypno/grammar_arc.y"
                         {
 		g_parsedArc->player = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1540 "engines/hypno/grammar_arc.cpp"
+#line 1544 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 30: /* hline: I1TOK FILENAME  */
-#line 216 "engines/hypno/grammar_arc.y"
+#line 220 "engines/hypno/grammar_arc.y"
                          {
 		debugC(1, kHypnoDebugParser, "I1 %s", (yyvsp[0].s));
 	}
-#line 1548 "engines/hypno/grammar_arc.cpp"
+#line 1552 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 31: /* hline: QTOK NUM NUM  */
-#line 219 "engines/hypno/grammar_arc.y"
+#line 223 "engines/hypno/grammar_arc.y"
                        { debugC(1, kHypnoDebugParser, "Q %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1554 "engines/hypno/grammar_arc.cpp"
+#line 1558 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 32: /* hline: BNTOK FILENAME  */
-#line 220 "engines/hypno/grammar_arc.y"
+#line 224 "engines/hypno/grammar_arc.y"
                          {
 		if (Common::String("B0") == (yyvsp[-1].s))
 			g_parsedArc->beforeVideo = (yyvsp[0].s);
@@ -1583,153 +1587,153 @@ yyreduce:
 
 		debugC(1, kHypnoDebugParser, "BN %s", (yyvsp[0].s));
 	}
-#line 1587 "engines/hypno/grammar_arc.cpp"
+#line 1591 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 33: /* hline: SNTOK FILENAME enc flag  */
-#line 248 "engines/hypno/grammar_arc.y"
+#line 252 "engines/hypno/grammar_arc.y"
                                   {
 		parseSN((yyvsp[-3].s), (yyvsp[-2].s), (yyvsp[-1].s), (yyvsp[0].s));
 	}
-#line 1595 "engines/hypno/grammar_arc.cpp"
+#line 1599 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 34: /* hline: SNTOK FILENAME flag enc  */
-#line 251 "engines/hypno/grammar_arc.y"
+#line 255 "engines/hypno/grammar_arc.y"
                                   {
 		parseSN((yyvsp[-3].s), (yyvsp[-2].s), (yyvsp[0].s), (yyvsp[-1].s));
 	}
-#line 1603 "engines/hypno/grammar_arc.cpp"
+#line 1607 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 35: /* hline: HETOK BYTE NUM NUM  */
-#line 254 "engines/hypno/grammar_arc.y"
+#line 258 "engines/hypno/grammar_arc.y"
                              {
 		Segment segment((yyvsp[-2].i), (yyvsp[0].i), (yyvsp[-1].i));
 		segment.end = true;
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "HE %x %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1614 "engines/hypno/grammar_arc.cpp"
+#line 1618 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 36: /* hline: HLTOK BYTE NUM NUM  */
-#line 260 "engines/hypno/grammar_arc.y"
+#line 264 "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 1624 "engines/hypno/grammar_arc.cpp"
+#line 1628 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 37: /* hline: HUTOK BYTE NUM NUM  */
-#line 265 "engines/hypno/grammar_arc.y"
+#line 269 "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 1634 "engines/hypno/grammar_arc.cpp"
+#line 1638 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 38: /* hline: HTOK NAME NUM NUM  */
-#line 270 "engines/hypno/grammar_arc.y"
+#line 274 "engines/hypno/grammar_arc.y"
                             {
 		assert(Common::String((yyvsp[-2].s)).size() == 1);
 		Segment segment((yyvsp[-2].s)[0], (yyvsp[0].i), (yyvsp[-1].i));
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "H %s %d %d", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1645 "engines/hypno/grammar_arc.cpp"
+#line 1649 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 39: /* hline: HTOK RTOK NUM NUM  */
-#line 276 "engines/hypno/grammar_arc.y"
+#line 280 "engines/hypno/grammar_arc.y"
                             { // Workaround for BYTE == R
 		Segment segment('R', (yyvsp[0].i), (yyvsp[-1].i));
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "H R %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1655 "engines/hypno/grammar_arc.cpp"
+#line 1659 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 40: /* hline: HTOK ATOK NUM NUM  */
-#line 281 "engines/hypno/grammar_arc.y"
+#line 285 "engines/hypno/grammar_arc.y"
                             { // Workaround for BYTE == A
 		Segment segment('A', (yyvsp[0].i), (yyvsp[-1].i));
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "H A %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1665 "engines/hypno/grammar_arc.cpp"
+#line 1669 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 41: /* hline: HTOK PTOK NUM NUM  */
-#line 286 "engines/hypno/grammar_arc.y"
+#line 290 "engines/hypno/grammar_arc.y"
                             { // Workaround for BYTE == P
 		Segment segment('P', (yyvsp[0].i), (yyvsp[-1].i));
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "H P %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1675 "engines/hypno/grammar_arc.cpp"
+#line 1679 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 42: /* hline: HTOK LTOK NUM NUM  */
-#line 291 "engines/hypno/grammar_arc.y"
+#line 295 "engines/hypno/grammar_arc.y"
                             { // Workaround for BYTE == P
 		Segment segment('L', (yyvsp[0].i), (yyvsp[-1].i));
 		g_parsedArc->segments.push_back(segment);
 		debugC(1, kHypnoDebugParser, "H P %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1685 "engines/hypno/grammar_arc.cpp"
+#line 1689 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 43: /* hline: H12TOK BYTE NUM NUM  */
-#line 296 "engines/hypno/grammar_arc.y"
+#line 300 "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, "HN %x %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1695 "engines/hypno/grammar_arc.cpp"
+#line 1699 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 44: /* hline: HTOK BYTE NUM NUM  */
-#line 301 "engines/hypno/grammar_arc.y"
+#line 305 "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, "H %x %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1705 "engines/hypno/grammar_arc.cpp"
+#line 1709 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 45: /* enc: ENCTOK  */
-#line 308 "engines/hypno/grammar_arc.y"
+#line 312 "engines/hypno/grammar_arc.y"
                      { (yyval.s) = (yyvsp[0].s); }
-#line 1711 "engines/hypno/grammar_arc.cpp"
+#line 1715 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 46: /* enc: %empty  */
-#line 309 "engines/hypno/grammar_arc.y"
+#line 313 "engines/hypno/grammar_arc.y"
                          { (yyval.s) = scumm_strdup(""); }
-#line 1717 "engines/hypno/grammar_arc.cpp"
+#line 1721 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 47: /* flag: NAME  */
-#line 312 "engines/hypno/grammar_arc.y"
+#line 316 "engines/hypno/grammar_arc.y"
                      { (yyval.s) = (yyvsp[0].s); }
-#line 1723 "engines/hypno/grammar_arc.cpp"
+#line 1727 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 48: /* flag: %empty  */
-#line 313 "engines/hypno/grammar_arc.y"
+#line 317 "engines/hypno/grammar_arc.y"
                          { (yyval.s) = scumm_strdup(""); }
-#line 1729 "engines/hypno/grammar_arc.cpp"
+#line 1733 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 52: /* bline: FNTOK FILENAME  */
-#line 321 "engines/hypno/grammar_arc.y"
+#line 325 "engines/hypno/grammar_arc.y"
                       {
 		shoot = new Shoot();
 		if (Common::String("F0") == (yyvsp[-1].s))
@@ -1738,461 +1742,461 @@ yyreduce:
 			shoot->explosionAnimation = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "FN %s", (yyvsp[0].s));
 	}
-#line 1742 "engines/hypno/grammar_arc.cpp"
+#line 1746 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 53: /* bline: AVTOK NUM  */
-#line 329 "engines/hypno/grammar_arc.y"
+#line 333 "engines/hypno/grammar_arc.y"
                     {
 		assert((yyvsp[0].i) == 0);
 		shoot->nonHostile = true;
 		debugC(1, kHypnoDebugParser, "AV %d", (yyvsp[0].i));
 	}
-#line 1752 "engines/hypno/grammar_arc.cpp"
+#line 1756 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 54: /* bline: ALTOK NUM  */
-#line 334 "engines/hypno/grammar_arc.y"
+#line 338 "engines/hypno/grammar_arc.y"
                     {
 		debugC(1, kHypnoDebugParser, "AL %d", (yyvsp[0].i));
 	}
-#line 1760 "engines/hypno/grammar_arc.cpp"
+#line 1764 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 55: /* bline: ABTOK NUM  */
-#line 337 "engines/hypno/grammar_arc.y"
+#line 341 "engines/hypno/grammar_arc.y"
                     {
 		assert((yyvsp[0].i) == 1);
 		shoot->playInteractionAudio = true;
 		debugC(1, kHypnoDebugParser, "AB %d", (yyvsp[0].i));
 	}
-#line 1770 "engines/hypno/grammar_arc.cpp"
+#line 1774 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 56: /* bline: DTOK LTOK  */
-#line 342 "engines/hypno/grammar_arc.y"
+#line 346 "engines/hypno/grammar_arc.y"
                      { debugC(1, kHypnoDebugParser, "D L");
 	}
-#line 1777 "engines/hypno/grammar_arc.cpp"
+#line 1781 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 57: /* bline: J0TOK NUM  */
-#line 344 "engines/hypno/grammar_arc.y"
+#line 348 "engines/hypno/grammar_arc.y"
                     {
 		debugC(1, kHypnoDebugParser, "J0 %d", (yyvsp[0].i));
 	}
-#line 1785 "engines/hypno/grammar_arc.cpp"
+#line 1789 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 58: /* bline: FNTOK NONETOK  */
-#line 347 "engines/hypno/grammar_arc.y"
+#line 351 "engines/hypno/grammar_arc.y"
                         {
 		shoot = new Shoot();
 		shoot->animation = "NONE";
 		debugC(1, kHypnoDebugParser, "FN NONE");
 	}
-#line 1795 "engines/hypno/grammar_arc.cpp"
+#line 1799 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 59: /* bline: FTOK FILENAME  */
-#line 352 "engines/hypno/grammar_arc.y"
+#line 356 "engines/hypno/grammar_arc.y"
                         {
 		shoot = new Shoot();
 		shoot->animation = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "FN %s", (yyvsp[0].s));
 	}
-#line 1805 "engines/hypno/grammar_arc.cpp"
+#line 1809 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 60: /* bline: ITOK NAME  */
-#line 357 "engines/hypno/grammar_arc.y"
+#line 361 "engines/hypno/grammar_arc.y"
                      {
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1814 "engines/hypno/grammar_arc.cpp"
+#line 1818 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 61: /* bline: ITOK BNTOK  */
-#line 361 "engines/hypno/grammar_arc.y"
+#line 365 "engines/hypno/grammar_arc.y"
                       {  // Workaround for NAME == B1
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1823 "engines/hypno/grammar_arc.cpp"
+#line 1827 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 62: /* bline: ITOK ATOK  */
-#line 365 "engines/hypno/grammar_arc.y"
+#line 369 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == A
 		shoot->name = "A";
 		debugC(1, kHypnoDebugParser, "I A");
 	}
-#line 1832 "engines/hypno/grammar_arc.cpp"
+#line 1836 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 63: /* bline: ITOK CTOK  */
-#line 369 "engines/hypno/grammar_arc.y"
+#line 373 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == C
 		shoot->name = "C";
 		debugC(1, kHypnoDebugParser, "I C");
 	}
-#line 1841 "engines/hypno/grammar_arc.cpp"
+#line 1845 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 64: /* bline: ITOK DTOK  */
-#line 373 "engines/hypno/grammar_arc.y"
+#line 377 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == D
 		shoot->name = "D";
 		debugC(1, kHypnoDebugParser, "I D");
 	}
-#line 1850 "engines/hypno/grammar_arc.cpp"
+#line 1854 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 65: /* bline: ITOK FTOK  */
-#line 377 "engines/hypno/grammar_arc.y"
+#line 381 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == F
 		shoot->name = "F";
 		debugC(1, kHypnoDebugParser, "I F");
 	}
-#line 1859 "engines/hypno/grammar_arc.cpp"
+#line 1863 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 66: /* bline: ITOK GTOK  */
-#line 381 "engines/hypno/grammar_arc.y"
+#line 385 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == G
 		shoot->name = "G";
 		debugC(1, kHypnoDebugParser, "I G");
 	}
-#line 1868 "engines/hypno/grammar_arc.cpp"
+#line 1872 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 67: /* bline: ITOK HTOK  */
-#line 385 "engines/hypno/grammar_arc.y"
+#line 389 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == H
 		shoot->name = "H";
 		debugC(1, kHypnoDebugParser, "I H");
 	}
-#line 1877 "engines/hypno/grammar_arc.cpp"
+#line 1881 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 68: /* bline: ITOK H12TOK  */
-#line 389 "engines/hypno/grammar_arc.y"
+#line 393 "engines/hypno/grammar_arc.y"
                        { // Workaround for NAME == H1/H2
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1886 "engines/hypno/grammar_arc.cpp"
+#line 1890 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 69: /* bline: ITOK ITOK  */
-#line 393 "engines/hypno/grammar_arc.y"
+#line 397 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == I
 		shoot->name = "I";
 		debugC(1, kHypnoDebugParser, "I I");
 	}
-#line 1895 "engines/hypno/grammar_arc.cpp"
+#line 1899 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 70: /* bline: ITOK JTOK  */
-#line 397 "engines/hypno/grammar_arc.y"
+#line 401 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == J
 		shoot->name = "J";
 		debugC(1, kHypnoDebugParser, "I J");
 	}
-#line 1904 "engines/hypno/grammar_arc.cpp"
+#line 1908 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 71: /* bline: ITOK KTOK  */
-#line 401 "engines/hypno/grammar_arc.y"
+#line 405 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == K
 		shoot->name = "K";
 		debugC(1, kHypnoDebugParser, "I K");
 	}
-#line 1913 "engines/hypno/grammar_arc.cpp"
+#line 1917 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 72: /* bline: ITOK NTOK  */
-#line 405 "engines/hypno/grammar_arc.y"
+#line 409 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == N
 		shoot->name = "N";
 		debugC(1, kHypnoDebugParser, "I N");
 	}
-#line 1922 "engines/hypno/grammar_arc.cpp"
+#line 1926 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 73: /* bline: ITOK OTOK  */
-#line 409 "engines/hypno/grammar_arc.y"
+#line 413 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == O
 		shoot->name = "O";
 		debugC(1, kHypnoDebugParser, "I O");
 	}
-#line 1931 "engines/hypno/grammar_arc.cpp"
+#line 1935 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 74: /* bline: ITOK PTOK  */
-#line 413 "engines/hypno/grammar_arc.y"
+#line 417 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == P
 		shoot->name = "P";
 		debugC(1, kHypnoDebugParser, "I P");
 	}
-#line 1940 "engines/hypno/grammar_arc.cpp"
+#line 1944 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 75: /* bline: ITOK QTOK  */
-#line 417 "engines/hypno/grammar_arc.y"
+#line 421 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == Q
 		shoot->name = "Q";
 		debugC(1, kHypnoDebugParser, "I Q");
 	}
-#line 1949 "engines/hypno/grammar_arc.cpp"
+#line 1953 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 76: /* bline: ITOK RTOK  */
-#line 421 "engines/hypno/grammar_arc.y"
+#line 425 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == R
 		shoot->name = "R";
 		debugC(1, kHypnoDebugParser, "I R");
 	}
-#line 1958 "engines/hypno/grammar_arc.cpp"
+#line 1962 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 77: /* bline: ITOK SNTOK  */
-#line 425 "engines/hypno/grammar_arc.y"
+#line 429 "engines/hypno/grammar_arc.y"
                       {  // Workaround for NAME == S1
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1967 "engines/hypno/grammar_arc.cpp"
+#line 1971 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 78: /* bline: ITOK TTOK  */
-#line 429 "engines/hypno/grammar_arc.y"
+#line 433 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == T
 		shoot->name = "T";
 		debugC(1, kHypnoDebugParser, "I T");
 	}
-#line 1976 "engines/hypno/grammar_arc.cpp"
+#line 1980 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 79: /* bline: ITOK LTOK  */
-#line 433 "engines/hypno/grammar_arc.y"
+#line 437 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == L
 		shoot->name = "L";
 		debugC(1, kHypnoDebugParser, "I L");
 	}
-#line 1985 "engines/hypno/grammar_arc.cpp"
+#line 1989 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 80: /* bline: ITOK MTOK  */
-#line 437 "engines/hypno/grammar_arc.y"
+#line 441 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == M
 		shoot->name = "M";
 		debugC(1, kHypnoDebugParser, "I M");
 	}
-#line 1994 "engines/hypno/grammar_arc.cpp"
+#line 1998 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 81: /* bline: ITOK UTOK  */
-#line 441 "engines/hypno/grammar_arc.y"
+#line 445 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == U
 		shoot->name = "U";
 		debugC(1, kHypnoDebugParser, "I U");
 	}
-#line 2003 "engines/hypno/grammar_arc.cpp"
+#line 2007 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 82: /* bline: JTOK NUM  */
-#line 445 "engines/hypno/grammar_arc.y"
+#line 449 "engines/hypno/grammar_arc.y"
                     {
 		debugC(1, kHypnoDebugParser, "J %d", (yyvsp[0].i));
 	}
-#line 2011 "engines/hypno/grammar_arc.cpp"
+#line 2015 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 83: /* bline: A0TOK NUM NUM  */
-#line 448 "engines/hypno/grammar_arc.y"
+#line 452 "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 2020 "engines/hypno/grammar_arc.cpp"
+#line 2024 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 84: /* bline: RTOK NUM NUM  */
-#line 452 "engines/hypno/grammar_arc.y"
+#line 456 "engines/hypno/grammar_arc.y"
                         {
 		shoot->objKillsCount = (yyvsp[-1].i);
 		shoot->objMissesCount = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "R %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2030 "engines/hypno/grammar_arc.cpp"
+#line 2034 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 85: /* bline: R0TOK NUM NUM  */
-#line 457 "engines/hypno/grammar_arc.y"
+#line 461 "engines/hypno/grammar_arc.y"
                          {
 		shoot->objKillsCount = (yyvsp[-1].i);
 		shoot->objMissesCount = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "R0 %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2040 "engines/hypno/grammar_arc.cpp"
+#line 2044 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 86: /* bline: R1TOK NUM NUM  */
-#line 462 "engines/hypno/grammar_arc.y"
+#line 466 "engines/hypno/grammar_arc.y"
                          {
 		debugC(1, kHypnoDebugParser, "R1 %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2048 "engines/hypno/grammar_arc.cpp"
+#line 2052 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 87: /* bline: BNTOK NUM NUM  */
-#line 465 "engines/hypno/grammar_arc.y"
+#line 469 "engines/hypno/grammar_arc.y"
                         {
 		FrameInfo fi((yyvsp[0].i), (yyvsp[-1].i));
 		shoot->bodyFrames.push_back(fi);
 		debugC(1, kHypnoDebugParser, "BN %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2058 "engines/hypno/grammar_arc.cpp"
+#line 2062 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 88: /* bline: KNTOK NUM NUM  */
-#line 470 "engines/hypno/grammar_arc.y"
+#line 474 "engines/hypno/grammar_arc.y"
                         {
 		FrameInfo fi((yyvsp[0].i), (yyvsp[-1].i));
 		shoot->explosionFrames.push_back(fi);
 		debugC(1, kHypnoDebugParser, "KN %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2068 "engines/hypno/grammar_arc.cpp"
+#line 2072 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 89: /* bline: P0TOK NUM NUM  */
-#line 475 "engines/hypno/grammar_arc.y"
+#line 479 "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 2077 "engines/hypno/grammar_arc.cpp"
+#line 2081 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 90: /* bline: OTOK NUM NUM  */
-#line 479 "engines/hypno/grammar_arc.y"
+#line 483 "engines/hypno/grammar_arc.y"
                        {
 		if ((yyvsp[-1].i) == 0 && (yyvsp[0].i) == 0)
 			error("Invalid O command (0, 0)");
 		shoot->deathPosition = Common::Point((yyvsp[-1].i), (yyvsp[0].i));
 		debugC(1, kHypnoDebugParser, "O %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2088 "engines/hypno/grammar_arc.cpp"
+#line 2092 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 91: /* bline: CTOK NUM  */
-#line 485 "engines/hypno/grammar_arc.y"
+#line 489 "engines/hypno/grammar_arc.y"
                     {
 		shoot->timesToShoot = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "C %d", (yyvsp[0].i));
 	}
-#line 2097 "engines/hypno/grammar_arc.cpp"
+#line 2101 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 92: /* bline: HTOK NUM  */
-#line 489 "engines/hypno/grammar_arc.y"
+#line 493 "engines/hypno/grammar_arc.y"
                     {
 		shoot->attackFrames.push_back((yyvsp[0].i));
 		debugC(1, kHypnoDebugParser, "H %d", (yyvsp[0].i)); }
-#line 2105 "engines/hypno/grammar_arc.cpp"
+#line 2109 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 93: /* bline: VTOK NUM  */
-#line 492 "engines/hypno/grammar_arc.y"
+#line 496 "engines/hypno/grammar_arc.y"
                     { debugC(1, kHypnoDebugParser, "V %d", (yyvsp[0].i)); }
-#line 2111 "engines/hypno/grammar_arc.cpp"
+#line 2115 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 94: /* bline: VTOK  */
-#line 493 "engines/hypno/grammar_arc.y"
+#line 497 "engines/hypno/grammar_arc.y"
                { debugC(1, kHypnoDebugParser, "V"); }
-#line 2117 "engines/hypno/grammar_arc.cpp"
+#line 2121 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 95: /* bline: WTOK NUM  */
-#line 494 "engines/hypno/grammar_arc.y"
+#line 498 "engines/hypno/grammar_arc.y"
                     {
 		shoot->attackWeight = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "W %d", (yyvsp[0].i)); }
-#line 2125 "engines/hypno/grammar_arc.cpp"
+#line 2129 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 96: /* bline: DTOK NUM  */
-#line 497 "engines/hypno/grammar_arc.y"
+#line 501 "engines/hypno/grammar_arc.y"
                     {
 		shoot->pointsToShoot = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "D %d", (yyvsp[0].i));
 	}
-#line 2134 "engines/hypno/grammar_arc.cpp"
+#line 2138 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 97: /* bline: LTOK NUM NUM  */
-#line 501 "engines/hypno/grammar_arc.y"
+#line 505 "engines/hypno/grammar_arc.y"
                        {
 		debugC(1, kHypnoDebugParser, "L %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2142 "engines/hypno/grammar_arc.cpp"
+#line 2146 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 98: /* bline: LTOK NUM  */
-#line 504 "engines/hypno/grammar_arc.y"
+#line 508 "engines/hypno/grammar_arc.y"
                    {
 		debugC(1, kHypnoDebugParser, "L %d", (yyvsp[0].i));
 		FrameInfo fi((yyvsp[0].i)-1, 0);
 		shoot->bodyFrames.push_back(fi);
 	}
-#line 2152 "engines/hypno/grammar_arc.cpp"
+#line 2156 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 99: /* bline: MTOK NUM  */
-#line 509 "engines/hypno/grammar_arc.y"
+#line 513 "engines/hypno/grammar_arc.y"
                    { debugC(1, kHypnoDebugParser, "M %d", (yyvsp[0].i));
 		shoot->missedAnimation = (yyvsp[0].i);
 	}
-#line 2160 "engines/hypno/grammar_arc.cpp"
+#line 2164 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 100: /* bline: KTOK  */
-#line 512 "engines/hypno/grammar_arc.y"
+#line 516 "engines/hypno/grammar_arc.y"
                { debugC(1, kHypnoDebugParser, "K"); }
-#line 2166 "engines/hypno/grammar_arc.cpp"
+#line 2170 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 101: /* bline: KTOK NUM  */
-#line 513 "engines/hypno/grammar_arc.y"
+#line 517 "engines/hypno/grammar_arc.y"
                    { debugC(1, kHypnoDebugParser, "K %d", (yyvsp[0].i));
 		FrameInfo fi((yyvsp[0].i), 1);
 		shoot->explosionFrames.push_back(fi);
 	}
-#line 2175 "engines/hypno/grammar_arc.cpp"
+#line 2179 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 102: /* bline: KTOK NUM NUM NUM  */
-#line 517 "engines/hypno/grammar_arc.y"
+#line 521 "engines/hypno/grammar_arc.y"
                            {
 		debugC(1, kHypnoDebugParser, "K %d %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2183 "engines/hypno/grammar_arc.cpp"
+#line 2187 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 103: /* bline: KTOK NUM NUM  */
-#line 520 "engines/hypno/grammar_arc.y"
+#line 524 "engines/hypno/grammar_arc.y"
                        { debugC(1, kHypnoDebugParser, "K %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 		FrameInfo fi((yyvsp[-1].i), 1);
 		shoot->explosionFrames.push_back(fi);
 	}
-#line 2192 "engines/hypno/grammar_arc.cpp"
+#line 2196 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 104: /* bline: SNTOK FILENAME enc  */
-#line 524 "engines/hypno/grammar_arc.y"
+#line 528 "engines/hypno/grammar_arc.y"
                              {
 		if (Common::String("S0") == (yyvsp[-2].s))
 			shoot->enemySound = (yyvsp[-1].s);
@@ -2204,85 +2208,85 @@ yyreduce:
 			shoot->animalSound = (yyvsp[-1].s);
 
 		debugC(1, kHypnoDebugParser, "SN %s", (yyvsp[-1].s)); }
-#line 2208 "engines/hypno/grammar_arc.cpp"
+#line 2212 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 105: /* bline: SNTOK  */
-#line 535 "engines/hypno/grammar_arc.y"
+#line 539 "engines/hypno/grammar_arc.y"
                 {
 		debugC(1, kHypnoDebugParser, "SN");
 	}
-#line 2216 "engines/hypno/grammar_arc.cpp"
+#line 2220 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 106: /* bline: GTOK  */
-#line 539 "engines/hypno/grammar_arc.y"
+#line 543 "engines/hypno/grammar_arc.y"
                { debugC(1, kHypnoDebugParser, "G"); }
-#line 2222 "engines/hypno/grammar_arc.cpp"
+#line 2226 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 107: /* bline: TTOK NUM NUM NUM  */
-#line 540 "engines/hypno/grammar_arc.y"
+#line 544 "engines/hypno/grammar_arc.y"
                            {
 		debugC(1, kHypnoDebugParser, "T %d %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2230 "engines/hypno/grammar_arc.cpp"
+#line 2234 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 108: /* bline: TTOK NUM  */
-#line 543 "engines/hypno/grammar_arc.y"
+#line 547 "engines/hypno/grammar_arc.y"
                    {
 		shoot->interactionFrame = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "T %d", (yyvsp[0].i));
 	}
-#line 2239 "engines/hypno/grammar_arc.cpp"
+#line 2243 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 109: /* bline: TTOK  */
-#line 547 "engines/hypno/grammar_arc.y"
+#line 551 "engines/hypno/grammar_arc.y"
                {
 		shoot->isAnimal = true;
 		debugC(1, kHypnoDebugParser, "T");
 	}
-#line 2248 "engines/hypno/grammar_arc.cpp"
+#line 2252 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 110: /* bline: MTOK  */
-#line 551 "engines/hypno/grammar_arc.y"
+#line 555 "engines/hypno/grammar_arc.y"
                {
 		debugC(1, kHypnoDebugParser, "M");
 	}
-#line 2256 "engines/hypno/grammar_arc.cpp"
+#line 2260 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 111: /* bline: NTOK  */
-#line 554 "engines/hypno/grammar_arc.y"
+#line 558 "engines/hypno/grammar_arc.y"
                {
 		shoot->noEnemySound = true;
 		debugC(1, kHypnoDebugParser, "N"); }
-#line 2264 "engines/hypno/grammar_arc.cpp"
+#line 2268 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 112: /* bline: NRTOK  */
-#line 557 "engines/hypno/grammar_arc.y"
+#line 561 "engines/hypno/grammar_arc.y"
                 {
 		debugC(1, kHypnoDebugParser, "NR"); }
-#line 2271 "engines/hypno/grammar_arc.cpp"
+#line 2275 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 113: /* bline: ZTOK  */
-#line 559 "engines/hypno/grammar_arc.y"
+#line 563 "engines/hypno/grammar_arc.y"
                {
 		g_parsedArc->shoots.push_back(*shoot);
 		//delete shoot;
 		//shoot = nullptr;
 		debugC(1, kHypnoDebugParser, "Z");
 	}
-#line 2282 "engines/hypno/grammar_arc.cpp"
+#line 2286 "engines/hypno/grammar_arc.cpp"
     break;
 
 
-#line 2286 "engines/hypno/grammar_arc.cpp"
+#line 2290 "engines/hypno/grammar_arc.cpp"
 
       default: break;
     }
diff --git a/engines/hypno/grammar_arc.y b/engines/hypno/grammar_arc.y
index baf7c5de1b2..001eb0d2638 100644
--- a/engines/hypno/grammar_arc.y
+++ b/engines/hypno/grammar_arc.y
@@ -172,7 +172,7 @@ hline: 	CTOK NUM {
 		debugC(1, kHypnoDebugParser, "ON %d", $2);
 	}
 	| TPTOK NONETOK NUM FILENAME {
-		ArcadeTransition at("NONE", $4, "", $3);
+		ArcadeTransition at("NONE", $4, "", 0, $3);
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "Tp %s %d %s", "NONE", $3, $4);
 	}
@@ -180,22 +180,26 @@ hline: 	CTOK NUM {
 		debugC(1, kHypnoDebugParser, "Ts %s %d %d", $2, $3, $4);
 	}
 	| TPTOK FILENAME NUM FILENAME {
-		ArcadeTransition at($2, $4, "", $3);
+		ArcadeTransition at($2, $4, "", 0, $3);
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "Tp %s %d %s", $2, $3, $4);
 	}
 	| TATOK NUM FILENAME flag enc {
-		ArcadeTransition at("", "", $3, $2);
+		uint32 sampleRate = 11025;
+		if (Common::String("22K") == $5 || Common::String("22k") == $5)
+			sampleRate = 22050;
+
+		ArcadeTransition at("", "", $3, sampleRate, $2);
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "Ta %d %s", $2, $3);
 	}
 	| TTOK FILENAME NUM {
-		ArcadeTransition at($2, "", "", $3);
+		ArcadeTransition at($2, "", "", 0, $3);
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "T %s %d", $2, $3);
 	}
 	| TTOK NONETOK NUM {
-		ArcadeTransition at("NONE", "", "", $3);
+		ArcadeTransition at("NONE", "", "", 0, $3);
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "T NONE %d", $3); }
 	| NTOK FILENAME  {




More information about the Scummvm-git-logs mailing list