#include "global.h" #include "NoteTypes.h" #include "RageUtil.h" #include "LuaManager.h" #include "XmlFile.h" #include "LocalizedString.h" TapNote TAP_EMPTY ( TapNote::empty, TapNote::SubType_Invalid, TapNote::original, "", 0, -1 ); TapNote TAP_ORIGINAL_TAP ( TapNote::tap, TapNote::SubType_Invalid, TapNote::original, "", 0, -1 ); TapNote TAP_ORIGINAL_LIFT ( TapNote::lift, TapNote::SubType_Invalid, TapNote::original, "", 0, -1 ); TapNote TAP_ORIGINAL_HOLD_HEAD ( TapNote::hold_head, TapNote::hold_head_hold, TapNote::original, "", 0, -1 ); TapNote TAP_ORIGINAL_ROLL_HEAD ( TapNote::hold_head, TapNote::hold_head_roll, TapNote::original, "", 0, -1 ); TapNote TAP_ORIGINAL_MINE ( TapNote::mine, TapNote::SubType_Invalid, TapNote::original, "", 0, -1 ); TapNote TAP_ORIGINAL_ATTACK ( TapNote::attack, TapNote::SubType_Invalid, TapNote::original, "", 0, -1 ); TapNote TAP_ORIGINAL_AUTO_KEYSOUND ( TapNote::autoKeysound,TapNote::SubType_Invalid, TapNote::original, "", 0, -1 ); TapNote TAP_ORIGINAL_FAKE ( TapNote::fake, TapNote::SubType_Invalid, TapNote::original, "", 0, -1 ); //TapNote TAP_ORIGINAL_MINE_HEAD ( TapNote::mine_head, TapNote::hold_head_mine, TapNote::original, "", 0, -1 ); TapNote TAP_ADDITION_TAP ( TapNote::tap, TapNote::SubType_Invalid, TapNote::addition, "", 0, -1 ); TapNote TAP_ADDITION_MINE ( TapNote::mine, TapNote::SubType_Invalid, TapNote::addition, "", 0, -1 ); static const char *NoteTypeNames[] = { "4th", "8th", "12th", "16th", "24th", "32nd", "48th", "64th", "192nd", }; XToString( NoteType ); LuaXType( NoteType ) XToLocalizedString( NoteType ); float NoteTypeToBeat( NoteType nt ) { switch( nt ) { case NOTE_TYPE_4TH: return 1.0f; // quarter notes case NOTE_TYPE_8TH: return 1.0f/2; // eighth notes case NOTE_TYPE_12TH: return 1.0f/3; // quarter note triplets case NOTE_TYPE_16TH: return 1.0f/4; // sixteenth notes case NOTE_TYPE_24TH: return 1.0f/6; // eighth note triplets case NOTE_TYPE_32ND: return 1.0f/8; // thirty-second notes case NOTE_TYPE_48TH: return 1.0f/12; // sixteenth note triplets case NOTE_TYPE_64TH: return 1.0f/16; // sixty-fourth notes case NOTE_TYPE_192ND: return 1.0f/48; // sixty-fourth note triplets default: ASSERT(0); // and fall through case NoteType_Invalid: return 1.0f/48; } } // FIXME: Remove hard-coded beat values and instead look at the time signature in the song. static const int BEATS_PER_MEASURE = 4; static const int ROWS_PER_MEASURE = ROWS_PER_BEAT * BEATS_PER_MEASURE; NoteType GetNoteType( int row ) { if( row % (ROWS_PER_MEASURE/4) == 0) return NOTE_TYPE_4TH; else if( row % (ROWS_PER_MEASURE/8) == 0) return NOTE_TYPE_8TH; else if( row % (ROWS_PER_MEASURE/12) == 0) return NOTE_TYPE_12TH; else if( row % (ROWS_PER_MEASURE/16) == 0) return NOTE_TYPE_16TH; else if( row % (ROWS_PER_MEASURE/24) == 0) return NOTE_TYPE_24TH; else if( row % (ROWS_PER_MEASURE/32) == 0) return NOTE_TYPE_32ND; else if( row % (ROWS_PER_MEASURE/48) == 0) return NOTE_TYPE_48TH; else if( row % (ROWS_PER_MEASURE/64) == 0) return NOTE_TYPE_64TH; else return NOTE_TYPE_192ND; }; NoteType BeatToNoteType( float fBeat ) { return GetNoteType( BeatToNoteRow(fBeat) ); } bool IsNoteOfType( int row, NoteType t ) { return GetNoteType(row) == t; } XNode* TapNoteResult::CreateNode() const { XNode *p = new XNode( "TapNoteResult" ); p->AppendAttr( "TapNoteScore", TapNoteScoreToString(tns) ); p->AppendAttr( "TapNoteOffset", fTapNoteOffset ); return p; } void TapNoteResult::LoadFromNode( const XNode* pNode ) { ASSERT(0); } XNode* HoldNoteResult::CreateNode() const { // XXX: Should this do anything? return new XNode( "HoldNoteResult" ); } void HoldNoteResult::LoadFromNode( const XNode* pNode ) { ASSERT(0); } XNode* TapNote::CreateNode() const { XNode *p = new XNode( "TapNote" ); p->AppendChild( result.CreateNode() ); p->AppendChild( HoldResult.CreateNode() ); return p; } void TapNote::LoadFromNode( const XNode* pNode ) { ASSERT(0); } float HoldNoteResult::GetLastHeldBeat() const { return NoteRowToBeat(iLastHeldRow); } /* * (c) 2001-2004 Chris Danford, Glenn Maynard * All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, and/or sell copies of the Software, and to permit persons to * whom the Software is furnished to do so, provided that the above * copyright notice(s) and this permission notice appear in all copies of * the Software and that both the above copyright notice(s) and this * permission notice appear in supporting documentation. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */