Merge pull request #565 from kyzentun/toast_in_mouth

Multiple toasties per song.
This commit is contained in:
Kyzentun
2015-04-24 19:07:35 -06:00
9 changed files with 113 additions and 60 deletions
+2
View File
@@ -345,6 +345,7 @@ AllowExtraStage=When enabled (and Event Mode isn't on), allows the player to ear
AllowSongDeletion=Allow players to permanently delete songs from the system by pressing Ctrl+Backspace when browsing the music wheel. AllowSongDeletion=Allow players to permanently delete songs from the system by pressing Ctrl+Backspace when browsing the music wheel.
AllowW1=Enable or disable fantastic judgement. NEVER - never show Fantastic, COURSES ONLY - only during nonstop/oni modes, ALWAYS - all modes of play. AllowW1=Enable or disable fantastic judgement. NEVER - never show Fantastic, COURSES ONLY - only during nonstop/oni modes, ALWAYS - all modes of play.
AllowMultipleHighScoreWithSameName=If turned off, only the highest score with a given name will be saved. If turned on, it will allow mutliple high scores with a given name to be saved. AllowMultipleHighScoreWithSameName=If turned off, only the highest score with a given name will be saved. If turned on, it will allow mutliple high scores with a given name to be saved.
AllowMultipleToasties=Allow multiple toasties to be shown in one song.
Announcer=Choose from this list of installed announcer packs. Announcer=Choose from this list of installed announcer packs.
Appearance=Appearance Appearance=Appearance
Appearance Options=Change the theme, announcer, and other style options. Appearance Options=Change the theme, announcer, and other style options.
@@ -945,6 +946,7 @@ AllowExtraStage=Allow Extra Stage
AllowSongDeletion=Allow Song Deletion AllowSongDeletion=Allow Song Deletion
AllowW1=Fantastic Timing AllowW1=Fantastic Timing
AllowMultipleHighScoreWithSameName=Competitive Mode AllowMultipleHighScoreWithSameName=Competitive Mode
AllowMultipleToasties=Extra Toast
Alter=Alter Alter=Alter
Announcer=Announcer Announcer=Announcer
Appearance=Appearance Appearance=Appearance
+3 -1
View File
@@ -571,6 +571,7 @@ AvoidMineIncrementsCombo=false
UseInternalScoring=true UseInternalScoring=true
# When you hit it, you know. # When you hit it, you know.
ToastyTriggersAt=250 ToastyTriggersAt=250
ToastyMinTNS='TapNoteScore_W2'
[GameState] [GameState]
# Default song and sort. these don't really matter # Default song and sort. these don't really matter
@@ -3128,7 +3129,7 @@ Fallback="ScreenOptionsServiceChild"
NextScreen="ScreenOptionsService" NextScreen="ScreenOptionsService"
PrevScreen="ScreenOptionsService" PrevScreen="ScreenOptionsService"
# stuff tied to arcade features # stuff tied to arcade features
LineNames="1,2,3,4,5,6,7,8,9,HHLP,10,11,12,13,14" LineNames="1,2,3,4,5,6,7,8,AMT,9,HHLP,10,11,12,13,14"
Line1="conf,GetRankingName" Line1="conf,GetRankingName"
Line2="conf,CoinMode" Line2="conf,CoinMode"
Line3="conf,SongsPerPlay" Line3="conf,SongsPerPlay"
@@ -3137,6 +3138,7 @@ Line5="conf,Premium"
Line6="conf,EventMode" Line6="conf,EventMode"
Line7="conf,AllowMultipleHighScoreWithSameName" Line7="conf,AllowMultipleHighScoreWithSameName"
Line8="conf,ComboContinuesBetweenSongs" Line8="conf,ComboContinuesBetweenSongs"
LineAMT="conf,AllowMultipleToasties"
Line9="conf,Disqualification" Line9="conf,Disqualification"
LineHHLP="conf,HarshHotLifePenalty" LineHHLP="conf,HarshHotLifePenalty"
Line10="conf,FailOffForFirstStageEasy" Line10="conf,FailOffForFirstStageEasy"
+1
View File
@@ -223,6 +223,7 @@ PrefsManager::PrefsManager() :
m_iSongsPerPlay ( "SongsPerPlay", 3, ValidateSongsPerPlay ), m_iSongsPerPlay ( "SongsPerPlay", 3, ValidateSongsPerPlay ),
m_bDelayedCreditsReconcile ( "DelayedCreditsReconcile", false ), m_bDelayedCreditsReconcile ( "DelayedCreditsReconcile", false ),
m_bComboContinuesBetweenSongs ( "ComboContinuesBetweenSongs", false ), m_bComboContinuesBetweenSongs ( "ComboContinuesBetweenSongs", false ),
m_AllowMultipleToasties("AllowMultipleToasties", true),
m_MinTNSToHideNotes("MinTNSToHideNotes", TNS_W3), m_MinTNSToHideNotes("MinTNSToHideNotes", TNS_W3),
m_ShowSongOptions ( "ShowSongOptions", Maybe_NO ), m_ShowSongOptions ( "ShowSongOptions", Maybe_NO ),
m_bDancePointsForOni ( "DancePointsForOni", true ), m_bDancePointsForOni ( "DancePointsForOni", true ),
+1
View File
@@ -215,6 +215,7 @@ public:
Preference<int> m_iSongsPerPlay; Preference<int> m_iSongsPerPlay;
Preference<bool> m_bDelayedCreditsReconcile; // zuh? Preference<bool> m_bDelayedCreditsReconcile; // zuh?
Preference<bool> m_bComboContinuesBetweenSongs; Preference<bool> m_bComboContinuesBetweenSongs;
Preference<bool> m_AllowMultipleToasties;
Preference<TapNoteScore> m_MinTNSToHideNotes; Preference<TapNoteScore> m_MinTNSToHideNotes;
Preference<Maybe> m_ShowSongOptions; Preference<Maybe> m_ShowSongOptions;
Preference<bool> m_bDancePointsForOni; Preference<bool> m_bDancePointsForOni;
+90 -51
View File
@@ -51,12 +51,10 @@ void ScoreKeeperNormal::Load(
m_AvoidMineIncrementsCombo.Load( "Gameplay", "AvoidMineIncrementsCombo" ); m_AvoidMineIncrementsCombo.Load( "Gameplay", "AvoidMineIncrementsCombo" );
m_UseInternalScoring.Load( "Gameplay", "UseInternalScoring" ); m_UseInternalScoring.Load( "Gameplay", "UseInternalScoring" );
// Toasty triggers (idea from 3.9+) // This can be a function or a number, the type is checked when needed.
// Multiple toasty support doesn't seem to be working right now. // -Kyz
// Since it's causing more problems than solutions, I'm going back to m_toasty_trigger.Load("Gameplay", "ToastyTriggersAt");
// the old way of a single toasty trigger for now. m_toasty_min_tns.Load("Gameplay", "ToastyMinTNS");
//m_vToastyTriggers.Load( "Gameplay", "ToastyTriggersAt" );
m_ToastyTrigger.Load( "Gameplay", "ToastyTriggersAt" );
// Fill in STATSMAN->m_CurStageStats, calculate multiplier // Fill in STATSMAN->m_CurStageStats, calculate multiplier
int iTotalPossibleDancePoints = 0; int iTotalPossibleDancePoints = 0;
@@ -103,9 +101,12 @@ void ScoreKeeperNormal::Load(
m_pPlayerStageStats->m_iPossibleGradePoints = iTotalPossibleGradePoints; m_pPlayerStageStats->m_iPossibleGradePoints = iTotalPossibleGradePoints;
m_iScoreRemainder = 0; m_iScoreRemainder = 0;
m_iCurToastyCombo = 0; m_cur_toasty_combo = 0;
//m_iCurToastyTrigger = 0; m_cur_toasty_level= 0;
//m_iNextToastyAt = 0; // Initialize m_next_toasty_at to 0 so that CalcNextToastyAt just needs to
// add the value. -Kyz
m_next_toasty_at= 0;
m_next_toasty_at= CalcNextToastyAt(m_cur_toasty_level);
m_iMaxScoreSoFar = 0; m_iMaxScoreSoFar = 0;
m_iPointBonus = 0; m_iPointBonus = 0;
m_iNumTapsAndHolds = 0; m_iNumTapsAndHolds = 0;
@@ -329,6 +330,62 @@ void ScoreKeeperNormal::AddScoreInternal( TapNoteScore score )
} }
} }
int ScoreKeeperNormal::CalcNextToastyAt(int level)
{
Lua* L= LUA->Get();
m_toasty_trigger.PushSelf(L);
const int default_amount= 250;
int amount= default_amount;
bool erred= false;
switch(lua_type(L, 1))
{
case LUA_TNUMBER:
amount= lua_tointeger(L, 1);
break;
case LUA_TFUNCTION:
{
RString err= "Error running ToastyTriggersAt: ";
LuaHelpers::Push(L, m_pPlayerState->m_PlayerNumber);
lua_pushnumber(L, level);
if(LuaHelpers::RunScriptOnStack(L, err, 2, 1, true))
{
if(lua_isnumber(L, -1))
{
amount= lua_tointeger(L, -1);
}
else
{
LuaHelpers::ReportScriptError("Gameplay::ToastyTriggersAt "
"function must return a number greater than 0.");
erred= true;
}
}
else
{
erred= true;
}
}
break;
default:
LuaHelpers::ReportScriptError("Gameplay::ToastyTriggersAt metric has "
"a nonsensical type, it must be a number or a function.");
erred= true;
break;
}
if(amount <= 0)
{
if(!erred)
{
LuaHelpers::ReportScriptError("The ToastyTriggersAt value cannot be "
"less than or equal to 0 because that would be silly.");
}
amount= default_amount;
}
lua_settop(L, 0);
LUA->Release(L);
return m_next_toasty_at + amount;
}
void ScoreKeeperNormal::HandleTapScore( const TapNote &tn ) void ScoreKeeperNormal::HandleTapScore( const TapNote &tn )
{ {
TapNoteScore tns = tn.result.tns; TapNoteScore tns = tn.result.tns;
@@ -504,61 +561,43 @@ void ScoreKeeperNormal::HandleTapRowScore( const NoteData &nd, int iRow )
if( (GamePreferences::m_AutoPlay != PC_HUMAN || m_pPlayerState->m_PlayerOptions.GetCurrent().m_fPlayerAutoPlay != 0) if( (GamePreferences::m_AutoPlay != PC_HUMAN || m_pPlayerState->m_PlayerOptions.GetCurrent().m_fPlayerAutoPlay != 0)
&& !GAMESTATE->m_bDemonstrationOrJukebox ) // cheaters always prosper >:D -aj comment edit && !GAMESTATE->m_bDemonstrationOrJukebox ) // cheaters always prosper >:D -aj comment edit
{ {
m_iCurToastyCombo = 0; m_cur_toasty_combo = 0;
return; return;
} }
#endif //DEBUG #endif //DEBUG
// Toasty combo // Toasty combo
//vector<int> iToastyMilestones; if(scoreOfLastTap >= m_toasty_min_tns)
switch( scoreOfLastTap )
{ {
case TNS_W1: m_cur_toasty_combo += iNumTapsInRow;
case TNS_W2: if(m_cur_toasty_combo > m_next_toasty_at &&
m_iCurToastyCombo += iNumTapsInRow; !GAMESTATE->m_bDemonstrationOrJukebox)
/*
// compile the list of toasty triggers
{ {
Lua *L = LUA->Get(); ++m_cur_toasty_level;
m_vToastyTriggers.PushSelf(L); // Broadcast the message before posting the screen message so that the
LuaHelpers::ReadArrayFromTable(iToastyMilestones, L); // transition layer can catch the message to know the level and respond
lua_pop( L, 1 ); // accordingly. -Kyz
LUA->Release(L);
}
// find out which one we're at.
if(m_iCurToastyTrigger <= int(iToastyMilestones.size()))
{
m_iNextToastyAt = iToastyMilestones[m_iCurToastyTrigger];
}
else // out of index value? then don't make it toasty!
{
m_iNextToastyAt = -1;
}
*/
if( m_iCurToastyCombo >= m_ToastyTrigger &&
m_iCurToastyCombo - iNumTapsInRow < m_ToastyTrigger &&
!GAMESTATE->m_bDemonstrationOrJukebox )
{
SCREENMAN->PostMessageToTopScreen( SM_PlayToasty, 0 );
Message msg("ToastyAchieved"); Message msg("ToastyAchieved");
msg.SetParam( "PlayerNumber", m_pPlayerState->m_PlayerNumber ); msg.SetParam("PlayerNumber", m_pPlayerState->m_PlayerNumber);
msg.SetParam( "ToastyCombo", m_iCurToastyCombo ); msg.SetParam("ToastyCombo", m_cur_toasty_combo);
msg.SetParam("Level", m_cur_toasty_level);
MESSAGEMAN->Broadcast(msg); MESSAGEMAN->Broadcast(msg);
SCREENMAN->PostMessageToTopScreen(SM_PlayToasty, 0);
// TODO: keep a pointer to the Profile. Don't index with m_PlayerNumber // TODO: keep a pointer to the Profile. Don't index with m_PlayerNumber
PROFILEMAN->IncrementToastiesCount( m_pPlayerState->m_PlayerNumber ); // TODO: Make the profile count the level and combo of the toasty. -Kyz
PROFILEMAN->IncrementToastiesCount(m_pPlayerState->m_PlayerNumber);
//m_iCurToastyTrigger++; m_next_toasty_at= CalcNextToastyAt(m_cur_toasty_level);
} }
break; }
default: else
m_iCurToastyCombo = 0; {
m_cur_toasty_combo = 0;
m_cur_toasty_level= 0;
m_next_toasty_at= 0;
m_next_toasty_at= CalcNextToastyAt(m_cur_toasty_level);
Message msg("ToastyDropped"); Message msg("ToastyDropped");
msg.SetParam( "PlayerNumber", m_pPlayerState->m_PlayerNumber ); msg.SetParam( "PlayerNumber", m_pPlayerState->m_PlayerNumber );
MESSAGEMAN->Broadcast(msg); MESSAGEMAN->Broadcast(msg);
break;
} }
// TODO: Remove indexing with PlayerNumber // TODO: Remove indexing with PlayerNumber
@@ -570,7 +609,7 @@ void ScoreKeeperNormal::HandleTapRowScore( const NoteData &nd, int iRow )
Message msg( "ScoreChanged" ); Message msg( "ScoreChanged" );
msg.SetParam( "PlayerNumber", m_pPlayerState->m_PlayerNumber ); msg.SetParam( "PlayerNumber", m_pPlayerState->m_PlayerNumber );
msg.SetParam( "MultiPlayer", m_pPlayerState->m_mp ); msg.SetParam( "MultiPlayer", m_pPlayerState->m_mp );
msg.SetParam( "ToastyCombo", m_iCurToastyCombo ); msg.SetParam( "ToastyCombo", m_cur_toasty_combo );
MESSAGEMAN->Broadcast( msg ); MESSAGEMAN->Broadcast( msg );
} }
+6 -5
View File
@@ -18,6 +18,7 @@ AutoScreenMessage( SM_PlayToasty );
class ScoreKeeperNormal: public ScoreKeeper class ScoreKeeperNormal: public ScoreKeeper
{ {
void AddScoreInternal( TapNoteScore score ); void AddScoreInternal( TapNoteScore score );
int CalcNextToastyAt(int level);
int m_iScoreRemainder; int m_iScoreRemainder;
int m_iMaxPossiblePoints; int m_iMaxPossiblePoints;
@@ -26,9 +27,9 @@ class ScoreKeeperNormal: public ScoreKeeper
int m_iNumTapsAndHolds; int m_iNumTapsAndHolds;
int m_iMaxScoreSoFar; // for nonstop scoring int m_iMaxScoreSoFar; // for nonstop scoring
int m_iPointBonus; // the difference to award at the end int m_iPointBonus; // the difference to award at the end
int m_iCurToastyCombo; int m_cur_toasty_combo;
//int m_iCurToastyTrigger; int m_cur_toasty_level;
//int m_iNextToastyAt; int m_next_toasty_at;
bool m_bIsLastSongInCourse; bool m_bIsLastSongInCourse;
bool m_bIsBeginner; bool m_bIsBeginner;
@@ -43,8 +44,8 @@ class ScoreKeeperNormal: public ScoreKeeper
ThemeMetric<bool> m_AvoidMineIncrementsCombo; ThemeMetric<bool> m_AvoidMineIncrementsCombo;
ThemeMetric<bool> m_UseInternalScoring; ThemeMetric<bool> m_UseInternalScoring;
//ThemeMetric<LuaReference> m_vToastyTriggers; ThemeMetric<TapNoteScore> m_toasty_min_tns;
ThemeMetric<int> m_ToastyTrigger; ThemeMetric<LuaReference> m_toasty_trigger;
vector<Steps*> m_apSteps; vector<Steps*> m_apSteps;
+8 -3
View File
@@ -2874,10 +2874,15 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM )
} }
else if( SM == SM_PlayToasty ) else if( SM == SM_PlayToasty )
{ {
// todo: make multiple toasties work -aj if(g_bEasterEggs)
if( g_bEasterEggs ) {
if( !m_Toasty.IsTransitioning() && !m_Toasty.IsFinished() ) // don't play if we've already played it once if(PREFSMAN->m_AllowMultipleToasties ||
m_Toasty.IsWaiting())
{
m_Toasty.Reset();
m_Toasty.StartTransitioning(); m_Toasty.StartTransitioning();
}
}
} }
else if( ScreenMessageHelpers::ScreenMessageToString(SM).find("0Combo") != string::npos ) else if( ScreenMessageHelpers::ScreenMessageToString(SM).find("0Combo") != string::npos )
{ {
+1
View File
@@ -785,6 +785,7 @@ static void InitializeConfOptions()
ADD( ConfOption( "AllowExtraStage", MovePref<bool>, "Off","On" ) ); ADD( ConfOption( "AllowExtraStage", MovePref<bool>, "Off","On" ) );
ADD( ConfOption( "AllowMultipleHighScoreWithSameName", MovePref<bool>, "Off", "On" ) ); ADD( ConfOption( "AllowMultipleHighScoreWithSameName", MovePref<bool>, "Off", "On" ) );
ADD( ConfOption( "ComboContinuesBetweenSongs", MovePref<bool>, "Off", "On") ); ADD( ConfOption( "ComboContinuesBetweenSongs", MovePref<bool>, "Off", "On") );
ADD(ConfOption("AllowMultipleToasties", MovePref<bool>, "Off", "On"));
ADD( ConfOption( "Disqualification", MovePref<bool>, "Off","On" ) ); ADD( ConfOption( "Disqualification", MovePref<bool>, "Off","On" ) );
ADD( ConfOption( "HarshHotLifePenalty", MovePref<bool>, "Off", "On") ); ADD( ConfOption( "HarshHotLifePenalty", MovePref<bool>, "Off", "On") );
ADD( ConfOption( "FailOffForFirstStageEasy", MovePref<bool>, "Off","On" ) ); ADD( ConfOption( "FailOffForFirstStageEasy", MovePref<bool>, "Off","On" ) );
+1
View File
@@ -22,6 +22,7 @@ public:
virtual float GetTweenTimeLeft() const; virtual float GetTweenTimeLeft() const;
void Reset(); // explicitly allow transitioning again void Reset(); // explicitly allow transitioning again
bool IsWaiting() const { return m_State == waiting; };
bool IsTransitioning() const { return m_State == transitioning; }; bool IsTransitioning() const { return m_State == transitioning; };
bool IsFinished() const { return m_State == finished; }; bool IsFinished() const { return m_State == finished; };