From a1a85c277f078d9bb98031cb3e106ca7eb307675 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Sun, 11 Jan 2004 23:33:56 +0000 Subject: [PATCH] MercifulMines -> MercifulDrain playbalance rave playbalance AI --- stepmania/Data/AI.ini | 40 ++++-------- stepmania/src/CombinedLifeMeterTug.cpp | 57 ++++++++-------- stepmania/src/CombinedLifeMeterTug.h | 1 + stepmania/src/LifeMeterBar.cpp | 6 +- stepmania/src/PrefsManager.cpp | 90 ++++++++++++++++++++++---- stepmania/src/PrefsManager.h | 27 +++++++- stepmania/src/ScoreKeeperRave.cpp | 74 ++++++++++++++++----- stepmania/src/ScoreKeeperRave.h | 1 + stepmania/src/ScreenGameplay.cpp | 14 +--- 9 files changed, 209 insertions(+), 101 deletions(-) diff --git a/stepmania/Data/AI.ini b/stepmania/Data/AI.ini index 35e3f04950..87634fe297 100644 --- a/stepmania/Data/AI.ini +++ b/stepmania/Data/AI.ini @@ -2,7 +2,7 @@ MissWeight=4 BooWeight=4 GoodWeight=4 -GreatWeight=40 +GreatWeight=30 PerfectWeight=30 MarvelousWeight=30 @@ -10,7 +10,7 @@ MarvelousWeight=30 MissWeight=3 BooWeight=3 GoodWeight=3 -GreatWeight=38 +GreatWeight=30 PerfectWeight=30 MarvelousWeight=30 @@ -18,7 +18,7 @@ MarvelousWeight=30 MissWeight=2 BooWeight=2 GoodWeight=2 -GreatWeight=36 +GreatWeight=30 PerfectWeight=30 MarvelousWeight=30 @@ -26,15 +26,15 @@ MarvelousWeight=30 MissWeight=2 BooWeight=1 GoodWeight=2 -GreatWeight=34 +GreatWeight=30 PerfectWeight=30 MarvelousWeight=30 [Skill4] MissWeight=1 BooWeight=1 -GoodWeight=2 -GreatWeight=32 +GoodWeight=4 +GreatWeight=28 PerfectWeight=30 MarvelousWeight=30 @@ -42,7 +42,7 @@ MarvelousWeight=30 MissWeight=1 BooWeight=1 GoodWeight=1 -GreatWeight=30 +GreatWeight=26 PerfectWeight=30 MarvelousWeight=30 @@ -50,15 +50,15 @@ MarvelousWeight=30 MissWeight=1 BooWeight= GoodWeight=1 -GreatWeight=28 -PerfectWeight=36 -MarvelousWeight=30 +GreatWeight=24 +PerfectWeight=30 +MarvelousWeight=35 [Skill7] MissWeight= BooWeight= GoodWeight=1 -GreatWeight=26 +GreatWeight=22 PerfectWeight=30 MarvelousWeight=40 @@ -82,22 +82,6 @@ MarvelousWeight=60 MissWeight= BooWeight= GoodWeight= -GreatWeight= +GreatWeight=5 PerfectWeight=30 MarvelousWeight=70 - -[Skill11] -MissWeight= -BooWeight= -GoodWeight= -GreatWeight= -PerfectWeight=20 -MarvelousWeight=80 - -[Skill12] -MissWeight= -BooWeight= -GoodWeight= -GreatWeight= -PerfectWeight=10 -MarvelousWeight=90 diff --git a/stepmania/src/CombinedLifeMeterTug.cpp b/stepmania/src/CombinedLifeMeterTug.cpp index 48d4ad5296..91ca396a1e 100644 --- a/stepmania/src/CombinedLifeMeterTug.cpp +++ b/stepmania/src/CombinedLifeMeterTug.cpp @@ -68,23 +68,16 @@ void CombinedLifeMeterTug::ChangeLife( PlayerNumber pn, TapNoteScore score ) float fPercentToMove = 0; switch( score ) { - case TNS_MARVELOUS: fPercentToMove = PREFSMAN->m_fLifeDeltaMarvelousPercentChange; break; - case TNS_PERFECT: fPercentToMove = PREFSMAN->m_fLifeDeltaPerfectPercentChange; break; - case TNS_GREAT: fPercentToMove = PREFSMAN->m_fLifeDeltaGreatPercentChange; break; - case TNS_GOOD: fPercentToMove = PREFSMAN->m_fLifeDeltaGoodPercentChange; break; - case TNS_BOO: fPercentToMove = PREFSMAN->m_fLifeDeltaBooPercentChange; break; - case TNS_MISS: fPercentToMove = PREFSMAN->m_fLifeDeltaMissPercentChange; break; + case TNS_MARVELOUS: fPercentToMove = PREFSMAN->m_fTugMeterMarvelousPercentChange; break; + case TNS_PERFECT: fPercentToMove = PREFSMAN->m_fTugMeterPerfectPercentChange; break; + case TNS_GREAT: fPercentToMove = PREFSMAN->m_fTugMeterGreatPercentChange; break; + case TNS_GOOD: fPercentToMove = PREFSMAN->m_fTugMeterGoodPercentChange; break; + case TNS_BOO: fPercentToMove = PREFSMAN->m_fTugMeterBooPercentChange; break; + case TNS_MISS: fPercentToMove = PREFSMAN->m_fTugMeterMissPercentChange; break; default: ASSERT(0); break; } - switch( pn ) - { - case PLAYER_1: GAMESTATE->m_fTugLifePercentP1 += fPercentToMove; break; - case PLAYER_2: GAMESTATE->m_fTugLifePercentP1 -= fPercentToMove; break; - default: ASSERT(0); - } - - CLAMP( GAMESTATE->m_fTugLifePercentP1, 0, 1 ); + ChangeLife( pn, fPercentToMove ); } void CombinedLifeMeterTug::ChangeLife( PlayerNumber pn, HoldNoteScore score, TapNoteScore tscore ) @@ -97,32 +90,40 @@ void CombinedLifeMeterTug::ChangeLife( PlayerNumber pn, HoldNoteScore score, Tap float fPercentToMove = 0; switch( score ) { - case HNS_OK: fPercentToMove = PREFSMAN->m_fLifeDeltaOKPercentChange; break; - case HNS_NG: fPercentToMove = PREFSMAN->m_fLifeDeltaNGPercentChange; break; + case HNS_OK: fPercentToMove = PREFSMAN->m_fTugMeterOKPercentChange; break; + case HNS_NG: fPercentToMove = PREFSMAN->m_fTugMeterNGPercentChange; break; default: ASSERT(0); break; } - switch( pn ) - { - case PLAYER_1: GAMESTATE->m_fTugLifePercentP1 += fPercentToMove; break; - case PLAYER_2: GAMESTATE->m_fTugLifePercentP1 -= fPercentToMove; break; - default: ASSERT(0); - } - - CLAMP( GAMESTATE->m_fTugLifePercentP1, 0, 1 ); + ChangeLife( pn, fPercentToMove ); } void CombinedLifeMeterTug::ChangeLifeMine( PlayerNumber pn ) { - float fPercentToMove = PREFSMAN->m_fLifeDeltaHitMinePercentChange; + float fPercentToMove = PREFSMAN->m_fTugMeterHitMinePercentChange; + + ChangeLife( pn, fPercentToMove ); +} + +void CombinedLifeMeterTug::ChangeLife( PlayerNumber pn, float fPercentToMove ) +{ + if( PREFSMAN->m_bMercifulDrain && fPercentToMove < 0 ) + { + float fLifePercentage; + switch( pn ) + { + case PLAYER_1: fLifePercentage = GAMESTATE->m_fTugLifePercentP1; break; + case PLAYER_2: fLifePercentage = 1 - GAMESTATE->m_fTugLifePercentP1; break; + default: ASSERT(0); + } + fPercentToMove *= SCALE( fLifePercentage, 0.f, 1.f, 0.2f, 1.f); + } + switch( pn ) { case PLAYER_1: GAMESTATE->m_fTugLifePercentP1 += fPercentToMove; break; case PLAYER_2: GAMESTATE->m_fTugLifePercentP1 -= fPercentToMove; break; default: ASSERT(0); } - CLAMP( GAMESTATE->m_fTugLifePercentP1, 0, 1 ); - } - diff --git a/stepmania/src/CombinedLifeMeterTug.h b/stepmania/src/CombinedLifeMeterTug.h index c41dc100b4..9bcb3de19c 100644 --- a/stepmania/src/CombinedLifeMeterTug.h +++ b/stepmania/src/CombinedLifeMeterTug.h @@ -32,6 +32,7 @@ public: virtual bool IsFailing( PlayerNumber pn ) { return false; }; protected: + void ChangeLife( PlayerNumber pn, float fPercentToMove ); MeterDisplay m_Stream[NUM_PLAYERS]; Sprite m_sprSeparator; diff --git a/stepmania/src/LifeMeterBar.cpp b/stepmania/src/LifeMeterBar.cpp index 794544efde..f762da2283 100644 --- a/stepmania/src/LifeMeterBar.cpp +++ b/stepmania/src/LifeMeterBar.cpp @@ -380,6 +380,9 @@ void LifeMeterBar::ChangeLife( HoldNoteScore score, TapNoteScore tscore ) void LifeMeterBar::ChangeLife( float fDeltaLife ) { + if( PREFSMAN->m_bMercifulDrain && fDeltaLife < 0 ) + fDeltaLife *= SCALE( m_fLifePercentage, 0.f, 1.f, 0.5f, 1.f); + // handle progressiveness and ComboToRegainLife here if( fDeltaLife >= 0 ) { @@ -456,9 +459,6 @@ void LifeMeterBar::ChangeLifeMine() ASSERT(0); } - if( PREFSMAN->m_bMercifulMines ) - fDeltaLife *= SCALE( m_fLifePercentage, 0.f, 1.f, 0.5f, 1.f); - ChangeLife( fDeltaLife ); } diff --git a/stepmania/src/PrefsManager.cpp b/stepmania/src/PrefsManager.cpp index 72a0c747e2..b33fbac389 100644 --- a/stepmania/src/PrefsManager.cpp +++ b/stepmania/src/PrefsManager.cpp @@ -70,21 +70,32 @@ PrefsManager::PrefsManager() m_fJudgeWindowOKSeconds = 0.250f; // allow enough time to take foot off and put back on m_fJudgeWindowMineSeconds = 0.090f; // same as great m_fJudgeWindowAttackSeconds = 0.135f; - m_fLifeDeltaMarvelousPercentChange = +0.008f; - m_fLifeDeltaPerfectPercentChange = +0.008f; - m_fLifeDeltaGreatPercentChange = +0.004f; - m_fLifeDeltaGoodPercentChange = +0.000f; - m_fLifeDeltaBooPercentChange = -0.040f; - m_fLifeDeltaMissPercentChange = -0.080f; - m_fLifeDeltaOKPercentChange = +0.008f; - m_fLifeDeltaNGPercentChange = -0.080f; - m_fLifeDeltaHitMinePercentChange = -0.160f; + m_fLifeDeltaMarvelousPercentChange = +0.008f; + m_fLifeDeltaPerfectPercentChange = +0.008f; + m_fLifeDeltaGreatPercentChange = +0.004f; + m_fLifeDeltaGoodPercentChange = +0.000f; + m_fLifeDeltaBooPercentChange = -0.040f; + m_fLifeDeltaMissPercentChange = -0.080f; + m_fLifeDeltaHitMinePercentChange = -0.160f; + m_fLifeDeltaOKPercentChange = +0.008f; + m_fLifeDeltaNGPercentChange = -0.080f; + + m_fTugMeterMarvelousPercentChange = +0.008f; + m_fTugMeterPerfectPercentChange = +0.008f; + m_fTugMeterGreatPercentChange = +0.004f; + m_fTugMeterGoodPercentChange = +0.000f; + m_fTugMeterBooPercentChange = -0.010f; + m_fTugMeterMissPercentChange = -0.020f; + m_fTugMeterHitMinePercentChange = -0.040f; + m_fTugMeterOKPercentChange = +0.008f; + m_fTugMeterNGPercentChange = -0.020f; + m_iRegenComboAfterFail = 10; // cumulative m_iRegenComboAfterMiss = 5; // cumulative m_iMaxRegenComboAfterFail = 10; m_iMaxRegenComboAfterMiss = 10; m_bTwoPlayerRecovery = true; - m_bMercifulMines = true; + m_bMercifulDrain = true; m_iPercentScoreMarvelousWeight = 3; m_iPercentScorePerfectWeight = 2; @@ -109,6 +120,17 @@ PrefsManager::PrefsManager() m_fGradePercentB = 0.65f; m_fGradePercentC = 0.45f; m_fGradePercentD = 0; + + m_fSuperMeterMarvelousPercentChange = +0.08f; + m_fSuperMeterPerfectPercentChange = +0.08f; + m_fSuperMeterGreatPercentChange = +0.04f; + m_fSuperMeterGoodPercentChange = +0.00f; + m_fSuperMeterBooPercentChange = -0.00f; + m_fSuperMeterMissPercentChange = -0.20f; + m_fSuperMeterHitMinePercentChange = -0.40f; + m_fSuperMeterOKPercentChange = +0.08f; + m_fSuperMeterNGPercentChange = -0.20f; + m_bMercifulSuperMeter = true; m_bDelayedEscape = true; m_bInstructions = true; @@ -304,15 +326,24 @@ void PrefsManager::ReadGlobalPrefsFromDisk() ini.GetValue( "Options", "LifeDeltaGoodPercentChange", m_fLifeDeltaGoodPercentChange ); ini.GetValue( "Options", "LifeDeltaBooPercentChange", m_fLifeDeltaBooPercentChange ); ini.GetValue( "Options", "LifeDeltaMissPercentChange", m_fLifeDeltaMissPercentChange ); + ini.GetValue( "Options", "LifeDeltaHitMinePercentChange", m_fLifeDeltaHitMinePercentChange ); ini.GetValue( "Options", "LifeDeltaOKPercentChange", m_fLifeDeltaOKPercentChange ); ini.GetValue( "Options", "LifeDeltaNGPercentChange", m_fLifeDeltaNGPercentChange ); - ini.GetValue( "Options", "LifeDeltaHitMinePercentChange", m_fLifeDeltaHitMinePercentChange ); + ini.GetValue( "Options", "TugMeterMarvelousPercentChange", m_fTugMeterMarvelousPercentChange ); + ini.GetValue( "Options", "TugMeterPerfectPercentChange", m_fTugMeterPerfectPercentChange ); + ini.GetValue( "Options", "TugMeterGreatPercentChange", m_fTugMeterGreatPercentChange ); + ini.GetValue( "Options", "TugMeterGoodPercentChange", m_fTugMeterGoodPercentChange ); + ini.GetValue( "Options", "TugMeterBooPercentChange", m_fTugMeterBooPercentChange ); + ini.GetValue( "Options", "TugMeterMissPercentChange", m_fTugMeterMissPercentChange ); + ini.GetValue( "Options", "TugMeterHitMinePercentChange", m_fTugMeterHitMinePercentChange ); + ini.GetValue( "Options", "TugMeterOKPercentChange", m_fTugMeterOKPercentChange ); + ini.GetValue( "Options", "TugMeterNGPercentChange", m_fTugMeterNGPercentChange ); ini.GetValue( "Options", "RegenComboAfterFail", m_iRegenComboAfterFail ); ini.GetValue( "Options", "RegenComboAfterMiss", m_iRegenComboAfterMiss ); ini.GetValue( "Options", "MaxRegenComboAfterFail", m_iMaxRegenComboAfterFail ); ini.GetValue( "Options", "MaxRegenComboAfterMiss", m_iMaxRegenComboAfterMiss ); ini.GetValue( "Options", "TwoPlayerRecovery", m_bTwoPlayerRecovery ); - ini.GetValue( "Options", "MercifulMines", m_bMercifulMines ); + ini.GetValue( "Options", "MercifulDrain", m_bMercifulDrain ); ini.GetValue( "Options", "PercentScoreMarvelousWeight", m_iPercentScoreMarvelousWeight ); ini.GetValue( "Options", "PercentScorePerfectWeight", m_iPercentScorePerfectWeight ); @@ -338,6 +369,17 @@ void PrefsManager::ReadGlobalPrefsFromDisk() ini.GetValue( "Options", "GradePercentC", m_fGradePercentC ); ini.GetValue( "Options", "GradePercentD", m_fGradePercentD ); + ini.GetValue( "Options", "SuperMeterMarvelousPercentChange",m_fSuperMeterMarvelousPercentChange ); + ini.GetValue( "Options", "SuperMeterPerfectPercentChange", m_fSuperMeterPerfectPercentChange ); + ini.GetValue( "Options", "SuperMeterGreatPercentChange", m_fSuperMeterGreatPercentChange ); + ini.GetValue( "Options", "SuperMeterGoodPercentChange", m_fSuperMeterGoodPercentChange ); + ini.GetValue( "Options", "SuperMeterBooPercentChange", m_fSuperMeterBooPercentChange ); + ini.GetValue( "Options", "SuperMeterMissPercentChange", m_fSuperMeterMissPercentChange ); + ini.GetValue( "Options", "SuperMeterHitMinePercentChange", m_fSuperMeterHitMinePercentChange ); + ini.GetValue( "Options", "SuperMeterOKPercentChange", m_fSuperMeterOKPercentChange ); + ini.GetValue( "Options", "SuperMeterNGPercentChange", m_fSuperMeterNGPercentChange ); + ini.GetValue( "Options", "MercifulSuperMeter", m_bMercifulSuperMeter ); + ini.GetValue( "Options", "DelayedEscape", m_bDelayedEscape ); ini.GetValue( "Options", "HiddenSongs", m_bHiddenSongs ); ini.GetValue( "Options", "Vsync", m_bVsync ); @@ -488,15 +530,24 @@ void PrefsManager::SaveGlobalPrefsToDisk() const ini.SetValue( "Options", "LifeDeltaGoodPercentChange", m_fLifeDeltaGoodPercentChange ); ini.SetValue( "Options", "LifeDeltaBooPercentChange", m_fLifeDeltaBooPercentChange ); ini.SetValue( "Options", "LifeDeltaMissPercentChange", m_fLifeDeltaMissPercentChange ); + ini.SetValue( "Options", "LifeDeltaHitMinePercentChange", m_fLifeDeltaHitMinePercentChange ); ini.SetValue( "Options", "LifeDeltaOKPercentChange", m_fLifeDeltaOKPercentChange ); ini.SetValue( "Options", "LifeDeltaNGPercentChange", m_fLifeDeltaNGPercentChange ); - ini.SetValue( "Options", "LifeDeltaHitMinePercentChange", m_fLifeDeltaHitMinePercentChange ); + ini.SetValue( "Options", "TugMeterMarvelousPercentChange", m_fTugMeterMarvelousPercentChange ); + ini.SetValue( "Options", "TugMeterPerfectPercentChange", m_fTugMeterPerfectPercentChange ); + ini.SetValue( "Options", "TugMeterGreatPercentChange", m_fTugMeterGreatPercentChange ); + ini.SetValue( "Options", "TugMeterGoodPercentChange", m_fTugMeterGoodPercentChange ); + ini.SetValue( "Options", "TugMeterBooPercentChange", m_fTugMeterBooPercentChange ); + ini.SetValue( "Options", "TugMeterMissPercentChange", m_fTugMeterMissPercentChange ); + ini.SetValue( "Options", "TugMeterHitMinePercentChange", m_fTugMeterHitMinePercentChange ); + ini.SetValue( "Options", "TugMeterOKPercentChange", m_fTugMeterOKPercentChange ); + ini.SetValue( "Options", "TugMeterNGPercentChange", m_fTugMeterNGPercentChange ); ini.SetValue( "Options", "RegenComboAfterFail", m_iRegenComboAfterFail ); ini.SetValue( "Options", "RegenComboAfterMiss", m_iRegenComboAfterMiss ); ini.SetValue( "Options", "MaxRegenComboAfterFail", m_iMaxRegenComboAfterFail ); ini.SetValue( "Options", "MaxRegenComboAfterMiss", m_iMaxRegenComboAfterMiss ); ini.SetValue( "Options", "TwoPlayerRecovery", m_bTwoPlayerRecovery ); - ini.SetValue( "Options", "MercifulMines", m_bMercifulMines ); + ini.SetValue( "Options", "MercifulDrain", m_bMercifulDrain ); ini.SetValue( "Options", "PercentScoreMarvelousWeight", m_iPercentScoreMarvelousWeight ); ini.SetValue( "Options", "PercentScorePerfectWeight", m_iPercentScorePerfectWeight ); @@ -522,6 +573,17 @@ void PrefsManager::SaveGlobalPrefsToDisk() const ini.SetValue( "Options", "GradePercentC", m_fGradePercentC ); ini.SetValue( "Options", "GradePercentD", m_fGradePercentD ); + ini.SetValue( "Options", "SuperMeterMarvelousPercentChange",m_fSuperMeterMarvelousPercentChange ); + ini.SetValue( "Options", "SuperMeterPerfectPercentChange", m_fSuperMeterPerfectPercentChange ); + ini.SetValue( "Options", "SuperMeterGreatPercentChange", m_fSuperMeterGreatPercentChange ); + ini.SetValue( "Options", "SuperMeterGoodPercentChange", m_fSuperMeterGoodPercentChange ); + ini.SetValue( "Options", "SuperMeterBooPercentChange", m_fSuperMeterBooPercentChange ); + ini.SetValue( "Options", "SuperMeterMissPercentChange", m_fSuperMeterMissPercentChange ); + ini.SetValue( "Options", "SuperMeterHitMinePercentChange", m_fSuperMeterHitMinePercentChange ); + ini.SetValue( "Options", "SuperMeterOKPercentChange", m_fSuperMeterOKPercentChange ); + ini.SetValue( "Options", "SuperMeterNGPercentChange", m_fSuperMeterNGPercentChange ); + ini.SetValue( "Options", "MercifulSuperMeter", m_bMercifulSuperMeter ); + ini.SetValue( "Options", "DelayedEscape", m_bDelayedEscape ); ini.SetValue( "Options", "HiddenSongs", m_bHiddenSongs ); ini.SetValue( "Options", "Vsync", m_bVsync ); diff --git a/stepmania/src/PrefsManager.h b/stepmania/src/PrefsManager.h index 799de440b3..227a1b81f6 100644 --- a/stepmania/src/PrefsManager.h +++ b/stepmania/src/PrefsManager.h @@ -55,6 +55,7 @@ public: bool m_bShowDanger; int m_iNumArcadeStages; bool m_bEventMode; + float m_fJudgeWindowScale; float m_fLifeDifficultyScale; float m_fJudgeWindowMarvelousSeconds; @@ -65,6 +66,7 @@ public: float m_fJudgeWindowOKSeconds; float m_fJudgeWindowMineSeconds; float m_fJudgeWindowAttackSeconds; + float m_fLifeDeltaMarvelousPercentChange; float m_fLifeDeltaPerfectPercentChange; float m_fLifeDeltaGreatPercentChange; @@ -74,12 +76,23 @@ public: float m_fLifeDeltaHitMinePercentChange; float m_fLifeDeltaOKPercentChange; float m_fLifeDeltaNGPercentChange; + // tug meter used in rave + float m_fTugMeterMarvelousPercentChange; + float m_fTugMeterPerfectPercentChange; + float m_fTugMeterGreatPercentChange; + float m_fTugMeterGoodPercentChange; + float m_fTugMeterBooPercentChange; + float m_fTugMeterMissPercentChange; + float m_fTugMeterHitMinePercentChange; + float m_fTugMeterOKPercentChange; + float m_fTugMeterNGPercentChange; int m_iRegenComboAfterFail; int m_iRegenComboAfterMiss; int m_iMaxRegenComboAfterFail; int m_iMaxRegenComboAfterMiss; bool m_bTwoPlayerRecovery; - bool m_bMercifulMines; + bool m_bMercifulDrain; + int m_iPercentScoreMarvelousWeight; int m_iPercentScorePerfectWeight; int m_iPercentScoreGreatWeight; @@ -103,6 +116,18 @@ public: float m_fGradePercentB; float m_fGradePercentC; float m_fGradePercentD; + + float m_fSuperMeterMarvelousPercentChange; + float m_fSuperMeterPerfectPercentChange; + float m_fSuperMeterGreatPercentChange; + float m_fSuperMeterGoodPercentChange; + float m_fSuperMeterBooPercentChange; + float m_fSuperMeterMissPercentChange; + float m_fSuperMeterHitMinePercentChange; + float m_fSuperMeterOKPercentChange; + float m_fSuperMeterNGPercentChange; + bool m_bMercifulSuperMeter; + bool m_bAutoPlay; bool m_bDelayedEscape; bool m_bInstructions, m_bShowDontDie, m_bShowSelectGroup; diff --git a/stepmania/src/ScoreKeeperRave.cpp b/stepmania/src/ScoreKeeperRave.cpp index c96bcb527e..d6e9d36aea 100644 --- a/stepmania/src/ScoreKeeperRave.cpp +++ b/stepmania/src/ScoreKeeperRave.cpp @@ -16,6 +16,7 @@ #include "GameState.h" #include "Character.h" #include "ScreenManager.h" +#include "PrefsManager.h" CachedThemeMetricF ATTACK_DURATION_SECONDS ("ScoreKeeperRave","AttackDurationSeconds"); @@ -35,28 +36,71 @@ void ScoreKeeperRave::OnNextSong( int iSongInCourseIndex, const Steps* pNotes, c void ScoreKeeperRave::HandleTapScore( TapNoteScore score ) { - // FIXME + float fPercentToMove; + switch( score ) + { + case TNS_HIT_MINE: fPercentToMove = PREFSMAN->m_fSuperMeterHitMinePercentChange; break; + } + + AddSuperMeterDelta( fPercentToMove ); } #define CROSSED( val ) (fOld < val && fNew >= val) #define CROSSED_ATTACK_LEVEL( level ) CROSSED(1.f/NUM_ATTACK_LEVELS*(level+1)) void ScoreKeeperRave::HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTapsInRow ) { - AttackLevel oldAL = (AttackLevel)(int)GAMESTATE->m_fSuperMeter[m_PlayerNumber]; - - // TODO: Move these to prefs float fPercentToMove; switch( scoreOfLastTap ) { - case TNS_MARVELOUS: fPercentToMove = +0.04f; break; - case TNS_PERFECT: fPercentToMove = +0.04f; break; - case TNS_GREAT: fPercentToMove = +0.02f; break; - case TNS_GOOD: fPercentToMove = +0.00f; break; - case TNS_BOO: fPercentToMove = -0.08f; break; - case TNS_MISS: fPercentToMove = -0.16f; break; + case TNS_MARVELOUS: fPercentToMove = PREFSMAN->m_fSuperMeterMarvelousPercentChange; break; + case TNS_PERFECT: fPercentToMove = PREFSMAN->m_fSuperMeterPerfectPercentChange; break; + case TNS_GREAT: fPercentToMove = PREFSMAN->m_fSuperMeterGreatPercentChange; break; + case TNS_GOOD: fPercentToMove = PREFSMAN->m_fSuperMeterGoodPercentChange; break; + case TNS_BOO: fPercentToMove = PREFSMAN->m_fSuperMeterBooPercentChange; break; + case TNS_MISS: fPercentToMove = PREFSMAN->m_fSuperMeterMissPercentChange; break; default: ASSERT(0); fPercentToMove = +0.00f; break; } + AddSuperMeterDelta( fPercentToMove ); +} +void ScoreKeeperRave::HandleHoldScore( HoldNoteScore holdScore, TapNoteScore tapScore ) +{ + float fPercentToMove; + switch( tapScore ) + { + case TNS_HIT_MINE: fPercentToMove = PREFSMAN->m_fSuperMeterHitMinePercentChange; break; + } + AddSuperMeterDelta( fPercentToMove ); +} + +void ScoreKeeperRave::AddSuperMeterDelta( float fUnscaledPercentChange ) +{ + if( PREFSMAN->m_bMercifulDrain && fUnscaledPercentChange<0 ) + { + float fSuperPercentage = GAMESTATE->m_fSuperMeter[m_PlayerNumber] / NUM_ATTACK_LEVELS; + fUnscaledPercentChange *= SCALE( fSuperPercentage, 0.f, 1.f, 0.5f, 1.f); + } + + // more mercy: Grow super meter slower or faster depending on life. + if( PREFSMAN->m_bMercifulSuperMeter ) + { + float fLifePercentage; + switch( m_PlayerNumber ) + { + case PLAYER_1: fLifePercentage = GAMESTATE->m_fTugLifePercentP1; break; + case PLAYER_2: fLifePercentage = 1 - GAMESTATE->m_fTugLifePercentP1; break; + default: ASSERT(0); + } + if( fUnscaledPercentChange > 0 ) + fUnscaledPercentChange *= SCALE( fLifePercentage, 0.f, 1.f, 1.8f, 0.2f); + else // fUnscaledPercentChange <= 0 + fUnscaledPercentChange *= SCALE( fLifePercentage, 0.f, 1.f, 1.8f, 0.2f); + } + + + AttackLevel oldAL = (AttackLevel)(int)GAMESTATE->m_fSuperMeter[m_PlayerNumber]; + + float fPercentToMove = fUnscaledPercentChange; GAMESTATE->m_fSuperMeter[m_PlayerNumber] += fPercentToMove * GAMESTATE->m_fSuperMeterGrowthScale[m_PlayerNumber]; CLAMP( GAMESTATE->m_fSuperMeter[m_PlayerNumber], 0.f, NUM_ATTACK_LEVELS ); @@ -64,16 +108,16 @@ void ScoreKeeperRave::HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTa if( newAL > oldAL ) { + LaunchAttack( oldAL ); if( newAL == NUM_ATTACK_LEVELS ) // hit upper bounds of meter GAMESTATE->m_fSuperMeter[m_PlayerNumber] -= 1.f; - LaunchAttack( oldAL ); } + + // mercy + if( fUnscaledPercentChange < 0 ) + GAMESTATE->RemoveActiveAttacksForPlayer( m_PlayerNumber ); } -void ScoreKeeperRave::HandleHoldScore( HoldNoteScore holdScore, TapNoteScore tapScore ) -{ - // FIXME -} void ScoreKeeperRave::Update( float fDelta ) { diff --git a/stepmania/src/ScoreKeeperRave.h b/stepmania/src/ScoreKeeperRave.h index d4ccd5f102..5403be8af3 100644 --- a/stepmania/src/ScoreKeeperRave.h +++ b/stepmania/src/ScoreKeeperRave.h @@ -29,6 +29,7 @@ public: protected: void LaunchAttack( AttackLevel al ); + void AddSuperMeterDelta( float fUnscaledPercentChange ); RageSound m_soundLaunchAttack; RageSound m_soundAttackEnding; diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index 363744c2b4..a823c6d2d8 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -48,6 +48,7 @@ #include "LightsManager.h" #include "ProfileManager.h" #include "StageStats.h" +#include "PlayerAI.h" // for NUM_SKILL_LEVELS // // Defines @@ -887,18 +888,7 @@ void ScreenGameplay::LoadNextSong() else if( GAMESTATE->IsCpuPlayer(p) ) { GAMESTATE->m_PlayerController[p] = PC_CPU; - if( GAMESTATE->m_iCpuSkill[p] == -1 ) - { - switch( GAMESTATE->m_pCurNotes[p]->GetDifficulty() ) - { - case DIFFICULTY_BEGINNER: GAMESTATE->m_iCpuSkill[p] = 1; break; - case DIFFICULTY_EASY: GAMESTATE->m_iCpuSkill[p] = 3; break; - case DIFFICULTY_MEDIUM: GAMESTATE->m_iCpuSkill[p] = 5; break; - case DIFFICULTY_HARD: GAMESTATE->m_iCpuSkill[p] = 7; break; - case DIFFICULTY_CHALLENGE: GAMESTATE->m_iCpuSkill[p] = 9; break; - default: ASSERT(0); - } - } + GAMESTATE->m_iCpuSkill[p] = SCALE( GAMESTATE->m_pCurNotes[p]->GetMeter(), MIN_METER, MAX_METER, 0, NUM_SKILL_LEVELS-1 ); } else if( PREFSMAN->m_bAutoPlay ) GAMESTATE->m_PlayerController[p] = PC_AUTOPLAY;