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"
2002-07-27 19:29:51 +00:00
2002-09-30 02:19:02 +00:00
void PlayerOptions :: Init ()
{
2003-04-16 22:49:40 +00:00
// m_bUseScrollBPM = false;
2003-01-25 11:05:12 +00:00
m_fScrollSpeed = 1.0f ;
2003-04-16 22:49:40 +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-04-01 19:31:27 +00:00
m_fPerspectiveTilt = 0 ;
2003-04-16 22:49:40 +00:00
m_bTimeSpacing = false ;
2003-04-10 08:49:25 +00:00
m_sPositioning = "" ;
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-16 22:49:40 +00:00
// if( !m_bUseScrollBPM )
// {
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-16 22:49:40 +00:00
// }
// else
// {
// CString s = ssprintf( "%.0f", m_fScrollBPM );
// sReturn += s + "V, ";
// }
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, " ;
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, " ;
2002-08-01 13:42:56 +00:00
2003-02-26 23:26:57 +00:00
if ( m_fReverseScroll == 1 ) sReturn += "Reverse, " ;
if ( m_fDark == 1 ) sReturn += "Dark, " ;
2003-04-16 22:49:40 +00:00
if ( m_bTimeSpacing ) sReturn += "TimeSpacing, " ;
2003-02-26 23:26:57 +00:00
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-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, " ;
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 ;
}
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-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 );
2002-08-01 13:42:56 +00:00
2003-04-16 22:49:40 +00:00
if ( sBit == "0.25x" ) { /*m_bUseScrollBPM=false;*/ m_fScrollSpeed = 0.25f ; }
else if ( sBit == "0.5x" ) { /*m_bUseScrollBPM=false;*/ m_fScrollSpeed = 0.50f ; }
2003-04-17 21:44:33 +00:00
else if ( sBit == "0.75x" ) { /*m_bUseScrollBPM=false;*/ m_fScrollSpeed = 0.75f ; }
2003-04-16 22:49:40 +00:00
else if ( sBit == "1.5x" ) { /*m_bUseScrollBPM=false;*/ m_fScrollSpeed = 1.00f ; }
else if ( sBit == "2.0x" ) { /*m_bUseScrollBPM=false;*/ m_fScrollSpeed = 2.00f ; }
else if ( sBit == "3.0x" ) { /*m_bUseScrollBPM=false;*/ m_fScrollSpeed = 3.00f ; }
else if ( sBit == "4.0x" ) { /*m_bUseScrollBPM=false;*/ m_fScrollSpeed = 4.00f ; }
else if ( sBit == "5.0x" ) { /*m_bUseScrollBPM=false;*/ m_fScrollSpeed = 5.00f ; }
else if ( sBit == "8.0x" ) { /*m_bUseScrollBPM=false;*/ m_fScrollSpeed = 8.00f ; }
else if ( sBit == "12.0x" ) { /*m_bUseScrollBPM=false;*/ m_fScrollSpeed = 12.00f ; }
// else if( sBit == "200v" ) { m_bUseScrollBPM=true; m_fScrollBPM = 200; }
// else if( sBit == "300v" ) { m_bUseScrollBPM=true; m_fScrollBPM = 300; }
// else if( sBit == "450v" ) { m_bUseScrollBPM=true; m_fScrollBPM = 450; }
2003-02-26 23:26:57 +00:00
else if ( sBit == "boost" ) m_fAccels [ ACCEL_BOOST ] = 1 ;
2003-04-01 19:31:27 +00:00
else if ( sBit == "brake" ) 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 ;
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 ;
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-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-04-01 19:31:27 +00:00
else if ( sBit == "incoming" ) m_fPerspectiveTilt = - 1 ;
else if ( sBit == "space" ) m_fPerspectiveTilt = + 1 ;
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 )
{
int index = - 1 ;
2003-04-17 21:44:33 +00:00
int i ;
for ( i = 0 ; i < size ; i ++ )
2003-02-26 23:26:57 +00:00
{
if ( fValues [ i ] == 1 )
{
index = i ;
break ;
}
}
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
index ;
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
}
2003-01-25 11:05:12 +00:00
void PlayerOptions :: NextAccel ()
{
2003-02-26 23:26:57 +00:00
NextFloat ( m_fAccels , NUM_ACCELS );
2003-01-25 11:05:12 +00:00
}
void PlayerOptions :: NextEffect ()
{
2003-02-26 23:26:57 +00:00
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
}