allow setting PO approach speed

This commit is contained in:
Glenn Maynard
2003-10-26 08:37:48 +00:00
parent 8885e33a3e
commit 1d35453951
2 changed files with 83 additions and 65 deletions
+69 -55
View File
@@ -19,45 +19,49 @@
#include "NoteFieldPositioning.h"
#include "NoteSkinManager.h"
#define ONE( arr ) { for( unsigned Z = 0; Z < ARRAYSIZE(arr); ++Z ) arr[Z]=1.0f; }
void PlayerOptions::Init()
{
m_bTimeSpacing = false;
m_fScrollSpeed = 1.0f;
m_fScrollBPM = 200;
ZERO( m_fAccels );
ZERO( m_fEffects );
ZERO( m_fAppearances );
ZERO( m_fScrolls );
m_fDark = 0;
m_fBlind = 0;
m_fScrollSpeed = 1.0f; m_SpeedfScrollSpeed = 1.0f;
m_fScrollBPM = 200; m_SpeedfScrollBPM = 1.0f;
ZERO( m_fAccels ); ONE( m_SpeedfAccels );
ZERO( m_fEffects ); ONE( m_SpeedfEffects );
ZERO( m_fAppearances ); ONE( m_SpeedfAppearances );
ZERO( m_fScrolls ); ONE( m_SpeedfScrolls );
m_fDark = 0; m_SpeedfDark = 1.0f;
m_fBlind = 0; m_SpeedfBlind = 1.0f;
m_fPerspectiveTilt = 0; m_SpeedfPerspectiveTilt = 1.0f;
m_fSkew = 0; m_SpeedfSkew = 1.0f;
m_Turn = TURN_NONE;
m_Transform = TRANSFORM_NONE;
m_bHoldNotes = true;
m_bTimingAssist = false;
m_bProTiming = false;
m_fPerspectiveTilt = 0;
m_fSkew = 0;
m_sPositioning = ""; // "null"
m_sNoteSkin = "default";
}
void PlayerOptions::Approach( const PlayerOptions& other, float fDeltaSeconds )
{
int i;
#define APP( opt ) \
fapproach( m_ ## opt, other.m_ ## opt, fDeltaSeconds * other.m_Speed ## opt );
fapproach( m_fScrollSpeed, other.m_fScrollSpeed, fDeltaSeconds*(0.2f+fabsf(m_fScrollSpeed-other.m_fScrollSpeed)) ); // make big jumps in scroll speed move faster
int i;
for( i=0; i<NUM_ACCELS; i++ )
fapproach( m_fAccels[i], other.m_fAccels[i], fDeltaSeconds );
APP( fAccels[i] );
for( i=0; i<NUM_EFFECTS; i++ )
fapproach( m_fEffects[i], other.m_fEffects[i], fDeltaSeconds );
APP( fEffects[i] );
for( i=0; i<NUM_APPEARANCES; i++ )
fapproach( m_fAppearances[i], other.m_fAppearances[i], fDeltaSeconds );
APP( fAppearances[i] );
for( i=0; i<NUM_SCROLLS; i++ )
fapproach( m_fScrolls[i], other.m_fScrolls[i], fDeltaSeconds );
fapproach( m_fDark, other.m_fDark, fDeltaSeconds );
fapproach( m_fBlind, other.m_fBlind, fDeltaSeconds );
fapproach( m_fPerspectiveTilt, other.m_fPerspectiveTilt, fDeltaSeconds );
fapproach( m_fSkew, other.m_fSkew, fDeltaSeconds );
APP( fScrolls[i] );
APP( fScrollSpeed );
APP( fDark );
APP( fBlind );
APP( fPerspectiveTilt );
APP( fSkew );
}
static CString AddPart( float level, CString name )
@@ -210,44 +214,54 @@ void PlayerOptions::FromString( CString sOptions )
/* "drunk"
* "no drunk"
* "150% drunk" */
* "150% drunk"
* "*2 100% drunk": approach at 2x normal speed */
float level = 1;
float speed = 1;
CStringArray asParts;
split( sBit, " ", asParts, true );
if( asParts.size() > 1 )
for( unsigned j = 0; j < asParts.size()-1; ++j )
{
sBit = asParts[1];
if( asParts[0] == "no" )
if( asParts[j] == "no" )
level = 0;
else
else if( isdigit(asParts[j][0]) )
{
sscanf( asParts[0], "%f", &level );
/* If the last character is a *, they probably said "123*" when
* they meant "*123". */
if( asParts[j].Right(1) == "*" )
RageException::Throw("Invalid player options '%i*'; did you mean '*%i'?",
atoi(asParts[j]), atoi(asParts[j]) );
sscanf( asParts[j], "%f", &level );
level /= 100.0f;
}
else if( asParts[j][0]=='*' )
sscanf( asParts[j], "*%f", &speed );
}
sBit = asParts[asParts.size()-1];
#define SET_FLOAT( opt ) \
{ m_ ## opt = level; m_Speed ## opt = speed; }
const bool on = (level > 0.5f);
if( sBit == "boost" ) m_fAccels[ACCEL_BOOST] = level;
else if( sBit == "brake" || sBit == "land" ) m_fAccels[ACCEL_BRAKE] = level;
else if( sBit == "wave" ) m_fAccels[ACCEL_WAVE] = level;
else if( sBit == "expand" ) m_fAccels[ACCEL_EXPAND] = level;
else if( sBit == "boomerang" ) m_fAccels[ACCEL_BOOMERANG] = level;
else if( sBit == "drunk" ) m_fEffects[EFFECT_DRUNK] = level;
else if( sBit == "dizzy" ) m_fEffects[EFFECT_DIZZY] = level;
else if( sBit == "mini" ) m_fEffects[EFFECT_MINI] = level;
else if( sBit == "flip" ) m_fEffects[EFFECT_FLIP] = level;
else if( sBit == "tornado" ) m_fEffects[EFFECT_TORNADO] = level;
else if( sBit == "tipsy" ) m_fEffects[EFFECT_TIPSY] = level;
else if( sBit == "bumpy" ) m_fEffects[EFFECT_BUMPY] = level;
else if( sBit == "beat" ) m_fEffects[EFFECT_BEAT] = level;
else if( sBit == "hidden" ) m_fAppearances[APPEARANCE_HIDDEN] = level;
else if( sBit == "sudden" ) m_fAppearances[APPEARANCE_SUDDEN] = level;
else if( sBit == "stealth" ) m_fAppearances[APPEARANCE_STEALTH] = level;
else if( sBit == "blink" ) m_fAppearances[APPEARANCE_BLINK] = level;
else if( sBit == "randomvanish" ) m_fAppearances[APPEARANCE_RANDOMVANISH] = level;
if( sBit == "boost" ) SET_FLOAT( fAccels[ACCEL_BOOST] )
else if( sBit == "brake" || sBit == "land" ) SET_FLOAT( fAccels[ACCEL_BRAKE] )
else if( sBit == "wave" ) SET_FLOAT( fAccels[ACCEL_WAVE] )
else if( sBit == "expand" ) SET_FLOAT( fAccels[ACCEL_EXPAND] )
else if( sBit == "boomerang" ) SET_FLOAT( fAccels[ACCEL_BOOMERANG] )
else if( sBit == "drunk" ) SET_FLOAT( fEffects[EFFECT_DRUNK] )
else if( sBit == "dizzy" ) SET_FLOAT( fEffects[EFFECT_DIZZY] )
else if( sBit == "mini" ) SET_FLOAT( fEffects[EFFECT_MINI] )
else if( sBit == "flip" ) SET_FLOAT( fEffects[EFFECT_FLIP] )
else if( sBit == "tornado" ) SET_FLOAT( fEffects[EFFECT_TORNADO] )
else if( sBit == "tipsy" ) SET_FLOAT( fEffects[EFFECT_TIPSY] )
else if( sBit == "bumpy" ) SET_FLOAT( fEffects[EFFECT_BUMPY] )
else if( sBit == "beat" ) SET_FLOAT( fEffects[EFFECT_BEAT] )
else if( sBit == "hidden" ) SET_FLOAT( fAppearances[APPEARANCE_HIDDEN] )
else if( sBit == "sudden" ) SET_FLOAT( fAppearances[APPEARANCE_SUDDEN] )
else if( sBit == "stealth" ) SET_FLOAT( fAppearances[APPEARANCE_STEALTH] )
else if( sBit == "blink" ) SET_FLOAT( fAppearances[APPEARANCE_BLINK] )
else if( sBit == "randomvanish" ) SET_FLOAT( fAppearances[APPEARANCE_RANDOMVANISH] )
else if( sBit == "turn" && !on )m_Turn = TURN_NONE; /* "no turn" */
else if( sBit == "mirror" ) m_Turn = TURN_MIRROR;
else if( sBit == "left" ) m_Turn = TURN_LEFT;
@@ -261,20 +275,20 @@ void PlayerOptions::FromString( CString sOptions )
else if( sBit == "quick" ) m_Transform = TRANSFORM_QUICK;
else if( sBit == "skippy" ) m_Transform = TRANSFORM_SKIPPY;
else if( sBit == "mines" ) m_Transform = TRANSFORM_MINES;
else if( sBit == "reverse" ) m_fScrolls[SCROLL_REVERSE] = level;
else if( sBit == "split" ) m_fScrolls[SCROLL_SPLIT] = level;
else if( sBit == "alternate" ) m_fScrolls[SCROLL_ALTERNATE] = level;
else if( sBit == "reverse" ) SET_FLOAT( fScrolls[SCROLL_REVERSE] )
else if( sBit == "split" ) SET_FLOAT( fScrolls[SCROLL_SPLIT] )
else if( sBit == "alternate" ) SET_FLOAT( fScrolls[SCROLL_ALTERNATE] )
else if( sBit == "noholds" ) m_bHoldNotes = !on;
else if( sBit == "nofreeze" ) m_bHoldNotes = !on;
else if( sBit == "dark" ) m_fDark = level;
else if( sBit == "blind" ) m_fBlind = level;
else if( sBit == "dark" ) SET_FLOAT( fDark )
else if( sBit == "blind" ) SET_FLOAT( fBlind )
else if( sBit == "timingassist")m_bTimingAssist = on;
else if( sBit == "protiming") m_bProTiming = on;
else if( sBit == "overhead" ) { m_fSkew = 0; m_fPerspectiveTilt = 0; }
else if( sBit == "incoming" ) { m_fSkew = 1; m_fPerspectiveTilt = -1; }
else if( sBit == "space" ) { m_fSkew = 1; m_fPerspectiveTilt = +1; }
else if( sBit == "hallway" ) { m_fSkew = 0; m_fPerspectiveTilt = -1; }
else if( sBit == "distant" ) { m_fSkew = 0; m_fPerspectiveTilt = +1; }
else if( sBit == "overhead" ) { m_fSkew = 0; m_fPerspectiveTilt = 0; m_SpeedfSkew = m_SpeedfPerspectiveTilt = speed; }
else if( sBit == "incoming" ) { m_fSkew = level; m_fPerspectiveTilt = -level; m_SpeedfSkew = m_SpeedfPerspectiveTilt = speed; }
else if( sBit == "space" ) { m_fSkew = level; m_fPerspectiveTilt = +level; m_SpeedfSkew = m_SpeedfPerspectiveTilt = speed; }
else if( sBit == "hallway" ) { m_fSkew = 1-level; m_fPerspectiveTilt = -level; m_SpeedfSkew = m_SpeedfPerspectiveTilt = speed; }
else if( sBit == "distant" ) { m_fSkew = 1-level; m_fPerspectiveTilt = +level; m_SpeedfSkew = m_SpeedfPerspectiveTilt = speed; }
else if( GAMESTATE->m_pPosition->IsValidModeForAnyStyle(sBit) )
m_sPositioning = sBit;
else if( sBit == "nopositioning" )
+14 -10
View File
@@ -77,21 +77,25 @@ struct PlayerOptions
bool m_bTimeSpacing; // instead of Beat spacing
float m_fScrollSpeed; // used if !m_bTimeSpacing
float m_fScrollBPM; // used if m_bTimeSpacing
float m_fAccels[NUM_ACCELS];
float m_fEffects[NUM_EFFECTS];
float m_fAppearances[NUM_APPEARANCES];
float m_fScrolls[NUM_SCROLLS];
float m_fDark;
float m_fBlind;
/* All floats have a corresponding speed setting, which determines how fast
* PlayerOptions::Approach approaches. */
float m_fScrollSpeed, m_SpeedfScrollSpeed; // used if !m_bTimeSpacing
float m_fScrollBPM, m_SpeedfScrollBPM; // used if m_bTimeSpacing
float m_fAccels[NUM_ACCELS], m_SpeedfAccels[NUM_ACCELS];
float m_fEffects[NUM_EFFECTS],m_SpeedfEffects[NUM_EFFECTS];
float m_fAppearances[NUM_APPEARANCES],m_SpeedfAppearances[NUM_APPEARANCES];
float m_fScrolls[NUM_SCROLLS],m_SpeedfScrolls[NUM_SCROLLS];
float m_fDark, m_SpeedfDark;
float m_fBlind, m_SpeedfBlind;
float m_fPerspectiveTilt, m_SpeedfPerspectiveTilt; // -1 = near, 0 = overhead, +1 = space
float m_fSkew, m_SpeedfSkew; // 0 = vanish point is in center of player, 1 = vanish point is in center of screen
Turn m_Turn;
Transform m_Transform;
bool m_bHoldNotes;
bool m_bTimingAssist;
bool m_bProTiming;
float m_fPerspectiveTilt; // -1 = near, 0 = overhead, +1 = space
float m_fSkew; // 0 = vanish point is in center of player, 1 = vanish point is in center of screen
CString m_sPositioning; /* The current positioning mode, or empty to use the normal positions. */
CString m_sNoteSkin;