Added new unlock system, disabled by default

This commit is contained in:
Kevin Slaughter
2003-05-09 05:56:05 +00:00
parent 6150d3f2c2
commit fd02bce784
16 changed files with 258 additions and 7 deletions
+4
View File
@@ -0,0 +1,4 @@
//Test file for Miryo's new Unlock system. Songs are matched by name, not folder name
[DP]500|Gamelan de Couple
[DP]7500|Exotic Ethnic
[DP]10000|Maxx Unlimited
+1
View File
@@ -1708,6 +1708,7 @@ MarvelousTiming=Enable or disable marvelous judgement.
HiddenSongs=Some songs are only playable during Oni courses and::with roulette. Leave this &oq;OFF&cq; to always display all songs. HiddenSongs=Some songs are only playable during Oni courses and::with roulette. Leave this &oq;OFF&cq; to always display all songs.
PickExtraStage=Instead of a set extra stage, this allows::the player to choose which song to play.::Difficulty and options are still locked. PickExtraStage=Instead of a set extra stage, this allows::the player to choose which song to play.::Difficulty and options are still locked.
SoloSingles=Turn this option &oq;ON&cq; to enable Solo-Style::for 4-panel single play. SoloSingles=Turn this option &oq;ON&cq; to enable Solo-Style::for 4-panel single play.
UnlockSystem=Enable or disable unlock system.
[ScreenBackgroundOptions] [ScreenBackgroundOptions]
HelpText=&UP; &DOWN; to change line &LEFT; &RIGHT; to select between options::START to accept changes BACK to discard changes HelpText=&UP; &DOWN; to change line &LEFT; &RIGHT; to select between options::START to accept changes BACK to discard changes
+2
View File
@@ -18,6 +18,7 @@
#include "Style.h" #include "Style.h"
#include "Grade.h" #include "Grade.h"
#include "StageStats.h" #include "StageStats.h"
#include "UnlockSystem.h"
class Song; class Song;
class Notes; class Notes;
@@ -41,6 +42,7 @@ public:
// //
// Main State Info // Main State Info
// //
UnlockSystem UnlockingSys;
Game m_CurGame; Game m_CurGame;
Style m_CurStyle; Style m_CurStyle;
bool m_bPlayersCanJoin; // true if it's not too late for a player to join - this only has an effect on the credits message bool m_bPlayersCanJoin; // true if it's not too late for a player to join - this only has an effect on the credits message
+8
View File
@@ -274,7 +274,15 @@ void MusicWheel::GetSongList(vector<Song*> &arraySongs, SongSortOrder so, CStrin
pSong->GetNotes( arraySteps, GAMESTATE->GetCurrentStyleDef()->m_NotesType, DIFFICULTY_INVALID, -1, -1, "", PREFSMAN->m_bAutogenMissingTypes ); pSong->GetNotes( arraySteps, GAMESTATE->GetCurrentStyleDef()->m_NotesType, DIFFICULTY_INVALID, -1, -1, "", PREFSMAN->m_bAutogenMissingTypes );
if( !arraySteps.empty() ) if( !arraySteps.empty() )
{
// If we're using unlocks, check it here to prevent from being shown
if( PREFSMAN->m_bUseUnlockSystem )
{
pSong->m_bIsLocked = GAMESTATE->UnlockingSys.SongIsLocked( pSong->m_sMainTitle );
if( pSong->m_bIsLocked ) { continue; }
}
arraySongs.push_back( pSong ); arraySongs.push_back( pSong );
}
} }
} }
+6
View File
@@ -93,6 +93,8 @@ PrefsManager::PrefsManager()
m_bBreakComboToGetItem = false; m_bBreakComboToGetItem = false;
m_bShowDancingCharacters = false; m_bShowDancingCharacters = false;
m_BannerCacheType = preload_none; m_BannerCacheType = preload_none;
m_fDancePointsAccumulated = 0;
m_bUseUnlockSystem = false;
/* DDR Extreme-style extra stage support. /* DDR Extreme-style extra stage support.
* Default off so people used to the current behavior (or those with extra * Default off so people used to the current behavior (or those with extra
@@ -196,6 +198,8 @@ void PrefsManager::ReadGlobalPrefsFromDisk( bool bSwitchToLastPlayedGame )
ini.GetValueB( "Options", "BreakComboToGetItem", m_bBreakComboToGetItem ); ini.GetValueB( "Options", "BreakComboToGetItem", m_bBreakComboToGetItem );
ini.GetValueB( "Options", "ShowDancingCharacters", m_bShowDancingCharacters ); ini.GetValueB( "Options", "ShowDancingCharacters", m_bShowDancingCharacters );
ini.GetValueI( "Options", "BannerCacheType", (int&)m_BannerCacheType ); ini.GetValueI( "Options", "BannerCacheType", (int&)m_BannerCacheType );
ini.GetValueF( "Misc", "DancePointsAccumulated", m_fDancePointsAccumulated );
ini.GetValueB( "Misc", "UseUnlockSystem", m_bUseUnlockSystem );
m_asAdditionalSongFolders.clear(); m_asAdditionalSongFolders.clear();
CString sAdditionalSongFolders; CString sAdditionalSongFolders;
@@ -279,6 +283,8 @@ void PrefsManager::SaveGlobalPrefsToDisk()
ini.SetValueB( "Options", "BreakComboToGetItem", m_bBreakComboToGetItem ); ini.SetValueB( "Options", "BreakComboToGetItem", m_bBreakComboToGetItem );
ini.SetValueB( "Options", "ShowDancingCharacters", m_bShowDancingCharacters ); ini.SetValueB( "Options", "ShowDancingCharacters", m_bShowDancingCharacters );
ini.SetValueI( "Options", "BannerCacheType", m_BannerCacheType ); ini.SetValueI( "Options", "BannerCacheType", m_BannerCacheType );
ini.SetValueF( "Misc", "DancePointsAccumulated", m_fDancePointsAccumulated );
ini.SetValueB( "Misc", "UseUnlockSystem", m_bUseUnlockSystem );
/* Only write these if they aren't the default. This ensures that we can change /* Only write these if they aren't the default. This ensures that we can change
+2
View File
@@ -76,6 +76,8 @@ public:
CString m_sDefaultModifiers; CString m_sDefaultModifiers;
bool m_bBreakComboToGetItem; bool m_bBreakComboToGetItem;
bool m_bShowDancingCharacters; bool m_bShowDancingCharacters;
float m_fDancePointsAccumulated;
bool m_bUseUnlockSystem;
/* 0 = no; 1 = yes; -1 = auto (do whatever is appropriate for the arch). */ /* 0 = no; 1 = yes; -1 = auto (do whatever is appropriate for the arch). */
int m_iBoostAppPriority; int m_iBoostAppPriority;
+13
View File
@@ -195,8 +195,12 @@ ScreenEvaluation::ScreenEvaluation( CString sClassName, Type type ) : Screen(sCl
case stage: case stage:
{ {
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
{
if( GAMESTATE->IsHumanPlayer(p) ) if( GAMESTATE->IsHumanPlayer(p) )
{
GAMESTATE->m_pCurNotes[p]->AddScore( (PlayerNumber)p, grade[p], stageStats.fScore[p], bNewRecord[p] ); GAMESTATE->m_pCurNotes[p]->AddScore( (PlayerNumber)p, grade[p], stageStats.fScore[p], bNewRecord[p] );
}
}
} }
break; break;
case summary: case summary:
@@ -208,10 +212,12 @@ ScreenEvaluation::ScreenEvaluation( CString sClassName, Type type ) : Screen(sCl
RankingCategory cat[NUM_PLAYERS]; RankingCategory cat[NUM_PLAYERS];
int iRankingIndex[NUM_PLAYERS]; int iRankingIndex[NUM_PLAYERS];
float fTotalDP;
for( int p=0; p<NUM_PLAYERS; p++ ) for( int p=0; p<NUM_PLAYERS; p++ )
{ {
float fAverageMeter = stageStats.iMeter[p] / (float)PREFSMAN->m_iNumArcadeStages; float fAverageMeter = stageStats.iMeter[p] / (float)PREFSMAN->m_iNumArcadeStages;
cat[p] = AverageMeterToRankingCategory( fAverageMeter ); cat[p] = AverageMeterToRankingCategory( fAverageMeter );
fTotalDP += stageStats.iActualDancePoints[p];
} }
SONGMAN->AddScores( nt, bIsHumanPlayer, cat, stageStats.fScore, iRankingIndex ); SONGMAN->AddScores( nt, bIsHumanPlayer, cat, stageStats.fScore, iRankingIndex );
@@ -219,6 +225,13 @@ ScreenEvaluation::ScreenEvaluation( CString sClassName, Type type ) : Screen(sCl
COPY( GAMESTATE->m_RankingCategory, cat ); COPY( GAMESTATE->m_RankingCategory, cat );
COPY( GAMESTATE->m_iRankingIndex, iRankingIndex ); COPY( GAMESTATE->m_iRankingIndex, iRankingIndex );
GAMESTATE->m_RankingNotesType = nt; GAMESTATE->m_RankingNotesType = nt;
// If unlocking is enabled, save the dance points
if( PREFSMAN->m_bUseUnlockSystem )
{
PREFSMAN->m_fDancePointsAccumulated += fTotalDP;
PREFSMAN->SaveGlobalPrefsToDisk();
}
} }
break; break;
case course: case course:
+1
View File
@@ -63,6 +63,7 @@ protected:
GradeDisplay m_Grades[NUM_PLAYERS]; GradeDisplay m_Grades[NUM_PLAYERS];
// points area // points area
bool m_bNewSongsUnlocked;
Sprite m_sprPercentFrame[NUM_PLAYERS]; Sprite m_sprPercentFrame[NUM_PLAYERS];
BitmapText m_textPercentWhole[NUM_PLAYERS]; BitmapText m_textPercentWhole[NUM_PLAYERS];
BitmapText m_textPercentRemainder[NUM_PLAYERS]; BitmapText m_textPercentRemainder[NUM_PLAYERS];
+5 -1
View File
@@ -31,6 +31,7 @@ enum {
GO_EASTER_EGGS, GO_EASTER_EGGS,
GO_MARVELOUS, GO_MARVELOUS,
GO_PICK_EXTRA_STAGE, GO_PICK_EXTRA_STAGE,
GO_UNLOCK_SYSTEM,
NUM_GAMEPLAY_OPTIONS_LINES NUM_GAMEPLAY_OPTIONS_LINES
}; };
@@ -40,7 +41,8 @@ OptionRow g_GameplayOptionsLines[NUM_GAMEPLAY_OPTIONS_LINES] = {
OptionRow( "Hidden\nSongs", "OFF","ON" ), OptionRow( "Hidden\nSongs", "OFF","ON" ),
OptionRow( "Easter\nEggs", "OFF","ON" ), OptionRow( "Easter\nEggs", "OFF","ON" ),
OptionRow( "Marvelous\nTiming", "OFF","ON" ), OptionRow( "Marvelous\nTiming", "OFF","ON" ),
OptionRow( "Pick Extra\nStage", "OFF","ON" ) OptionRow( "Pick Extra\nStage", "OFF","ON" ),
OptionRow( "Unlock\nSystem", "OFF","ON" )
}; };
ScreenGameplayOptions::ScreenGameplayOptions() : ScreenGameplayOptions::ScreenGameplayOptions() :
@@ -66,6 +68,7 @@ void ScreenGameplayOptions::ImportOptions()
m_iSelectedOption[0][GO_EASTER_EGGS] = PREFSMAN->m_bEasterEggs ? 1:0; m_iSelectedOption[0][GO_EASTER_EGGS] = PREFSMAN->m_bEasterEggs ? 1:0;
m_iSelectedOption[0][GO_MARVELOUS] = PREFSMAN->m_bMarvelousTiming ? 1:0; m_iSelectedOption[0][GO_MARVELOUS] = PREFSMAN->m_bMarvelousTiming ? 1:0;
m_iSelectedOption[0][GO_PICK_EXTRA_STAGE] = PREFSMAN->m_bPickExtraStage? 1:0; m_iSelectedOption[0][GO_PICK_EXTRA_STAGE] = PREFSMAN->m_bPickExtraStage? 1:0;
m_iSelectedOption[0][GO_UNLOCK_SYSTEM] = PREFSMAN->m_bUseUnlockSystem? 1:0;
} }
void ScreenGameplayOptions::ExportOptions() void ScreenGameplayOptions::ExportOptions()
@@ -76,6 +79,7 @@ void ScreenGameplayOptions::ExportOptions()
PREFSMAN->m_bEasterEggs = m_iSelectedOption[0][GO_EASTER_EGGS] == 1; PREFSMAN->m_bEasterEggs = m_iSelectedOption[0][GO_EASTER_EGGS] == 1;
PREFSMAN->m_bMarvelousTiming = m_iSelectedOption[0][GO_MARVELOUS] == 1; PREFSMAN->m_bMarvelousTiming = m_iSelectedOption[0][GO_MARVELOUS] == 1;
PREFSMAN->m_bPickExtraStage = m_iSelectedOption[0][GO_PICK_EXTRA_STAGE] == 1; PREFSMAN->m_bPickExtraStage = m_iSelectedOption[0][GO_PICK_EXTRA_STAGE] == 1;
PREFSMAN->m_bUseUnlockSystem = m_iSelectedOption[0][GO_UNLOCK_SYSTEM] == 1;
} }
void ScreenGameplayOptions::GoToPrevState() void ScreenGameplayOptions::GoToPrevState()
+32
View File
@@ -0,0 +1,32 @@
#include "global.h"
#include "PrefsManager.h"
#include "ScreenUnlock.h"
#include "ThemeManager.h"
#include "GameState.h"
#include "RageLog.h"
ScreenUnlock::ScreenUnlock() : ScreenAttract("ScreenUnlock")
{
LOG->Trace("ScreenUnlock::ScreenUnlock()");
PointsUntilNextUnlock.LoadFromFont( THEME->GetPathToF("Common normal") );
PointsUntilNextUnlock.SetHorizAlign( Actor::align_left );
CString sDP = ssprintf( "%f", GAMESTATE->UnlockingSys.NumPointsUntilNextUnlock() );
// Remove the decimal
if( sDP.Find(".",1) > 0 )
{
sDP = sDP.Left(sDP.Find(".",1));
}
// No negative numbers
if( sDP.Left(1) == "-" )
{
sDP = "*";
};
PointsUntilNextUnlock.SetText( sDP );
PointsUntilNextUnlock.SetZoom( 3 );
PointsUntilNextUnlock.SetXY( 10, 370 );
this->AddChild( &PointsUntilNextUnlock );
}
+8 -5
View File
@@ -8,15 +8,18 @@
Chris Danford Chris Danford
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
*/ */
#include "ScreenAttract.h" #include "ScreenAttract.h"
#include "GameConstantsAndTypes.h" // for NUM_RANKING_LINES
#include "Style.h"
class Course;
class ScreenUnlock : public ScreenAttract class ScreenUnlock : public ScreenAttract
{ {
public: public:
ScreenUnlock() : ScreenAttract("ScreenUnlock") { }; ScreenUnlock();
protected:
BitmapText PointsUntilNextUnlock;
}; };
+1
View File
@@ -83,6 +83,7 @@ void SortBackgroundChangesArray( vector<BackgroundChange> &arrayBackgroundChange
////////////////////////////// //////////////////////////////
Song::Song() Song::Song()
{ {
m_bIsLocked = false;
m_bChangedSinceSave = false; m_bChangedSinceSave = false;
m_fBeat0OffsetInSeconds = 0; m_fBeat0OffsetInSeconds = 0;
m_fMusicSampleStartSeconds = -1; m_fMusicSampleStartSeconds = -1;
+3
View File
@@ -347,6 +347,9 @@ int main(int argc, char* argv[])
"(Advanced: To allow use of the software renderer, set 'AllowSoftwareRenderer=1' " "(Advanced: To allow use of the software renderer, set 'AllowSoftwareRenderer=1' "
"in StepMania.ini)" ); "in StepMania.ini)" );
/* Load the unlocks into memory */
GAMESTATE->UnlockingSys.LoadFromDATFile("Data/Unlocks.dat");
/* Run the main loop. */ /* Run the main loop. */
GameLoop(); GameLoop();
+133
View File
@@ -0,0 +1,133 @@
/*
-----------------------------------------------------------------------------
Class: UnlockSystem
Desc: See header.
Copyright (c) 2001-2003 by the person(s) listed below. All rights reserved.
Kevin Slaughter
-----------------------------------------------------------------------------
*/
#include "global.h"
#include "PrefsManager.h"
#include "RageLog.h"
#include "RageException.h"
#include "RageUtil.h"
#include "UnlockSystem.h"
#include <fstream>
#include <map>
using namespace std;
#define POINTS_ACCUMULATED_BEFORE_LAST_ROUND // Load from file here
UnlockSystem::UnlockSystem()
{
}
bool UnlockSystem::SongIsLocked( CString sSongName )
{
sSongName.MakeUpper(); //Avoid case-sensitive problems
for( unsigned i=0; i<m_SongEntries.size(); i++ )
{
if( sSongName == m_SongEntries[i].m_sSongName )
{
if( PREFSMAN->m_fDancePointsAccumulated >= m_SongEntries[i].m_fDancePointsRequired ) { LOG->Trace(" *This song is UNLOCKED"); return false; }
else { LOG->Trace(" *This song is LOCKED"); return true; };
}
else { continue; };
}
LOG->Trace( " *This song is UNLOCKED (wasn't locked in the first place)" );
return false;
}
static int CompareSongEntries(const SongEntry &se1, const SongEntry &se2)
{
return se1.m_fDancePointsRequired < se2.m_fDancePointsRequired;
}
void UnlockSystem::SortSongEntriesArray()
{
sort( m_SongEntries.begin(), m_SongEntries.end(), CompareSongEntries );
}
bool UnlockSystem::LoadFromDATFile( CString sPath )
{
LOG->Trace( "\n\n\n\nUnlockSystem::LoadFromDATFile(%s)", sPath.c_str() );
ifstream input(sPath);
if(input.bad())
{
LOG->Warn( "Error opening file '%s' for reading.", sPath.c_str() );
return false;
}
string line;
m_SongEntries.clear();
while(input.good() && getline(input, line))
{
if(!line.compare(0, 2, "//")) //Check for comments
continue;
/* "[data1] data2". Ignore whitespace at the beginning of the line. */
static Regex x("^ *\\[([^]]+)\\] *(.*)$");
vector<CString> matches;
if(!x.Compare(line, matches))
continue;
CString &sValueName = matches[0];
CString &sValueData = matches[1];
StripCrnl(sValueData);
// Handle our data
if( 0==stricmp(sValueName,"DP") ) // This means the DancePoints value is coming up
{
float DP;
CString SongName;
DP = (float)atof( sValueData.Left(sValueData.Find("|",1)) );
SongName = (CString)sValueData.Right( sValueData.GetLength() - (sValueData.Find("|",1)+1) );
SongName.MakeUpper(); // Avoid case-sensitive problems
SongEntry SE;
SE.m_fDancePointsRequired = DP;
SE.m_sSongName = SongName.c_str();
m_SongEntries.push_back( SE );
continue;
}
}
return true;
}
float UnlockSystem::NumPointsUntilNextUnlock()
{
float fSmallestPoints;
fSmallestPoints = m_SongEntries[0].m_fDancePointsRequired;
for( unsigned a=0; a<m_SongEntries.size(); a++ )
{
if( m_SongEntries[a].m_fDancePointsRequired >= fSmallestPoints )
{
fSmallestPoints = m_SongEntries[a].m_fDancePointsRequired;
}
}
float fResults = (fSmallestPoints - PREFSMAN->m_fDancePointsAccumulated);
return fResults;
}
+37
View File
@@ -0,0 +1,37 @@
#ifndef UNLOCK_SYSTEM_H
#define UNLOCK_SYSTEM_H
/*
-----------------------------------------------------------------------------
Class: UnlockSystem
Desc: See header.
Copyright (c) 2001-2003 by the person(s) listed below. All rights reserved.
Kevin Slaughter
-----------------------------------------------------------------------------
*/
struct SongEntry
{
float m_fDancePointsRequired; // Ammount of Dance Points needed to unlock this song
CString m_sSongName; /* Name of the song in the DWI/SM file itself.. This allows
for a lot easier compatibility since a lot of people's
song folders are named differantly, song names tend to
be the same in the file.*/
};
class UnlockSystem
{
public:
UnlockSystem();
float NumPointsUntilNextUnlock();
bool SongIsLocked( CString sSongName );
bool LoadFromDATFile( CString sPath );
bool m_bAllSongsAreUnlocked; // Quick way to check if all songs are unlocked
vector<SongEntry> m_SongEntries; // All locked songs are stored here
private:
void SortSongEntriesArray();
};
#endif
+1
View File
@@ -163,6 +163,7 @@ public:
bool HasMovieBackground() const; bool HasMovieBackground() const;
bool HasBGChanges() const; bool HasBGChanges() const;
bool HasLyrics() const; bool HasLyrics() const;
bool m_bIsLocked;
vector<BPMSegment> m_BPMSegments; // this must be sorted before gameplay vector<BPMSegment> m_BPMSegments; // this must be sorted before gameplay
vector<StopSegment> m_StopSegments; // this must be sorted before gameplay vector<StopSegment> m_StopSegments; // this must be sorted before gameplay