From b555be59df916f8b8f0baaf6d7d1e0e136f8b400 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Mon, 12 Jan 2004 03:47:55 +0000 Subject: [PATCH] more rave balancing add "noquads" --- stepmania/src/GameState.cpp | 27 +++++++++++++++++++++++---- stepmania/src/GameState.h | 5 +++++ stepmania/src/NoteDataUtil.cpp | 6 ++++++ stepmania/src/NoteDataUtil.h | 1 + stepmania/src/Player.cpp | 2 +- stepmania/src/PlayerAI.cpp | 15 +++++++++++---- stepmania/src/PlayerAI.h | 4 ++-- stepmania/src/PlayerOptions.cpp | 2 ++ stepmania/src/PlayerOptions.h | 1 + stepmania/src/PrefsManager.cpp | 8 ++++---- stepmania/src/ScoreKeeperRave.cpp | 10 +++++++--- stepmania/src/ScreenEdit.cpp | 3 ++- stepmania/src/ScreenEdit.h | 2 +- 13 files changed, 66 insertions(+), 20 deletions(-) diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index fd5ab90e13..a1f4bd6cf8 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -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 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 ) diff --git a/stepmania/src/GameState.h b/stepmania/src/GameState.h index 782012c4ff..ca98fecbf4 100644 --- a/stepmania/src/GameState.h +++ b/stepmania/src/GameState.h @@ -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 m_ModsToApply[NUM_PLAYERS]; diff --git a/stepmania/src/NoteDataUtil.cpp b/stepmania/src/NoteDataUtil.cpp index 88beeeb083..dea15542da 100644 --- a/stepmania/src/NoteDataUtil.cpp +++ b/stepmania/src/NoteDataUtil.cpp @@ -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 ) diff --git a/stepmania/src/NoteDataUtil.h b/stepmania/src/NoteDataUtil.h index c2f68bfc62..cce91ad6c1 100644 --- a/stepmania/src/NoteDataUtil.h +++ b/stepmania/src/NoteDataUtil.h @@ -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 ); diff --git a/stepmania/src/Player.cpp b/stepmania/src/Player.cpp index d53e3cbf0a..c2f5e01c69 100644 --- a/stepmania/src/Player.cpp +++ b/stepmania/src/Player.cpp @@ -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; diff --git a/stepmania/src/PlayerAI.cpp b/stepmania/src/PlayerAI.cpp index d5a89e0bde..e577fef4d5 100644 --- a/stepmania/src/PlayerAI.cpp +++ b/stepmania/src/PlayerAI.cpp @@ -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 && iCpuSkillm_iCpuSkill[pn]; + int iSumOfAttackLevels = + GAMESTATE->m_fSecondsUntilAttacksPhasedOut[pn] > 0 ? + GAMESTATE->m_iLastPositiveSumOfAttackLevels[pn] : + 0; + + ASSERT( iCpuSkill>=0 && iCpuSkillm_PlayerController[pn] == PC_CPU ); + + iCpuSkill -= iSumOfAttackLevels*3; CLAMP( iCpuSkill, 0, NUM_SKILL_LEVELS-1 ); TapScoreDistribution& distribution = g_Distributions[iCpuSkill]; diff --git a/stepmania/src/PlayerAI.h b/stepmania/src/PlayerAI.h index db22b59da7..0fe2538d1d 100644 --- a/stepmania/src/PlayerAI.h +++ b/stepmania/src/PlayerAI.h @@ -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 ); }; diff --git a/stepmania/src/PlayerOptions.cpp b/stepmania/src/PlayerOptions.cpp index be11ec3bb5..870deac819 100644 --- a/stepmania/src/PlayerOptions.cpp +++ b/stepmania/src/PlayerOptions.cpp @@ -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] ) diff --git a/stepmania/src/PlayerOptions.h b/stepmania/src/PlayerOptions.h index 2d1ef4d4dc..49c3119976 100644 --- a/stepmania/src/PlayerOptions.h +++ b/stepmania/src/PlayerOptions.h @@ -75,6 +75,7 @@ struct PlayerOptions TRANSFORM_TWISTER, TRANSFORM_NOJUMPS, TRANSFORM_NOHANDS, + TRANSFORM_NOQUADS, NUM_TRANSFORMS }; enum Scroll { diff --git a/stepmania/src/PrefsManager.cpp b/stepmania/src/PrefsManager.cpp index 65d0e5d0db..c48114af19 100644 --- a/stepmania/src/PrefsManager.cpp +++ b/stepmania/src/PrefsManager.cpp @@ -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; diff --git a/stepmania/src/ScoreKeeperRave.cpp b/stepmania/src/ScoreKeeperRave.cpp index 552f22c530..05f2a93575 100644 --- a/stepmania/src/ScoreKeeperRave.cpp +++ b/stepmania/src/ScoreKeeperRave.cpp @@ -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 ); } diff --git a/stepmania/src/ScreenEdit.cpp b/stepmania/src/ScreenEdit.cpp index fb8fcf5896..aafa63aaee 100644 --- a/stepmania/src/ScreenEdit.cpp +++ b/stepmania/src/ScreenEdit.cpp @@ -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); } diff --git a/stepmania/src/ScreenEdit.h b/stepmania/src/ScreenEdit.h index 583d656512..8ce7c789ef 100644 --- a/stepmania/src/ScreenEdit.h +++ b/stepmania/src/ScreenEdit.h @@ -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 };