|
From: Tapio V. <aa...@us...> - 2009-12-30 22:51:38
|
Module: performous
Branch: master
Commit: da483dc081847ce70d6b059c30bc7ba1c0b90348
Author: Tapio Vierros <tap...@gm...>
Date: Thu Dec 31 00:49:40 2009 +0200
Quick hack to prevent crashing when exiting song with Select and to allow pause with Start.
---
game/guitargraph.cc | 54 ++++++++++++++++++++++++++++----------------------
game/screen_sing.cc | 31 ++++++++++++++++++++--------
2 files changed, 52 insertions(+), 33 deletions(-)
diff --git a/game/guitargraph.cc b/game/guitargraph.cc
index 18850c1..756240e 100644
--- a/game/guitargraph.cc
+++ b/game/guitargraph.cc
@@ -155,32 +155,38 @@ void GuitarGraph::engine() {
for (input::Event ev; m_input.tryPoll(ev);) {
m_dead = 0; // Keep alive
if (m_jointime == not_joined) m_jointime = (time < 0.0 ? -join_delay : time); // Handle joining
- // Guitar specific actions
- if (!m_drums) {
- if ((ev.type == input::Event::PRESS || ev.type == input::Event::RELEASE) && ev.button == input::STARPOWER_BUTTON) {
- if (ev.type == input::Event::PRESS) activateStarpower();
- continue;
+ if (ev.type == input::Event::PRESS && ev.button > input::STARPOWER_BUTTON) {
+ // This hack signals Screen_sing about Start/Select presses by throwing exceptions
+ if (ev.button == 8) throw std::runtime_error("select");
+ else if (ev.button == 9) throw std::runtime_error("start");
+ } else {
+ // Guitar specific actions
+ if (!m_drums) {
+ if ((ev.type == input::Event::PRESS || ev.type == input::Event::RELEASE) && ev.button == input::STARPOWER_BUTTON) {
+ if (ev.type == input::Event::PRESS) activateStarpower();
+ continue;
+ }
+ if (ev.type == input::Event::RELEASE) endHold(ev.button, time);
+ if (ev.type == input::Event::WHAMMY) whammy = (1.0 + ev.button + 2.0*(rand()/double(RAND_MAX))) / 4.0;
}
- if (ev.type == input::Event::RELEASE) endHold(ev.button, time);
- if (ev.type == input::Event::WHAMMY) whammy = (1.0 + ev.button + 2.0*(rand()/double(RAND_MAX))) / 4.0;
- }
- // Keypress anims
- if (ev.type == input::Event::PRESS) m_hit[!m_drums + ev.button].setValue(1.0);
- else if (ev.type == input::Event::PICK) m_hit[0].setValue(1.0);
- // Difficulty and track selection
- if (time < m_jointime + join_delay) {
- if (ev.type == input::Event::PICK || ev.type == input::Event::PRESS) {
- if (!m_drums && ev.pressed[4]) nextTrack();
- if (ev.pressed[0 + m_drums]) difficulty(DIFFICULTY_SUPAEASY);
- else if (ev.pressed[1 + m_drums]) difficulty(DIFFICULTY_EASY);
- else if (ev.pressed[2 + m_drums]) difficulty(DIFFICULTY_MEDIUM);
- else if (ev.pressed[3 + m_drums]) difficulty(DIFFICULTY_AMAZING);
+ // Keypress anims
+ if (ev.type == input::Event::PRESS) m_hit[!m_drums + ev.button].setValue(1.0);
+ else if (ev.type == input::Event::PICK) m_hit[0].setValue(1.0);
+ // Difficulty and track selection
+ if (time < m_jointime + join_delay) {
+ if (ev.type == input::Event::PICK || ev.type == input::Event::PRESS) {
+ if (!m_drums && ev.pressed[4]) nextTrack();
+ if (ev.pressed[0 + m_drums]) difficulty(DIFFICULTY_SUPAEASY);
+ else if (ev.pressed[1 + m_drums]) difficulty(DIFFICULTY_EASY);
+ else if (ev.pressed[2 + m_drums]) difficulty(DIFFICULTY_MEDIUM);
+ else if (ev.pressed[3 + m_drums]) difficulty(DIFFICULTY_AMAZING);
+ }
+ // Playing
+ } else if (m_drums) {
+ if (ev.type == input::Event::PRESS) drumHit(time, ev.button);
+ } else {
+ guitarPlay(time, ev);
}
- // Playing
- } else if (m_drums) {
- if (ev.type == input::Event::PRESS) drumHit(time, ev.button);
- } else {
- guitarPlay(time, ev);
}
if (m_score < 0) m_score = 0;
}
diff --git a/game/screen_sing.cc b/game/screen_sing.cc
index e99ba0b..c88a867 100644
--- a/game/screen_sing.cc
+++ b/game/screen_sing.cc
@@ -108,7 +108,14 @@ bool ScreenSing::instrumentLayout(double time) {
typedef std::pair<unsigned, double> CountSum;
std::map<std::string, CountSum> volume; // Stream id to (count, sum)
for (Instruments::iterator it = m_instruments.begin(); it != m_instruments.end(); ++it) {
- it->engine(); // Run engine even when dead so that joining is possible
+ try {
+ it->engine(); // Run engine even when dead so that joining is possible
+ } catch (std::runtime_error& e) { // Receive Start/Select key presses
+ std::string what(e.what());
+ if (what == "start") m_audio.togglePause();
+ // We cannot quit from here (crash) so let's throw it further
+ else if (what == "select") throw std::runtime_error("exit");
+ }
if (!it->dead()) {
it->position((0.5 + i - 0.5 * count) * iw, iw); // Do layout stuff
CountSum& cs = volume[it->getTrackIndex()];
@@ -250,13 +257,13 @@ void ScreenSing::manageEvent(SDL_Event event) {
if (seekback) {
m_layout_singer->reset();
}
- } else if (event.type == SDL_JOYBUTTONDOWN) {
- int button = event.jbutton.button;
- if (button == 9 /* START */) m_audio.togglePause();
- if (button == 8 /* SELECT */) {
- ScreenManager::getSingletonPtr()->activateScreen("Songs");
- return;
- }
+ //} else if (event.type == SDL_JOYBUTTONDOWN) {
+ //int button = event.jbutton.button;
+ //if (button == 9 /* START */) m_audio.togglePause();
+ //if (button == 8 /* SELECT */) {
+ //ScreenManager::getSingletonPtr()->activateScreen("Songs");
+ //return;
+ //}
}
}
@@ -307,7 +314,13 @@ void ScreenSing::draw() {
} else if( m_instruments.empty() ) {
m_layout_singer->draw(time, LayoutSinger::BOTTOM);
} else {
- bool some_alive = instrumentLayout(time);
+ bool some_alive;
+ try {
+ some_alive = instrumentLayout(time);
+ } catch (std::runtime_error& e) { // Did we catch an quit signal?
+ ScreenManager::getSingletonPtr()->activateScreen("Songs");
+ return;
+ }
m_layout_singer->draw(time, some_alive ? LayoutSinger::MIDDLE : LayoutSinger::BOTTOM);
}
|