2003-02-16 04:01:45 +00:00
# include "global.h"
2003-01-26 07:33:03 +00:00
# include "ScreenRanking.h"
2005-07-20 09:48:19 +00:00
# include "ScreenManager.h"
2003-01-26 07:33:03 +00:00
# include "SongManager.h"
# include "GameState.h"
# include "GameManager.h"
2003-12-07 07:09:13 +00:00
# include "ProfileManager.h"
2005-07-01 05:07:22 +00:00
# include "Profile.h"
2003-01-26 07:33:03 +00:00
2008-11-27 02:58:50 +00:00
static const char * RankingTypeNames [ ] = {
2004-05-02 03:01:27 +00:00
" Category " ,
" Course " ,
} ;
2008-11-27 02:58:50 +00:00
XToString ( RankingType ) ;
LuaXType ( RankingType ) ;
2004-01-29 01:46:08 +00:00
2005-03-28 08:01:36 +00:00
AutoScreenMessage ( SM_ShowNextPage )
AutoScreenMessage ( SM_HidePage )
2003-01-26 20:49:05 +00:00
2008-11-27 02:58:50 +00:00
REGISTER_SCREEN_CLASS ( ScreenRanking ) ;
2003-01-26 07:33:03 +00:00
2008-11-27 02:58:50 +00:00
# define BULLET_X(row) (BULLET_START_X+ROW_SPACING_X*row)
# define BULLET_Y(row) (BULLET_START_Y+ROW_SPACING_Y*row)
# define NAME_X(row) (NAME_START_X+ROW_SPACING_X*row)
# define NAME_Y(row) (NAME_START_Y+ROW_SPACING_Y*row)
# define SCORE_X(row) (SCORE_START_X+ROW_SPACING_X*row)
# define SCORE_Y(row) (SCORE_START_Y+ROW_SPACING_Y*row)
# define POINTS_X(row) (POINTS_START_X+ROW_SPACING_X*row)
# define POINTS_Y(row) (POINTS_START_Y+ROW_SPACING_Y*row)
# define TIME_X(row) (TIME_START_X+ROW_SPACING_X*row)
# define TIME_Y(row) (TIME_START_Y+ROW_SPACING_Y*row)
2005-03-27 03:00:39 +00:00
2006-01-22 01:00:06 +00:00
static RString STEPS_TYPE_COLOR_NAME ( size_t i ) { return ssprintf ( " StepsTypeColor%d " , int ( i + 1 ) ) ; }
2005-02-28 17:18:01 +00:00
2005-02-23 06:29:05 +00:00
void ScreenRanking : : Init ( )
{
2008-11-24 03:56:54 +00:00
STEPS_TYPES_TO_SHOW . Load ( m_sName , " StepsTypesToHide " ) ; // tricky: The metric name is "hide" because ThemeMetricStepsTypesToShow takes a list of what to hide and returns what StepsTypes to show
PAGE_FADE_SECONDS . Load ( m_sName , " PageFadeSeconds " ) ;
2005-10-07 03:28:47 +00:00
2005-02-23 06:29:05 +00:00
ScreenAttract : : Init ( ) ;
2005-09-21 21:14:09 +00:00
m_textStepsType . SetName ( " StepsType " ) ;
2008-11-27 02:58:50 +00:00
m_textStepsType . LoadFromFont ( THEME - > GetPathF ( m_sName , " StepsType " ) ) ;
2005-09-21 21:14:09 +00:00
m_textStepsType . SetShadowLength ( 0 ) ;
this - > AddChild ( & m_textStepsType ) ;
2007-05-02 00:09:16 +00:00
LOAD_ALL_COMMANDS ( m_textStepsType ) ;
2003-01-26 07:33:03 +00:00
2007-05-02 22:43:45 +00:00
2008-11-27 02:58:50 +00:00
RANKING_TYPE . Load ( m_sName , " RankingType " ) ;
COURSES_TO_SHOW . Load ( m_sName , " CoursesToShow " ) ;
SECONDS_PER_PAGE . Load ( m_sName , " SecondsPerPage " ) ;
2005-02-28 18:49:17 +00:00
2007-05-02 22:43:45 +00:00
NO_SCORE_NAME . Load ( m_sName , " NoScoreName " ) ;
ROW_SPACING_X . Load ( m_sName , " RowSpacingX " ) ;
ROW_SPACING_Y . Load ( m_sName , " RowSpacingY " ) ;
2006-01-15 19:13:38 +00:00
BULLET_START_X . Load ( m_sName , " BulletStartX " ) ;
BULLET_START_Y . Load ( m_sName , " BulletStartY " ) ;
NAME_START_X . Load ( m_sName , " NameStartX " ) ;
NAME_START_Y . Load ( m_sName , " NameStartY " ) ;
SCORE_START_X . Load ( m_sName , " ScoreStartX " ) ;
SCORE_START_Y . Load ( m_sName , " ScoreStartY " ) ;
POINTS_START_X . Load ( m_sName , " PointsStartX " ) ;
POINTS_START_Y . Load ( m_sName , " PointsStartY " ) ;
TIME_START_X . Load ( m_sName , " TimeStartX " ) ;
TIME_START_Y . Load ( m_sName , " TimeStartY " ) ;
2008-12-21 01:27:33 +00:00
STEPS_TYPE_COLOR . Load ( m_sName , STEPS_TYPE_COLOR_NAME , NUM_RANKING_LINES ) ;
2006-01-15 19:13:38 +00:00
2008-11-27 02:58:50 +00:00
if ( RANKING_TYPE = = RankingType_Category )
2003-01-26 07:33:03 +00:00
{
2005-09-27 19:10:09 +00:00
m_textCategory . SetName ( " Category " ) ;
m_textCategory . LoadFromFont ( THEME - > GetPathF ( m_sName , " category " ) ) ;
m_textCategory . SetShadowLength ( 0 ) ;
this - > AddChild ( & m_textCategory ) ;
2007-05-01 21:20:14 +00:00
LOAD_ALL_COMMANDS ( m_textCategory ) ;
2005-09-27 19:10:09 +00:00
for ( unsigned i = 0 ; i < STEPS_TYPES_TO_SHOW . GetValue ( ) . size ( ) ; i + + )
2003-01-26 07:33:03 +00:00
{
2006-09-26 20:49:10 +00:00
for ( int c = 0 ; c < NUM_RankingCategory ; c + + )
2005-09-27 19:10:09 +00:00
{
PageToShow pts ;
pts . colorIndex = i ;
pts . category = ( RankingCategory ) c ;
2007-05-02 22:43:45 +00:00
StepsType st = STEPS_TYPES_TO_SHOW . GetValue ( ) [ i ] ;
pts . aTypes . push_back ( make_pair ( Difficulty_Invalid , st ) ) ;
2005-09-27 19:10:09 +00:00
m_vPagesToShow . push_back ( pts ) ;
}
2003-01-26 07:33:03 +00:00
}
2005-09-27 19:10:09 +00:00
}
2008-11-27 02:58:50 +00:00
if ( RANKING_TYPE = = RankingType_SpecificTrail )
2005-09-27 19:10:09 +00:00
{
m_Banner . SetName ( " Banner " ) ;
this - > AddChild ( & m_Banner ) ;
2007-05-01 21:20:14 +00:00
LOAD_ALL_COMMANDS ( m_Banner ) ;
2005-09-27 19:10:09 +00:00
m_textCourseTitle . SetName ( " CourseTitle " ) ;
m_textCourseTitle . LoadFromFont ( THEME - > GetPathF ( m_sName , " course title " ) ) ;
m_textCourseTitle . SetShadowLength ( 0 ) ;
this - > AddChild ( & m_textCourseTitle ) ;
2007-05-01 21:20:14 +00:00
LOAD_ALL_COMMANDS ( m_textCourseTitle ) ;
2005-09-27 19:10:09 +00:00
2006-01-22 01:00:06 +00:00
vector < RString > asCoursePaths ;
2005-09-27 19:10:09 +00:00
split ( COURSES_TO_SHOW , " , " , asCoursePaths , true ) ;
for ( unsigned i = 0 ; i < STEPS_TYPES_TO_SHOW . GetValue ( ) . size ( ) ; i + + )
2003-01-26 07:33:03 +00:00
{
2005-09-27 19:10:09 +00:00
for ( unsigned c = 0 ; c < asCoursePaths . size ( ) ; c + + )
{
PageToShow pts ;
pts . colorIndex = i ;
2007-05-02 22:43:45 +00:00
StepsType st = STEPS_TYPES_TO_SHOW . GetValue ( ) [ i ] ;
pts . aTypes . push_back ( make_pair ( Difficulty_Invalid , st ) ) ;
2005-09-27 19:10:09 +00:00
pts . pCourse = SONGMAN - > GetCourseFromPath ( asCoursePaths [ c ] ) ;
if ( pts . pCourse = = NULL )
continue ;
2007-05-02 22:43:45 +00:00
pts . pTrail = pts . pCourse - > GetTrail ( st ) ;
2005-09-27 19:10:09 +00:00
if ( pts . pTrail = = NULL )
continue ;
m_vPagesToShow . push_back ( pts ) ;
}
2003-01-26 07:33:03 +00:00
}
2005-03-23 08:48:38 +00:00
}
2005-09-27 19:10:09 +00:00
for ( int l = 0 ; l < NUM_RANKING_LINES ; l + + )
2005-03-23 08:48:38 +00:00
{
2005-09-27 19:10:09 +00:00
m_sprBullets [ l ] . Load ( THEME - > GetPathG ( m_sName , ssprintf ( " bullets 1x%d " , NUM_RANKING_LINES ) ) ) ;
m_sprBullets [ l ] - > SetName ( ssprintf ( " Bullet%d " , l + 1 ) ) ;
m_sprBullets [ l ] - > StopAnimating ( ) ;
m_sprBullets [ l ] - > SetState ( l ) ;
m_sprBullets [ l ] - > SetXY ( BULLET_X ( l ) , BULLET_Y ( l ) ) ;
ActorUtil : : LoadAllCommands ( * m_sprBullets [ l ] , m_sName ) ;
this - > AddChild ( m_sprBullets [ l ] ) ;
m_textNames [ l ] . SetName ( ssprintf ( " Name%d " , l + 1 ) ) ;
m_textNames [ l ] . LoadFromFont ( THEME - > GetPathF ( m_sName , " name " ) ) ;
m_textNames [ l ] . SetXY ( NAME_X ( l ) , NAME_Y ( l ) ) ;
ActorUtil : : LoadAllCommands ( m_textNames [ l ] , m_sName ) ;
this - > AddChild ( & m_textNames [ l ] ) ;
m_textScores [ l ] . SetName ( ssprintf ( " Score%d " , l + 1 ) ) ;
m_textScores [ l ] . LoadFromFont ( THEME - > GetPathF ( m_sName , " score " ) ) ;
m_textScores [ l ] . SetXY ( SCORE_X ( l ) , SCORE_Y ( l ) ) ;
ActorUtil : : LoadAllCommands ( m_textScores [ l ] , m_sName ) ;
this - > AddChild ( & m_textScores [ l ] ) ;
m_textPoints [ l ] . SetName ( ssprintf ( " Points%d " , l + 1 ) ) ;
m_textPoints [ l ] . LoadFromFont ( THEME - > GetPathF ( m_sName , " points " ) ) ;
2007-02-13 06:32:26 +00:00
m_textPoints [ l ] . SetVisible ( false ) ;
2005-09-27 19:10:09 +00:00
m_textPoints [ l ] . SetXY ( POINTS_X ( l ) , POINTS_Y ( l ) ) ;
ActorUtil : : LoadAllCommands ( m_textPoints [ l ] , m_sName ) ;
this - > AddChild ( & m_textPoints [ l ] ) ;
m_textTime [ l ] . SetName ( ssprintf ( " Time%d " , l + 1 ) ) ;
m_textTime [ l ] . LoadFromFont ( THEME - > GetPathF ( m_sName , " time " ) ) ;
2007-02-13 06:32:26 +00:00
m_textTime [ l ] . SetVisible ( false ) ;
2005-09-27 19:10:09 +00:00
m_textTime [ l ] . SetXY ( TIME_X ( l ) , TIME_Y ( l ) ) ;
ActorUtil : : LoadAllCommands ( m_textTime [ l ] , m_sName ) ;
this - > AddChild ( & m_textTime [ l ] ) ;
2003-01-26 07:33:03 +00:00
}
}
2008-11-27 02:58:50 +00:00
void ScreenRanking : : BeginScreen ( )
2003-01-26 07:33:03 +00:00
{
2008-11-27 02:58:50 +00:00
m_iNextPageToShow = 0 ;
ScreenAttract : : BeginScreen ( ) ;
this - > HandleScreenMessage ( SM_ShowNextPage ) ;
}
void ScreenRanking : : HandleScreenMessage ( const ScreenMessage SM )
{
if ( SM = = SM_ShowNextPage )
{
if ( m_iNextPageToShow < m_vPagesToShow . size ( ) )
{
float fSecsToShow = SetPage ( m_vPagesToShow [ m_iNextPageToShow ] ) ;
+ + m_iNextPageToShow ;
this - > SortByDrawOrder ( ) ;
this - > PostScreenMessage ( SM_HidePage , fSecsToShow - PAGE_FADE_SECONDS ) ;
}
else
{
StartTransitioningScreen ( SM_GoToNextScreen ) ;
}
}
else if ( SM = = SM_HidePage )
{
this - > PlayCommand ( " SwitchPage " ) ;
this - > PostScreenMessage ( SM_ShowNextPage , PAGE_FADE_SECONDS ) ;
}
ScreenAttract : : HandleScreenMessage ( SM ) ;
}
float ScreenRanking : : SetPage ( const PageToShow & pts )
{
// This is going to take a while to load. Possibly longer than one frame.
// So, zero the next update so we don't skip.
SCREENMAN - > ZeroNextUpdate ( ) ;
//
// init page
//
StepsType st = pts . aTypes . front ( ) . second ;
2009-08-09 02:59:32 +00:00
m_textStepsType . SetText ( GAMEMAN - > GetStepsTypeInfo ( st ) . GetLocalizedString ( ) ) ;
2008-11-27 02:58:50 +00:00
2005-02-28 07:17:10 +00:00
2005-09-27 19:10:09 +00:00
bool bShowScores = false ;
bool bShowPoints = false ;
bool bShowTime = false ;
2008-11-27 02:58:50 +00:00
switch ( RANKING_TYPE )
2003-10-14 17:06:30 +00:00
{
2008-11-27 02:58:50 +00:00
case RankingType_Category :
2005-09-27 19:10:09 +00:00
bShowScores = true ;
break ;
2008-11-27 02:58:50 +00:00
case RankingType_SpecificTrail :
2005-09-27 19:10:09 +00:00
bShowScores = ! pts . pCourse - > IsOni ( ) ;
bShowPoints = pts . pCourse - > IsOni ( ) ;
bShowTime = pts . pCourse - > IsOni ( ) ;
break ;
2005-09-21 20:43:07 +00:00
}
2005-09-27 19:10:09 +00:00
for ( int l = 0 ; l < NUM_RANKING_LINES ; l + + )
2005-03-24 21:44:03 +00:00
{
2005-09-27 19:10:09 +00:00
m_textNames [ l ] . SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) ) ;
2007-02-13 06:32:26 +00:00
m_textScores [ l ] . SetVisible ( bShowScores ) ;
2005-09-27 19:10:09 +00:00
m_textScores [ l ] . SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) ) ;
2007-02-13 06:32:26 +00:00
m_textPoints [ l ] . SetVisible ( bShowPoints ) ;
2005-09-27 19:10:09 +00:00
m_textPoints [ l ] . SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) ) ;
2007-02-13 06:32:26 +00:00
m_textTime [ l ] . SetVisible ( bShowTime ) ;
2005-09-27 19:10:09 +00:00
m_textTime [ l ] . SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) ) ;
2004-01-29 01:46:08 +00:00
}
2005-09-22 01:49:07 +00:00
2008-11-27 02:58:50 +00:00
switch ( RANKING_TYPE )
2003-01-26 07:33:03 +00:00
{
2008-11-27 02:58:50 +00:00
case RankingType_Category :
2003-01-26 07:33:03 +00:00
{
2003-12-28 08:20:48 +00:00
m_textCategory . SetText ( ssprintf ( " Type %c " , ' A ' + pts . category ) ) ;
2003-10-22 09:45:23 +00:00
2003-01-27 02:00:38 +00:00
for ( int l = 0 ; l < NUM_RANKING_LINES ; l + + )
2003-01-26 07:33:03 +00:00
{
2007-05-02 22:43:45 +00:00
StepsType st = pts . aTypes . front ( ) . second ;
2008-11-27 02:58:50 +00:00
HighScoreList & hsl = PROFILEMAN - > GetMachineProfile ( ) - > GetCategoryHighScoreList ( st , pts . category ) ;
2004-02-09 06:26:13 +00:00
HighScore hs ;
2003-12-28 08:20:48 +00:00
bool bRecentHighScore = false ;
2004-02-09 06:26:13 +00:00
if ( l < ( int ) hsl . vHighScores . size ( ) )
2003-12-28 08:20:48 +00:00
{
2004-02-09 06:26:13 +00:00
hs = hsl . vHighScores [ l ] ;
2006-01-22 01:00:06 +00:00
RString * psName = hsl . vHighScores [ l ] . GetNameMutable ( ) ;
2003-12-28 08:20:48 +00:00
bRecentHighScore = find ( GAMESTATE - > m_vpsNamesThatWereFilled . begin ( ) , GAMESTATE - > m_vpsNamesThatWereFilled . end ( ) , psName ) ! = GAMESTATE - > m_vpsNamesThatWereFilled . end ( ) ;
}
2003-12-24 23:38:56 +00:00
else
2003-12-28 08:20:48 +00:00
{
2005-08-12 01:52:01 +00:00
hs . SetName ( NO_SCORE_NAME ) ;
2003-12-28 08:20:48 +00:00
}
2003-10-14 17:06:30 +00:00
2004-03-08 02:50:46 +00:00
m_textNames [ l ] . SetText ( hs . GetDisplayName ( ) ) ;
2005-08-12 02:37:04 +00:00
m_textScores [ l ] . SetText ( ssprintf ( " %09i " , hs . GetScore ( ) ) ) ;
2005-02-28 17:18:01 +00:00
m_textNames [ l ] . SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) ) ;
m_textScores [ l ] . SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) ) ;
2003-02-03 05:53:59 +00:00
if ( bRecentHighScore )
{
2003-03-02 01:43:33 +00:00
m_textNames [ l ] . SetEffectGlowBlink ( 0.1f ) ;
m_textScores [ l ] . SetEffectGlowBlink ( 0.1f ) ;
2003-02-03 05:53:59 +00:00
}
else
{
2005-07-24 03:11:03 +00:00
m_textNames [ l ] . StopEffect ( ) ;
m_textScores [ l ] . StopEffect ( ) ;
2003-01-27 02:00:38 +00:00
}
2003-01-26 07:33:03 +00:00
}
}
2003-12-28 08:20:48 +00:00
return SECONDS_PER_PAGE ;
2008-11-27 02:58:50 +00:00
case RankingType_SpecificTrail :
2003-01-26 07:33:03 +00:00
{
2005-05-23 00:38:09 +00:00
m_textCourseTitle . SetText ( pts . pCourse - > GetDisplayFullTitle ( ) ) ;
2005-09-21 20:16:53 +00:00
2003-12-28 08:20:48 +00:00
m_Banner . LoadFromCourse ( pts . pCourse ) ;
2003-07-16 02:32:37 +00:00
2004-06-03 20:47:37 +00:00
const HighScoreList & hsl = PROFILEMAN - > GetMachineProfile ( ) - > GetCourseHighScoreList ( pts . pCourse , pts . pTrail ) ;
2003-01-27 02:00:38 +00:00
for ( int l = 0 ; l < NUM_RANKING_LINES ; l + + )
2003-01-26 07:33:03 +00:00
{
2004-02-09 06:26:13 +00:00
HighScore hs ;
2003-12-28 08:20:48 +00:00
bool bRecentHighScore = false ;
2004-02-09 06:26:13 +00:00
if ( l < ( int ) hsl . vHighScores . size ( ) )
2003-12-28 08:20:48 +00:00
{
2004-02-09 06:26:13 +00:00
hs = hsl . vHighScores [ l ] ;
2006-01-22 01:00:06 +00:00
const RString * psName = hsl . vHighScores [ l ] . GetNameMutable ( ) ;
2003-12-28 08:20:48 +00:00
bRecentHighScore = find ( GAMESTATE - > m_vpsNamesThatWereFilled . begin ( ) , GAMESTATE - > m_vpsNamesThatWereFilled . end ( ) , psName ) ! = GAMESTATE - > m_vpsNamesThatWereFilled . end ( ) ;
}
2003-12-24 23:38:56 +00:00
else
2003-12-28 08:20:48 +00:00
{
2005-08-12 01:52:01 +00:00
hs . SetName ( NO_SCORE_NAME ) ;
2003-12-28 08:20:48 +00:00
}
2004-02-09 06:26:13 +00:00
2004-03-08 02:50:46 +00:00
m_textNames [ l ] . SetText ( hs . GetDisplayName ( ) ) ;
2003-06-30 08:06:47 +00:00
if ( pts . pCourse - > IsOni ( ) )
{
2005-08-12 02:37:04 +00:00
m_textPoints [ l ] . SetText ( ssprintf ( " %04d " , hs . GetScore ( ) ) ) ;
2005-08-12 02:46:58 +00:00
m_textTime [ l ] . SetText ( SecondsToMMSSMsMs ( hs . GetSurviveSeconds ( ) ) ) ;
2003-06-30 08:06:47 +00:00
m_textScores [ l ] . SetText ( " " ) ;
} else {
m_textPoints [ l ] . SetText ( " " ) ;
m_textTime [ l ] . SetText ( " " ) ;
2005-08-12 02:37:04 +00:00
m_textScores [ l ] . SetText ( ssprintf ( " %09d " , hs . GetScore ( ) ) ) ;
2003-06-30 08:06:47 +00:00
}
2005-02-28 17:18:01 +00:00
m_textNames [ l ] . SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) ) ;
m_textPoints [ l ] . SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) ) ;
m_textTime [ l ] . SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) ) ;
m_textScores [ l ] . SetDiffuse ( STEPS_TYPE_COLOR . GetValue ( pts . colorIndex ) ) ;
2003-12-28 08:20:48 +00:00
if ( bRecentHighScore )
2003-01-27 02:00:38 +00:00
{
2003-12-28 08:20:48 +00:00
m_textNames [ l ] . SetEffectGlowBlink ( 0.1f ) ;
m_textScores [ l ] . SetEffectGlowBlink ( 0.1f ) ;
}
else
{
2005-07-24 03:11:03 +00:00
m_textNames [ l ] . StopEffect ( ) ;
m_textScores [ l ] . StopEffect ( ) ;
2003-01-27 02:00:38 +00:00
}
2003-01-26 07:33:03 +00:00
}
}
2003-12-28 08:20:48 +00:00
return SECONDS_PER_PAGE ;
2003-01-26 07:33:03 +00:00
default :
ASSERT ( 0 ) ;
2003-12-28 08:20:48 +00:00
return 0 ;
2003-01-26 07:33:03 +00:00
}
2003-01-26 20:49:05 +00:00
}
2004-06-08 05:22:33 +00:00
/*
2007-05-02 22:43:45 +00:00
* (c) 2001-2007 Chris Danford, Glenn Maynard
2004-06-08 05:22:33 +00:00
* 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.
*/