[Scummvm-git-logs] scummvm master -> 2ba67dbc14e58c02f5dc2b69f8d9070fa843e75b

neuromancer noreply at scummvm.org
Wed Jul 24 07:51:28 UTC 2024


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

Summary:
e533598656 FREESCAPE: added rock travel cheat for castle
ffb23e8314 HYPNO: initial support for wetlands early demo and font handling refactoring
2ba67dbc14 HYPNO: improve support for non-zero anchors in arcade sequences


Commit: e533598656b3d820823434308e92f5e16bfd9f0e
    https://github.com/scummvm/scummvm/commit/e533598656b3d820823434308e92f5e16bfd9f0e
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-07-24T09:49:39+02:00

Commit Message:
FREESCAPE: added rock travel cheat for castle

Changed paths:
    engines/freescape/detection.cpp
    engines/freescape/detection.h
    engines/freescape/freescape.cpp
    engines/freescape/games/castle/castle.cpp
    engines/freescape/games/castle/castle.h
    engines/freescape/metaengine.cpp


diff --git a/engines/freescape/detection.cpp b/engines/freescape/detection.cpp
index d4b4a41a08a..e4c84c60952 100644
--- a/engines/freescape/detection.cpp
+++ b/engines/freescape/detection.cpp
@@ -684,7 +684,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::EN_ANY,
 		Common::kPlatformZX,
 		ADGF_UNSTABLE,
