more rave balancing

add "noquads"
This commit is contained in:
Chris Danford
2004-01-12 03:47:55 +00:00
parent 43d23e5b3a
commit b555be59df
13 changed files with 66 additions and 20 deletions
+23 -4
View File
@@ -259,7 +259,7 @@ void GameState::Update( float fDelta )
m_CurrentPlayerOptions[p].Approach( m_PlayerOptions[p], fDelta );
bool RebuildPlayerOptions = false;
bool bRebuildPlayerOptions = false;
/* See if any delayed attacks are starting. */
for( s=0; s<m_ActiveAttacks[p].size(); s++ )
@@ -271,7 +271,7 @@ void GameState::Update( float fDelta )
m_ActiveAttacks[p][s].fStartSecond = -1;
RebuildPlayerOptions = true;
bRebuildPlayerOptions = true;
}
/* See if any attacks are ending. */
@@ -293,11 +293,14 @@ void GameState::Update( float fDelta )
/* ending */
m_ActiveAttacks[p].erase( m_ActiveAttacks[p].begin()+s, m_ActiveAttacks[p].begin()+s+1 );
m_bAttackEndedThisUpdate[p] = true;
RebuildPlayerOptions = true;
bRebuildPlayerOptions = true;
}
if( RebuildPlayerOptions )
if( bRebuildPlayerOptions )
RebuildPlayerOptionsFromActiveAttacks( (PlayerNumber)p );
if( m_fSecondsUntilAttacksPhasedOut[p] > 0 )
m_fSecondsUntilAttacksPhasedOut[p] = max( 0, m_fSecondsUntilAttacksPhasedOut[p] - fDelta );
}
}
@@ -382,6 +385,9 @@ void GameState::ResetStageStatistics()
{
m_fSuperMeter[p] = 0;
m_HealthState[p] = ALIVE;
m_iLastPositiveSumOfAttackLevels[p] = 0;
m_fSecondsUntilAttacksPhasedOut[p] = 0; // PlayerAI not affected
}
}
@@ -862,6 +868,19 @@ void GameState::RebuildPlayerOptionsFromActiveAttacks( PlayerNumber pn )
po.FromString( m_ActiveAttacks[pn][s].sModifier );
}
m_PlayerOptions[pn] = po;
int iSumOfAttackLevels = GetSumOfActiveAttackLevels( pn );
if( iSumOfAttackLevels > 0 )
{
m_iLastPositiveSumOfAttackLevels[pn] = iSumOfAttackLevels;
m_fSecondsUntilAttacksPhasedOut[pn] = 10000; // any positive number that won't run out before the attacks
}
else
{
// don't change! m_iLastPositiveSumOfAttackLevels[p] = iSumOfAttackLevels;
m_fSecondsUntilAttacksPhasedOut[pn] = 2; // 2 seconds to phase out
}
}
int GameState::GetSumOfActiveAttackLevels( PlayerNumber pn )
+5
View File
@@ -169,6 +169,11 @@ public:
// used in PLAY_MODE_BATTLE and PLAY_MODE_RAVE
AttackArray m_ActiveAttacks[NUM_PLAYERS];
// Attacks take a while to transition out of use. Account for this in PlayerAI
// by still penalizing it for 1 second after the player options are rebuilt.
int m_iLastPositiveSumOfAttackLevels[NUM_PLAYERS];
float m_fSecondsUntilAttacksPhasedOut[NUM_PLAYERS]; // positive means PlayerAI is still affected
vector<Attack> m_ModsToApply[NUM_PLAYERS];
+6
View File
@@ -420,6 +420,11 @@ void NoteDataUtil::RemoveHands( NoteData &in, float fStartBeat, float fEndBeat )
RemoveSimultaneousNotes(in,2);
}
void NoteDataUtil::RemoveQuads( NoteData &in, float fStartBeat, float fEndBeat )
{
RemoveSimultaneousNotes(in,3);
}
void NoteDataUtil::RemoveMines(NoteData &in, float fStartBeat, float fEndBeat )
{
int iRowStart = BeatToNoteRow(fStartBeat);
@@ -1353,6 +1358,7 @@ void NoteDataUtil::TransformNoteData( NoteData &nd, const PlayerOptions &po, Ste
if( po.m_bTransforms[PlayerOptions::TRANSFORM_TWISTER] ) NoteDataUtil::Twister(nd, fStartBeat, fEndBeat);
if( po.m_bTransforms[PlayerOptions::TRANSFORM_NOJUMPS] ) NoteDataUtil::RemoveJumps(nd, fStartBeat, fEndBeat);
if( po.m_bTransforms[PlayerOptions::TRANSFORM_NOHANDS] ) NoteDataUtil::RemoveHands(nd, fStartBeat, fEndBeat);
if( po.m_bTransforms[PlayerOptions::TRANSFORM_NOQUADS] ) NoteDataUtil::RemoveQuads(nd, fStartBeat, fEndBeat);
}
void NoteDataUtil::AddTapAttacks( NoteData &nd, Song* pSong )
+1
View File
@@ -43,6 +43,7 @@ namespace NoteDataUtil
void RemoveSimultaneousNotes( NoteData &in, int iMaxSimultaneous, float fStartBeat = 0, float fEndBeat = 99999 );
void RemoveJumps( NoteData &in, float fStartBeat = 0, float fEndBeat = 99999 );
void RemoveHands( NoteData &in, float fStartBeat = 0, float fEndBeat = 99999 );
void RemoveQuads( NoteData &in, float fStartBeat = 0, float fEndBeat = 99999 );
void RemoveMines( NoteData &in, float fStartBeat = 0, float fEndBeat = 99999 );
enum TrackMapping { left, right, mirror, shuffle, super_shuffle, stomp, NUM_TRACK_MAPPINGS };
void Turn( NoteData &in, StepsType st, TrackMapping tt, float fStartBeat = 0, float fEndBeat = -1 );
+1 -1
View File
@@ -710,7 +710,7 @@ void PlayerMinus::Step( int col, RageTimer tm )
switch( GAMESTATE->m_PlayerController[m_PlayerNumber] )
{
case PC_CPU:
score = PlayerAI::GetTapNoteScore( GAMESTATE->m_iCpuSkill[m_PlayerNumber], GAMESTATE->GetSumOfActiveAttackLevels(m_PlayerNumber) );
score = PlayerAI::GetTapNoteScore( m_PlayerNumber );
break;
case PC_AUTOPLAY:
score = TNS_MARVELOUS;
+11 -4
View File
@@ -74,12 +74,19 @@ void PlayerAI::InitFromDisk()
}
TapNoteScore PlayerAI::GetTapNoteScore( int iCpuSkill, int iSumOfAttackLevels )
TapNoteScore PlayerAI::GetTapNoteScore( PlayerNumber pn )
{
// shouldn't call this unless we're CPU controlled
ASSERT( iCpuSkill>=0 && iCpuSkill<NUM_SKILL_LEVELS );
iCpuSkill -= iSumOfAttackLevels;
int iCpuSkill = GAMESTATE->m_iCpuSkill[pn];
int iSumOfAttackLevels =
GAMESTATE->m_fSecondsUntilAttacksPhasedOut[pn] > 0 ?
GAMESTATE->m_iLastPositiveSumOfAttackLevels[pn] :
0;
ASSERT( iCpuSkill>=0 && iCpuSkill<NUM_SKILL_LEVELS );
ASSERT( GAMESTATE->m_PlayerController[pn] == PC_CPU );
iCpuSkill -= iSumOfAttackLevels*3;
CLAMP( iCpuSkill, 0, NUM_SKILL_LEVELS-1 );
TapScoreDistribution& distribution = g_Distributions[iCpuSkill];
+2 -2
View File
@@ -13,14 +13,14 @@
#include "GameConstantsAndTypes.h"
const int NUM_SKILL_LEVELS = 11; // 0-10
const int NUM_SKILL_LEVELS = 6; // 0-5
class PlayerAI
{
public:
static void InitFromDisk();
static TapNoteScore GetTapNoteScore( int iCpuSkill, int iSumOfAttackLevels );
static TapNoteScore GetTapNoteScore( PlayerNumber pn );
};
+2
View File
@@ -158,6 +158,7 @@ CString PlayerOptions::GetString() const
if( m_bTransforms[TRANSFORM_TWISTER] ) sReturn += "Twister, ";
if( m_bTransforms[TRANSFORM_NOJUMPS] ) sReturn += "NoJumps, ";
if( m_bTransforms[TRANSFORM_NOHANDS] ) sReturn += "NoHands, ";
if( m_bTransforms[TRANSFORM_NOQUADS] ) sReturn += "NoQuads, ";
if( m_bTimingAssist ) sReturn += "TimingAssist, ";
if( m_bProTiming ) sReturn += "ProTiming, ";
@@ -285,6 +286,7 @@ void PlayerOptions::FromString( CString sOptions )
else if( sBit == "twister" ) m_bTransforms[TRANSFORM_TWISTER] = on;
else if( sBit == "nojumps" ) m_bTransforms[TRANSFORM_NOJUMPS] = on;
else if( sBit == "nohands" ) m_bTransforms[TRANSFORM_NOHANDS] = on;
else if( sBit == "noquads" ) m_bTransforms[TRANSFORM_NOQUADS] = on;
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] )
+1
View File
@@ -75,6 +75,7 @@ struct PlayerOptions
TRANSFORM_TWISTER,
TRANSFORM_NOJUMPS,
TRANSFORM_NOHANDS,
TRANSFORM_NOQUADS,
NUM_TRANSFORMS
};
enum Scroll {
+4 -4
View File
@@ -121,14 +121,14 @@ PrefsManager::PrefsManager()
m_fGradePercentC = 0.45f;
m_fGradePercentD = 0;
m_fSuperMeterMarvelousPercentChange = +0.10f;
m_fSuperMeterPerfectPercentChange = +0.08f;
m_fSuperMeterGreatPercentChange = +0.04f;
m_fSuperMeterMarvelousPercentChange = +0.05f;
m_fSuperMeterPerfectPercentChange = +0.04f;
m_fSuperMeterGreatPercentChange = +0.02f;
m_fSuperMeterGoodPercentChange = +0.00f;
m_fSuperMeterBooPercentChange = -0.00f;
m_fSuperMeterMissPercentChange = -0.20f;
m_fSuperMeterHitMinePercentChange = -0.40f;
m_fSuperMeterOKPercentChange = +0.08f;
m_fSuperMeterOKPercentChange = +0.04f;
m_fSuperMeterNGPercentChange = -0.20f;
m_bMercifulSuperMeter = true;
+7 -3
View File
@@ -92,12 +92,16 @@ void ScoreKeeperRave::AddSuperMeterDelta( float fUnscaledPercentChange )
default: ASSERT(0);
}
if( fUnscaledPercentChange > 0 )
fUnscaledPercentChange *= SCALE( fLifePercentage, 0.f, 1.f, 1.8f, 0.2f);
fUnscaledPercentChange *= SCALE( fLifePercentage, 0.f, 1.f, 1.7f, 0.3f);
else // fUnscaledPercentChange <= 0
fUnscaledPercentChange *= SCALE( fLifePercentage, 0.f, 1.f, 1.8f, 0.2f);
fUnscaledPercentChange /= SCALE( fLifePercentage, 0.f, 1.f, 1.7f, 0.3f);
}
// mercy: drop super meter faster if at a higher level
if( fUnscaledPercentChange < 0 )
fUnscaledPercentChange *= SCALE( GAMESTATE->m_fSuperMeter[m_PlayerNumber], 0.f, 1.f, 0.01f, 1.f );
AttackLevel oldAL = (AttackLevel)(int)GAMESTATE->m_fSuperMeter[m_PlayerNumber];
float fPercentToMove = fUnscaledPercentChange;
@@ -113,7 +117,7 @@ void ScoreKeeperRave::AddSuperMeterDelta( float fUnscaledPercentChange )
GAMESTATE->m_fSuperMeter[m_PlayerNumber] -= 1.f;
}
// mercy
// mercy: remove attacks on life drain
if( fUnscaledPercentChange < 0 )
GAMESTATE->RemoveActiveAttacksForPlayer( m_PlayerNumber );
}
+2 -1
View File
@@ -161,7 +161,7 @@ static const MenuRow g_AreaMenuItems[] =
{ "Clear", true, 0, { NULL } },
{ "Quantize", true, 0, { "4TH","8TH","12TH","16TH","24TH","32ND","48TH","64TH" } },
{ "Turn", true, 0, { "Left","Right","Mirror","Shuffle","Super Shuffle" } },
{ "Transform", true, 0, { "NoHolds","NoMines","Little","Wide","Big","Quick","Skippy","Mines","Echo","Planted","Stomp","Twister","NoJumps","NoHands" } },
{ "Transform", true, 0, { "NoHolds","NoMines","Little","Wide","Big","Quick","Skippy","Mines","Echo","Planted","Stomp","Twister","NoJumps","NoHands","NoQuads" } },
{ "Alter", true, 0, { "Backwards","Swap Sides","Copy Left To Right","Copy Right To Left","Clear Left","Clear Right","Collapse To One","Collapse Left","Shift Left","Shift Right" } },
{ "Tempo", true, 0, { "Compress 2x","Compress 3->2","Compress 4->3","Expand 3->4","Expand 2->3","Expand 2x" } },
{ "Play selection", true, 0, { NULL } },
@@ -1590,6 +1590,7 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers )
case twister: NoteDataUtil::Twister( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break;
case nojumps: NoteDataUtil::RemoveJumps( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break;
case nohands: NoteDataUtil::RemoveHands( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break;
case noquads: NoteDataUtil::RemoveQuads( m_NoteFieldEdit, fBeginBeat, fEndBeat ); break;
default: ASSERT(0);
}
+1 -1
View File
@@ -133,7 +133,7 @@ public:
};
void HandleAreaMenuChoice( AreaMenuChoice c, int* iAnswers );
enum TurnType { left, right, mirror, shuffle, super_shuffle, NUM_TURN_TYPES };
enum TransformType { noholds, nomines, little, wide, big, quick, skippy, mines, echo, planted, stomp, twister, nojumps, nohands, NUM_TRANSFORM_TYPES };
enum TransformType { noholds, nomines, little, wide, big, quick, skippy, mines, echo, planted, stomp, twister, nojumps, nohands, noquads, NUM_TRANSFORM_TYPES };
enum AlterType { backwards, swap_sides, copy_left_to_right, copy_right_to_left, clear_left, clear_right, collapse_to_one, collapse_left, shift_left, shift_right, NUM_ALTER_TYPES };
// MD 11/02/03 - added additional tempo adjusts which make "sense"
enum TempoType { compress_2x, compress_3_2, compress_4_3, expand_4_3, expand_3_2, expand_2x, NUM_TEMPO_TYPES };