[Scummvm-git-logs] scummvm master -> 958df59b87af601628c4bde97953526712876205

neuromancer neuromancer at users.noreply.github.com
Sat Nov 6 17:18:07 UTC 2021


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

Summary:
958df59b87 HYPNO: refactored scene loading and avoid repeating the same cutscenes


Commit: 958df59b87af601628c4bde97953526712876205
    https://github.com/scummvm/scummvm/commit/958df59b87af601628c4bde97953526712876205
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2021-11-06T18:17:27+01:00

Commit Message:
HYPNO: refactored scene loading and avoid repeating the same cutscenes

Changed paths:
    engines/hypno/actions.cpp
    engines/hypno/grammar_mis.cpp
    engines/hypno/grammar_mis.y
    engines/hypno/hypno.h
    engines/hypno/scene.cpp
    engines/hypno/spider/spider.cpp


diff --git a/engines/hypno/actions.cpp b/engines/hypno/actions.cpp
index 1b21326cb8..5268294e2b 100644
--- a/engines/hypno/actions.cpp
+++ b/engines/hypno/actions.cpp
@@ -48,6 +48,14 @@ void HypnoEngine::runMenu(Hotspots hs) {
 			case AmbientAction: 
 				runAmbient((Ambient *)action);
 			break;
+			case CutsceneAction: {
+				// Should not repeat the same
+				Cutscene *cutscene = (Cutscene *) action; 
+				if (!_intros.contains(cutscene->path))
+				 	runCutscene(cutscene);
+				_intros[cutscene->path] = true;
+			}
+			break;
 
 			default:
 			break;
diff --git a/engines/hypno/grammar_mis.cpp b/engines/hypno/grammar_mis.cpp
index aee1000be4..9aa8f2bf42 100644
--- a/engines/hypno/grammar_mis.cpp
+++ b/engines/hypno/grammar_mis.cpp
@@ -1513,7 +1513,7 @@ yyreduce:
   case 17:
 #line 166 "engines/hypno/grammar_mis.y" /* yacc.c:1646  */
     { 
-		Cutscene *a = new Cutscene((yyvsp[-2].s));
+		Cutscene *a = new Cutscene(Common::String("cine/") + (yyvsp[-2].s));
 		Hotspots *cur = stack.back();
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);
diff --git a/engines/hypno/grammar_mis.y b/engines/hypno/grammar_mis.y
index 6fc1010524..ac6d363693 100644
--- a/engines/hypno/grammar_mis.y
+++ b/engines/hypno/grammar_mis.y
@@ -164,7 +164,7 @@ line: MENUTOK mflag mflag  {
 		debugC(1, kHypnoDebugParser, "PALE");
 	}
 	|  INTRTOK FILENAME NUM NUM { 
-		Cutscene *a = new Cutscene($2);
+		Cutscene *a = new Cutscene(Common::String("cine/") + $2);
 		Hotspots *cur = stack.back();
 		Hotspot *hot = &cur->back();
 		hot->actions.push_back(a);
diff --git a/engines/hypno/hypno.h b/engines/hypno/hypno.h
index 3780bb2b4d..faa0cea08e 100644
--- a/engines/hypno/hypno.h
+++ b/engines/hypno/hypno.h
@@ -93,10 +93,10 @@ public:
 
 	// Parsing
 	void splitArcadeFile(const Common::String &filename, Common::String &arc, Common::String &list);
-	void parseScene(const Common::String &prefix, const Common::String &filename);
 	void parseArcadeShooting(const Common::String &prefix, const Common::String &name, const Common::String &data);
 	ShootSequence parseShootList(const Common::String &name, const Common::String &data);
 	void loadArcadeLevel(const Common::String &current, const Common::String &next, const Common::String &prefix);
+	void loadSceneLevel(const Common::String &current, const Common::String &next, const Common::String &prefix);
 	LibFile *loadLib(const Filename &prefix, const Filename &filename, bool encrypted);
 
 	// User input
@@ -159,7 +159,7 @@ public:
 	void drawScreen();
 
 	// intros
-	Common::HashMap<Common::String, Videos> _intros;
+	Common::HashMap<Filename, bool> _intros;
 
 	// levels
 	Common::String _nextLevel;
diff --git a/engines/hypno/scene.cpp b/engines/hypno/scene.cpp
index 845add4708..019c6caf49 100644
--- a/engines/hypno/scene.cpp
+++ b/engines/hypno/scene.cpp
@@ -59,11 +59,11 @@ const static char *sceneVariables[] = {
 	NULL
 };
 
-void HypnoEngine::parseScene(const Common::String &prefix, const Common::String &filename) {
-	debugC(1, kHypnoDebugParser, "Parsing %s", filename.c_str());
-	Common::String name = convertPath(filename);
-	if (!prefix.empty())
-		name = prefix + "/" + name;
+void HypnoEngine::loadSceneLevel(const Common::String &current, const Common::String &next, const Common::String &prefix) {
+	debugC(1, kHypnoDebugParser, "Parsing %s", current.c_str());
+	Common::String name = convertPath(current);
+	// if (!prefix.empty())
+	// 	name = prefix + "/" + name;
 
 	Common::File test;
 	if (!test.open(name.c_str()))
@@ -78,6 +78,7 @@ void HypnoEngine::parseScene(const Common::String &prefix, const Common::String
 	parse_mis(buf);
 	Level level;
 	level.scene.prefix = prefix;
+	level.scene.levelIfWin = next;
 	level.scene.hots = *g_parsedHots;
 	_levels[name] = level;
 	free(buf);
@@ -241,6 +242,7 @@ void HypnoEngine::runScene(Scene &scene) {
 	_nextLoopingVideoToPlay.clear();
 	_nextParallelVideoToPlay.clear();
 	_nextSequentialVideoToPlay.clear();
+	_intros.clear();
 
 	_refreshConversation = false;
 	_conversation.clear();
diff --git a/engines/hypno/spider/spider.cpp b/engines/hypno/spider/spider.cpp
index 61399d9314..e6cb07d5e4 100644
--- a/engines/hypno/spider/spider.cpp
+++ b/engines/hypno/spider/spider.cpp
@@ -41,6 +41,7 @@ void SpiderEngine::loadAssets() {
 void SpiderEngine::loadAssetsFullGame() {
 
 	Common::Language language = Common::parseLanguage(ConfMan.get("language"));
+	Common::String prefix = "spider";
 	if (language == Common::EN_USA) {
 		if (!_installerArchive.open("DATA.Z"))
 			error("Failed to open DATA.Z");
@@ -53,31 +54,19 @@ void SpiderEngine::loadAssetsFullGame() {
 	if (missions == nullptr || missions->listMembers(files) == 0)
 		error("Failed to load any file from missions.lib");
 
-	parseScene("", "mainmenu.mi_");
-	_levels["mainmenu.mi_"].scene.prefix = "spider";
+	loadSceneLevel("mainmenu.mi_", "", prefix);
+	loadSceneLevel("tryagain.mi_", "", prefix);
+	loadSceneLevel("options.mi_", "", prefix);
+	loadSceneLevel("levels.mi_", "mv0t.mi_", prefix);
+	loadSceneLevel("combmenu.mi_", "", prefix);
 
-	parseScene("", "options.mi_");
-	_levels["options.mi_"].scene.prefix = "spider";
-
-	parseScene("", "levels.mi_");
-	_levels["levels.mi_"].scene.prefix = "spider";
-	_levels["levels.mi_"].scene.levelIfWin = "mv0t.mi_";
-
-	parseScene("", "combmenu.mi_");
-	_levels["combmenu.mi_"].scene.prefix = "spider";
-
-	parseScene("", "mv0t.mi_");
-	_levels["mv0t.mi_"].scene.prefix = "spider";
+	loadSceneLevel("mv0t.mi_", "roof.mi_", prefix);
 	_levels["mv0t.mi_"].scene.intro = "cine/ints001s.smk";
-	_levels["mv0t.mi_"].scene.levelIfWin = "roof.mi_";
-
-	parseScene("", "roof.mi_");
-	_levels["roof.mi_"].scene.prefix = "spider";
-	_levels["roof.mi_"].scene.levelIfWin = "decide1.mi_";
 
+	loadSceneLevel("roof.mi_", "decide1.mi_", prefix);
 
-	parseScene("", "decide1.mi_");
-	_levels["decide1.mi_"].scene.prefix = "spider";
+	loadSceneLevel("decide1.mi_", "", prefix);
+	// _levels["decide1.mi_"].scene.prefix = "spider";
 
 	// loadArcadeLevel("c1", "", "spider");
 	// loadArcadeLevel("c2", "", "spider");
@@ -152,7 +141,7 @@ void SpiderEngine::loadAssetsDemo() {
 	loadLib("sixdemo/demo/sound.lib/", "sixdemo/demo/sound.lib", true);
 
 	// Read assets from mis files
-	parseScene("sixdemo", "mis/demo.mis");
+	loadSceneLevel("mis/demo.mis", "", "sixdemo");
 	ChangeLevel *cl = new ChangeLevel("c1.mi_");
 	_levels["sixdemo/mis/demo.mis"].scene.hots[1].actions.push_back(cl);
 
@@ -169,17 +158,17 @@ void SpiderEngine::loadAssetsDemo() {
 	_levels["sixdemo/mis/demo.mis"].scene.hots[5].actions.push_back(cl);
 	_levels["sixdemo/mis/demo.mis"].scene.sound = "demo/sound.lib/menu_mus.raw";
 
-	parseScene("sixdemo", "mis/order.mis");
+	loadSceneLevel("mis/order.mis", "", "sixdemo");
 	cl = new ChangeLevel("<quit>");
 	_levels["sixdemo/mis/order.mis"].scene.hots[1].actions.push_back(cl);
 
-	parseScene("sixdemo", "mis/alley.mis");
+	loadSceneLevel("mis/alley.mis", "", "sixdemo");
 	_levels["sixdemo/mis/alley.mis"].scene.intro = "demo/aleyc01s.smk";
 	_levels["sixdemo/mis/alley.mis"].scene.sound = "demo/sound.lib/alleymus.raw";
 	_levels["sixdemo/mis/alley.mis"].scene.levelIfWin = "sixdemo/mis/demo.mis";
 	_levels["sixdemo/mis/alley.mis"].scene.levelIfLose = "sixdemo/mis/demo.mis";
 
-	parseScene("sixdemo", "mis/shoctalk.mis");
+	loadSceneLevel("mis/shoctalk.mis", "", "sixdemo");
 
 	Level matrix;
 	matrix.code.name = "sixdemo/puz_matr";




More information about the Scummvm-git-logs mailing list