|
From: knittl <kn...@us...> - 2009-08-03 08:41:38
|
Module: performous
Branch: master
Commit: d53bd632d8d4f01f2ca632f9ee0edc3c86121a6d
Author: Lasse Karkkainen <tro...@tr...>
Date: Mon Aug 3 03:46:36 2009 +0300
Improved dead instrument handling.
Experimental event system for tracking strums etc.
---
game/guitargraph.cc | 22 +++++++++++++++-------
game/guitargraph.hh | 16 ++++++++++------
game/screen_sing.cc | 2 +-
3 files changed, 26 insertions(+), 14 deletions(-)
diff --git a/game/guitargraph.cc b/game/guitargraph.cc
index bfdf85f..5050ae3 100644
--- a/game/guitargraph.cc
+++ b/game/guitargraph.cc
@@ -44,7 +44,7 @@ GuitarGraph::GuitarGraph(Song const& song, bool drums, unsigned track):
m_track(track),
m_stream(),
m_level(),
- m_dead(-1),
+ m_dead(1000),
m_text(getThemePath("sing_timetxt.svg"), config["graphic/text_lod"].f()),
m_correctness(0.0, 5.0),
m_score()
@@ -133,7 +133,8 @@ void GuitarGraph::drumHit(double time, int fret) {
++m_chordIt;
}
++m_chordIt->status;
- m_notes[m_chordIt->dur[fret]] = 1;
+ m_events.push_back(Event(time, 1));
+ m_notes[m_chordIt->dur[fret]] = m_events.size();
double score = points(tolerance);
m_chordIt->score += score;
m_score += score;
@@ -180,10 +181,10 @@ void GuitarGraph::guitarPlay(double time, input::Event const& ev) {
std::cout << (picked ? "Pick: " : "Tap: ");
if (best == m_chords.end()) {
std::cout << "MISS" << std::endl;
- if (picked) {
- m_score -= 50;
- m_correctness.setTarget(0.0, true); // Instantly go to zero
- }
+ if (!picked) return;
+ m_score -= 50;
+ m_correctness.setTarget(0.0, true); // Instantly go to zero
+ m_events.push_back(Event(time, 0));
} else {
m_chordIt = best;
int& score = m_chordIt->score;
@@ -194,6 +195,10 @@ void GuitarGraph::guitarPlay(double time, input::Event const& ev) {
m_chordIt->status = 1 + picked;
m_score += score;
m_correctness.setTarget(1.0, true); // Instantly go to one
+ m_events.push_back(Event(time, 1 + picked));
+ for (int fret = 0; fret < 5; ++fret) {
+ if (m_chordIt->fret[fret]) m_notes[m_chordIt->dur[fret]] = m_events.size();
+ }
}
}
@@ -288,7 +293,10 @@ void GuitarGraph::draw(double time) {
if (m_drums) x -= 0.5f;
float w = 0.5f;
glutil::Color c = color(fret);
- if (m_notes[it->dur[fret]] == 1) c.r = c.g = c.b = 1.0f;
+ unsigned event = m_notes[it->dur[fret]];
+ if (event) {
+ c.r = c.g = c.b = std::max(0.5, m_events[event - 1].glow.get());
+ }
float wLine = 0.5f * w;
if (tEnd > future) tEnd = future;
if (m_drums && fret == 0) {
diff --git a/game/guitargraph.hh b/game/guitargraph.hh
index 67924a5..650dd0e 100644
--- a/game/guitargraph.hh
+++ b/game/guitargraph.hh
@@ -23,10 +23,6 @@ struct Chord {
std::fill(dur, dur + 5, static_cast<Duration const*>(NULL));
}
bool matches(bool const* fretPressed) {
- for (int i = 0; i < 5; ++i) {
- std::cout << fret[i] << fretPressed[i] << " ";
- }
- std::cout << std::endl;
if (polyphony == 1) {
bool shadowed = true;
for (int i = 0; i < 5; ++i) {
@@ -54,7 +50,7 @@ class GuitarGraph {
void draw(double time);
void engine(Audio& audio);
void position(double cx, double width) { m_cx.setTarget(cx); m_width.setTarget(width); }
- double dead(double time) const { return time > -0.5 && m_dead > 10; }
+ double dead(double time) const { return time > -0.5 && m_dead > 50; }
unsigned stream() const { return m_stream; }
double correctness() const { return m_correctness.get(); }
private:
@@ -78,6 +74,14 @@ class GuitarGraph {
DIFFICULTY_AMAZING,
DIFFICULTYCOUNT
} m_level;
+ struct Event {
+ double time;
+ AnimValue glow;
+ int type; // 0 = miss (pick), 1 = tap, 2 = pick
+ Event(double t, int ty): time(t), glow(0.0, 0.5), type(ty) { if (type > 0) glow.setValue(1.0); }
+ };
+ typedef std::vector<Event> Events;
+ Events m_events;
int m_dead;
glutil::Color const& color(int fret) const;
void drawBar(double time, float h);
@@ -88,7 +92,7 @@ class GuitarGraph {
typedef std::vector<Chord> Chords;
Chords m_chords;
Chords::iterator m_chordIt;
- typedef std::map<Duration const*, int> NoteStatus;
+ typedef std::map<Duration const*, unsigned> NoteStatus; // Note in song to m_events[unsigned - 1] or 0 for not played
NoteStatus m_notes;
AnimValue m_correctness;
int m_score;
diff --git a/game/screen_sing.cc b/game/screen_sing.cc
index 17956e8..8b63849 100644
--- a/game/screen_sing.cc
+++ b/game/screen_sing.cc
@@ -15,7 +15,7 @@ namespace {
}
void ScreenSing::enter() {
- m_audio.playMusic(m_song->music, false, 0.0, m_song->tracks.empty() ? -1.0 : -4.0); // Startup delay for instruments is longer than for singing only
+ m_audio.playMusic(m_song->music, false, 0.0, m_song->tracks.empty() ? -1.0 : -8.0); // Startup delay for instruments is longer than for singing only
theme.reset(new ThemeSing());
if (!m_song->background.empty()) {
try {
|