[Scummvm-git-logs] scummvm master -> 60e379268dd2c234508953c3b08df2811c4351fc

neuromancer noreply at scummvm.org
Sun Mar 6 17:01:27 UTC 2022


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:
60e379268d HYPNO: added mission statistics screen in wet


Commit: 60e379268dd2c234508953c3b08df2811c4351fc
    https://github.com/scummvm/scummvm/commit/60e379268dd2c234508953c3b08df2811c4351fc
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2022-03-06T17:53:28+01:00

Commit Message:
HYPNO: added mission statistics screen in wet

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


diff --git a/engines/hypno/arcade.cpp b/engines/hypno/arcade.cpp
index 1e99d9cce4d..8f65c8ba88c 100644
--- a/engines/hypno/arcade.cpp
+++ b/engines/hypno/arcade.cpp
@@ -168,6 +168,7 @@ void HypnoEngine::hitPlayer() { error("Function \"%s\" not implemented", __FUNCT
 void HypnoEngine::missTarget(Shoot *s, ArcadeShooting *arc, MVideo &background) {}
 
 void HypnoEngine::runBeforeArcade(ArcadeShooting *arc) {}
+void HypnoEngine::runAfterArcade(ArcadeShooting *arc) {}
 
 void HypnoEngine::initSegment(ArcadeShooting *arc) { error("Function \"%s\" not implemented", __FUNCTION__); }
 void HypnoEngine::findNextSegment(ArcadeShooting *arc) { error("Function \"%s\" not implemented", __FUNCTION__); }
@@ -177,6 +178,9 @@ void HypnoEngine::runArcade(ArcadeShooting *arc) {
 	Common::Point mousePos;
 	Common::List<uint32> shootsToRemove;
 
+	// statistics
+	resetStatistics();
+
 	// segment/shoots
 	Segments segments = arc->segments;
 	initSegment(arc);
@@ -397,6 +401,7 @@ void HypnoEngine::runArcade(ArcadeShooting *arc) {
 			//debug("%d %d", si.timestamp, idx);
 			if ((int)si.timestamp <= idx) {
 				_shootSequence.pop_front();
+				incEnemyTargets();
 				for (Shoots::iterator it = arc->shoots.begin(); it != arc->shoots.end(); ++it) {
 					if (it->name == si.name) {
 						Shoot s = *it;
@@ -451,6 +456,7 @@ void HypnoEngine::runArcade(ArcadeShooting *arc) {
 				uint32 bodyLastFrame = it->bodyFrames[it->bodyFrames.size() - 1].lastFrame();
 				if (frame > 0 && frame >= (int)(bodyLastFrame - 3) && !it->destroyed) {
 					missTarget(it, arc, background);
+					incTargetsMissed();
 					// No need to pop attackFrames or explosionFrames
 					skipVideo(*it->video);
 				} else if (frame > 0 && frame >= (int)(it->lastFrame)) {
@@ -536,11 +542,13 @@ void HypnoEngine::drawCursorArcade(const Common::Point &mousePos) {
 bool HypnoEngine::clickedPrimaryShoot(const Common::Point &mousePos) { return true; }
 
 void HypnoEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc, MVideo &background) {
+	incShotsFired();
 	int i = detectTarget(mousePos);
 	if (i >= 0) {
 		if (!_shoots[i].hitSound.empty())
 			playSound(_soundPath + _shoots[i].hitSound, 1);
 
+		incEnemyHits();
 		if (_shoots[i].timesToShoot > 1) {
 			_shoots[i].timesToShoot = _shoots[i].timesToShoot - 1;
 			return;
@@ -548,7 +556,10 @@ void HypnoEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc, MVid
 
 		if (!_shoots[i].deathSound.empty())
 			playSound(_soundPath + _shoots[i].deathSound, 1);
-		_score = _score + _shoots[i].pointsToShoot;
+
+		incTargetsDestroyed();
+		incScore(_shoots[i].pointsToShoot);
+		incBonus(_shoots[i].pointsToShoot);
 		_shoots[i].destroyed = true;
 
 		if (_shoots[i].animation != "NONE") {
@@ -601,6 +612,55 @@ void HypnoEngine::shoot(const Common::Point &mousePos, ArcadeShooting *arc, MVid
 	}
 }
 
+void HypnoEngine::incBonus(int inc) {
+	_bonus = _bonus + inc;
+}
+
+void HypnoEngine::incScore(int inc) {
+	_score = _score + inc;
+}
+
+void HypnoEngine::incShotsFired() {
+	_shootsFired++;
+}
+
+void HypnoEngine::incEnemyHits() {
+	_enemyHits++;
+}
+
+void HypnoEngine::incEnemyTargets() {
+	_enemyTargets++;
+}
+
+void HypnoEngine::incTargetsDestroyed() {
+	_targetsDestroyed++;
+}
+
+void HypnoEngine::incTargetsMissed() {
+	_targetsMissed++;
+}
+
+uint32 HypnoEngine::killRatio() {
+	if (_enemyTargets == 0)
+		return 0;
+	return 100 * _targetsDestroyed / _enemyTargets;
+}
+
+uint32 HypnoEngine::accuracyRatio() {
+	if (_shootsFired == 0)
+		return 0;
+	return 100 * _enemyHits / _shootsFired;
+}
+
+void HypnoEngine::resetStatistics() {
+	_shootsFired = 0;
+	_enemyHits = 0;
+	_enemyTargets = 0;
+	_targetsDestroyed = 0;
+	_targetsMissed = 0;
+	_bonus = 0;
+}
+
 bool HypnoEngine::checkArcadeLevelCompleted(MVideo &background, Segment segment) {
 	return !background.decoder || background.decoder->endOfVideo() || segment.end || _skipLevel;
 }
diff --git a/engines/hypno/hypno.cpp b/engines/hypno/hypno.cpp
index 7e04db38389..64c5e320c28 100644
--- a/engines/hypno/hypno.cpp
+++ b/engines/hypno/hypno.cpp
@@ -79,6 +79,7 @@ HypnoEngine::HypnoEngine(OSystem *syst, const ADGameDescription *gd)
 	hs.push_back(q);
 	quit->hots = hs;
 	_levels["<quit>"] = quit;
+	resetStatistics();
 }
 
 HypnoEngine::~HypnoEngine() {
@@ -174,8 +175,10 @@ void HypnoEngine::runLevel(Common::String &name) {
 	} else if (_levels[name]->type == ArcadeLevel) {
 		debugC(1, kHypnoDebugArcade, "Executing arcade level %s", name.c_str());
 		changeScreenMode("320x200");
-		runBeforeArcade((ArcadeShooting *)_levels[name]);
-		runArcade((ArcadeShooting *)_levels[name]);
+		ArcadeShooting *arc = (ArcadeShooting *)_levels[name];
+		runBeforeArcade(arc);
+		runArcade(arc);
+		runAfterArcade(arc);
 	} else if (_levels[name]->type == CodeLevel) {
 		debugC(1, kHypnoDebugScene, "Executing hardcoded level %s", name.c_str());
 		// Resolution depends on the game
diff --git a/engines/hypno/hypno.h b/engines/hypno/hypno.h
index 704b0fdf5cb..64b8fd564b1 100644
--- a/engines/hypno/hypno.h
+++ b/engines/hypno/hypno.h
@@ -96,6 +96,7 @@ public:
 	void runLevel(Common::String &name);
 	void runScene(Scene *scene);
 	virtual void runBeforeArcade(ArcadeShooting *arc);
+	virtual void runAfterArcade(ArcadeShooting *arc);
 	void runArcade(ArcadeShooting *arc);
 	// For some menus and hardcoded puzzles
 	virtual void runCode(Code *code);
@@ -235,6 +236,30 @@ public:
 	virtual void findNextSegment(ArcadeShooting *arc);
 	virtual void initSegment(ArcadeShooting *arc);
 	virtual bool checkArcadeLevelCompleted(MVideo &background, Segment segment);
+
+	void resetStatistics();
+
+	void incShotsFired();
+	uint32 _shootsFired;
+
+	void incEnemyHits();
+	uint32 _enemyHits;
+
+	void incEnemyTargets();
+	uint32 _enemyTargets;
+
+	void incTargetsDestroyed();
+	uint32 _targetsDestroyed;
+
+	void incTargetsMissed();
+	uint32 _targetsMissed;
+
+	void incScore(int inc);
+	void incBonus(int inc);
+
+	uint32 killRatio();
+	uint32 accuracyRatio();
+
 	Common::String _difficulty;
 	bool _skipLevel;
 
@@ -244,6 +269,7 @@ public:
 	int _health;
 	int _maxHealth;
 	int _score;
+	int _bonus;
 	int _lives;
 	Filename _shootSound;
 	Filename _hitSound;
@@ -314,6 +340,7 @@ public:
 
 	// Arcade
 	void runBeforeArcade(ArcadeShooting *arc) override;
+	void runAfterArcade(ArcadeShooting *arc) override;
 	void findNextSegment(ArcadeShooting *arc) override;
 	void initSegment(ArcadeShooting *arc) override;
 
diff --git a/engines/hypno/wet/arcade.cpp b/engines/hypno/wet/arcade.cpp
index 171475521ec..de48bd7e5ae 100644
--- a/engines/hypno/wet/arcade.cpp
+++ b/engines/hypno/wet/arcade.cpp
@@ -226,7 +226,68 @@ void WetEngine::findNextSegment(ArcadeShooting *arc) {
 	}
 }
 
+void WetEngine::runAfterArcade(ArcadeShooting *arc) {
+	_checkpoint = _currentLevel;
+	if (!isDemo() || _variant == "Demo") {
+		byte *palette;
+		Graphics::Surface *frame = decodeFrame("c_misc/zones.smk", 12, &palette);
+		loadPalette(palette, 0, 256);
+		uint32 c = 251; // green
+		int bonusCounter = 0;
+		int scoreCounter = _score - _bonus;
+		assert(scoreCounter >= 0);
+		bool skip = false;
+		Common::Event event;
+		while (!shouldQuit() && !skip) {
+
+			drawImage(*frame, 0, 0, false);
+			drawString("scifi08.fgx", Common::String::format("Lives : %d", _lives), 36, 2, 0, c);
+			drawString("scifi08.fgx", Common::String::format("%-20s = %7d", "SHOTS FIRED", _shootsFired), 60, 46, 0, c);
+			drawString("scifi08.fgx", Common::String::format("%-20s = %7d", "ENEMY TARGETS", _enemyTargets), 60, 56, 0, c);
+			drawString("scifi08.fgx", Common::String::format("%-20s = %7d", "TARGETS DESTROYED", _targetsDestroyed), 60, 66, 0, c);
+			drawString("scifi08.fgx", Common::String::format("%-20s = %7d", "TARGETS MISSED", _targetsMissed), 60, 76, 0, c);
+			drawString("scifi08.fgx", Common::String::format("%-20s = %5d %%", "KILL RATIO", killRatio()), 60, 86, 0, c);
+			drawString("scifi08.fgx", Common::String::format("%-20s = %5d %%", "ACCURACY", accuracyRatio()), 60, 96, 0, c);
+			drawString("scifi08.fgx", Common::String::format("%-20s = %5d %%", "ENERGY", _health), 60, 106, 0, c);
+
+			while (g_system->getEventManager()->pollEvent(event)) {
+				// Events
+				switch (event.type) {
+
+				case Common::EVENT_QUIT:
+				case Common::EVENT_RETURN_TO_LAUNCHER:
+					break;
+
+				case Common::EVENT_KEYDOWN:
+					bonusCounter = _bonus;
+					drawString("scifi08.fgx", Common::String::format("%-20s = %3d pts", "BONUS", _bonus), 60, 116, 0, c);
+					drawString("scifi08.fgx", Common::String::format("%-20s = %3d pts", "SCORE", _score), 60, 126, 0, c);
+					skip = true;
+					break;
+				default:
+					break;
+				}
+			}
+
+			if (bonusCounter < _bonus) {
+				bonusCounter++;
+				scoreCounter++;
+				drawString("scifi08.fgx", Common::String::format("%-20s = %3d pts", "BONUS", bonusCounter), 60, 116, 0, c);
+				drawString("scifi08.fgx", Common::String::format("%-20s = %3d pts", "SCORE", scoreCounter), 60, 126, 0, c);
+			}
+
+			drawScreen();
+			g_system->delayMillis(25);
+		}
+		frame->free();
+		delete frame;
+	}
+
+}
+
+
 void WetEngine::runBeforeArcade(ArcadeShooting *arc) {
+	resetStatistics();
 	_checkpoint = _currentLevel;
 	MVideo *video;
 	if (!isDemo()) {
@@ -242,6 +303,9 @@ void WetEngine::runBeforeArcade(ArcadeShooting *arc) {
 		bool showedBriefing = false;
 		bool endedBriefing = false;
 		Common::Event event;
+
+		uint32 c = 251; // green
+		drawString("scifi08.fgx", Common::String::format("Lives : %d", _lives), 36, 2, 0, c);
 		while (!shouldQuit() && !endedBriefing) {
 
 			while (g_system->getEventManager()->pollEvent(event)) {
@@ -318,6 +382,7 @@ void WetEngine::runBeforeArcade(ArcadeShooting *arc) {
 }
 
 bool WetEngine::clickedSecondaryShoot(const Common::Point &mousePos) {
+	incShotsFired();
 	return clickedPrimaryShoot(mousePos);
 }
 




More information about the Scummvm-git-logs mailing list