|
From: Tapio V. <aa...@us...> - 2009-12-11 12:43:24
|
Module: performous
Branch: dance
Commit: cb009e3dc88481ae31a2b394726663ab4f3ed725
Author: Tapio Vierros <tap...@gm...>
Date: Sun Nov 29 23:03:57 2009 +0200
Simple starmeter system.
Playing correctly increses starmeter, using whammy increases it more.
Once meter is full Starpower becomes available.
---
game/guitargraph.cc | 155 +++++++++++++++++++++++++++++----------------------
game/guitargraph.hh | 2 +
game/opengl_text.cc | 4 +-
game/opengl_text.hh | 4 +-
4 files changed, 94 insertions(+), 71 deletions(-)
diff --git a/game/guitargraph.cc b/game/guitargraph.cc
index cff1825..9c5c44d 100644
--- a/game/guitargraph.cc
+++ b/game/guitargraph.cc
@@ -53,6 +53,7 @@ namespace {
return c;
}
+ bool canActivateStarpower(int meter) { return (meter > 6000); }
}
GuitarGraph::GuitarGraph(Audio& audio, Song const& song, std::string track):
@@ -75,6 +76,7 @@ GuitarGraph::GuitarGraph(Audio& audio, Song const& song, std::string track):
m_correctness(0.0, 5.0),
m_score(),
m_scoreFactor(),
+ m_starmeter(),
m_streak(),
m_longestStreak()
{
@@ -141,7 +143,7 @@ void GuitarGraph::engine() {
}
if (!m_drums && ev.type == input::Event::WHAMMY)
whammy = (1.0 + ev.button + 2.0*(rand()/double(RAND_MAX))) / 4.0;
- if (!m_drums && ev.type == input::Event::STARPOWER) m_starpower.setValue(1.0);
+ if (!m_drums && ev.type == input::Event::STARPOWER) activateStarpower();
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);
if (time < -0.5) {
@@ -189,6 +191,8 @@ void GuitarGraph::engine() {
// Minimal points for long holds unless whammy is used
double wfactor = (ev.dur->end - ev.dur->begin < 1.5 || ev.whammy.get() > 0.01) ? 1.0 : 0.2;
m_score += t * 50.0 * wfactor;
+ // Whammy fills starmeter much faster
+ m_starmeter += t * 50 * ( (ev.whammy.get() > 0.01) ? 2.0 : 1.0 );
ev.holdTime = time;
}
if (last == ev.dur->end) endHold(fret);
@@ -196,6 +200,10 @@ void GuitarGraph::engine() {
}
}
+void GuitarGraph::activateStarpower() {
+ if (canActivateStarpower(m_starmeter)) { m_starmeter = 0; m_starpower.setValue(1.0); }
+}
+
void GuitarGraph::endHold(int fret) {
if (!m_holds[fret]) return;
m_events[m_holds[fret] - 1].glow.setTarget(0.0);
@@ -308,6 +316,7 @@ void GuitarGraph::guitarPlay(double time, input::Event const& ev) {
score *= m_chordIt->polyphony;
m_chordIt->status = 1 + picked;
m_score += score;
+ m_starmeter += score;
m_streak += 1;
if (m_streak > m_longestStreak) m_longestStreak = m_streak;
m_correctness.setTarget(1.0, true); // Instantly go to one
@@ -395,76 +404,88 @@ void GuitarGraph::draw(double time) {
m_text.draw(boost::lexical_cast<std::string>(unsigned(m_streak)) + "/"
+ boost::lexical_cast<std::string>(unsigned(m_longestStreak)));
}
- glutil::PushMatrixMode pmm(GL_PROJECTION);
- glTranslatef(frac * 2.0 * offsetX, 0.0f, 0.0f);
- glutil::PushMatrixMode pmb(GL_MODELVIEW);
- glTranslatef((1.0 - frac) * offsetX, dimensions.y2(), 0.0f);
- glRotatef(g_angle, 1.0f, 0.0f, 0.0f);
- { float s = dimensions.w() / 5.0f; glScalef(s, s, s); }
- // Draw the neck
{
- UseTexture tex(*m_neck);
- glutil::Begin block(GL_TRIANGLE_STRIP);
- float w = (m_drums ? 2.0f : 2.5f);
- float texCoord = 0.0f;
- float tBeg = 0.0f, tEnd;
- for (Song::Beats::const_iterator it = m_song.beats.begin(); it != m_song.beats.end() && tBeg < future; ++it, texCoord += texCoordStep, tBeg = tEnd) {
- tEnd = *it - time;
- //if (tEnd < past) continue;
- if (tEnd > future) {
- // Crop the end off
- texCoord -= texCoordStep * (tEnd - future) / (tEnd - tBeg);
- tEnd = future;
+ glutil::PushMatrixMode pmm(GL_PROJECTION);
+ glTranslatef(frac * 2.0 * offsetX, 0.0f, 0.0f);
+ {
+ glutil::PushMatrixMode pmb(GL_MODELVIEW);
+ glTranslatef((1.0 - frac) * offsetX, dimensions.y2(), 0.0f);
+ glRotatef(g_angle, 1.0f, 0.0f, 0.0f);
+ { float s = dimensions.w() / 5.0f; glScalef(s, s, s); }
+ // Draw the neck
+ {
+ UseTexture tex(*m_neck);
+ glutil::Begin block(GL_TRIANGLE_STRIP);
+ float w = (m_drums ? 2.0f : 2.5f);
+ float texCoord = 0.0f;
+ float tBeg = 0.0f, tEnd;
+ for (Song::Beats::const_iterator it = m_song.beats.begin(); it != m_song.beats.end() && tBeg < future; ++it, texCoord += texCoordStep, tBeg = tEnd) {
+ tEnd = *it - time;
+ //if (tEnd < past) continue;
+ if (tEnd > future) {
+ // Crop the end off
+ texCoord -= texCoordStep * (tEnd - future) / (tEnd - tBeg);
+ tEnd = future;
+ }
+ glutil::Color c(1.0f, 1.0f, 1.0f, time2a(tEnd));
+ glColor4fv(starpowerColorize(c, m_starpower.get()));
+ glNormal3f(0.0f, 1.0f, 0.0f);
+ glTexCoord2f(0.0f, texCoord); glVertex2f(-w, time2y(tEnd));
+ glNormal3f(0.0f, 1.0f, 0.0f);
+ glTexCoord2f(1.0f, texCoord); glVertex2f(w, time2y(tEnd));
+ }
}
- glutil::Color c(1.0f, 1.0f, 1.0f, time2a(tEnd));
- glColor4fv(starpowerColorize(c, m_starpower.get()));
- glNormal3f(0.0f, 1.0f, 0.0f);
- glTexCoord2f(0.0f, texCoord); glVertex2f(-w, time2y(tEnd));
- glNormal3f(0.0f, 1.0f, 0.0f);
- glTexCoord2f(1.0f, texCoord); glVertex2f(w, time2y(tEnd));
- }
- }
- // Draw the cursor
- float level = m_hit[0].get();
- glColor3f(level, level, level);
- drawBar(0.0, 0.01f);
- // Fret buttons on cursor
- for (int fret = m_drums; fret < 5; ++fret) {
- float x = -2.0f + fret - 0.5f * m_drums;
- float l = m_hit[fret + !m_drums].get();
- glColor4fv(starpowerColorize(color(fret), m_starpower.get()));
- //glColor4fv(c);
- m_button.dimensions.center(time2y(0.0)).middle(x);
- m_button.draw();
- glColor3f(l, l, l);
- m_tap.dimensions = m_button.dimensions;
- m_tap.draw();
- }
- // Draw the notes
- glutil::UseLighting lighting(m_use3d);
- for (Chords::const_iterator it = m_chords.begin(); it != m_chords.end(); ++it) {
- float tBeg = it->begin - time;
- float tEnd = it->end - time;
- if (tEnd < past) continue;
- if (tBeg > future) break;
- for (int fret = 0; fret < 5; ++fret) {
- if (!it->fret[fret]) continue;
- if (tEnd > future) tEnd = future;
- //drawNote(fret, color(fret), tBeg, tEnd);
- unsigned event = m_notes[it->dur[fret]];
- float glow = 0.0f;
- float whammy = 0.0f;
- if (event > 0) {
- glow = m_events[event - 1].glow.get();
- whammy = m_events[event - 1].whammy.get();
+ // Draw the cursor
+ float level = m_hit[0].get();
+ glColor3f(level, level, level);
+ drawBar(0.0, 0.01f);
+ // Fret buttons on cursor
+ for (int fret = m_drums; fret < 5; ++fret) {
+ float x = -2.0f + fret - 0.5f * m_drums;
+ float l = m_hit[fret + !m_drums].get();
+ glColor4fv(starpowerColorize(color(fret), m_starpower.get()));
+ m_button.dimensions.center(time2y(0.0)).middle(x);
+ m_button.draw();
+ glColor3f(l, l, l);
+ m_tap.dimensions = m_button.dimensions;
+ m_tap.draw();
}
- glutil::Color c = starpowerColorize(color(fret), m_starpower.get());
- c.r += glow;
- c.g += glow;
- c.b += glow;
- drawNote(fret, c, tBeg, tEnd, whammy, it->tappable);
-
+ // Draw the notes
+ glutil::UseLighting lighting(m_use3d);
+ for (Chords::const_iterator it = m_chords.begin(); it != m_chords.end(); ++it) {
+ float tBeg = it->begin - time;
+ float tEnd = it->end - time;
+ if (tEnd < past) continue;
+ if (tBeg > future) break;
+ for (int fret = 0; fret < 5; ++fret) {
+ if (!it->fret[fret]) continue;
+ if (tEnd > future) tEnd = future;
+ //drawNote(fret, color(fret), tBeg, tEnd);
+ unsigned event = m_notes[it->dur[fret]];
+ float glow = 0.0f;
+ float whammy = 0.0f;
+ if (event > 0) {
+ glow = m_events[event - 1].glow.get();
+ whammy = m_events[event - 1].whammy.get();
+ }
+ glutil::Color c = starpowerColorize(color(fret), m_starpower.get());
+ c.r += glow;
+ c.g += glow;
+ c.b += glow;
+ drawNote(fret, c, tBeg, tEnd, whammy, it->tappable);
+ }
+ }
+ glRotatef(-g_angle, 1.0f, 0.0f, 0.0f);
+ glTranslatef(-(1.0 - frac) * offsetX, -dimensions.y2(), 0.0f);
+ glScalef(5.0f, 5.0f, 5.0f);
}
+ glTranslatef(-frac * 2.0 * offsetX, 0.0f, 0.0f);
+ }
+
+ if (canActivateStarpower(m_starmeter)) {
+ float a = (int(time * 1000.0) % 1000) / 1000.0;
+ m_text.dimensions.screenBottom(-0.02).middle(-0.12 + offsetX);
+ m_text.draw("Starpower Ready!", a);
}
glColor3f(1.0f, 1.0f, 1.0f);
}
diff --git a/game/guitargraph.hh b/game/guitargraph.hh
index eaa9406..08ea02e 100644
--- a/game/guitargraph.hh
+++ b/game/guitargraph.hh
@@ -62,6 +62,7 @@ class GuitarGraph {
std::string getTrack() const { return m_track_index->first; }
std::string getDifficultyString() const;
private:
+ void activateStarpower();
void fail(double time, int fret);
void endHold(int fret);
Audio& m_audio;
@@ -121,6 +122,7 @@ class GuitarGraph {
AnimValue m_correctness;
double m_score;
double m_scoreFactor;
+ double m_starmeter;
int m_streak;
int m_longestStreak;
};
diff --git a/game/opengl_text.cc b/game/opengl_text.cc
index 360582b..7652a82 100644
--- a/game/opengl_text.cc
+++ b/game/opengl_text.cc
@@ -196,13 +196,13 @@ void SvgTxtTheme::draw(std::vector<std::string> const& _text) {
draw(tmp);
}
-void SvgTxtTheme::draw(std::string _text) {
+void SvgTxtTheme::draw(std::string _text, float alpha) {
std::vector<TZoomText> tmp;
TZoomText t;
t.string = _text;
t.factor = 1.0;
tmp.push_back(t);
- draw(tmp);
+ draw(tmp, alpha);
}
void SvgTxtTheme::draw(std::vector<TZoomText> const& _text, float alpha) {
diff --git a/game/opengl_text.hh b/game/opengl_text.hh
index 2d9759d..4130fde 100644
--- a/game/opengl_text.hh
+++ b/game/opengl_text.hh
@@ -145,8 +145,8 @@ class SvgTxtTheme {
void draw(std::vector<TZoomText> const& _text, float alpha = 1.0f);
/// draw texts
void draw(std::vector<std::string> const& _text);
- /// draw text
- void draw(std::string _text);
+ /// draw text with alpha
+ void draw(std::string _text, float alpha = 1.0f);
/// sets highlight
void setHighlight(std::string _theme_file);
|