more rave balancing
add "noquads"
This commit is contained in:
@@ -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 )
|
||||
|
||||
@@ -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];
|
||||
|
||||
|
||||
@@ -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 )
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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 );
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -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] )
|
||||
|
||||
@@ -75,6 +75,7 @@ struct PlayerOptions
|
||||
TRANSFORM_TWISTER,
|
||||
TRANSFORM_NOJUMPS,
|
||||
TRANSFORM_NOHANDS,
|
||||
TRANSFORM_NOQUADS,
|
||||
NUM_TRANSFORMS
|
||||
};
|
||||
enum Scroll {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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 };
|
||||
|
||||
Reference in New Issue
Block a user