2003-02-16 04:01:45 +00:00
# include "global.h"
2002-07-27 19:29:51 +00:00
/*
-----------------------------------------------------------------------------
Class: PlayerOptions
Desc: See header.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
# include "PlayerOptions.h"
# include "RageUtil.h"
2003-02-26 23:26:57 +00:00
# include "math.h"
2003-07-28 07:55:57 +00:00
# include "RageLog.h"
2002-07-27 19:29:51 +00:00
2003-04-18 02:13:23 +00:00
# include "GameState.h"
# include "NoteFieldPositioning.h"
2003-04-22 04:54:04 +00:00
# include "NoteSkinManager.h"
2002-09-30 02:19:02 +00:00
void PlayerOptions : : Init ( )
{
2003-04-24 06:16:04 +00:00
m_bTimeSpacing = false ;
2003-01-25 11:05:12 +00:00
m_fScrollSpeed = 1.0f ;
2003-04-24 06:16:04 +00:00
m_fScrollBPM = 200 ;
2003-02-26 23:26:57 +00:00
ZERO ( m_fAccels ) ;
ZERO ( m_fEffects ) ;
ZERO ( m_fAppearances ) ;
m_fReverseScroll = 0 ;
m_fDark = 0 ;
m_Turn = TURN_NONE ;
2003-02-16 20:27:53 +00:00
m_Transform = TRANSFORM_NONE ;
2002-09-30 02:19:02 +00:00
m_bHoldNotes = true ;
2003-03-27 00:49:48 +00:00
m_bTimingAssist = false ;
2003-08-01 00:15:17 +00:00
m_bProTiming = false ;
2003-04-01 19:31:27 +00:00
m_fPerspectiveTilt = 0 ;
2003-04-22 04:54:04 +00:00
m_sPositioning = " " ; // "null"
m_sNoteSkin = " default " ;
2002-09-30 02:19:02 +00:00
}
2003-02-26 23:26:57 +00:00
void PlayerOptions : : Approach ( const PlayerOptions & other , float fDeltaSeconds )
{
int i ;
2003-04-16 22:49:40 +00:00
fapproach ( m_fScrollSpeed , other . m_fScrollSpeed , fDeltaSeconds * ( 0.2f + fabsf ( m_fScrollSpeed - other . m_fScrollSpeed ) ) ) ; // make big jumps in scroll speed move faster
2003-02-26 23:26:57 +00:00
for ( i = 0 ; i < NUM_ACCELS ; i + + )
2003-04-16 22:49:40 +00:00
fapproach ( m_fAccels [ i ] , other . m_fAccels [ i ] , fDeltaSeconds ) ;
2003-02-26 23:26:57 +00:00
for ( i = 0 ; i < NUM_EFFECTS ; i + + )
2003-04-16 22:49:40 +00:00
fapproach ( m_fEffects [ i ] , other . m_fEffects [ i ] , fDeltaSeconds ) ;
2003-02-26 23:26:57 +00:00
for ( i = 0 ; i < NUM_APPEARANCES ; i + + )
2003-04-16 22:49:40 +00:00
fapproach ( m_fAppearances [ i ] , other . m_fAppearances [ i ] , fDeltaSeconds ) ;
fapproach ( m_fReverseScroll , other . m_fReverseScroll , fDeltaSeconds ) ;
fapproach ( m_fDark , other . m_fDark , fDeltaSeconds ) ;
fapproach ( m_fPerspectiveTilt , other . m_fPerspectiveTilt , fDeltaSeconds ) ;
2003-02-26 23:26:57 +00:00
}
2002-07-27 19:29:51 +00:00
CString PlayerOptions : : GetString ( )
{
CString sReturn ;
2002-08-01 13:42:56 +00:00
2003-04-24 06:16:04 +00:00
if ( ! m_bTimeSpacing )
{
2003-04-16 22:49:40 +00:00
if ( m_fScrollSpeed ! = 1 )
{
/* -> 1.00 */
CString s = ssprintf ( " %2.2f " , m_fScrollSpeed ) ;
2002-10-18 01:36:19 +00:00
if ( s [ s . GetLength ( ) - 1 ] = = ' 0 ' ) {
2003-04-16 22:49:40 +00:00
/* -> 1.0 */
s . erase ( s . GetLength ( ) - 1 ) ; // delete last char
if ( s [ s . GetLength ( ) - 1 ] = = ' 0 ' ) {
/* -> 1 */
s . erase ( s . GetLength ( ) - 2 ) ; // delete last 2 chars
}
2002-10-18 01:36:19 +00:00
}
2003-04-16 22:49:40 +00:00
sReturn + = s + " X, " ;
2002-10-18 01:36:19 +00:00
}
2003-04-24 06:16:04 +00:00
}
else
{
CString s = ssprintf ( " C%.0f " , m_fScrollBPM ) ;
sReturn + = s + " , " ;
}
2002-08-01 13:42:56 +00:00
2003-02-26 23:26:57 +00:00
if ( m_fAccels [ ACCEL_BOOST ] = = 1 ) sReturn + = " Boost, " ;
2003-04-01 19:31:27 +00:00
if ( m_fAccels [ ACCEL_BRAKE ] = = 1 ) sReturn + = " Brake, " ;
2003-02-26 23:26:57 +00:00
if ( m_fAccels [ ACCEL_WAVE ] = = 1 ) sReturn + = " Wave, " ;
if ( m_fAccels [ ACCEL_EXPAND ] = = 1 ) sReturn + = " Expand, " ;
if ( m_fAccels [ ACCEL_BOOMERANG ] = = 1 ) sReturn + = " Boomerang, " ;
2002-09-30 02:19:02 +00:00
2003-02-26 23:26:57 +00:00
if ( m_fEffects [ EFFECT_DRUNK ] = = 1 ) sReturn + = " Drunk, " ;
if ( m_fEffects [ EFFECT_DIZZY ] = = 1 ) sReturn + = " Dizzy, " ;
if ( m_fEffects [ EFFECT_MINI ] = = 1 ) sReturn + = " Mini, " ;
if ( m_fEffects [ EFFECT_FLIP ] = = 1 ) sReturn + = " Flip, " ;
if ( m_fEffects [ EFFECT_TORNADO ] = = 1 ) sReturn + = " Tornado, " ;
2003-08-16 23:34:47 +00:00
if ( m_fEffects [ EFFECT_TIPSY ] = = 1 ) sReturn + = " Tipsy, " ;
2003-07-09 01:34:48 +00:00
if ( m_fEffects [ EFFECT_BUMPY ] = = 1 ) sReturn + = " Bumpy, " ;
2003-07-09 10:40:34 +00:00
if ( m_fEffects [ EFFECT_BEAT ] = = 1 ) sReturn + = " Beat, " ;
2002-08-01 13:42:56 +00:00
2003-02-26 23:26:57 +00:00
if ( m_fAppearances [ APPEARANCE_HIDDEN ] = = 1 ) sReturn + = " Hidden, " ;
if ( m_fAppearances [ APPEARANCE_SUDDEN ] = = 1 ) sReturn + = " Sudden, " ;
if ( m_fAppearances [ APPEARANCE_STEALTH ] = = 1 ) sReturn + = " Stealth, " ;
if ( m_fAppearances [ APPEARANCE_BLINK ] = = 1 ) sReturn + = " Blink, " ;
2003-05-04 13:58:45 +00:00
if ( m_fAppearances [ APPEARANCE_RANDOMVANISH ] = = 1 ) sReturn + = " RandomVanish, " ;
2003-02-26 23:26:57 +00:00
if ( m_fReverseScroll = = 1 ) sReturn + = " Reverse, " ;
2002-08-01 13:42:56 +00:00
2003-02-26 23:26:57 +00:00
if ( m_fDark = = 1 ) sReturn + = " Dark, " ;
switch ( m_Turn )
2002-07-27 19:29:51 +00:00
{
2002-09-02 21:59:58 +00:00
case TURN_NONE : break ;
case TURN_MIRROR : sReturn + = " Mirror, " ; break ;
case TURN_LEFT : sReturn + = " Left, " ; break ;
case TURN_RIGHT : sReturn + = " Right, " ; break ;
case TURN_SHUFFLE : sReturn + = " Shuffle, " ; break ;
case TURN_SUPER_SHUFFLE : sReturn + = " SuperShuffle, " ; break ;
2003-02-16 20:27:53 +00:00
default : ASSERT ( 0 ) ; // invalid
2002-07-27 19:29:51 +00:00
}
2002-08-01 13:42:56 +00:00
2003-02-16 20:27:53 +00:00
switch ( m_Transform )
{
2003-02-20 00:57:52 +00:00
case TRANSFORM_NONE : break ;
case TRANSFORM_LITTLE : sReturn + = " Little, " ; break ;
case TRANSFORM_WIDE : sReturn + = " Wide, " ; break ;
case TRANSFORM_BIG : sReturn + = " Big, " ; break ;
case TRANSFORM_QUICK : sReturn + = " Quick, " ; break ;
2003-03-13 09:25:57 +00:00
case TRANSFORM_SKIPPY : sReturn + = " Skippy, " ; break ;
2003-08-10 10:12:50 +00:00
case TRANSFORM_MINES : sReturn + = " Mines, " ; break ;
2003-02-16 20:27:53 +00:00
default : ASSERT ( 0 ) ; // invalid
}
2002-08-01 13:42:56 +00:00
2003-02-26 23:26:57 +00:00
if ( ! m_bHoldNotes ) sReturn + = " NoHolds, " ;
2003-03-27 00:49:48 +00:00
if ( m_bTimingAssist ) sReturn + = " TimingAssist, " ;
2003-08-01 00:15:17 +00:00
if ( m_bProTiming ) sReturn + = " ProTiming, " ;
2002-08-01 13:42:56 +00:00
2003-04-01 19:31:27 +00:00
switch ( ( int ) m_fPerspectiveTilt )
{
case - 1 : sReturn + = " Incoming, " ; break ;
case + 1 : sReturn + = " Space, " ; break ;
}
2003-04-22 04:54:04 +00:00
if ( ! m_sPositioning . empty ( ) )
sReturn + = m_sPositioning + " , " ;
if ( ! m_sNoteSkin . empty ( ) & & m_sNoteSkin . CompareNoCase ( " default " ) ! = 0 )
sReturn + = m_sNoteSkin + " , " ;
2002-07-27 19:29:51 +00:00
if ( sReturn . GetLength ( ) > 2 )
2003-01-03 05:29:45 +00:00
sReturn . erase ( sReturn . GetLength ( ) - 2 ) ; // delete the trailing ", "
2002-07-27 19:29:51 +00:00
return sReturn ;
}
2003-02-22 21:56:59 +00:00
/* Options are added to the current settings; call Init() beforehand if
* you don't want this. */
2002-07-27 19:29:51 +00:00
void PlayerOptions : : FromString ( CString sOptions )
{
2003-06-30 18:55:07 +00:00
ASSERT ( GAMESTATE - > m_pPosition ) ;
ASSERT ( NOTESKIN ) ;
2003-02-22 21:56:59 +00:00
// Init();
2002-08-01 13:42:56 +00:00
sOptions . MakeLower ( ) ;
CStringArray asBits ;
split ( sOptions , " , " , asBits , true ) ;
2002-10-31 03:16:02 +00:00
for ( unsigned i = 0 ; i < asBits . size ( ) ; i + + )
2002-08-01 13:42:56 +00:00
{
CString & sBit = asBits [ i ] ;
2002-10-31 08:05:13 +00:00
TrimLeft ( sBit ) ;
TrimRight ( sBit ) ;
2003-07-28 07:55:57 +00:00
2003-07-28 18:03:50 +00:00
int i1 ;
Regex mult ( " ^([0-9]+( \\ .[0-9]+) ? ) x $ " ) ;
vector < CString > matches ;
if ( mult . Compare ( sBit , matches ) )
{
m_bTimeSpacing = false ;
int ret = sscanf ( matches [ 0 ] , " %f " , & m_fScrollSpeed ) ;
ASSERT ( ret = = 1 ) ;
}
2003-07-28 07:55:57 +00:00
else if ( sscanf ( sBit , " C%d " , & i1 ) = = 1 )
{
m_bTimeSpacing = true ;
2003-07-28 18:03:50 +00:00
m_fScrollBPM = ( float ) i1 ;
2003-07-28 07:55:57 +00:00
}
2003-02-26 23:26:57 +00:00
else if ( sBit = = " boost " ) m_fAccels [ ACCEL_BOOST ] = 1 ;
2003-05-24 05:44:31 +00:00
else if ( sBit = = " brake " | | sBit = = " land " ) m_fAccels [ ACCEL_BRAKE ] = 1 ;
2003-02-26 23:26:57 +00:00
else if ( sBit = = " wave " ) m_fAccels [ ACCEL_WAVE ] = 1 ;
else if ( sBit = = " expand " ) m_fAccels [ ACCEL_EXPAND ] = 1 ;
else if ( sBit = = " boomerang " ) m_fAccels [ ACCEL_BOOMERANG ] = 1 ;
else if ( sBit = = " drunk " ) m_fEffects [ EFFECT_DRUNK ] = 1 ;
else if ( sBit = = " dizzy " ) m_fEffects [ EFFECT_DIZZY ] = 1 ;
else if ( sBit = = " mini " ) m_fEffects [ EFFECT_MINI ] = 1 ;
else if ( sBit = = " flip " ) m_fEffects [ EFFECT_FLIP ] = 1 ;
else if ( sBit = = " tornado " ) m_fEffects [ EFFECT_TORNADO ] = 1 ;
2003-08-16 23:34:47 +00:00
else if ( sBit = = " tipsy " ) m_fEffects [ EFFECT_TIPSY ] = 1 ;
2003-07-09 01:34:48 +00:00
else if ( sBit = = " bumpy " ) m_fEffects [ EFFECT_BUMPY ] = 1 ;
2003-07-09 10:40:34 +00:00
else if ( sBit = = " beat " ) m_fEffects [ EFFECT_BEAT ] = 1 ;
2003-02-26 23:26:57 +00:00
else if ( sBit = = " hidden " ) m_fAppearances [ APPEARANCE_HIDDEN ] = 1 ;
else if ( sBit = = " sudden " ) m_fAppearances [ APPEARANCE_SUDDEN ] = 1 ;
else if ( sBit = = " stealth " ) m_fAppearances [ APPEARANCE_STEALTH ] = 1 ;
else if ( sBit = = " blink " ) m_fAppearances [ APPEARANCE_BLINK ] = 1 ;
2003-05-04 13:58:45 +00:00
else if ( sBit = = " randomvanish " ) m_fAppearances [ APPEARANCE_RANDOMVANISH ] = 1 ;
2003-02-26 23:26:57 +00:00
else if ( sBit = = " mirror " ) m_Turn = TURN_MIRROR ;
else if ( sBit = = " left " ) m_Turn = TURN_LEFT ;
else if ( sBit = = " right " ) m_Turn = TURN_RIGHT ;
else if ( sBit = = " shuffle " ) m_Turn = TURN_SHUFFLE ;
else if ( sBit = = " supershuffle " ) m_Turn = TURN_SUPER_SHUFFLE ;
2003-02-16 20:27:53 +00:00
else if ( sBit = = " little " ) m_Transform = TRANSFORM_LITTLE ;
2003-02-19 22:58:14 +00:00
else if ( sBit = = " wide " ) m_Transform = TRANSFORM_WIDE ;
2003-02-20 00:57:52 +00:00
else if ( sBit = = " big " ) m_Transform = TRANSFORM_BIG ;
else if ( sBit = = " quick " ) m_Transform = TRANSFORM_QUICK ;
2003-03-13 09:25:57 +00:00
else if ( sBit = = " skippy " ) m_Transform = TRANSFORM_SKIPPY ;
2003-08-10 10:12:50 +00:00
else if ( sBit = = " mines " ) m_Transform = TRANSFORM_MINES ;
2003-02-26 23:26:57 +00:00
else if ( sBit = = " reverse " ) m_fReverseScroll = 1 ;
2002-08-01 13:42:56 +00:00
else if ( sBit = = " noholds " ) m_bHoldNotes = false ;
else if ( sBit = = " nofreeze " ) m_bHoldNotes = false ;
2003-02-26 23:26:57 +00:00
else if ( sBit = = " dark " ) m_fDark = 1 ;
2003-03-27 00:49:48 +00:00
else if ( sBit = = " timingassist " ) m_bTimingAssist = true ;
2003-08-01 00:15:17 +00:00
else if ( sBit = = " protiming " ) m_bProTiming = true ;
2003-04-01 19:31:27 +00:00
else if ( sBit = = " incoming " ) m_fPerspectiveTilt = - 1 ;
else if ( sBit = = " space " ) m_fPerspectiveTilt = + 1 ;
2003-05-13 05:24:30 +00:00
else if ( GAMESTATE - > m_pPosition - > IsValidModeForAnyStyle ( sBit ) )
2003-04-22 04:54:04 +00:00
m_sPositioning = sBit ;
else if ( NOTESKIN - > DoesNoteSkinExist ( sBit ) )
m_sNoteSkin = sBit ;
2003-07-31 02:06:19 +00:00
// XXX: this warns about song options
//else
// LOG->Warn( "Modifier '%s' not recognized.", sBit.c_str() );
2002-08-01 13:42:56 +00:00
}
2002-11-16 09:12:55 +00:00
}
2003-01-25 11:05:12 +00:00
2003-02-26 23:26:57 +00:00
void NextFloat ( float fValues [ ] , int size )
2003-01-25 11:05:12 +00:00
{
2003-02-26 23:26:57 +00:00
int index = - 1 ;
2003-04-17 21:44:33 +00:00
int i ;
for ( i = 0 ; i < size ; i + + )
2003-01-25 11:05:12 +00:00
{
2003-02-26 23:26:57 +00:00
if ( fValues [ i ] = = 1 )
2003-01-25 11:05:12 +00:00
{
2003-02-26 23:26:57 +00:00
index = i ;
break ;
2003-01-25 11:05:12 +00:00
}
}
2003-04-17 21:44:33 +00:00
for ( i = 0 ; i < size ; i + + )
fValues [ i ] = 0 ;
2003-02-26 23:26:57 +00:00
2003-04-17 21:44:33 +00:00
if ( index = = size - 1 ) // if true, then the last float in the list was selected
2003-02-26 23:26:57 +00:00
; // leave all off
else
2003-04-17 21:44:33 +00:00
fValues [ index + 1 ] = 1 ;
2003-02-26 23:26:57 +00:00
}
void PlayerOptions : : NextAccel ( )
{
NextFloat ( m_fAccels , NUM_ACCELS ) ;
}
void PlayerOptions : : NextEffect ( )
{
NextFloat ( m_fEffects , NUM_EFFECTS ) ;
2003-01-25 11:05:12 +00:00
}
void PlayerOptions : : NextAppearance ( )
{
2003-02-26 23:26:57 +00:00
NextFloat ( m_fAppearances , NUM_APPEARANCES ) ;
2003-01-25 11:05:12 +00:00
}
void PlayerOptions : : NextTurn ( )
{
2003-02-26 23:26:57 +00:00
m_Turn = ( Turn ) ( ( m_Turn + 1 ) % NUM_TURNS ) ;
2003-01-25 11:05:12 +00:00
}
2003-02-11 02:20:38 +00:00
2003-02-16 20:27:53 +00:00
void PlayerOptions : : NextTransform ( )
{
m_Transform = ( Transform ) ( ( m_Transform + 1 ) % NUM_TRANSFORMS ) ;
}
2003-04-01 19:31:27 +00:00
void PlayerOptions : : NextPerspective ( )
{
switch ( ( int ) m_fPerspectiveTilt )
{
case - 1 : m_fPerspectiveTilt = 0 ; break ;
case 0 : m_fPerspectiveTilt = + 1 ; break ;
case + 1 : default : m_fPerspectiveTilt = - 1 ; break ;
}
}
2003-02-11 02:20:38 +00:00
void PlayerOptions : : ChooseRandomMofifiers ( )
{
if ( RandomFloat ( 0 , 1 ) > 0.8f )
m_fScrollSpeed = 1.5f ;
if ( RandomFloat ( 0 , 1 ) > 0.8f )
2003-02-26 23:26:57 +00:00
m_fReverseScroll = 1 ;
2003-02-11 02:20:38 +00:00
if ( RandomFloat ( 0 , 1 ) > 0.9f )
2003-02-26 23:26:57 +00:00
m_fDark = 1 ;
2003-02-11 02:20:38 +00:00
float f ;
f = RandomFloat ( 0 , 1 ) ;
if ( f > 0.66f )
2003-02-26 23:26:57 +00:00
m_fAccels [ rand ( ) % NUM_ACCELS ] = 1 ;
2003-02-11 02:20:38 +00:00
else if ( f > 0.33f )
2003-02-26 23:26:57 +00:00
m_fEffects [ rand ( ) % NUM_EFFECTS ] = 1 ;
2003-02-11 02:20:38 +00:00
f = RandomFloat ( 0 , 1 ) ;
if ( f > 0.95f )
2003-02-26 23:26:57 +00:00
m_fAppearances [ APPEARANCE_HIDDEN ] = 1 ;
2003-02-11 02:20:38 +00:00
else if ( f > 0.9f )
2003-02-26 23:26:57 +00:00
m_fAppearances [ APPEARANCE_SUDDEN ] = 1 ;
}
PlayerOptions : : Accel PlayerOptions : : GetFirstAccel ( )
{
for ( int i = 0 ; i < NUM_ACCELS ; i + + )
if ( m_fAccels [ i ] = = 1.f )
return ( Accel ) i ;
return ( Accel ) - 1 ;
}
PlayerOptions : : Effect PlayerOptions : : GetFirstEffect ( )
{
for ( int i = 0 ; i < NUM_EFFECTS ; i + + )
if ( m_fEffects [ i ] = = 1.f )
return ( Effect ) i ;
return ( Effect ) - 1 ;
}
PlayerOptions : : Appearance PlayerOptions : : GetFirstAppearance ( )
{
for ( int i = 0 ; i < NUM_APPEARANCES ; i + + )
if ( m_fAppearances [ i ] = = 1.f )
return ( Appearance ) i ;
return ( Appearance ) - 1 ;
}
void PlayerOptions : : SetOneAccel ( Accel a )
{
ZERO ( m_fAccels ) ;
m_fAccels [ a ] = 1 ;
}
void PlayerOptions : : SetOneEffect ( Effect e )
{
ZERO ( m_fEffects ) ;
m_fEffects [ e ] = 1 ;
}
void PlayerOptions : : SetOneAppearance ( Appearance a )
{
ZERO ( m_fAppearances ) ;
m_fAppearances [ a ] = 1 ;
2003-02-11 02:20:38 +00:00
}