[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