|
From: Tapio V. <aa...@us...> - 2010-01-28 16:59:54
|
Module: performous
Branch: master
Commit: 6930a4282e9cb6c6959a570b9867a24131e5bcc4
Author: Tapio Vierros <tap...@gm...>
Date: Thu Jan 28 18:58:52 2010 +0200
Big Rock Endings for drums, proper scoring still missing.
---
game/guitargraph.cc | 7 ++++---
game/midifile.cc | 7 ++++---
game/midifile.hh | 4 ++--
game/song.cc | 1 +
game/song.hh | 5 +++--
game/songparser-ini.cc | 5 +++++
6 files changed, 19 insertions(+), 10 deletions(-)
diff --git a/game/guitargraph.cc b/game/guitargraph.cc
index af5db25..7838f83 100644
--- a/game/guitargraph.cc
+++ b/game/guitargraph.cc
@@ -342,7 +342,8 @@ void GuitarGraph::updateDrumFill(double time) {
if (m_dfIt != m_drumfills.end()) {
if (time > m_dfIt->end - past) {
// Check if we can activate GodMode (drums) -> requires ~ 7 hits per second
- if (m_drums && m_drumfillScore >= 7.0 * (m_dfIt->end - m_dfIt->begin)) activateStarpower();
+ if (m_drums && m_drumfillScore >= 7.0 * (m_dfIt->end - m_dfIt->begin)
+ && (!m_song.hasBRE || m_dfIt != (--m_drumfills.end()))) activateStarpower();
m_drumfillScore = 0;
} else return;
} else if (m_drums && canActivateStarpower()) {
@@ -352,6 +353,8 @@ void GuitarGraph::updateDrumFill(double time) {
}
} else if (!m_drums && m_drumfills.back().begin >= time + future) {
m_dfIt = (--m_drumfills.end()); return; // Guitar Big Rock Ending
+ } else if (m_drums && m_song.hasBRE && m_drumfills.back().begin <= time + future) {
+ m_dfIt = (--m_drumfills.end()); return; // Drum Big Rock Ending
}
m_dfIt = m_drumfills.end(); // Reset iterator
}
@@ -363,8 +366,6 @@ void GuitarGraph::drumHit(double time, int fret) {
if (m_dfIt != m_drumfills.end() && time >= m_dfIt->begin - maxTolerance
&& time <= m_dfIt->end + maxTolerance) {
m_drumfillScore += 1;
- Duration const* dur = &(*m_dfIt);
- m_events.push_back(Event(time, 1, fret, dur));
m_flames[fret].push_back(AnimValue(0.0, flameSpd));
m_flames[fret].back().setTarget(1.0);
return;
diff --git a/game/midifile.cc b/game/midifile.cc
index 7141d91..fc4d54d 100644
--- a/game/midifile.cc
+++ b/game/midifile.cc
@@ -169,8 +169,9 @@ MidiFileParser::Track MidiFileParser::read_track(MidiStream& stream) {
std::string data = riff.read_bytes(riff.read_varlen());
switch (type) {
case 0x01:
- // Lyrics are hidden here, only [text] are orders
- if( data[0] != '[' ) m_lyric = data;
+ // Lyrics are hidden here, only [text] are orders
+ if (data[0] != '[') m_lyric = data;
+ else cmdevents.push_back(std::string(data));
#if MIDI_DEBUG_LEVEL > 2
std::cout << "Text: " << data << std::endl;
#endif
@@ -232,7 +233,7 @@ void MidiFileParser::cout_midi_event(uint8_t t, uint8_t arg1, uint8_t arg2, uint
std::cout << "Midi event:" << std::setw(12) << miditime << std::fixed << std::setprecision(2) << std::setw(12) << get_seconds(miditime) << " ";
switch (t) {
case 0x8: std::cout << "note off pitch=" << int(arg1) << " velocity=" << int(arg2); break;
- case 0x9: std::cout << "note on pitch=" << int(arg1) << " velocity=" << int(arg2); break;
+ case 0x9: std::cout << "note on pitch=" << int(arg1) << " velocity=" << int(arg2); break;
case 0xA: std::cout << "aftertouch pitch=" << int(arg1) << " value=" << int(arg2); break;
case 0xB: std::cout << "controller num=" << int(arg1) << " value=" << int(arg2); break;
case 0xC: std::cout << "program change num=" << int(arg1); break;
diff --git a/game/midifile.hh b/game/midifile.hh
index 086f999..33dcfe2 100644
--- a/game/midifile.hh
+++ b/game/midifile.hh
@@ -45,8 +45,6 @@ class MidiFileParser{
*/
MidiFileParser(std::string name);
-// private:
-
struct TempoChange {
uint32_t miditime;
uint32_t value;
@@ -86,6 +84,8 @@ class MidiFileParser{
double get_seconds(uint32_t miditime) { return 1e-6 * get_us(miditime); }
void add_tempo_change(uint32_t miditime, uint32_t tempo);
uint16_t format;
+ typedef std::vector<std::string> CommandEvents;
+ CommandEvents cmdevents;
/** Ticks per beat == number of divisions per every quarter note **/
uint16_t division;
diff --git a/game/song.cc b/game/song.cc
index 0d2af5b..5b08d93 100644
--- a/game/song.cc
+++ b/game/song.cc
@@ -33,6 +33,7 @@ void Song::reload(bool errorIgnore) {
preview_start = getNaN();
beginTime = endTime = getNaN();
m_scoreFactor = 0.0;
+ hasBRE = false;
b0rkedTracks = false;
try { SongParser(*this); } catch (...) { if (!errorIgnore) throw; }
collateUpdate();
diff --git a/game/song.hh b/game/song.hh
index 9718265..1a950a4 100644
--- a/game/song.hh
+++ b/game/song.hh
@@ -87,10 +87,11 @@ class Song: boost::noncopyable {
std::vector<double> volumePitchGraph; ///< volume of pitch graph
std::vector<bool> drawPitchGraph; ///< if pitch graph should be drawn
double beginTime, endTime; ///< the period where there are notes
- double m_scoreFactor; ///< Normalization factor for the scoring system
+ double m_scoreFactor; ///< normalization factor for the scoring system
typedef std::vector<std::pair<double,double> > Stops;
Stops stops;
- bool b0rkedTracks;
+ bool hasBRE; ///< is there a Big Rock Ending? (used for drums only)
+ bool b0rkedTracks; ///< are some tracks broken? (so that user can be notified)
};
static inline bool operator<(Song const& l, Song const& r) { return l.collateByArtist < r.collateByArtist; }
diff --git a/game/songparser-ini.cc b/game/songparser-ini.cc
index 9faa435..46fa715 100644
--- a/game/songparser-ini.cc
+++ b/game/songparser-ini.cc
@@ -233,6 +233,11 @@ void SongParser::iniParse() {
}
if (!s.notes.empty()) break;
}
+ // Figure out if we have BRE in the song
+ for (MidiFileParser::CommandEvents::const_iterator it = midi.cmdevents.begin(); it != midi.cmdevents.end(); ++it) {
+ if (*it == "[section big_rock_ending]") s.hasBRE = true;
+ }
+ // Output some warning
if (reversedNoteCount > 0) {
std::ostringstream oss;
oss << "WARNING: Skipping " << reversedNoteCount << " reversed note(s) in ";
|