account for sticky pads in mine hit detection

This commit is contained in:
Chris Danford
2004-02-25 05:49:54 +00:00
parent c69f29e54d
commit 6b4b560cff
4 changed files with 57 additions and 24 deletions
+39 -15
View File
@@ -117,8 +117,8 @@ void PlayerMinus::Load( PlayerNumber pn, const NoteData* pNoteData, LifeMeter* p
m_pPrimaryScoreKeeper = pPrimaryScoreKeeper;
m_pSecondaryScoreKeeper = pSecondaryScoreKeeper;
m_pNoteField = pNoteField;
m_iRowLastCrossed = BeatToNoteRowNotRounded( GAMESTATE->m_fSongBeat ) - 1;
// m_iRowLastCrossed = -1;
m_iRowLastCrossed = BeatToNoteRowNotRounded( GAMESTATE->m_fSongBeat ) - 1; // why this?
m_iMineRowLastCrossed = BeatToNoteRowNotRounded( GAMESTATE->m_fSongBeat ) - 1; // why this?
/* Ensure that this is up-to-date. */
GAMESTATE->m_pPosition->Load(pn);
@@ -383,16 +383,32 @@ void PlayerMinus::Update( float fDeltaTime )
SetHoldNoteScore(hn, hns);
}
// Why was this originally "BeatToNoteRowNotRounded"? It should be rounded. -Chris
/* We want to send the crossed row message exactly when we cross the row--not
* .5 before the row. Use a very slow song (around 2 BPM) as a test case: without
* rounding, autoplay steps early. -glenn */
const int iRowNow = BeatToNoteRowNotRounded( GAMESTATE->m_fSongBeat );
if( iRowNow >= 0 )
{
for( ; m_iRowLastCrossed <= iRowNow; m_iRowLastCrossed++ ) // for each index we crossed since the last update
if( GAMESTATE->IsPlayerEnabled(m_PlayerNumber) )
CrossedRow( m_iRowLastCrossed );
// Why was this originally "BeatToNoteRowNotRounded"? It should be rounded. -Chris
/* We want to send the crossed row message exactly when we cross the row--not
* .5 before the row. Use a very slow song (around 2 BPM) as a test case: without
* rounding, autoplay steps early. -glenn */
const int iRowNow = BeatToNoteRowNotRounded( GAMESTATE->m_fSongBeat );
if( iRowNow >= 0 )
{
for( ; m_iRowLastCrossed <= iRowNow; m_iRowLastCrossed++ ) // for each index we crossed since the last update
if( GAMESTATE->IsPlayerEnabled(m_PlayerNumber) )
CrossedRow( m_iRowLastCrossed );
}
}
{
// TRICKY:
float fPositionSeconds = GAMESTATE->m_fMusicSeconds;
fPositionSeconds -= PREFSMAN->m_fPadStickSeconds;
const float fSongBeat = GAMESTATE->m_pCurSong ? GAMESTATE->m_pCurSong->GetBeatFromElapsedTime( fPositionSeconds ) : 0;
const int iRowNow = BeatToNoteRowNotRounded( fSongBeat );
if( iRowNow >= 0 )
{
for( ; m_iMineRowLastCrossed <= iRowNow; m_iMineRowLastCrossed++ ) // for each index we crossed since the last update
if( GAMESTATE->IsPlayerEnabled(m_PlayerNumber) )
CrossedMineRow( m_iMineRowLastCrossed );
}
}
@@ -574,10 +590,14 @@ void PlayerMinus::Step( int col, RageTimer tm )
ASSERT( col >= 0 && col <= GetNumTracks() );
float fPositionSeconds = GAMESTATE->m_fMusicSeconds;
fPositionSeconds -= tm.Ago();
const float fSongBeat = GAMESTATE->m_pCurSong ? GAMESTATE->m_pCurSong->GetBeatFromElapsedTime( fPositionSeconds ) : GAMESTATE->m_fSongBeat;
//
// Check for step on a TapNote
//
int iIndexOverlappingNote = GetClosestNote( col, GAMESTATE->m_fSongBeat,
int iIndexOverlappingNote = GetClosestNote( col, fSongBeat,
StepSearchDistanceForwards * GAMESTATE->m_fCurBPS * GAMESTATE->m_SongOptions.m_fMusicRate,
StepSearchDistanceBackwards * GAMESTATE->m_fCurBPS * GAMESTATE->m_SongOptions.m_fMusicRate );
@@ -1036,18 +1056,22 @@ void PlayerMinus::CrossedRow( int iNoteRow )
if( GetTapNoteScore(t, iNoteRow) == TNS_NONE )
Step( t, now );
}
}
void PlayerMinus::CrossedMineRow( int iNoteRow )
{
// Hold the panel while crossing a mine will cause the mine to explode
RageTimer now;
for( int t=0; t<GetNumTracks(); t++ )
{
if( GetTapNote(t,iNoteRow) == TAP_MINE )
{
const StyleInput StyleI( m_PlayerNumber, t );
const GameInput GameI = GAMESTATE->GetCurrentStyleDef()->StyleInputToGameInput( StyleI );
bool bIsHoldingButton = INPUTMAPPER->IsButtonDown( GameI );
float fSecsHeld = INPUTMAPPER->GetSecsHeld( GameI );
if( bIsHoldingButton )
Step( t, now );
if( fSecsHeld >= PREFSMAN->m_fPadStickSeconds )
Step( t, now+(-PREFSMAN->m_fPadStickSeconds) );
}
}
}
+2
View File
@@ -50,6 +50,7 @@ public:
void Load( PlayerNumber player_no, const NoteData* pNoteData, LifeMeter* pLM, CombinedLifeMeter* pCombinedLM, ScoreDisplay* pScoreDisplay, ScoreDisplay* pSecondaryScoreDisplay, Inventory* pInventory, ScoreKeeper* pPrimaryScoreKeeper, ScoreKeeper* pSecondaryScoreKeeper, NoteField* pNoteField );
void CrossedRow( int iNoteRow );
void CrossedMineRow( int iNoteRow );
void Step( int col, RageTimer tm );
void RandomiseNotes( int iNoteRow );
void FadeToFail();
@@ -99,6 +100,7 @@ protected:
Inventory* m_pInventory;
int m_iRowLastCrossed;
int m_iMineRowLastCrossed;
RageSound m_soundMine;
RageSound m_soundAttackLaunch;
+11 -8
View File
@@ -62,14 +62,14 @@ PrefsManager::PrefsManager()
m_bAutoPlay = false;
m_fJudgeWindowScale = 1.0f;
m_fLifeDifficultyScale = 1.0f;
m_fJudgeWindowSecondsMarvelous = 0.0225f;
m_fJudgeWindowSecondsPerfect = 0.045f;
m_fJudgeWindowSecondsGreat = 0.090f;
m_fJudgeWindowSecondsGood = 0.135f;
m_fJudgeWindowSecondsBoo = 0.180f;
m_fJudgeWindowSecondsOK = 0.250f; // allow enough time to take foot off and put back on
m_fJudgeWindowSecondsMine = 0.090f; // same as great
m_fJudgeWindowSecondsAttack = 0.135f;
m_fJudgeWindowSecondsMarvelous = 0.0225f;
m_fJudgeWindowSecondsPerfect = 0.045f;
m_fJudgeWindowSecondsGreat = 0.090f;
m_fJudgeWindowSecondsGood = 0.135f;
m_fJudgeWindowSecondsBoo = 0.180f;
m_fJudgeWindowSecondsOK = 0.250f; // allow enough time to take foot off and put back on
m_fJudgeWindowSecondsMine = 0.090f; // same as great
m_fJudgeWindowSecondsAttack = 0.135f;
m_fLifeDeltaPercentChangeMarvelous = +0.008f;
m_fLifeDeltaPercentChangePerfect = +0.008f;
m_fLifeDeltaPercentChangeGreat = +0.004f;
@@ -213,6 +213,7 @@ PrefsManager::PrefsManager()
m_iAttractSoundFrequency = 1;
m_bAllowExtraStage = true;
m_fPadStickSeconds = 0;
g_bAutoRestart = false;
m_bSignProfileData = false;
@@ -490,6 +491,7 @@ void PrefsManager::ReadGlobalPrefsFromDisk()
ini.GetValue( "Options", "CenterImageScaleY", m_fCenterImageScaleY );
ini.GetValue( "Options", "AttractSoundFrequency", m_iAttractSoundFrequency );
ini.GetValue( "Options", "AllowExtraStage", m_bAllowExtraStage );
ini.GetValue( "Options", "PadStickSeconds", m_fPadStickSeconds );
ini.GetValue( "Options", "AutoRestart", g_bAutoRestart );
ini.GetValue( "Options", "SignProfileData", m_bSignProfileData );
@@ -701,6 +703,7 @@ void PrefsManager::SaveGlobalPrefsToDisk() const
ini.SetValue( "Options", "CenterImageScaleY", m_fCenterImageScaleY );
ini.SetValue( "Options", "AttractSoundFrequency", m_iAttractSoundFrequency );
ini.SetValue( "Options", "AllowExtraStage", m_bAllowExtraStage );
ini.SetValue( "Options", "PadStickSeconds", m_fPadStickSeconds );
ini.SetValue( "Options", "AutoRestart", g_bAutoRestart );
ini.SetValue( "Options", "SignProfileData", m_bSignProfileData );
+4
View File
@@ -189,6 +189,10 @@ public:
int m_iAttractSoundFrequency; // 0 = never, 1 = every time
bool m_bAllowExtraStage;
// Number of seconds it takes for a button on the controller to release
// after pressed.
float m_fPadStickSeconds;
// If true, then signatures created when writing profile data
// and verified when reading profile data. Leave this false if
// you want to use a profile on different machines that don't