-		GUIO2(GUIO_NOMIDI, GUIO_RENDERZX)
+		GUIO3(GUIO_NOMIDI, GAMEOPTION_TRAVEL_ROCK, GUIO_RENDERZX)
 	},
 	{
 		"castlemaster",
@@ -698,7 +698,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::EN_ANY,
 		Common::kPlatformDOS,
 		ADGF_UNSTABLE | ADGF_DEMO,
-		GUIO3(GUIO_NOMIDI, GUIO_RENDEREGA, GUIO_RENDERCGA)
+		GUIO4(GUIO_NOMIDI, GAMEOPTION_TRAVEL_ROCK, GUIO_RENDEREGA, GUIO_RENDERCGA)
 	},
 	{
 		"castlemaster",
@@ -711,7 +711,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::EN_ANY,
 		Common::kPlatformAmiga,
 		ADGF_UNSTABLE | ADGF_DEMO,
-		GUIO2(GUIO_NOMIDI, GUIO_RENDERAMIGA)
+		GUIO3(GUIO_NOMIDI, GAMEOPTION_TRAVEL_ROCK, GUIO_RENDERAMIGA)
 	},
 	// Stampede Amiga, Issue 1, July 1990
 	{
@@ -725,7 +725,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::EN_ANY,
 		Common::kPlatformAmiga,
 		ADGF_UNSTABLE | ADGF_DEMO,
-		GUIO2(GUIO_NOMIDI, GUIO_RENDERAMIGA)
+		GUIO3(GUIO_NOMIDI, GAMEOPTION_TRAVEL_ROCK, GUIO_RENDERAMIGA)
 	},
 	{
 		"castlemaster",
@@ -741,7 +741,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::UNK_LANG,
 		Common::kPlatformDOS,
 		ADGF_UNSTABLE,
-		GUIO3(GUIO_NOMIDI, GUIO_RENDEREGA, GUIO_RENDERCGA)
+		GUIO4(GUIO_NOMIDI, GAMEOPTION_TRAVEL_ROCK, GUIO_RENDEREGA, GUIO_RENDERCGA)
 	},
 	{
 		"castlemaster",
@@ -757,7 +757,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::EN_ANY,
 		Common::kPlatformDOS,
 		ADGF_UNSTABLE,
-		GUIO3(GUIO_NOMIDI, GUIO_RENDEREGA, GUIO_RENDERCGA)
+		GUIO4(GUIO_NOMIDI, GAMEOPTION_TRAVEL_ROCK, GUIO_RENDEREGA, GUIO_RENDERCGA)
 	},
 	{
 		"castlemaster",
@@ -773,7 +773,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::EN_ANY,
 		Common::kPlatformDOS,
 		ADGF_UNSTABLE,
-		GUIO3(GUIO_NOMIDI, GUIO_RENDEREGA, GUIO_RENDERCGA)
+		GUIO4(GUIO_NOMIDI, GAMEOPTION_TRAVEL_ROCK, GUIO_RENDEREGA, GUIO_RENDERCGA)
 	},
 	{
 		"castlemaster",
@@ -789,7 +789,7 @@ static const ADGameDescription gameDescriptions[] = {
 		Common::ES_ESP,
 		Common::kPlatformDOS,
 		ADGF_UNSTABLE,
-		GUIO3(GUIO_NOMIDI, GUIO_RENDEREGA, GUIO_RENDERCGA)
+		GUIO4(GUIO_NOMIDI, GAMEOPTION_TRAVEL_ROCK, GUIO_RENDEREGA, GUIO_RENDERCGA)
 	},
 
 	// 3D Construction Kit games
diff --git a/engines/freescape/detection.h b/engines/freescape/detection.h
index 5262bcd7a50..a0c5940715f 100644
--- a/engines/freescape/detection.h
+++ b/engines/freescape/detection.h
@@ -34,4 +34,9 @@
 // Driller options
 #define GAMEOPTION_AUTOMATIC_DRILLING   GUIO_GAMEOPTIONS8
 
+// Castle Master options
+
+#define GAMEOPTION_TRAVEL_ROCK   GUIO_GAMEOPTIONS8
+
+
 #endif
diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 9eddfd80383..1c92c727f9a 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -731,7 +731,9 @@ Common::Error FreescapeEngine::run() {
 
 		if (_shootingFrames == 0) {
 			if (_delayedShootObject) {
-				bool rockTravel = isCastle() && getGameBit(k8bitGameBitTravelRock);
+				bool rockTravel = isSpectrum() && isCastle() && getGameBit(k8bitGameBitTravelRock);
+				// If rock travel is enabled for other platforms than ZX and CPC,
+				// then this variable should be false since the game scripts will take care
 				executeObjectConditions(_delayedShootObject, true, rockTravel, false);
 				executeLocalGlobalConditions(true, false, false); // Only execute "on shot" room/global conditions
 				_delayedShootObject = nullptr;
diff --git a/engines/freescape/games/castle/castle.cpp b/engines/freescape/games/castle/castle.cpp
index b80ff766b24..3688c9fdf4c 100644
--- a/engines/freescape/games/castle/castle.cpp
+++ b/engines/freescape/games/castle/castle.cpp
@@ -21,6 +21,7 @@
 
 #include "common/file.h"
 #include "common/memstream.h"
+#include "common/config-manager.h"
 
 #include "freescape/freescape.h"
 #include "freescape/games/castle/castle.h"
@@ -29,6 +30,10 @@
 namespace Freescape {
 
 CastleEngine::CastleEngine(OSystem *syst, const ADGameDescription *gd) : FreescapeEngine(syst, gd) {
+
+	if (!Common::parseBool(ConfMan.get("rock_travel"), _useRockTravel))
+		error("Failed to parse bool from rock_travel option");
+
 	if (isSpectrum())
 		initZX();
 
@@ -124,6 +129,9 @@ void CastleEngine::initGameState() {
 	_gameStateVars[k8bitVariableEnergy] = 1;
 	_countdown = INT_MAX;
 	_numberKeys = 0;
+
+	if (_useRockTravel) // Enable cheat
+		setGameBit(k8bitGameBitTravelRock);
 }
 
 void CastleEngine::endGame() {
@@ -723,6 +731,9 @@ Common::Error CastleEngine::saveGameStreamExtended(Common::WriteStream *stream,
 
 Common::Error CastleEngine::loadGameStreamExtended(Common::SeekableReadStream *stream) {
 	_numberKeys = stream->readUint32LE();
+
+	if (_useRockTravel) // Enable cheat
+		setGameBit(k8bitGameBitTravelRock);
 	return Common::kNoError;
 }
 
diff --git a/engines/freescape/games/castle/castle.h b/engines/freescape/games/castle/castle.h
index 83a7cc7af99..4f43ad62333 100644
--- a/engines/freescape/games/castle/castle.h
+++ b/engines/freescape/games/castle/castle.h
@@ -66,6 +66,7 @@ public:
 
 	Graphics::Surface *_keysFrame;
 	int _numberKeys;
+	bool _useRockTravel;
 
 private:
 	Common::SeekableReadStream *decryptFile(const Common::Path &filename);
diff --git a/engines/freescape/metaengine.cpp b/engines/freescape/metaengine.cpp
index 32f8c64a0a9..a65f83e29f8 100644
--- a/engines/freescape/metaengine.cpp
+++ b/engines/freescape/metaengine.cpp
@@ -122,6 +122,17 @@ static const ADExtraGuiOptionsMap optionsList[] = {
 			0
 		}
 	},
+	{
+		GAMEOPTION_TRAVEL_ROCK,
+		{
+			_s("Enable rock travel"),
+			_s("Enable traveling using a rock shoot at start"),
+			"rock_travel",
+			false,
+			0,
+			0
+		}
+	},
 	AD_EXTRA_GUI_OPTIONS_TERMINATOR
 };
 


Commit: ffb23e8314db8150c0186322dec977c178b1c05d
    https://github.com/scummvm/scummvm/commit/ffb23e8314db8150c0186322dec977c178b1c05d
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-07-24T09:49:39+02:00

Commit Message:
HYPNO: initial support for wetlands early demo and font handling refactoring

Changed paths:
    engines/hypno/boyz/boyz.cpp
    engines/hypno/detection.cpp
    engines/hypno/hypno.cpp
    engines/hypno/hypno.h
    engines/hypno/spider/spider.cpp
    engines/hypno/wet/arcade.cpp
    engines/hypno/wet/wet.cpp


diff --git a/engines/hypno/boyz/boyz.cpp b/engines/hypno/boyz/boyz.cpp
index 04927122ba4..6b7b7c2a16f 100644
--- a/engines/hypno/boyz/boyz.cpp
+++ b/engines/hypno/boyz/boyz.cpp
@@ -943,32 +943,6 @@ void BoyzEngine::loadAssets() {
 	_nextLevel = "<start>";
 }
 
-void BoyzEngine::loadFonts() {
-	Common::File file;
-
-	if (!file.open("block05.fgx"))
-		error("Cannot open font");
-
-	byte *font = (byte *)malloc(file.size());
-	file.read(font, file.size());
-
-	_font05.set_size(file.size()*8);
-	_font05.set_bits((byte *)font);
-
-	file.close();
-	free(font);
-	if (!file.open("scifi08.fgx"))
-		error("Cannot open font");
-
-	font = (byte *)malloc(file.size());
-	file.read(font, file.size());
-
-	_font08.set_size(file.size()*8);
-	_font08.set_bits((byte *)font);
-
-	free(font);
-}
-
 void BoyzEngine::drawString(const Common::String &font, const Common::String &str, int x, int y, int w, uint32 color) {
 	int offset = 0;
 	if (font == "block05.fgx") {
diff --git a/engines/hypno/detection.cpp b/engines/hypno/detection.cpp
index 9b0aeb5340a..21b661e58b3 100644
--- a/engines/hypno/detection.cpp
+++ b/engines/hypno/detection.cpp
@@ -110,6 +110,16 @@ static const ADGameDescription gameDescriptions[] = {
 		ADGF_UNSTABLE,
 		GUIO1(GUIO_NOMIDI)
 	},
+	{
+		"wetlands", // Wetlands Demo PC Spiel (October 1995)
+		"EarlyDemo",
+		AD_ENTRY2s("wetlands.exe", "edc5b0c0caf3d5b01d344cb555d9a085", 641411,
+			  "c61.mis", "11e384b3abe0f42995bb61566d877e45", 18497),
+		Common::EN_USA,
+		Common::kPlatformDOS,
+		ADGF_DEMO,
+		GUIO1(GUIO_NOMIDI)
+	},
 	{
 		"wetlands", // Wetlands Demo Disc (November 1995)
 		"Demo",
diff --git a/engines/hypno/hypno.cpp b/engines/hypno/hypno.cpp
index 0a323e6ec03..e56150edb42 100644
--- a/engines/hypno/hypno.cpp
+++ b/engines/hypno/hypno.cpp
@@ -298,8 +298,34 @@ void HypnoEngine::loadGame(const Common::String &nextLevel, int score, int puzzl
 	error("Function \"%s\" not implemented", __FUNCTION__);
 }
 
-void HypnoEngine::loadFonts() {
-	error("Function \"%s\" not implemented", __FUNCTION__);
+void HypnoEngine::loadFonts(const Common::String prefix) {
+	Common::File file;
+	Common::Path path = Common::Path(prefix).append("block05.fgx");
+
+	if (!file.open(path))
+		error("Cannot open font %s", path.toString().c_str());
+
+	byte *font = (byte *)malloc(file.size());
+	file.read(font, file.size());
+
+	_font05.set_size(file.size()*8);
+	_font05.set_bits((byte *)font);
+
+	file.close();
+	free(font);
+	path = Common::Path(prefix).append("scifi08.fgx");
+
+	if (!file.open(path))
+		error("Cannot open font %s", path.toString().c_str());
+
+	font = (byte *)malloc(file.size());
+	file.read(font, file.size());
+
+	_font08.set_size(file.size()*8);
+	_font08.set_bits((byte *)font);
+
+	file.close();
+	free(font);
 }
 
 void HypnoEngine::drawString(const Filename &name, const Common::String &str, int x, int y, int w, uint32 c) {
diff --git a/engines/hypno/hypno.h b/engines/hypno/hypno.h
index ef441c895b1..120f896b7ae 100644
--- a/engines/hypno/hypno.h
+++ b/engines/hypno/hypno.h
@@ -337,7 +337,9 @@ public:
 	uint32 _objMissesAllowed[2];
 
 	// Fonts
-	virtual void loadFonts();
+	Common::BitArray _font05;
+	Common::BitArray _font08;
+	virtual void loadFonts(const Common::String prefix = "");
 	virtual void drawString(const Filename &name, const Common::String &str, int x, int y, int w, uint32 c);
 
 	// Conversation
@@ -383,13 +385,14 @@ public:
 
 	void loadAssets() override;
 	void loadAssetsDemoDisc();
+	void loadAssetsEarlyDemo();
 	void loadAssetsGen4();
 	void loadAssetsPCW();
 	void loadAssetsPCG();
 	void loadAssetsFullGame();
 	void loadAssetsNI();
 
-	void loadFonts() override;
+	void loadFonts(const Common::String prefix = "") override;
 	void drawString(const Filename &name, const Common::String &str, int x, int y, int w, uint32 c) override;
 	void changeCursor(const Common::String &cursor) override;
 
@@ -452,8 +455,6 @@ private:
 	bool _c33UseMouse;
 	void generateStaticEffect();
 
-	Common::BitArray _font05;
-	Common::BitArray _font08;
 	Common::BitArray _fontg9a;
 	Common::Array<uint32> _c40SegmentPath;
 	Common::Array<uint32> _c40SegmentNext;
@@ -491,7 +492,7 @@ public:
 	Common::String findNextLevel(const Common::String &level) override;
 	Common::String findNextLevel(const Transition *trans) override;
 
-	void loadFonts() override;
+	void loadFonts(const Common::String prefix = "") override;
 	void drawString(const Filename &name, const Common::String &str, int x, int y, int w, uint32 c) override;
 
 	void showConversation() override;
@@ -584,7 +585,6 @@ public:
 	void initSegment(ArcadeShooting *arc) override;
 	bool checkTransition(ArcadeTransitions &transitions, ArcadeShooting *arc) override;
 
-	void loadFonts() override;
 	void drawString(const Filename &name, const Common::String &str, int x, int y, int w, uint32 c) override;
 
 	// Saves
diff --git a/engines/hypno/spider/spider.cpp b/engines/hypno/spider/spider.cpp
index 965e7181daa..98961e910d8 100644
--- a/engines/hypno/spider/spider.cpp
+++ b/engines/hypno/spider/spider.cpp
@@ -1155,31 +1155,8 @@ Common::String SpiderEngine::findNextLevel(const Transition *trans) {
 	return trans->nextLevel;
 }
 
-void SpiderEngine::loadFonts() {
-	Common::File file;
-
-	if (!file.open("block05.fgx"))
-		error("Cannot open font");
-
-	byte *font = (byte *)malloc(file.size());
-	file.read(font, file.size());
-
-	_font05.set_size(file.size()*8);
-	_font05.set_bits((byte *)font);
-
-	file.close();
-	free(font);
-	if (!file.open("scifi08.fgx"))
-		error("Cannot open font");
-
-	font = (byte *)malloc(file.size());
-	file.read(font, file.size());
-
-	_font08.set_size(file.size()*8);
-	_font08.set_bits((byte *)font);
-
-	free(font);
-
+void SpiderEngine::loadFonts(const Common::String prefix) {
+	HypnoEngine::loadFonts(prefix);
 	// Additional fonts
 	_font = FontMan.getFontByUsage(Graphics::FontManager::kConsoleFont);
 }
diff --git a/engines/hypno/wet/arcade.cpp b/engines/hypno/wet/arcade.cpp
index afecae94a82..16c6bd3596c 100644
--- a/engines/hypno/wet/arcade.cpp
+++ b/engines/hypno/wet/arcade.cpp
@@ -640,6 +640,24 @@ void WetEngine::runBeforeArcade(ArcadeShooting *arc) {
 		_playerFrames = decodeFrames(arc->player);
 	}
 
+	if (_variant == "EarlyDemo" && (arc->id == 31 || arc->id == 41)) {
+		int cutX = 36;
+		for (int i = 0; i < int(_playerFrames.size()); i++) {
+			Graphics::Surface *frame = _playerFrames[i];
+			Graphics::Surface *newFrame = new Graphics::Surface();
+			newFrame->create(320, 200, frame->format);
+			newFrame->fillRect(Common::Rect(0, 0, 320, 200), frame->format.ARGBToColor(0, 0, 0, 0));
+			newFrame->copyRectToSurfaceWithKey(*frame, 0, 0, Common::Rect(0, 0, 320, cutX), 0);
+			newFrame->copyRectToSurfaceWithKey(*frame, 0, 200 - (frame->h - cutX - 1), Common::Rect(0, cutX, 320, frame->h - 1), 0);
+
+			frame->free();
+			delete frame;
+			_playerFrames[i] = newFrame;
+		}
+
+	}
+
+
 	if (arc->mode == "Y4" || arc->mode == "Y5")  { // These images are flipped, for some reason
 		for (Frames::iterator it = _playerFrames.begin(); it != _playerFrames.end(); ++it) {
 			for (int i = 0 ; i < (*it)->w ; i++)
@@ -1053,7 +1071,7 @@ void WetEngine::drawPlayer() {
 
 	int offset = 0;
 	// Ugly, but seems to be necessary
-	if (_levelId == 31)
+	if (_levelId == 31 && _variant != "EarlyDemo")
 		offset = 2;
 	else if (_levelId == 52)
 		offset = 2;
diff --git a/engines/hypno/wet/wet.cpp b/engines/hypno/wet/wet.cpp
index e833c376b9b..ba87ef6c8b0 100644
--- a/engines/hypno/wet/wet.cpp
+++ b/engines/hypno/wet/wet.cpp
@@ -59,6 +59,12 @@ static const chapterEntry rawChapterTable[] = {
 	{0,  {0,  0},   {0,   0},   {0,   0},   {0, 0},     0, kHypnoColorRed}    	// NULL
 };
 
+static const chapterEntry rawChapterTableEarlyDemo[] = {
+	{31, {49, 12}, {205, 12}, {0,   0},   {127, 172}, 0,   kHypnoColorRed}, 	 // c31
+	{41, {49, 12}, {205, 12}, {0,   0},   {127, 172}, 0,   kHypnoColorRed}, 	 // c41
+	{0,  {0,  0},   {0,   0},   {0,   0},   {0, 0},     0, kHypnoColorRed}    	// NULL
+};
+
 WetEngine::WetEngine(OSystem *syst, const ADGameDescription *gd) : HypnoEngine(syst, gd) {
 	_screenW = 320;
 	_screenH = 200;
@@ -98,6 +104,8 @@ void WetEngine::loadAssets() {
 
 	if (_variant == "Demo" || _variant == "DemoHebrew" || _variant == "M&MCD")
 		loadAssetsDemoDisc();
+	else if (_variant == "EarlyDemo")
+		loadAssetsEarlyDemo();
 	else if (_variant == "Gen4")
 		loadAssetsGen4();
 	else if (_variant == "PCWDemo")
@@ -245,6 +253,39 @@ void WetEngine::loadAssetsDemoDisc() {
 	_nextLevel = "<start>";
 }
 
+
+void WetEngine::loadAssetsEarlyDemo() {
+
+	Transition *intro;
+	intro = new Transition("c_misc/c31.mis");
+
+	intro->prefix = "c_misc/";
+	intro->intros.push_back("nw_logo.smk");
+	intro->intros.push_back("h.s");
+	intro->intros.push_back("w.s");
+	intro->frameImage = "c.s";
+	intro->frameNumber = 0;
+	_levels["<start>"] = intro;
+
+	loadArcadeLevel("c_misc/c31.mis", "c_misc/c41.mis", "c_misc/c41.mis", "");
+	loadArcadeLevel("c_misc/c41.mis", "c_misc/c61.mis", "c_misc/c61.mis", "");
+	loadArcadeLevel("c_misc/c61.mis", "<quit>", "<quit>", "");
+
+	Transition *over = new Transition("<quit>");
+	over->intros.push_back("g.s");
+	_levels["<game_over>"] = over;
+
+	loadFonts("c_misc/");
+
+	const chapterEntry *entry = rawChapterTableEarlyDemo;
+	while (entry->id) {
+		_chapterTable[entry->id] = entry;
+		entry++;
+	}
+
+	_nextLevel = "<start>";
+}
+
 void WetEngine::loadAssetsGen4() {
 
 	bool encrypted = false;
@@ -576,37 +617,15 @@ void WetEngine::showCredits() {
 	}
 }
 
-void WetEngine::loadFonts() {
-	Common::File file;
-
-	if (!file.open("block05.fgx"))
-		error("Cannot open font");
-
-	byte *font = (byte *)malloc(file.size());
-	file.read(font, file.size());
-
-	_font05.set_size(file.size()*8);
-	_font05.set_bits((byte *)font);
-
-	file.close();
-	free(font);
-	if (!file.open("scifi08.fgx"))
-		error("Cannot open font");
-
-	font = (byte *)malloc(file.size());
-	file.read(font, file.size());
-
-	_font08.set_size(file.size()*8);
-	_font08.set_bits((byte *)font);
-
-	file.close();
-	free(font);
-
+void WetEngine::loadFonts(const Common::String prefix) {
+	HypnoEngine::loadFonts(prefix);
 	if (_language == Common::KO_KOR) {
+		Common::File file;
+
 		if (!file.open("C_MISC/G9A.SYF"))
 			error("Cannot open Korean font");
 
-		font = (byte *)malloc(file.size());
+		byte *font = (byte *)malloc(file.size());
 		file.read(font, file.size());
 
 		_fontg9a.set_size(file.size()*8);


Commit: 2ba67dbc14e58c02f5dc2b69f8d9070fa843e75b
    https://github.com/scummvm/scummvm/commit/2ba67dbc14e58c02f5dc2b69f8d9070fa843e75b
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2024-07-24T09:49:39+02:00

Commit Message:
HYPNO: improve support for non-zero anchors in arcade sequences

Changed paths:
    engines/hypno/arcade.cpp
    engines/hypno/grammar.h
    engines/hypno/grammar_arc.cpp
    engines/hypno/grammar_arc.y
    engines/hypno/grammar_mis.cpp
    engines/hypno/lexer_arc.cpp
    engines/hypno/lexer_mis.cpp


diff --git a/engines/hypno/arcade.cpp b/engines/hypno/arcade.cpp
index e29b354a0db..0089b71cd62 100644
--- a/engines/hypno/arcade.cpp
+++ b/engines/hypno/arcade.cpp
@@ -230,7 +230,11 @@ void HypnoEngine::runArcade(ArcadeShooting *arc) {
 		error("Invalid or missing mouse box");
 
 	Common::Point offset;
-	_background = new MVideo(arc->backgroundVideo, offset, false, false, false);
+	Common::Point anchor = arc->anchor;
+	anchor.x = 0;	// This is almost always zero, except when the screen starts at the middle
+					// We don't really need it
+	anchor.y = MAX(0, anchor.y - arc->mouseBox.bottom);
+	_background = new MVideo(arc->backgroundVideo, anchor, false, false, false);
 
 	drawCursorArcade(mousePos);
 	playVideo(*_background);
@@ -336,7 +340,7 @@ void HypnoEngine::runArcade(ArcadeShooting *arc) {
 					offset.x = offset.x - 1;
 					needsUpdate = true;
 				}
-				_background->position = offset;
+				_background->position.x = offset.x;
 				break;
 
 			default:
diff --git a/engines/hypno/grammar.h b/engines/hypno/grammar.h
index ea265e5407b..b6672a4578d 100644
--- a/engines/hypno/grammar.h
+++ b/engines/hypno/grammar.h
@@ -644,6 +644,7 @@ public:
 		objMissesAllowed[0] = 0;
 		objMissesAllowed[1] = 0;
 		mouseBox = Common::Rect(0, 0, 320, 200);
+		anchor = Common::Point(0, 0);
 		targetSoundRate = 0;
 		shootSoundRate = 0;
 		enemySoundRate = 0;
@@ -655,6 +656,7 @@ public:
 	uint32 frameDelay;
 	Common::String mode;
 	Common::Rect mouseBox;
+	Common::Point anchor;
 	ArcadeTransitions transitions;
 	Segments segments;
 
diff --git a/engines/hypno/grammar_arc.cpp b/engines/hypno/grammar_arc.cpp
index cc5d4f62ffe..b66af7d024c 100644
--- a/engines/hypno/grammar_arc.cpp
+++ b/engines/hypno/grammar_arc.cpp
@@ -632,17 +632,17 @@ static const yytype_int8 yytranslate[] =
 static const yytype_int16 yyrline[] =
 {
        0,   120,   120,   120,   121,   124,   125,   126,   129,   133,
-     137,   141,   142,   143,   147,   152,   156,   160,   165,   175,
-     184,   189,   195,   200,   213,   218,   222,   226,   230,   233,
-     237,   240,   241,   269,   272,   275,   281,   286,   291,   297,
-     302,   307,   312,   317,   322,   329,   330,   333,   334,   337,
-     338,   339,   342,   352,   357,   362,   367,   370,   373,   378,
-     383,   388,   392,   396,   400,   404,   408,   412,   416,   420,
-     424,   428,   432,   436,   440,   444,   448,   452,   456,   460,
-     464,   468,   472,   476,   479,   483,   488,   493,   496,   501,
-     506,   510,   516,   520,   523,   524,   525,   528,   532,   535,
-     540,   543,   544,   548,   555,   559,   574,   578,   579,   585,
-     589,   593,   596,   599,   601
+     137,   141,   142,   145,   149,   154,   158,   162,   167,   177,
+     186,   191,   197,   202,   215,   220,   224,   228,   232,   235,
+     239,   242,   243,   271,   274,   277,   283,   288,   293,   299,
+     304,   309,   314,   319,   324,   331,   332,   335,   336,   339,
+     340,   341,   344,   354,   359,   364,   369,   372,   375,   380,
+     385,   390,   394,   398,   402,   406,   410,   414,   418,   422,
+     426,   430,   434,   438,   442,   446,   450,   454,   458,   462,
+     466,   470,   474,   478,   481,   485,   490,   495,   498,   503,
+     508,   512,   518,   522,   525,   526,   527,   530,   534,   537,
+     542,   545,   546,   550,   557,   561,   576,   580,   581,   587,
+     591,   595,   598,   601,   603
 };
 #endif
 
@@ -1377,59 +1377,61 @@ yyreduce:
 
   case 12: /* hline: ATOK NUM NUM  */
 #line 142 "engines/hypno/grammar_arc.y"
-                       { debugC(1, kHypnoDebugParser, "A %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1382 "engines/hypno/grammar_arc.cpp"
+                       { g_parsedArc->anchor = Common::Point((yyvsp[-1].i), (yyvsp[0].i));
+		debugC(1, kHypnoDebugParser, "A %d %d", (yyvsp[-1].i), (yyvsp[0].i));
+	}
+#line 1384 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 13: /* hline: MTOK FILENAME  */
-#line 143 "engines/hypno/grammar_arc.y"
+#line 145 "engines/hypno/grammar_arc.y"
                         {
 		debugC(1, kHypnoDebugParser, "M %s", (yyvsp[0].s));
 		g_parsedArc->maskVideo = (yyvsp[0].s);
 	}
-#line 1391 "engines/hypno/grammar_arc.cpp"
+#line 1393 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 14: /* hline: UTOK NUM NUM NUM NUM  */
-#line 147 "engines/hypno/grammar_arc.y"
+#line 149 "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 1401 "engines/hypno/grammar_arc.cpp"
+#line 1403 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 15: /* hline: VTOK NUM NUM  */
-#line 152 "engines/hypno/grammar_arc.y"
+#line 154 "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 1410 "engines/hypno/grammar_arc.cpp"
+#line 1412 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 16: /* hline: VTOK RESTOK  */
-#line 156 "engines/hypno/grammar_arc.y"
+#line 158 "engines/hypno/grammar_arc.y"
                       {
 		debugC(1, kHypnoDebugParser, "V 320,200");
 		g_parsedArc->mouseBox = Common::Rect(0, 0, 320, 200);
 	}
-#line 1419 "engines/hypno/grammar_arc.cpp"
+#line 1421 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 17: /* hline: OTOK NUM NUM  */
-#line 160 "engines/hypno/grammar_arc.y"
+#line 162 "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 1429 "engines/hypno/grammar_arc.cpp"
+#line 1431 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 18: /* hline: ONTOK NUM NUM  */
-#line 165 "engines/hypno/grammar_arc.y"
+#line 167 "engines/hypno/grammar_arc.y"
                         {
 		if (Common::String("O0") == (yyvsp[-2].s)) {
 			g_parsedArc->objKillsRequired[0] = (yyvsp[-1].i);
@@ -1440,11 +1442,11 @@ yyreduce:
 		} else
 			error("Invalid objective: '%s'", (yyvsp[-2].s));
 		debugC(1, kHypnoDebugParser, "ON %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1444 "engines/hypno/grammar_arc.cpp"
+#line 1446 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 19: /* hline: ONTOK NUM  */
-#line 175 "engines/hypno/grammar_arc.y"
+#line 177 "engines/hypno/grammar_arc.y"
                     {
 		if (Common::String("O0") == (yyvsp[-1].s)) {
 			g_parsedArc->objKillsRequired[0] = (yyvsp[0].i);
@@ -1454,42 +1456,42 @@ yyreduce:
 			error("Invalid objective: '%s'", (yyvsp[-1].s));
 		debugC(1, kHypnoDebugParser, "ON %d", (yyvsp[0].i));
 	}
-#line 1458 "engines/hypno/grammar_arc.cpp"
+#line 1460 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 20: /* hline: TPTOK NONETOK NUM FILENAME  */
-#line 184 "engines/hypno/grammar_arc.y"
+#line 186 "engines/hypno/grammar_arc.y"
                                      {
 		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));
 	}
-#line 1468 "engines/hypno/grammar_arc.cpp"
+#line 1470 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 21: /* hline: TSTOK FILENAME NUM NUM  */
-#line 189 "engines/hypno/grammar_arc.y"
+#line 191 "engines/hypno/grammar_arc.y"
                                  {
 		ArcadeTransition at((yyvsp[-2].s), "", "", 0, (yyvsp[-1].i));
 		at.selection = true;
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "Ts %s %d %d", (yyvsp[-2].s), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 1479 "engines/hypno/grammar_arc.cpp"
+#line 1481 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 22: /* hline: TPTOK FILENAME NUM FILENAME  */
-#line 195 "engines/hypno/grammar_arc.y"
+#line 197 "engines/hypno/grammar_arc.y"
                                       {
 		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));
 	}
-#line 1489 "engines/hypno/grammar_arc.cpp"
+#line 1491 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 23: /* hline: TATOK NUM FILENAME flag enc  */
-#line 200 "engines/hypno/grammar_arc.y"
+#line 202 "engines/hypno/grammar_arc.y"
                                       {
 		uint32 sampleRate = 11025;
 		bool stereo = false;
@@ -1503,79 +1505,79 @@ yyreduce:
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "Ta %d %s", (yyvsp[-3].i), (yyvsp[-2].s));
 	}
-#line 1507 "engines/hypno/grammar_arc.cpp"
+#line 1509 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 24: /* hline: TTOK FILENAME NUM  */
-#line 213 "engines/hypno/grammar_arc.y"
+#line 215 "engines/hypno/grammar_arc.y"
                             {
 		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 1517 "engines/hypno/grammar_arc.cpp"
+#line 1519 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 25: /* hline: TTOK NONETOK NUM  */
-#line 218 "engines/hypno/grammar_arc.y"
+#line 220 "engines/hypno/grammar_arc.y"
                            {
 		ArcadeTransition at("NONE", "", "", 0, (yyvsp[0].i));
 		g_parsedArc->transitions.push_back(at);
 		debugC(1, kHypnoDebugParser, "T NONE %d", (yyvsp[0].i)); }
-#line 1526 "engines/hypno/grammar_arc.cpp"
+#line 1528 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 26: /* hline: NTOK FILENAME  */
-#line 222 "engines/hypno/grammar_arc.y"
+#line 224 "engines/hypno/grammar_arc.y"
                          {
 		g_parsedArc->backgroundVideo = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "N %s", (yyvsp[0].s));
 	}
-#line 1535 "engines/hypno/grammar_arc.cpp"
+#line 1537 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 27: /* hline: NSTOK FILENAME  */
-#line 226 "engines/hypno/grammar_arc.y"
+#line 228 "engines/hypno/grammar_arc.y"
                           {
 		g_parsedArc->backgroundVideo = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "N* %s", (yyvsp[0].s));
 	}
-#line 1544 "engines/hypno/grammar_arc.cpp"
+#line 1546 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 28: /* hline: RTOK FILENAME  */
-#line 230 "engines/hypno/grammar_arc.y"
+#line 232 "engines/hypno/grammar_arc.y"
                          {
 		g_parsedArc->backgroundPalette = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "R %s", (yyvsp[0].s)); }
-#line 1552 "engines/hypno/grammar_arc.cpp"
+#line 1554 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 29: /* hline: ITOK FILENAME  */
-#line 233 "engines/hypno/grammar_arc.y"
+#line 235 "engines/hypno/grammar_arc.y"
                         {
 		g_parsedArc->player = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1561 "engines/hypno/grammar_arc.cpp"
+#line 1563 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 30: /* hline: I1TOK FILENAME  */
-#line 237 "engines/hypno/grammar_arc.y"
+#line 239 "engines/hypno/grammar_arc.y"
                          {
 		debugC(1, kHypnoDebugParser, "I1 %s", (yyvsp[0].s));
 	}
-#line 1569 "engines/hypno/grammar_arc.cpp"
+#line 1571 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 31: /* hline: QTOK NUM NUM  */
-#line 240 "engines/hypno/grammar_arc.y"
+#line 242 "engines/hypno/grammar_arc.y"
                        { debugC(1, kHypnoDebugParser, "Q %d %d", (yyvsp[-1].i), (yyvsp[0].i)); }
-#line 1575 "engines/hypno/grammar_arc.cpp"
+#line 1577 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 32: /* hline: BNTOK FILENAME  */
-#line 241 "engines/hypno/grammar_arc.y"
+#line 243 "engines/hypno/grammar_arc.y"
                          {
 		if (Common::String("B0") == (yyvsp[-1].s))
 			g_parsedArc->beforeVideo = (yyvsp[0].s);
@@ -1604,153 +1606,153 @@ yyreduce:
 
 		debugC(1, kHypnoDebugParser, "BN %s", (yyvsp[0].s));
 	}
-#line 1608 "engines/hypno/grammar_arc.cpp"
+#line 1610 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 33: /* hline: SNTOK FILENAME enc flag  */
-#line 269 "engines/hypno/grammar_arc.y"
+#line 271 "engines/hypno/grammar_arc.y"
                                   {
 		parseSN((yyvsp[-3].s), (yyvsp[-2].s), (yyvsp[-1].s), (yyvsp[0].s));
 	}
-#line 1616 "engines/hypno/grammar_arc.cpp"
+#line 1618 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 34: /* hline: SNTOK FILENAME flag enc  */
-#line 272 "engines/hypno/grammar_arc.y"
+#line 274 "engines/hypno/grammar_arc.y"
                                   {
 		parseSN((yyvsp[-3].s), (yyvsp[-2].s), (yyvsp[0].s), (yyvsp[-1].s));
 	}
-#line 1624 "engines/hypno/grammar_arc.cpp"
+#line 1626 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 35: /* hline: HETOK BYTE NUM NUM  */
-#line 275 "engines/hypno/grammar_arc.y"
+#line 277 "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 1635 "engines/hypno/grammar_arc.cpp"
+#line 1637 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 36: /* hline: HLTOK BYTE NUM NUM  */
-#line 281 "engines/hypno/grammar_arc.y"
+#line 283 "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 1645 "engines/hypno/grammar_arc.cpp"
+#line 1647 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 37: /* hline: HUTOK BYTE NUM NUM  */
-#line 286 "engines/hypno/grammar_arc.y"
+#line 288 "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 1655 "engines/hypno/grammar_arc.cpp"
+#line 1657 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 38: /* hline: HTOK NAME NUM NUM  */
-#line 291 "engines/hypno/grammar_arc.y"
+#line 293 "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 1666 "engines/hypno/grammar_arc.cpp"
+#line 1668 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 39: /* hline: HTOK RTOK NUM NUM  */
-#line 297 "engines/hypno/grammar_arc.y"
+#line 299 "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 1676 "engines/hypno/grammar_arc.cpp"
+#line 1678 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 40: /* hline: HTOK ATOK NUM NUM  */
-#line 302 "engines/hypno/grammar_arc.y"
+#line 304 "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 1686 "engines/hypno/grammar_arc.cpp"
+#line 1688 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 41: /* hline: HTOK PTOK NUM NUM  */
-#line 307 "engines/hypno/grammar_arc.y"
+#line 309 "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 1696 "engines/hypno/grammar_arc.cpp"
+#line 1698 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 42: /* hline: HTOK LTOK NUM NUM  */
-#line 312 "engines/hypno/grammar_arc.y"
+#line 314 "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 1706 "engines/hypno/grammar_arc.cpp"
+#line 1708 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 43: /* hline: H12TOK BYTE NUM NUM  */
-#line 317 "engines/hypno/grammar_arc.y"
+#line 319 "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 1716 "engines/hypno/grammar_arc.cpp"
+#line 1718 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 44: /* hline: HTOK BYTE NUM NUM  */
-#line 322 "engines/hypno/grammar_arc.y"
+#line 324 "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 1726 "engines/hypno/grammar_arc.cpp"
+#line 1728 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 45: /* enc: ENCTOK  */
-#line 329 "engines/hypno/grammar_arc.y"
+#line 331 "engines/hypno/grammar_arc.y"
                      { (yyval.s) = (yyvsp[0].s); }
-#line 1732 "engines/hypno/grammar_arc.cpp"
+#line 1734 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 46: /* enc: %empty  */
-#line 330 "engines/hypno/grammar_arc.y"
+#line 332 "engines/hypno/grammar_arc.y"
                          { (yyval.s) = scumm_strdup(""); }
-#line 1738 "engines/hypno/grammar_arc.cpp"
+#line 1740 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 47: /* flag: NAME  */
-#line 333 "engines/hypno/grammar_arc.y"
+#line 335 "engines/hypno/grammar_arc.y"
                      { (yyval.s) = (yyvsp[0].s); }
-#line 1744 "engines/hypno/grammar_arc.cpp"
+#line 1746 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 48: /* flag: %empty  */
-#line 334 "engines/hypno/grammar_arc.y"
+#line 336 "engines/hypno/grammar_arc.y"
                          { (yyval.s) = scumm_strdup(""); }
-#line 1750 "engines/hypno/grammar_arc.cpp"
+#line 1752 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 52: /* bline: FNTOK FILENAME  */
-#line 342 "engines/hypno/grammar_arc.y"
+#line 344 "engines/hypno/grammar_arc.y"
                       {
 		shoot = new Shoot();
 		if (Common::String("F0") == (yyvsp[-1].s))
@@ -1761,457 +1763,457 @@ yyreduce:
 			shoot->additionalVideo = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "FN %s", (yyvsp[0].s));
 	}
-#line 1765 "engines/hypno/grammar_arc.cpp"
+#line 1767 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 53: /* bline: AVTOK NUM  */
-#line 352 "engines/hypno/grammar_arc.y"
+#line 354 "engines/hypno/grammar_arc.y"
                     {
 		assert((yyvsp[0].i) == 0);
 		shoot->nonHostile = true;
 		debugC(1, kHypnoDebugParser, "AV %d", (yyvsp[0].i));
 	}
-#line 1775 "engines/hypno/grammar_arc.cpp"
+#line 1777 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 54: /* bline: ALTOK NUM  */
-#line 357 "engines/hypno/grammar_arc.y"
+#line 359 "engines/hypno/grammar_arc.y"
                     {
 		assert(g_parsedArc->shoots.size() > 0);
 		shoot->checkIfDestroyed = g_parsedArc->shoots.back().name;
 		debugC(1, kHypnoDebugParser, "AL %d", (yyvsp[0].i));
 	}
-#line 1785 "engines/hypno/grammar_arc.cpp"
+#line 1787 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 55: /* bline: ABTOK NUM  */
-#line 362 "engines/hypno/grammar_arc.y"
+#line 364 "engines/hypno/grammar_arc.y"
                     {
 		assert((yyvsp[0].i) == 1);
 		shoot->playInteractionAudio = true;
 		debugC(1, kHypnoDebugParser, "AB %d", (yyvsp[0].i));
 	}
-#line 1795 "engines/hypno/grammar_arc.cpp"
+#line 1797 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 56: /* bline: DTOK LTOK  */
-#line 367 "engines/hypno/grammar_arc.y"
+#line 369 "engines/hypno/grammar_arc.y"
                      {
 		shoot->direction = 'L';
 		debugC(1, kHypnoDebugParser, "D L"); }
-#line 1803 "engines/hypno/grammar_arc.cpp"
+#line 1805 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 57: /* bline: DTOK RTOK  */
-#line 370 "engines/hypno/grammar_arc.y"
+#line 372 "engines/hypno/grammar_arc.y"
                      {
 		shoot->direction = 'R';
 		debugC(1, kHypnoDebugParser, "D R"); }
-#line 1811 "engines/hypno/grammar_arc.cpp"
+#line 1813 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 58: /* bline: J0TOK NUM  */
-#line 373 "engines/hypno/grammar_arc.y"
+#line 375 "engines/hypno/grammar_arc.y"
                     {
 		assert((yyvsp[0].i) > 0);
 		shoot->warningVideoIdx = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "J0 %d", (yyvsp[0].i));
 	}
-#line 1821 "engines/hypno/grammar_arc.cpp"
+#line 1823 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 59: /* bline: FNTOK NONETOK  */
-#line 378 "engines/hypno/grammar_arc.y"
+#line 380 "engines/hypno/grammar_arc.y"
                         {
 		shoot = new Shoot();
 		shoot->animation = "NONE";
 		debugC(1, kHypnoDebugParser, "FN NONE");
 	}
-#line 1831 "engines/hypno/grammar_arc.cpp"
+#line 1833 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 60: /* bline: FTOK FILENAME  */
-#line 383 "engines/hypno/grammar_arc.y"
+#line 385 "engines/hypno/grammar_arc.y"
                         {
 		shoot = new Shoot();
 		shoot->animation = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "FN %s", (yyvsp[0].s));
 	}
-#line 1841 "engines/hypno/grammar_arc.cpp"
+#line 1843 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 61: /* bline: ITOK NAME  */
-#line 388 "engines/hypno/grammar_arc.y"
+#line 390 "engines/hypno/grammar_arc.y"
                      {
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1850 "engines/hypno/grammar_arc.cpp"
+#line 1852 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 62: /* bline: ITOK BNTOK  */
-#line 392 "engines/hypno/grammar_arc.y"
+#line 394 "engines/hypno/grammar_arc.y"
                       {  // Workaround for NAME == B1
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1859 "engines/hypno/grammar_arc.cpp"
+#line 1861 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 63: /* bline: ITOK ATOK  */
-#line 396 "engines/hypno/grammar_arc.y"
+#line 398 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == A
 		shoot->name = "A";
 		debugC(1, kHypnoDebugParser, "I A");
 	}
-#line 1868 "engines/hypno/grammar_arc.cpp"
+#line 1870 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 64: /* bline: ITOK CTOK  */
-#line 400 "engines/hypno/grammar_arc.y"
+#line 402 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == C
 		shoot->name = "C";
 		debugC(1, kHypnoDebugParser, "I C");
 	}
-#line 1877 "engines/hypno/grammar_arc.cpp"
+#line 1879 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 65: /* bline: ITOK DTOK  */
-#line 404 "engines/hypno/grammar_arc.y"
+#line 406 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == D
 		shoot->name = "D";
 		debugC(1, kHypnoDebugParser, "I D");
 	}
-#line 1886 "engines/hypno/grammar_arc.cpp"
+#line 1888 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 66: /* bline: ITOK FTOK  */
-#line 408 "engines/hypno/grammar_arc.y"
+#line 410 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == F
 		shoot->name = "F";
 		debugC(1, kHypnoDebugParser, "I F");
 	}
-#line 1895 "engines/hypno/grammar_arc.cpp"
+#line 1897 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 67: /* bline: ITOK GTOK  */
-#line 412 "engines/hypno/grammar_arc.y"
+#line 414 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == G
 		shoot->name = "G";
 		debugC(1, kHypnoDebugParser, "I G");
 	}
-#line 1904 "engines/hypno/grammar_arc.cpp"
+#line 1906 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 68: /* bline: ITOK HTOK  */
-#line 416 "engines/hypno/grammar_arc.y"
+#line 418 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == H
 		shoot->name = "H";
 		debugC(1, kHypnoDebugParser, "I H");
 	}
-#line 1913 "engines/hypno/grammar_arc.cpp"
+#line 1915 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 69: /* bline: ITOK H12TOK  */
-#line 420 "engines/hypno/grammar_arc.y"
+#line 422 "engines/hypno/grammar_arc.y"
                        { // Workaround for NAME == H1/H2
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 1922 "engines/hypno/grammar_arc.cpp"
+#line 1924 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 70: /* bline: ITOK ITOK  */
-#line 424 "engines/hypno/grammar_arc.y"
+#line 426 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == I
 		shoot->name = "I";
 		debugC(1, kHypnoDebugParser, "I I");
 	}
-#line 1931 "engines/hypno/grammar_arc.cpp"
+#line 1933 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 71: /* bline: ITOK JTOK  */
-#line 428 "engines/hypno/grammar_arc.y"
+#line 430 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == J
 		shoot->name = "J";
 		debugC(1, kHypnoDebugParser, "I J");
 	}
-#line 1940 "engines/hypno/grammar_arc.cpp"
+#line 1942 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 72: /* bline: ITOK KTOK  */
-#line 432 "engines/hypno/grammar_arc.y"
+#line 434 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == K
 		shoot->name = "K";
 		debugC(1, kHypnoDebugParser, "I K");
 	}
-#line 1949 "engines/hypno/grammar_arc.cpp"
+#line 1951 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 73: /* bline: ITOK NTOK  */
-#line 436 "engines/hypno/grammar_arc.y"
+#line 438 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == N
 		shoot->name = "N";
 		debugC(1, kHypnoDebugParser, "I N");
 	}
-#line 1958 "engines/hypno/grammar_arc.cpp"
+#line 1960 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 74: /* bline: ITOK OTOK  */
-#line 440 "engines/hypno/grammar_arc.y"
+#line 442 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == O
 		shoot->name = "O";
 		debugC(1, kHypnoDebugParser, "I O");
 	}
-#line 1967 "engines/hypno/grammar_arc.cpp"
+#line 1969 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 75: /* bline: ITOK PTOK  */
-#line 444 "engines/hypno/grammar_arc.y"
+#line 446 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == P
 		shoot->name = "P";
 		debugC(1, kHypnoDebugParser, "I P");
 	}
-#line 1976 "engines/hypno/grammar_arc.cpp"
+#line 1978 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 76: /* bline: ITOK QTOK  */
-#line 448 "engines/hypno/grammar_arc.y"
+#line 450 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == Q
 		shoot->name = "Q";
 		debugC(1, kHypnoDebugParser, "I Q");
 	}
-#line 1985 "engines/hypno/grammar_arc.cpp"
+#line 1987 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 77: /* bline: ITOK RTOK  */
-#line 452 "engines/hypno/grammar_arc.y"
+#line 454 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == R
 		shoot->name = "R";
 		debugC(1, kHypnoDebugParser, "I R");
 	}
-#line 1994 "engines/hypno/grammar_arc.cpp"
+#line 1996 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 78: /* bline: ITOK SNTOK  */
-#line 456 "engines/hypno/grammar_arc.y"
+#line 458 "engines/hypno/grammar_arc.y"
                       {  // Workaround for NAME == S1
 		shoot->name = (yyvsp[0].s);
 		debugC(1, kHypnoDebugParser, "I %s", (yyvsp[0].s));
 	}
-#line 2003 "engines/hypno/grammar_arc.cpp"
+#line 2005 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 79: /* bline: ITOK TTOK  */
-#line 460 "engines/hypno/grammar_arc.y"
+#line 462 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == T
 		shoot->name = "T";
 		debugC(1, kHypnoDebugParser, "I T");
 	}
-#line 2012 "engines/hypno/grammar_arc.cpp"
+#line 2014 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 80: /* bline: ITOK LTOK  */
-#line 464 "engines/hypno/grammar_arc.y"
+#line 466 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == L
 		shoot->name = "L";
 		debugC(1, kHypnoDebugParser, "I L");
 	}
-#line 2021 "engines/hypno/grammar_arc.cpp"
+#line 2023 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 81: /* bline: ITOK MTOK  */
-#line 468 "engines/hypno/grammar_arc.y"
+#line 470 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == M
 		shoot->name = "M";
 		debugC(1, kHypnoDebugParser, "I M");
 	}
-#line 2030 "engines/hypno/grammar_arc.cpp"
+#line 2032 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 82: /* bline: ITOK UTOK  */
-#line 472 "engines/hypno/grammar_arc.y"
+#line 474 "engines/hypno/grammar_arc.y"
                      { // Workaround for NAME == U
 		shoot->name = "U";
 		debugC(1, kHypnoDebugParser, "I U");
 	}
-#line 2039 "engines/hypno/grammar_arc.cpp"
+#line 2041 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 83: /* bline: JTOK NUM  */
-#line 476 "engines/hypno/grammar_arc.y"
+#line 478 "engines/hypno/grammar_arc.y"
                     {
 		debugC(1, kHypnoDebugParser, "J %d", (yyvsp[0].i));
 	}
-#line 2047 "engines/hypno/grammar_arc.cpp"
+#line 2049 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 84: /* bline: A0TOK NUM NUM  */
-#line 479 "engines/hypno/grammar_arc.y"
+#line 481 "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 2056 "engines/hypno/grammar_arc.cpp"
+#line 2058 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 85: /* bline: RTOK NUM NUM  */
-#line 483 "engines/hypno/grammar_arc.y"
+#line 485 "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 2066 "engines/hypno/grammar_arc.cpp"
+#line 2068 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 86: /* bline: R0TOK NUM NUM  */
-#line 488 "engines/hypno/grammar_arc.y"
+#line 490 "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 2076 "engines/hypno/grammar_arc.cpp"
+#line 2078 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 87: /* bline: R1TOK NUM NUM  */
-#line 493 "engines/hypno/grammar_arc.y"
+#line 495 "engines/hypno/grammar_arc.y"
                          {
 		debugC(1, kHypnoDebugParser, "R1 %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2084 "engines/hypno/grammar_arc.cpp"
+#line 2086 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 88: /* bline: BNTOK NUM NUM  */
-#line 496 "engines/hypno/grammar_arc.y"
+#line 498 "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 2094 "engines/hypno/grammar_arc.cpp"
+#line 2096 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 89: /* bline: KNTOK NUM NUM  */
-#line 501 "engines/hypno/grammar_arc.y"
+#line 503 "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 2104 "engines/hypno/grammar_arc.cpp"
+#line 2106 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 90: /* bline: P0TOK NUM NUM  */
-#line 506 "engines/hypno/grammar_arc.y"
+#line 508 "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 2113 "engines/hypno/grammar_arc.cpp"
+#line 2115 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 91: /* bline: OTOK NUM NUM  */
-#line 510 "engines/hypno/grammar_arc.y"
+#line 512 "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 2124 "engines/hypno/grammar_arc.cpp"
+#line 2126 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 92: /* bline: CTOK NUM  */
-#line 516 "engines/hypno/grammar_arc.y"
+#line 518 "engines/hypno/grammar_arc.y"
                     {
 		shoot->timesToShoot = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "C %d", (yyvsp[0].i));
 	}
-#line 2133 "engines/hypno/grammar_arc.cpp"
+#line 2135 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 93: /* bline: HTOK NUM  */
-#line 520 "engines/hypno/grammar_arc.y"
+#line 522 "engines/hypno/grammar_arc.y"
                     {
 		shoot->attackFrames.push_back((yyvsp[0].i));
 		debugC(1, kHypnoDebugParser, "H %d", (yyvsp[0].i)); }
-#line 2141 "engines/hypno/grammar_arc.cpp"
+#line 2143 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 94: /* bline: VTOK NUM  */
-#line 523 "engines/hypno/grammar_arc.y"
+#line 525 "engines/hypno/grammar_arc.y"
                     { debugC(1, kHypnoDebugParser, "V %d", (yyvsp[0].i)); }
-#line 2147 "engines/hypno/grammar_arc.cpp"
+#line 2149 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 95: /* bline: VTOK  */
-#line 524 "engines/hypno/grammar_arc.y"
+#line 526 "engines/hypno/grammar_arc.y"
                { debugC(1, kHypnoDebugParser, "V"); }
-#line 2153 "engines/hypno/grammar_arc.cpp"
+#line 2155 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 96: /* bline: WTOK NUM  */
-#line 525 "engines/hypno/grammar_arc.y"
+#line 527 "engines/hypno/grammar_arc.y"
                     {
 		shoot->attackWeight = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "W %d", (yyvsp[0].i)); }
-#line 2161 "engines/hypno/grammar_arc.cpp"
+#line 2163 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 97: /* bline: DTOK NUM  */
-#line 528 "engines/hypno/grammar_arc.y"
+#line 530 "engines/hypno/grammar_arc.y"
                     {
 		shoot->pointsToShoot = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "D %d", (yyvsp[0].i));
 	}
-#line 2170 "engines/hypno/grammar_arc.cpp"
+#line 2172 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 98: /* bline: LTOK NUM NUM  */
-#line 532 "engines/hypno/grammar_arc.y"
+#line 534 "engines/hypno/grammar_arc.y"
                        {
 		debugC(1, kHypnoDebugParser, "L %d %d", (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2178 "engines/hypno/grammar_arc.cpp"
+#line 2180 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 99: /* bline: LTOK NUM  */
-#line 535 "engines/hypno/grammar_arc.y"
+#line 537 "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 2188 "engines/hypno/grammar_arc.cpp"
+#line 2190 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 100: /* bline: MTOK NUM  */
-#line 540 "engines/hypno/grammar_arc.y"
+#line 542 "engines/hypno/grammar_arc.y"
                    { debugC(1, kHypnoDebugParser, "M %d", (yyvsp[0].i));
 		shoot->missedAnimation = (yyvsp[0].i);
 	}
-#line 2196 "engines/hypno/grammar_arc.cpp"
+#line 2198 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 101: /* bline: KTOK  */
-#line 543 "engines/hypno/grammar_arc.y"
+#line 545 "engines/hypno/grammar_arc.y"
                { debugC(1, kHypnoDebugParser, "K"); }
-#line 2202 "engines/hypno/grammar_arc.cpp"
+#line 2204 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 102: /* bline: KTOK NUM  */
-#line 544 "engines/hypno/grammar_arc.y"
+#line 546 "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 2211 "engines/hypno/grammar_arc.cpp"
+#line 2213 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 103: /* bline: KTOK NUM NUM NUM  */
-#line 548 "engines/hypno/grammar_arc.y"
+#line 550 "engines/hypno/grammar_arc.y"
                            {
 		assert((yyvsp[-1].i) > (yyvsp[-2].i));
 		FrameInfo fi((yyvsp[-2].i), (yyvsp[-1].i) - (yyvsp[-2].i));
@@ -2219,20 +2221,20 @@ yyreduce:
 		shoot->explosionFrames.push_back(fi);
 		debugC(1, kHypnoDebugParser, "K %d %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2223 "engines/hypno/grammar_arc.cpp"
+#line 2225 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 104: /* bline: KTOK NUM NUM  */
-#line 555 "engines/hypno/grammar_arc.y"
+#line 557 "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 2232 "engines/hypno/grammar_arc.cpp"
+#line 2234 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 105: /* bline: SNTOK FILENAME enc  */
-#line 559 "engines/hypno/grammar_arc.y"
+#line 561 "engines/hypno/grammar_arc.y"
                              {
 		if (Common::String("S0") == (yyvsp[-2].s)) {
 			shoot->enemySound = (yyvsp[-1].s);
@@ -2248,88 +2250,88 @@ yyreduce:
 			shoot->animalSound = (yyvsp[-1].s);
 
 		debugC(1, kHypnoDebugParser, "SN %s", (yyvsp[-1].s)); }
-#line 2252 "engines/hypno/grammar_arc.cpp"
+#line 2254 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 106: /* bline: SNTOK  */
-#line 574 "engines/hypno/grammar_arc.y"
+#line 576 "engines/hypno/grammar_arc.y"
                 {
 		debugC(1, kHypnoDebugParser, "SN");
 	}
-#line 2260 "engines/hypno/grammar_arc.cpp"
+#line 2262 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 107: /* bline: GTOK  */
-#line 578 "engines/hypno/grammar_arc.y"
+#line 580 "engines/hypno/grammar_arc.y"
                { debugC(1, kHypnoDebugParser, "G"); }
-#line 2266 "engines/hypno/grammar_arc.cpp"
+#line 2268 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 108: /* bline: TTOK NUM NUM NUM  */
-#line 579 "engines/hypno/grammar_arc.y"
+#line 581 "engines/hypno/grammar_arc.y"
                            {
 		shoot->interactionFrame = (yyvsp[-2].i);
 		assert((yyvsp[-1].i) == 0);
 		shoot->waitForClickAfterInteraction = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "T %d %d %d", (yyvsp[-2].i), (yyvsp[-1].i), (yyvsp[0].i));
 	}
-#line 2277 "engines/hypno/grammar_arc.cpp"
+#line 2279 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 109: /* bline: TTOK NUM  */
-#line 585 "engines/hypno/grammar_arc.y"
+#line 587 "engines/hypno/grammar_arc.y"
                    {
 		shoot->interactionFrame = (yyvsp[0].i);
 		debugC(1, kHypnoDebugParser, "T %d", (yyvsp[0].i));
 	}
-#line 2286 "engines/hypno/grammar_arc.cpp"
+#line 2288 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 110: /* bline: TTOK  */
-#line 589 "engines/hypno/grammar_arc.y"
+#line 591 "engines/hypno/grammar_arc.y"
                {
 		shoot->isAnimal = true;
 		debugC(1, kHypnoDebugParser, "T");
 	}
-#line 2295 "engines/hypno/grammar_arc.cpp"
+#line 2297 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 111: /* bline: MTOK  */
-#line 593 "engines/hypno/grammar_arc.y"
+#line 595 "engines/hypno/grammar_arc.y"
                {
 		debugC(1, kHypnoDebugParser, "M");
 	}
-#line 2303 "engines/hypno/grammar_arc.cpp"
+#line 2305 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 112: /* bline: NTOK  */
-#line 596 "engines/hypno/grammar_arc.y"
+#line 598 "engines/hypno/grammar_arc.y"
                {
 		shoot->noEnemySound = true;
 		debugC(1, kHypnoDebugParser, "N"); }
-#line 2311 "engines/hypno/grammar_arc.cpp"
+#line 2313 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 113: /* bline: NRTOK  */
-#line 599 "engines/hypno/grammar_arc.y"
+#line 601 "engines/hypno/grammar_arc.y"
                 {
 		debugC(1, kHypnoDebugParser, "NR"); }
-#line 2318 "engines/hypno/grammar_arc.cpp"
+#line 2320 "engines/hypno/grammar_arc.cpp"
     break;
 
   case 114: /* bline: ZTOK  */
-#line 601 "engines/hypno/grammar_arc.y"
+#line 603 "engines/hypno/grammar_arc.y"
                {
 		g_parsedArc->shoots.push_back(*shoot);
 		//delete shoot;
 		//shoot = nullptr;
 		debugC(1, kHypnoDebugParser, "Z");
 	}
-#line 2329 "engines/hypno/grammar_arc.cpp"
+#line 2331 "engines/hypno/grammar_arc.cpp"
     break;
 
 
-#line 2333 "engines/hypno/grammar_arc.cpp"
+#line 2335 "engines/hypno/grammar_arc.cpp"
 
       default: break;
     }
diff --git a/engines/hypno/grammar_arc.y b/engines/hypno/grammar_arc.y
index a2cd5c86599..bc4cc3ad59f 100644
--- a/engines/hypno/grammar_arc.y
+++ b/engines/hypno/grammar_arc.y
@@ -139,7 +139,9 @@ hline: 	CTOK NUM {
 		debugC(1, kHypnoDebugParser, "D %d", $2);
 	}
 	| PTOK NUM NUM { debugC(1, kHypnoDebugParser, "P %d %d", $2, $3); }
-	| ATOK NUM NUM { debugC(1, kHypnoDebugParser, "A %d %d", $2, $3); }
+	| ATOK NUM NUM { g_parsedArc->anchor = Common::Point($2, $3);
+		debugC(1, kHypnoDebugParser, "A %d %d", $2, $3);
+	}
 	| MTOK FILENAME {
 		debugC(1, kHypnoDebugParser, "M %s", $2);
 		g_parsedArc->maskVideo = $2;
diff --git a/engines/hypno/grammar_mis.cpp b/engines/hypno/grammar_mis.cpp
index 60840809da2..3af0ed9e501 100644
--- a/engines/hypno/grammar_mis.cpp
+++ b/engines/hypno/grammar_mis.cpp
@@ -1240,7 +1240,7 @@ yyreduce:
 	if (smenu_idx)
 		delete smenu_idx;
 	smenu_idx = new Common::Array<uint32>();
-	smenu_idx->push_back(-1);
+	smenu_idx->push_back((uint32)-1);
 	if (stack)
 		delete stack;
 	stack = new Hypno::HotspotsStack();
@@ -1312,7 +1312,7 @@ yyreduce:
 		Hotspots *cur = stack->back();
 		Hotspot *hot = &(*cur)[idx];
 
-		smenu_idx->push_back(-1);
+		smenu_idx->push_back((uint32)-1);
 		hot->smenu = new Hotspots();
 		stack->push_back(hot->smenu);
 		debugC(1, kHypnoDebugParser, "SUBMENU");
diff --git a/engines/hypno/lexer_arc.cpp b/engines/hypno/lexer_arc.cpp
index d6da3615c09..2ebdae62221 100644
--- a/engines/hypno/lexer_arc.cpp
+++ b/engines/hypno/lexer_arc.cpp
@@ -879,8 +879,8 @@ char *yytext;
 #include "hypno/grammar.h"
 #include "hypno/tokens_arc.h"
 
-#line 874 "engines/hypno/lexer_arc.cpp"
-#line 875 "engines/hypno/lexer_arc.cpp"
+#line 882 "engines/hypno/lexer_arc.cpp"
+#line 883 "engines/hypno/lexer_arc.cpp"
 
 #define INITIAL 0
 
@@ -1095,9 +1095,9 @@ YY_DECL
 		}
 
 	{
-#line 42 "engines/hypno/lexer_arc.l"
+#line 50 "engines/hypno/lexer_arc.l"
 
-#line 1092 "engines/hypno/lexer_arc.cpp"
+#line 1100 "engines/hypno/lexer_arc.cpp"
 
 	while ( /*CONSTCOND*/1 )		/* loops until end-of-file is reached */
 		{
@@ -1162,306 +1162,306 @@ do_action:	/* This label is used only to access EOF actions. */
 
 case 1:
 YY_RULE_SETUP
-#line 43 "engines/hypno/lexer_arc.l"
+#line 51 "engines/hypno/lexer_arc.l"
 return NONETOK;
 	YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 44 "engines/hypno/lexer_arc.l"
+#line 52 "engines/hypno/lexer_arc.l"
 return CTOK;
 	YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 45 "engines/hypno/lexer_arc.l"
+#line 53 "engines/hypno/lexer_arc.l"
 return DTOK;
 	YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 46 "engines/hypno/lexer_arc.l"
+#line 54 "engines/hypno/lexer_arc.l"
 return HETOK;
 	YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 47 "engines/hypno/lexer_arc.l"
+#line 55 "engines/hypno/lexer_arc.l"
 return HLTOK;
 	YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 48 "engines/hypno/lexer_arc.l"
+#line 56 "engines/hypno/lexer_arc.l"
 return HUTOK;
 	YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 49 "engines/hypno/lexer_arc.l"
+#line 57 "engines/hypno/lexer_arc.l"
 HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return H12TOK;
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 50 "engines/hypno/lexer_arc.l"
+#line 58 "engines/hypno/lexer_arc.l"
 return HTOK;
 	YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 51 "engines/hypno/lexer_arc.l"
+#line 59 "engines/hypno/lexer_arc.l"
 return PTOK;
 	YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 52 "engines/hypno/lexer_arc.l"
+#line 60 "engines/hypno/lexer_arc.l"
 return ABTOK;
 	YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 53 "engines/hypno/lexer_arc.l"
+#line 61 "engines/hypno/lexer_arc.l"
 return ALTOK;
 	YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 54 "engines/hypno/lexer_arc.l"
+#line 62 "engines/hypno/lexer_arc.l"
 return AVTOK;
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 55 "engines/hypno/lexer_arc.l"
+#line 63 "engines/hypno/lexer_arc.l"
 return ATOK;
 	YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 56 "engines/hypno/lexer_arc.l"
+#line 64 "engines/hypno/lexer_arc.l"
 return VTOK;
 	YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 57 "engines/hypno/lexer_arc.l"
+#line 65 "engines/hypno/lexer_arc.l"
 return OTOK;
 	YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 58 "engines/hypno/lexer_arc.l"
+#line 66 "engines/hypno/lexer_arc.l"
 HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return ONTOK;
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 59 "engines/hypno/lexer_arc.l"
+#line 67 "engines/hypno/lexer_arc.l"
 return LTOK;
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 60 "engines/hypno/lexer_arc.l"
+#line 68 "engines/hypno/lexer_arc.l"
 return NTOK;
 	YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 61 "engines/hypno/lexer_arc.l"
+#line 69 "engines/hypno/lexer_arc.l"
 return NRTOK;
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 62 "engines/hypno/lexer_arc.l"
+#line 70 "engines/hypno/lexer_arc.l"
 return NSTOK;
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 63 "engines/hypno/lexer_arc.l"
+#line 71 "engines/hypno/lexer_arc.l"
 return MTOK;
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 64 "engines/hypno/lexer_arc.l"
+#line 72 "engines/hypno/lexer_arc.l"
 return RTOK;
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 65 "engines/hypno/lexer_arc.l"
+#line 73 "engines/hypno/lexer_arc.l"
 return R0TOK;
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 66 "engines/hypno/lexer_arc.l"
+#line 74 "engines/hypno/lexer_arc.l"
 return R1TOK;
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 67 "engines/hypno/lexer_arc.l"
+#line 75 "engines/hypno/lexer_arc.l"
 return ITOK;
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 68 "engines/hypno/lexer_arc.l"
+#line 76 "engines/hypno/lexer_arc.l"
 return I1TOK;
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 69 "engines/hypno/lexer_arc.l"
+#line 77 "engines/hypno/lexer_arc.l"
 return J0TOK;
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 70 "engines/hypno/lexer_arc.l"
+#line 78 "engines/hypno/lexer_arc.l"
 return JTOK;
 	YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 71 "engines/hypno/lexer_arc.l"
+#line 79 "engines/hypno/lexer_arc.l"
 return KTOK;
 	YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 72 "engines/hypno/lexer_arc.l"
+#line 80 "engines/hypno/lexer_arc.l"
 return GTOK;
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 73 "engines/hypno/lexer_arc.l"
+#line 81 "engines/hypno/lexer_arc.l"
 return QTOK;
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 74 "engines/hypno/lexer_arc.l"
+#line 82 "engines/hypno/lexer_arc.l"
 return UTOK;
 	YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 75 "engines/hypno/lexer_arc.l"
+#line 83 "engines/hypno/lexer_arc.l"
 return ZTOK;
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 76 "engines/hypno/lexer_arc.l"
+#line 84 "engines/hypno/lexer_arc.l"
 return WTOK;
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 77 "engines/hypno/lexer_arc.l"
+#line 85 "engines/hypno/lexer_arc.l"
 return XTOK;
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 78 "engines/hypno/lexer_arc.l"
+#line 86 "engines/hypno/lexer_arc.l"
 return TTOK;
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 79 "engines/hypno/lexer_arc.l"
+#line 87 "engines/hypno/lexer_arc.l"
 return TPTOK;
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 80 "engines/hypno/lexer_arc.l"
+#line 88 "engines/hypno/lexer_arc.l"
 return TSTOK;
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 81 "engines/hypno/lexer_arc.l"
+#line 89 "engines/hypno/lexer_arc.l"
 return TATOK;
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 82 "engines/hypno/lexer_arc.l"
+#line 90 "engines/hypno/lexer_arc.l"
 HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return FNTOK;
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 83 "engines/hypno/lexer_arc.l"
+#line 91 "engines/hypno/lexer_arc.l"
 return FTOK;
 	YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 84 "engines/hypno/lexer_arc.l"
+#line 92 "engines/hypno/lexer_arc.l"
 HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return SNTOK;
 	YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 85 "engines/hypno/lexer_arc.l"
+#line 93 "engines/hypno/lexer_arc.l"
 HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return SNTOK;
 	YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 86 "engines/hypno/lexer_arc.l"
+#line 94 "engines/hypno/lexer_arc.l"
 return A0TOK;
 	YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 87 "engines/hypno/lexer_arc.l"
+#line 95 "engines/hypno/lexer_arc.l"
 HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return BNTOK;
 	YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 88 "engines/hypno/lexer_arc.l"
+#line 96 "engines/hypno/lexer_arc.l"
 return KNTOK;
 	YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 89 "engines/hypno/lexer_arc.l"
+#line 97 "engines/hypno/lexer_arc.l"
 return P0TOK;
 	YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 90 "engines/hypno/lexer_arc.l"
+#line 98 "engines/hypno/lexer_arc.l"
 HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return YXTOK;
 	YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 91 "engines/hypno/lexer_arc.l"
+#line 99 "engines/hypno/lexer_arc.l"
 HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return ENCTOK;
 	YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 92 "engines/hypno/lexer_arc.l"
+#line 100 "engines/hypno/lexer_arc.l"
 HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return ENCTOK;
 	YY_BREAK
 case 51:
 YY_RULE_SETUP
-#line 93 "engines/hypno/lexer_arc.l"
+#line 101 "engines/hypno/lexer_arc.l"
 HYPNO_ARC_lval.i = atoi(HYPNO_ARC_text); return NUM;
 	YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 94 "engines/hypno/lexer_arc.l"
+#line 102 "engines/hypno/lexer_arc.l"
 HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return NAME;
 	YY_BREAK
 case 53:
 YY_RULE_SETUP
-#line 95 "engines/hypno/lexer_arc.l"
+#line 103 "engines/hypno/lexer_arc.l"
 HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return FILENAME;
 	YY_BREAK
 case 54:
 YY_RULE_SETUP
-#line 96 "engines/hypno/lexer_arc.l"
+#line 104 "engines/hypno/lexer_arc.l"
 HYPNO_ARC_lval.s = scumm_strdup(HYPNO_ARC_text); return FILENAME;
 	YY_BREAK
 case 55:
 YY_RULE_SETUP
-#line 97 "engines/hypno/lexer_arc.l"
+#line 105 "engines/hypno/lexer_arc.l"
 return RESTOK;
 	YY_BREAK
 case 56:
 /* rule 56 can match eol */
 YY_RULE_SETUP
-#line 98 "engines/hypno/lexer_arc.l"
+#line 106 "engines/hypno/lexer_arc.l"
 return RETTOK;
 	YY_BREAK
 case 57:
 YY_RULE_SETUP
-#line 99 "engines/hypno/lexer_arc.l"
+#line 107 "engines/hypno/lexer_arc.l"
 /* ignore comment */
 	YY_BREAK
 case 58:
 YY_RULE_SETUP
-#line 100 "engines/hypno/lexer_arc.l"
+#line 108 "engines/hypno/lexer_arc.l"
 /* ignore whitespace */;
 	YY_BREAK
 case 59:
 YY_RULE_SETUP
-#line 101 "engines/hypno/lexer_arc.l"
+#line 109 "engines/hypno/lexer_arc.l"
 HYPNO_ARC_lval.i = HYPNO_ARC_text[0]; return BYTE;
 	YY_BREAK
 case 60:
 YY_RULE_SETUP
-#line 102 "engines/hypno/lexer_arc.l"
+#line 110 "engines/hypno/lexer_arc.l"
 ECHO;
 	YY_BREAK
-#line 1456 "engines/hypno/lexer_arc.cpp"
+#line 1464 "engines/hypno/lexer_arc.cpp"
 case YY_STATE_EOF(INITIAL):
 	yyterminate();
 
@@ -2438,7 +2438,7 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 102 "engines/hypno/lexer_arc.l"
+#line 110 "engines/hypno/lexer_arc.l"
 
 
 namespace Hypno {
diff --git a/engines/hypno/lexer_mis.cpp b/engines/hypno/lexer_mis.cpp
index f5b2dd1c9ce..e3fd96d4a7d 100644
--- a/engines/hypno/lexer_mis.cpp
+++ b/engines/hypno/lexer_mis.cpp
@@ -909,8 +909,8 @@ char *yytext;
 #include "hypno/grammar.h"
 #include "hypno/tokens_mis.h"
 
-#line 904 "engines/hypno/lexer_mis.cpp"
-#line 905 "engines/hypno/lexer_mis.cpp"
+#line 912 "engines/hypno/lexer_mis.cpp"
+#line 913 "engines/hypno/lexer_mis.cpp"
 
 #define INITIAL 0
 
@@ -1125,9 +1125,9 @@ YY_DECL
 		}
 
 	{
-#line 41 "engines/hypno/lexer_mis.l"
+#line 49 "engines/hypno/lexer_mis.l"
 
-#line 1122 "engines/hypno/lexer_mis.cpp"
+#line 1130 "engines/hypno/lexer_mis.cpp"
 
 	while ( /*CONSTCOND*/1 )		/* loops until end-of-file is reached */
 		{
@@ -1192,261 +1192,261 @@ do_action:	/* This label is used only to access EOF actions. */
 
 case 1:
 YY_RULE_SETUP
-#line 42 "engines/hypno/lexer_mis.l"
+#line 50 "engines/hypno/lexer_mis.l"
 /* return COMMENT; */
 	YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 43 "engines/hypno/lexer_mis.l"
+#line 51 "engines/hypno/lexer_mis.l"
 /* return COMMENT; */
 	YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 44 "engines/hypno/lexer_mis.l"
+#line 52 "engines/hypno/lexer_mis.l"
 return MENUTOK;
 	YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 45 "engines/hypno/lexer_mis.l"
+#line 53 "engines/hypno/lexer_mis.l"
 return AMBITOK;
 	YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 46 "engines/hypno/lexer_mis.l"
+#line 54 "engines/hypno/lexer_mis.l"
 return BACKTOK;
 	YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 47 "engines/hypno/lexer_mis.l"
+#line 55 "engines/hypno/lexer_mis.l"
 return CUTSTOK;
 	YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 48 "engines/hypno/lexer_mis.l"
+#line 56 "engines/hypno/lexer_mis.l"
 return GLOBTOK;
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 49 "engines/hypno/lexer_mis.l"
+#line 57 "engines/hypno/lexer_mis.l"
 return PALETOK;
 	YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 50 "engines/hypno/lexer_mis.l"
+#line 58 "engines/hypno/lexer_mis.l"
 return HOTSTOK;
 	YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 51 "engines/hypno/lexer_mis.l"
+#line 59 "engines/hypno/lexer_mis.l"
 return MICETOK;
 	YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 52 "engines/hypno/lexer_mis.l"
+#line 60 "engines/hypno/lexer_mis.l"
 return ENDTOK;
 	YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 53 "engines/hypno/lexer_mis.l"
+#line 61 "engines/hypno/lexer_mis.l"
 return TIMETOK;
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 54 "engines/hypno/lexer_mis.l"
+#line 62 "engines/hypno/lexer_mis.l"
 return OVERTOK;
 	YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 55 "engines/hypno/lexer_mis.l"
+#line 63 "engines/hypno/lexer_mis.l"
 return SMENTOK;
 	YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 56 "engines/hypno/lexer_mis.l"
+#line 64 "engines/hypno/lexer_mis.l"
 return ESCPTOK;
 	YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 57 "engines/hypno/lexer_mis.l"
+#line 65 "engines/hypno/lexer_mis.l"
 return PLAYTOK;
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 58 "engines/hypno/lexer_mis.l"
+#line 66 "engines/hypno/lexer_mis.l"
 return SONDTOK;
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 59 "engines/hypno/lexer_mis.l"
+#line 67 "engines/hypno/lexer_mis.l"
 return TALKTOK;
 	YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 60 "engines/hypno/lexer_mis.l"
+#line 68 "engines/hypno/lexer_mis.l"
 return INACTOK;
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 61 "engines/hypno/lexer_mis.l"
+#line 69 "engines/hypno/lexer_mis.l"
 return FDTOK;
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 62 "engines/hypno/lexer_mis.l"
+#line 70 "engines/hypno/lexer_mis.l"
 return BOXXTOK;
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 63 "engines/hypno/lexer_mis.l"
+#line 71 "engines/hypno/lexer_mis.l"
 return MPTRTOK;
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 64 "engines/hypno/lexer_mis.l"
+#line 72 "engines/hypno/lexer_mis.l"
 return ESCAPETOK;
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 65 "engines/hypno/lexer_mis.l"
+#line 73 "engines/hypno/lexer_mis.l"
 return SECONDTOK;
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 66 "engines/hypno/lexer_mis.l"
+#line 74 "engines/hypno/lexer_mis.l"
 return INTROTOK;
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 67 "engines/hypno/lexer_mis.l"
+#line 75 "engines/hypno/lexer_mis.l"
 return INTRTOK;
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 68 "engines/hypno/lexer_mis.l"
+#line 76 "engines/hypno/lexer_mis.l"
 return SWPTTOK;
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 69 "engines/hypno/lexer_mis.l"
+#line 77 "engines/hypno/lexer_mis.l"
 return DEFAULTTOK;
 	YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 70 "engines/hypno/lexer_mis.l"
+#line 78 "engines/hypno/lexer_mis.l"
 HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return WALNTOK;
 	YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 71 "engines/hypno/lexer_mis.l"
+#line 79 "engines/hypno/lexer_mis.l"
 HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PS;
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 72 "engines/hypno/lexer_mis.l"
+#line 80 "engines/hypno/lexer_mis.l"
 HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PG;
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 73 "engines/hypno/lexer_mis.l"
+#line 81 "engines/hypno/lexer_mis.l"
 HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PP;
 	YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 74 "engines/hypno/lexer_mis.l"
+#line 82 "engines/hypno/lexer_mis.l"
 HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PI;
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 75 "engines/hypno/lexer_mis.l"
+#line 83 "engines/hypno/lexer_mis.l"
 HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PH;
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 76 "engines/hypno/lexer_mis.l"
+#line 84 "engines/hypno/lexer_mis.l"
 HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PA;
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 77 "engines/hypno/lexer_mis.l"
+#line 85 "engines/hypno/lexer_mis.l"
 HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PD;
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 78 "engines/hypno/lexer_mis.l"
+#line 86 "engines/hypno/lexer_mis.l"
 HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return PF;
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 79 "engines/hypno/lexer_mis.l"
+#line 87 "engines/hypno/lexer_mis.l"
 return PE;
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 80 "engines/hypno/lexer_mis.l"
+#line 88 "engines/hypno/lexer_mis.l"
 return PL;
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 81 "engines/hypno/lexer_mis.l"
+#line 89 "engines/hypno/lexer_mis.l"
 HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return ENCTOK;
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 82 "engines/hypno/lexer_mis.l"
+#line 90 "engines/hypno/lexer_mis.l"
 HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return ENCTOK;
 	YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 83 "engines/hypno/lexer_mis.l"
+#line 91 "engines/hypno/lexer_mis.l"
 HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return GSSWITCH;
 	YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 84 "engines/hypno/lexer_mis.l"
+#line 92 "engines/hypno/lexer_mis.l"
 return BBOXTOK;
 	YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 85 "engines/hypno/lexer_mis.l"
+#line 93 "engines/hypno/lexer_mis.l"
 HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return FLAG;
 	YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 86 "engines/hypno/lexer_mis.l"
+#line 94 "engines/hypno/lexer_mis.l"
 HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return NAME;
 	YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 87 "engines/hypno/lexer_mis.l"
+#line 95 "engines/hypno/lexer_mis.l"
 HYPNO_MIS_lval.s = scumm_strdup(HYPNO_MIS_text); return FILENAME;
 	YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 88 "engines/hypno/lexer_mis.l"
+#line 96 "engines/hypno/lexer_mis.l"
 HYPNO_MIS_lval.i = atoi(HYPNO_MIS_text); return NUM;
 	YY_BREAK
 case 48:
 /* rule 48 can match eol */
 YY_RULE_SETUP
-#line 89 "engines/hypno/lexer_mis.l"
+#line 97 "engines/hypno/lexer_mis.l"
 return RETTOK;
 	YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 90 "engines/hypno/lexer_mis.l"
+#line 98 "engines/hypno/lexer_mis.l"
 /* ignore whitespace */;
 	YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 91 "engines/hypno/lexer_mis.l"
+#line 99 "engines/hypno/lexer_mis.l"
 debugC(1, Hypno::kHypnoDebugParser, "<no match: %c>", *yytext); return *yytext;
 	YY_BREAK
 case 51:
 YY_RULE_SETUP
-#line 92 "engines/hypno/lexer_mis.l"
+#line 100 "engines/hypno/lexer_mis.l"
 ECHO;
 	YY_BREAK
-#line 1441 "engines/hypno/lexer_mis.cpp"
+#line 1449 "engines/hypno/lexer_mis.cpp"
 case YY_STATE_EOF(INITIAL):
 	yyterminate();
 
@@ -2423,7 +2423,7 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 92 "engines/hypno/lexer_mis.l"
+#line 100 "engines/hypno/lexer_mis.l"
 
 
 namespace Hypno {




More information about the Scummvm-git-logs mailing list