[Scummvm-git-logs] scummvm master -> 44bc37764a1580ba506eb70ca57b0d7313e3deb0

neuromancer noreply at scummvm.org
Sat Dec 25 17:49:59 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:
44bc37764a HYPNO: added fuse box puzzle and some intros


Commit: 44bc37764a1580ba506eb70ca57b0d7313e3deb0
    https://github.com/scummvm/scummvm/commit/44bc37764a1580ba506eb70ca57b0d7313e3deb0
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2021-12-25T18:49:30+01:00

Commit Message:
HYPNO: added fuse box puzzle and some intros

Changed paths:
    engines/hypno/hypno.h
    engines/hypno/spider/hard.cpp
    engines/hypno/spider/spider.cpp


diff --git a/engines/hypno/hypno.h b/engines/hypno/hypno.h
index 642df3360d..8e362b28e5 100644
--- a/engines/hypno/hypno.h
+++ b/engines/hypno/hypno.h
@@ -303,6 +303,7 @@ private:
 	void runOffice(Code *code);
 	void runFileCabinet(Code *code);
 	void runLock(Code *code);
+	void runFuseBox(Code *code);
 
 	bool isFuseRust = true;
 	bool isFuseUnreadable = false;
diff --git a/engines/hypno/spider/hard.cpp b/engines/hypno/spider/hard.cpp
index b60b80cd25..fd6d1e2411 100644
--- a/engines/hypno/spider/hard.cpp
+++ b/engines/hypno/spider/hard.cpp
@@ -41,6 +41,8 @@ void SpiderEngine::runCode(Code *code) {
 		runFileCabinet(code);
 	else if (code->name == "<lock>") 
 		runLock(code);
+	else if (code->name == "<fuse_box>")
+		runFuseBox(code);
 	else if (code->name == "<credits>")
 		showCredits();
 	else
@@ -619,6 +621,160 @@ void SpiderEngine::runLock(Code *code) {
 }
 
 
+void SpiderEngine::runFuseBox(Code *code) {
+	changeScreenMode("640x480");
+	Common::Point mousePos;
+	Common::Event event;
+
+	defaultCursor();
+
+	bool hdata[8][9] = {};
+	bool vdata[9][8] = {};
+
+	bool vsol[9][8] = {
+		{0, 0, 0, 0, 0, 0, 0, 0},
+		{0, 1, 1, 1, 0, 0, 0, 0},
+		{0, 0, 0, 0, 0, 0, 0, 0},
+		{0, 0, 0, 0, 0, 0, 0, 0},
+		{0, 0, 0, 0, 1, 1, 1, 0},
+		{0, 1, 1, 1, 1, 1, 1, 0},
+		{0, 0, 0, 0, 0, 0, 0, 0},
+		{0, 1, 1, 1, 0, 0, 0, 0},
+		{0, 0, 0, 0, 0, 0, 0, 0},
+	};
+
+	bool hsol[8][9] = {
+		{0, 0, 0, 0, 0, 0, 0, 0, 0},
+		{0, 1, 0, 0, 1, 0, 0, 1, 0},
+		{0, 1, 0, 0, 1, 0, 0, 1, 0},
+		{0, 1, 0, 0, 1, 0, 0, 1, 0},
+		{0, 0, 0, 0, 0, 0, 0, 0, 0},
+		{0, 1, 0, 0, 1, 0, 0, 0, 0},
+		{0, 1, 0, 0, 1, 0, 0, 0, 0},
+		{0, 0, 0, 0, 0, 0, 0, 0, 0},
+	};
+
+	Common::Rect matrix(289, 89, 551, 351);
+	Common::Point fuse(292, 87);
+	Common::Point vz(289, 89);
+	Common::Point hz(289, 89);
+
+	uint32 dxVert = 412 - 380;
+	uint32 dyVert = 120 - 88;
+
+	uint32 dxHoriz = 359 - 327;
+	uint32 dyHoriz = 146 - 114;
+
+	Common::Rect vcell(0, 0, 8, 32);
+	Common::Rect hcell(0, 0, 32, 8);
+
+	loadImage("spider/movie2/hfusebg.smk", 0, 0, false);
+	Frames fuses = decodeFrames("spider/movie2/onoffuse.smk");
+	//drawImage(*fuses[1], matrix.left, matrix.top, true);
+
+	while (!shouldQuit()) {
+
+		while (g_system->getEventManager()->pollEvent(event)) {
+			mousePos = g_system->getEventManager()->getMousePos();
+			// Events
+			switch (event.type) {
+
+			case Common::EVENT_QUIT:
+			case Common::EVENT_RETURN_TO_LAUNCHER:
+				break;
+
+			case Common::EVENT_LBUTTONDOWN:
+				if (matrix.contains(mousePos)) {
+					loadImage("spider/movie2/hfusebg.smk", 0, 0, false);
+
+					//drawImage(*fuses[1], matrix.left, matrix.top, true);
+					//bool found = false;
+					debug("\nvdata:");
+					for (int i = 0; i < 9; i++) {
+						for (int j = 0; j < 8; j++) {
+							vcell.moveTo(vz.x + i*dxVert, vz.y + j*dyVert);
+							if (vcell.contains(mousePos.x, mousePos.y)) {
+								vdata[i][j] = !vdata[i][j];
+							}
+							debugN("%d, ", vdata[i][j]);
+						}
+						debugN("\n");
+					}
+
+					debug("\nhdata:");
+					for (int i = 0; i < 8; i++) {
+						for (int j = 0; j < 9; j++) {
+							hcell.moveTo(hz.x + i*dxHoriz, hz.y + j*dyHoriz);
+							if (hcell.contains(mousePos.x, mousePos.y)) {
+								hdata[i][j] = !hdata[i][j];
+							}
+							debugN("%d, ", hdata[i][j]);
+						}
+						debugN("\n");
+					}
+
+					for (int i = 0; i < 9; i++) {
+						for (int j = 0; j < 8; j++) {
+							if (vdata[i][j]) {
+								vcell.moveTo(i*dxVert, j*dyVert);
+								Graphics::Surface sub = fuses[0]->getSubArea(vcell);
+								drawImage(sub, vz.x + i*dxVert, vz.y + j*dyVert, true);
+							}
+						}
+					}
+
+					for (int i = 0; i < 8; i++) {
+						for (int j = 0; j < 9; j++) {	
+							if (hdata[i][j]) {
+								hcell.moveTo(i*dxHoriz, j*dyHoriz);
+								Graphics::Surface sub = fuses[0]->getSubArea(hcell);
+								drawImage(sub, hz.x + i*dxHoriz, hz.y + j*dyHoriz, true);
+								//debug("Found horizontal fuse between %d, %d and %d, %d", i, j, i + 1, j);
+							}
+						}
+					}
+				}
+				break;
+
+			default:
+				break;
+			}
+		}
+
+		bool hfound = true;
+		for (int i = 0; i < 8; i++) {
+			for (int j = 0; j < 9; j++) {
+				if (hdata[i][j] != hsol[i][j]) {
+					hfound = false;
+					break;
+				}
+			}
+			if (!hfound)
+				break;
+		}
+
+		bool vfound = true;
+		for (int i = 0; i < 9; i++) {
+			for (int j = 0; j < 8; j++) {
+				if (vdata[i][j] != vsol[i][j]) {
+					vfound = false;
+					break;
+				}
+			}
+			if (!vfound)
+				break;
+		}
+
+		if (hfound && vfound) {
+			_nextLevel = code->levelIfWin;
+			return;
+		}
+
+		drawScreen();
+		g_system->delayMillis(10);
+	}
+}
+
 void SpiderEngine::showCredits() {
 	changeScreenMode("640x480");
 	MVideo video("cine/credits.smk", Common::Point(0, 0), false, false, false);
diff --git a/engines/hypno/spider/spider.cpp b/engines/hypno/spider/spider.cpp
index 4011a86f27..bc490a77f7 100644
--- a/engines/hypno/spider/spider.cpp
+++ b/engines/hypno/spider/spider.cpp
@@ -330,8 +330,21 @@ void SpiderEngine::loadAssetsFullGame() {
 	sc->hots[2].actions.push_back(cl);
 
 	loadSceneLevel("movie3.mi_", "movie4.mi_", prefix);
-	loadSceneLevel("movie4.mi_", "", prefix);
-
+	_levels["movie3.mi_"]->intros.push_back("cine/imss001s.smk");
+	loadSceneLevel("movie4.mi_", "<fuse_box>", prefix);
+	_levels["movie4.mi_"]->intros.push_back("cine/imss002s.smk");
+	Code *fuse_box = new Code();
+	fuse_box->name = "<fuse_box>";
+	fuse_box->levelIfWin = "<trans_fuse_box>";
+	_levels["<fuse_box>"] = fuse_box;
+
+	Transition *trans_fuse_box = new Transition("decide6.mi_");
+	trans_fuse_box->intros.push_back("spider/cine/dia009s.smk");
+	trans_fuse_box->intros.push_back("spider/cine/imss003s.smk");
+	_levels["<trans_fuse_box>"] = trans_fuse_box;
+
+	loadSceneLevel("decide6.mi_", "", prefix);
+	loadSceneLevel("decide10.mi_", "", prefix);
 
 	// No c7 level?
 	loadArcadeLevel("c8.mi_", "", prefix);
@@ -438,7 +451,7 @@ void SpiderEngine::loadAssetsFullGame() {
 	over_apt_5->intros.push_back("spider/cine/apts05as.smk");
 	_levels["<over_apt_5>"] = over_apt_5;
 	
-	_nextLevel = "decide5.mi_";
+	_nextLevel = "<start>";
 }
 
 void SpiderEngine::loadAssetsDemo() {




More information about the Scummvm-git-logs mailing list