diff --git a/stepmania/Themes/default/Graphics/MemoryCardDisplay error p1.png b/stepmania/Themes/default/Graphics/MemoryCardDisplay error p1.png new file mode 100644 index 0000000000..7f6b5d1bce Binary files /dev/null and b/stepmania/Themes/default/Graphics/MemoryCardDisplay error p1.png differ diff --git a/stepmania/Themes/default/Graphics/MemoryCardDisplay error p2.png b/stepmania/Themes/default/Graphics/MemoryCardDisplay error p2.png new file mode 100644 index 0000000000..3c5ac07505 Binary files /dev/null and b/stepmania/Themes/default/Graphics/MemoryCardDisplay error p2.png differ diff --git a/stepmania/Themes/default/Graphics/MemoryCardDisplay late p1.png b/stepmania/Themes/default/Graphics/MemoryCardDisplay late p1.png new file mode 100644 index 0000000000..1f44418ae5 Binary files /dev/null and b/stepmania/Themes/default/Graphics/MemoryCardDisplay late p1.png differ diff --git a/stepmania/Themes/default/Graphics/MemoryCardDisplay late p2.png b/stepmania/Themes/default/Graphics/MemoryCardDisplay late p2.png new file mode 100644 index 0000000000..d3748c2e1e Binary files /dev/null and b/stepmania/Themes/default/Graphics/MemoryCardDisplay late p2.png differ diff --git a/stepmania/Themes/default/Graphics/MemoryCardDisplay none p1.png b/stepmania/Themes/default/Graphics/MemoryCardDisplay none p1.png new file mode 100644 index 0000000000..9c720b4244 Binary files /dev/null and b/stepmania/Themes/default/Graphics/MemoryCardDisplay none p1.png differ diff --git a/stepmania/Themes/default/Graphics/MemoryCardDisplay none p2.png b/stepmania/Themes/default/Graphics/MemoryCardDisplay none p2.png new file mode 100644 index 0000000000..9c720b4244 Binary files /dev/null and b/stepmania/Themes/default/Graphics/MemoryCardDisplay none p2.png differ diff --git a/stepmania/Themes/default/Graphics/MemoryCardDisplay ready p1.png b/stepmania/Themes/default/Graphics/MemoryCardDisplay ready p1.png new file mode 100644 index 0000000000..29deb93942 Binary files /dev/null and b/stepmania/Themes/default/Graphics/MemoryCardDisplay ready p1.png differ diff --git a/stepmania/Themes/default/Graphics/MemoryCardDisplay ready p2.png b/stepmania/Themes/default/Graphics/MemoryCardDisplay ready p2.png new file mode 100644 index 0000000000..793fe87a89 Binary files /dev/null and b/stepmania/Themes/default/Graphics/MemoryCardDisplay ready p2.png differ diff --git a/stepmania/Themes/default/Sounds/MemoryCardManager ready.ogg b/stepmania/Themes/default/Sounds/MemoryCardManager ready.ogg new file mode 100644 index 0000000000..a76181dcf1 Binary files /dev/null and b/stepmania/Themes/default/Sounds/MemoryCardManager ready.ogg differ diff --git a/stepmania/Themes/default/metrics.ini b/stepmania/Themes/default/metrics.ini index eabac8ef14..81e112e1e1 100644 --- a/stepmania/Themes/default/metrics.ini +++ b/stepmania/Themes/default/metrics.ini @@ -58,6 +58,7 @@ Choice8=screen,ScreenTest Name8=SANDBOX TimerSeconds=-1 // none StyleIcon=0 +MemoryCardIcons=0 LogoHomeOnCommand=x,320;y,240;zoomy,0;sleep,0.5;bounceend,0.5;zoomy,1;glowshift;effectperiod,2.5;effectcolor1,1,1,1,0.1;effectcolor2,1,1,1,0.3 LogoOnCommand=x,320;y,240;zoomy,0;sleep,0.5;bounceend,0.5;zoomy,1;glowshift;effectperiod,2.5;effectcolor1,1,1,1,0.1;effectcolor2,1,1,1,0.3 VersionOnCommand=horizalign,right;x,620;y,20;diffuse,0.6,0.6,0.6,1;zoom,0.5;shadowlength,2 @@ -92,6 +93,7 @@ JoinMessageP2X=520 JoinMessageP2Y=336 TimerSeconds=40 StyleIcon=1 +MemoryCardIcons=1 NextScreen=ScreenSelectGroup SilentWait=1 BounceJoinMessage=1 @@ -107,6 +109,7 @@ Choice4=Style,double;name,double Choice5=Style,solo;name,solo TimerSeconds=40 StyleIcon=1 +MemoryCardIcons=1 NextScreen1=ScreenSelectDifficulty NextScreen2=ScreenSelectDifficulty NextScreen3=ScreenSelectDifficulty @@ -175,6 +178,7 @@ PictureOffCommand=linear,0.5;diffusealpha,0;glow,1,1,1,0 [ScreenSelectStyle5th] TimerSeconds=40 StyleIcon=1 +MemoryCardIcons=1 NextScreen=ScreenSelectDifficulty PadX1=70 PadY1=300 @@ -226,6 +230,7 @@ GuideX=320 GuideY=374 TimerSeconds=30 StyleIcon=1 +MemoryCardIcons=1 NextScreen=ScreenSelectGroup ScrollingListX=320 ScrollingListY=250 @@ -250,6 +255,7 @@ CharacterIconP2OffCommand=linear,0.3;diffusealpha,0;sleep,10 [ScreenStyleSplash] NextScreen=ScreenSelectGroup StyleIcon=0 +MemoryCardIcons=0 TimerSeconds=0 [ScreenSelectDifficulty] @@ -265,6 +271,7 @@ Choice8=PlayMode,rave;name,rave NumChoicesOnPage1=4 TimerSeconds=40 StyleIcon=1 +MemoryCardIcons=1 NextScreen1=ScreenSelectGroup NextScreen2=ScreenSelectGroup NextScreen3=ScreenSelectGroup @@ -484,6 +491,7 @@ SleepAfterChoiceSeconds=0.3 SleepAfterTweenOffSeconds=0.8 TimerSeconds=60 StyleIcon=1 +MemoryCardIcons=1 [ScreenSelectGroup] FrameX=180 @@ -519,6 +527,7 @@ MusicListOffCommand= SleepAfterTweenOffSeconds=0.8 TimerSeconds=40 StyleIcon=1 +MemoryCardIcons=1 NextScreen=ScreenInstructions [GroupList] @@ -554,6 +563,7 @@ NextScreenBattle=ScreenSelectCharacter NextScreenRave=ScreenSelectCharacter TimerSeconds=15 StyleIcon=1 +MemoryCardIcons=1 [ScreenSelectMusic] DefaultSort=GROUP @@ -717,6 +727,7 @@ CourseContentsShowCommand= CourseContentsHideCommand= TimerSeconds=60 StyleIcon=1 +MemoryCardIcons=1 SampleMusicDelay=0.25 PrevScreenArcade=ScreenTitleMenu PrevScreenNonstop=ScreenTitleMenu @@ -808,6 +819,7 @@ NextOptionsScreenBattle=ScreenPlayerOptions NextOptionsScreenRave=ScreenRaveOptions TimerSeconds=60 StyleIcon=0 +MemoryCardIcons=0 [ScreenSelectCourse] ExplanationX=132 @@ -833,6 +845,7 @@ ScoreP2Y=286 ScoreZoom=0.8 TimerSeconds=60 StyleIcon=1 +MemoryCardIcons=1 [ScreenStage] NextScreen=ScreenGameplay @@ -1474,6 +1487,7 @@ ShowComboArea=0 ShowFullCombo=0 TimerSeconds=15 StyleIcon=1 +MemoryCardIcons=1 FailedSoundTime=0 PassedSoundTime=0 NumSequenceSounds=0 @@ -1509,6 +1523,7 @@ ShowComboArea=0 ShowFullCombo=0 TimerSeconds=30 StyleIcon=1 +MemoryCardIcons=1 [ScreenEvaluationNonstop] NextScreen=ScreenNameEntry @@ -1541,6 +1556,7 @@ ShowComboArea=0 ShowFullCombo=0 TimerSeconds=30 StyleIcon=1 +MemoryCardIcons=1 [ScreenEvaluationOni] NextScreen=ScreenNameEntry @@ -1573,6 +1589,7 @@ ShowComboArea=0 ShowFullCombo=0 TimerSeconds=30 StyleIcon=1 +MemoryCardIcons=1 [ScreenEvaluationEndless] NextScreen=ScreenNameEntry @@ -1605,6 +1622,7 @@ ShowComboArea=0 ShowFullCombo=0 TimerSeconds=30 StyleIcon=1 +MemoryCardIcons=1 [ScreenEvaluationBattle] @@ -1638,6 +1656,7 @@ ShowComboArea=0 ShowFullCombo=0 TimerSeconds=15 StyleIcon=1 +MemoryCardIcons=1 FailedSoundTime=0 PassedSoundTime=0 NumSequenceSounds=0 @@ -1673,6 +1692,7 @@ ShowComboArea=0 ShowFullCombo=0 TimerSeconds=15 StyleIcon=1 +MemoryCardIcons=1 FailedSoundTime=0 PassedSoundTime=0 NumSequenceSounds=0 @@ -1687,18 +1707,21 @@ NextScreen=ScreenRanking ExplanationX=320 ExplanationY=410 StyleIcon=0 +MemoryCardIcons=0 TimerSeconds=0 [ScreenJukeboxMenu] ExplanationX=320 ExplanationY=410 StyleIcon=0 +MemoryCardIcons=0 TimerSeconds=0 [ScreenEditCoursesMenu] ExplanationX=320 ExplanationY=410 StyleIcon=0 +MemoryCardIcons=0 TimerSeconds=0 [ScreenSystemLayer] @@ -1813,15 +1836,33 @@ StopMusicOnNext=0 KeepAliveType=0 // 0 for MAX, 1 for 5th [MenuElements] -HeaderOnCommand=x,320;y,22;addx,640;spring,0.5;addx,-640 +HeaderX=320 +HeaderY=22 +HeaderOnCommand=addx,640;spring,0.5;addx,-640 HeaderOffCommand=bouncebegin,0.5;addx,640; -FooterOnCommand=x,320;y,464 +FooterX=320 +FooterY=464 +FooterOnCommand= FooterOffCommand= -HelpOnCommand=x,320;y,456;zoom,0.5;zoomy,0;linear,0.5;zoomy,0.5 +HelpX=320 +HelpY=456 +HelpOnCommand=zoom,0.5;zoomy,0;linear,0.5;zoomy,0.5 HelpOffCommand=linear,0.5;zoomy,0 -StyleIconOnCommand=x,440;y,26;addx,640;spring,0.5;addx,-640 +StyleIconX=440 +StyleIconY=26 +StyleIconOnCommand=addx,640;spring,0.5;addx,-640 StyleIconOffCommand=bouncebegin,0.5;addx,640; -TimerOnCommand=x,590;y,22;addx,640;spring,0.5;addx,-640 +MemoryCardDisplayP1X=460 +MemoryCardDisplayP1Y=20 +MemoryCardDisplayP1OnCommand=addx,640;spring,0.5;addx,-640 +MemoryCardDisplayP1OffCommand=bouncebegin,0.5;addx,640; +MemoryCardDisplayP2X=480 +MemoryCardDisplayP2Y=20 +MemoryCardDisplayP2OnCommand=addx,640;spring,0.5;addx,-640 +MemoryCardDisplayP2OffCommand=bouncebegin,0.5;addx,640; +TimerX=590 +TimerY=22 +TimerOnCommand=addx,640;spring,0.5;addx,-640 TimerOffCommand=bouncebegin,0.5;addx,640; [MenuTimer] @@ -1877,18 +1918,22 @@ OddLineIn=addx,640;decelerate,0.5;addx,-640; EvenLineOut=stoptweening;accelerate,0.3;addx,-640; OddLineOut=stoptweening;accelerate,0.3;addx,640; StyleIcon=0 +MemoryCardIcons=0 TimerSeconds=0 [ScreenCenterImage] StyleIcon=0 +MemoryCardIcons=0 TimerSeconds=0 [ScreenTestInput] StyleIcon=0 +MemoryCardIcons=0 TimerSeconds=0 [ScreenBookkeeping] StyleIcon=0 +MemoryCardIcons=0 TimerSeconds=0 [HoldGhostArrow] @@ -2200,9 +2245,11 @@ AttackDurationSeconds=10 [ScreenSelectMaster] TimerSeconds=20 StyleIcon=1 +MemoryCardIcons=1 [ScreenInputOptions] StyleIcon=0 +MemoryCardIcons=0 TimerSeconds=0 PrevScreen=ScreenOptionsMenu@ScreenOptionsMaster NextScreen=ScreenOptionsMenu@ScreenOptionsMaster @@ -2217,6 +2264,7 @@ Line6=conf,WheelSpeed [ScreenCoinOptions] StyleIcon=0 +MemoryCardIcons=0 TimerSeconds=0 PrevScreen=ScreenOptionsMenu@ScreenOptionsMaster NextScreen=ScreenOptionsMenu@ScreenOptionsMaster @@ -2229,6 +2277,7 @@ Line4=conf,Premium [ScreenMachineOptions] StyleIcon=0 +MemoryCardIcons=0 TimerSeconds=0 PrevScreen=ScreenOptionsMenu@ScreenOptionsMaster NextScreen=ScreenOptionsMenu@ScreenOptionsMaster @@ -2247,6 +2296,7 @@ Line10=conf,ShowNameEntry [ScreenGraphicOptions] StyleIcon=0 +MemoryCardIcons=0 TimerSeconds=0 PrevScreen=ScreenOptionsMenu@ScreenOptionsMaster NextScreen=ScreenOptionsMenu@ScreenOptionsMaster @@ -2267,6 +2317,7 @@ Line12=conf,ShowBanners [ScreenGameplayOptions] StyleIcon=0 +MemoryCardIcons=0 TimerSeconds=0 PrevScreen=ScreenOptionsMenu@ScreenOptionsMaster NextScreen=ScreenOptionsMenu@ScreenOptionsMaster @@ -2282,6 +2333,7 @@ Line7=conf,UnlockSystem [ScreenBackgroundOptions] StyleIcon=0 +MemoryCardIcons=0 TimerSeconds=0 PrevScreen=ScreenOptionsMenu@ScreenOptionsMaster NextScreen=ScreenOptionsMenu@ScreenOptionsMaster @@ -2296,6 +2348,7 @@ Line6=conf,RandomBackgrounds [ScreenAppearanceOptions] StyleIcon=0 +MemoryCardIcons=0 TimerSeconds=0 @@ -2320,6 +2373,7 @@ Line14=conf,Lyrics [ScreenAutogenOptions] StyleIcon=0 +MemoryCardIcons=0 TimerSeconds=0 PrevScreen=ScreenOptionsMenu@ScreenOptionsMaster NextScreen=ScreenOptionsMenu@ScreenOptionsMaster @@ -2337,6 +2391,7 @@ Rename= CardDirPlayer1= CardDirPlayer2= StyleIcon=0 +MemoryCardIcons=0 TimerSeconds=0 [ScreenUnlock] @@ -2599,6 +2654,7 @@ TextColor5=1.0,1,1.0,1 [ScreenSoundOptions] StyleIcon=0 +MemoryCardIcons=0 TimerSeconds=0 PrevScreen=ScreenOptionsMenu@ScreenOptionsMaster @@ -2667,6 +2723,7 @@ FakeBeatsPerSec=2.5 TimerSeconds=24 MaxRankingNameLength=4 StyleIcon=1 +MemoryCardIcons=1 [EditMenu] Arrows1X=190 @@ -2747,6 +2804,7 @@ Row8Y=360 [ScreenOptionsMenu] StyleIcon=0 +MemoryCardIcons=1 TimerSeconds=0 # "Rows" sets the number of rows; this field is required. @@ -2836,6 +2894,7 @@ TipY=0 [ScreenSelectGame] StyleIcon=0 +MemoryCardIcons=0 TimerSeconds=0 PrevScreen=ScreenTitleMenu NextScreen=ScreenTitleMenu @@ -2859,6 +2918,7 @@ NextScreenBattle=ScreenSongOptions NextScreenRave=ScreenSongOptions TimerSeconds=30 StyleIcon=0 +MemoryCardIcons=0 PrevScreen= NextScreen= @@ -2886,6 +2946,7 @@ PrevScreen=ScreenSelectMusic NextScreen=ScreenStage TimerSeconds=30 StyleIcon=0 +MemoryCardIcons=0 OptionMenuFlags=rows,5 @@ -2911,6 +2972,7 @@ NextScreenRave=ScreenStage Game=Change the current game type with this option. TimerSeconds=30 StyleIcon=0 +MemoryCardIcons=0 PrevScreen=ScreenOptionsMenu@ScreenOptionsMaster NextScreen=ScreenOptionsMenu@ScreenOptionsMaster @@ -2992,6 +3054,7 @@ IconsP2OffCommand=sleep,0.2;bouncebegin,0.5;addx,400 SleepAfterTweenOffSeconds=0.8 TimerSeconds=40 StyleIcon=1 +MemoryCardIcons=1 PrevScreenArcade=ScreenTitleMenu PrevScreenNonstop=ScreenTitleMenu PrevScreenOni=ScreenTitleMenu diff --git a/stepmania/src/GameConstantsAndTypes.cpp b/stepmania/src/GameConstantsAndTypes.cpp index 932ce1c0ce..df158a3807 100644 --- a/stepmania/src/GameConstantsAndTypes.cpp +++ b/stepmania/src/GameConstantsAndTypes.cpp @@ -164,3 +164,16 @@ CString TapNoteScoreToString( TapNoteScore tns ) default: ASSERT(0); return ""; // invalid Difficulty } } + +CString MemoryCardStateToString( MemoryCardState mcs ) +{ + switch( mcs ) + { + case MEMORY_CARD_STATE_READY: return "ready"; + case MEMORY_CARD_STATE_TOO_LATE: return "late"; + case MEMORY_CARD_STATE_WRITE_ERROR: return "error"; + case MEMORY_CARD_STATE_NO_CARD: return "none"; + default: ASSERT(0); return ""; + } +} + diff --git a/stepmania/src/GameConstantsAndTypes.h b/stepmania/src/GameConstantsAndTypes.h index f1587b2423..983109da62 100644 --- a/stepmania/src/GameConstantsAndTypes.h +++ b/stepmania/src/GameConstantsAndTypes.h @@ -195,6 +195,18 @@ enum MemoryCard NUM_MEMORY_CARDS }; +enum MemoryCardState +{ + MEMORY_CARD_STATE_READY, + MEMORY_CARD_STATE_TOO_LATE, + MEMORY_CARD_STATE_WRITE_ERROR, + MEMORY_CARD_STATE_NO_CARD, + NUM_MEMORY_CARD_STATES, + MEMORY_CARD_STATE_INVALID, +}; + +CString MemoryCardStateToString( MemoryCardState mcs ); + // // Ranking stuff diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index 644c7d546d..1026e13f5a 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -35,6 +35,7 @@ #include "RageFile.h" #include "Bookkeeper.h" #include +#include "MemoryCardManager.h" #define DEFAULT_MODIFIERS THEME->GetMetric( "Common","DefaultModifiers" ) @@ -148,6 +149,7 @@ void GameState::Reset() PROFILEMAN->SaveProfile( (PlayerNumber)p ); PROFILEMAN->UnloadProfile( (PlayerNumber)p ); } + MEMCARDMAN->LockCards( false ); LIGHTSMAN->SetLightMode( LIGHTMODE_ATTRACT ); diff --git a/stepmania/src/Makefile.am b/stepmania/src/Makefile.am index cd20b9ff8a..bc9b8f7e36 100644 --- a/stepmania/src/Makefile.am +++ b/stepmania/src/Makefile.am @@ -152,7 +152,7 @@ CourseEntryDisplay.cpp CourseEntryDisplay.h DifficultyDisplay.cpp DifficultyDisp DifficultyMeter.cpp DifficultyMeter.h DifficultyRating.cpp DifficultyRating.h EditCoursesMenu.cpp EditCoursesMenu.h \ EditMenu.cpp EditMenu.h FadingBanner.cpp FadingBanner.h GradeDisplay.cpp GradeDisplay.h GraphDisplay.cpp GraphDisplay.h \ GrooveGraph.cpp GrooveGraph.h GrooveRadar.cpp GrooveRadar.h GroupList.cpp GroupList.h HelpDisplay.cpp HelpDisplay.h \ -JukeboxMenu.cpp JukeboxMenu.h MenuElements.cpp MenuElements.h MenuTimer.cpp MenuTimer.h ModeSwitcher.cpp ModeSwitcher.h \ +JukeboxMenu.cpp JukeboxMenu.h MemoryCardDisplay.cpp MemoryCardDisplay.h MenuElements.cpp MenuElements.h MenuTimer.cpp MenuTimer.h ModeSwitcher.cpp ModeSwitcher.h \ MusicBannerWheel.cpp MusicBannerWheel.h MusicList.cpp MusicList.h MusicSortDisplay.cpp MusicSortDisplay.h \ MusicWheel.cpp MusicWheel.h MusicWheelItem.cpp MusicWheelItem.h OptionIcon.cpp OptionIcon.h OptionIconRow.cpp OptionIconRow.h \ OptionsCursor.cpp OptionsCursor.h PaneDisplay.cpp PaneDisplay.h ScrollBar.cpp ScrollBar.h ScrollingList.cpp ScrollingList.h \ diff --git a/stepmania/src/MemoryCardManager.cpp b/stepmania/src/MemoryCardManager.cpp index 00aa817f58..5f012d9fac 100644 --- a/stepmania/src/MemoryCardManager.cpp +++ b/stepmania/src/MemoryCardManager.cpp @@ -28,14 +28,17 @@ MemoryCardManager::MemoryCardManager() m_bCardsLocked = false; for( int p=0; pGetStorageDevices( m_vStorageDevices ); - ReassignCards(); - m_soundConnect.Load( THEME->GetPathToS("MemoryCardManager connect") ); + m_soundReady.Load( THEME->GetPathToS("MemoryCardManager ready") ); + m_soundError.Load( THEME->GetPathToS("MemoryCardManager error") ); + m_soundTooLate.Load( THEME->GetPathToS("MemoryCardManager too late") ); m_soundDisconnect.Load( THEME->GetPathToS("MemoryCardManager disconnect") ); + + AssignUnassignedCards(); } MemoryCardManager::~MemoryCardManager() @@ -77,47 +80,33 @@ void MemoryCardManager::Update( float fDelta ) } } - if( m_bCardsLocked ) // Cards are locked and play has begun. + // unassign cards that were disconnected + for( int p=0; pMountAndTestWrite( &m_Device[p] ); - } - } - else - { - // clear error flags - for( int p=0; p vDevices = m_vStorageDevices; // copy - for( int p=0; p vUnassignedDevices = m_vStorageDevices; // copy + + // remove cards that are already assigned { - m_Device[p].MakeBlank(); - - unsigned i; - - // search for card dir match - if( !PREFSMAN->m_sMemoryCardDir[p].empty() ) + for( int p=0; p::iterator it = find(vUnassignedDevices.begin(),vUnassignedDevices.end(),m_Device[p]); + ASSERT( it != vUnassignedDevices.end() ) // the assigned card better be connected! + vUnassignedDevices.erase( it ); + } + } + + // try to assign each device to a player + { + for( int p=0; pm_sMemoryCardDir[p].empty() ) { - UsbStorageDevice &usd = vDevices[i]; - if( usd.sOsMountDir.CompareNoCase(PREFSMAN->m_sMemoryCardDir[p]) == 0 ) // match - goto match; + for( i=0; im_sMemoryCardDir[p]) == 0 ) // match + goto match; + } } - } - // search for USB bus match - for( i=0; im_iMemoryCardUsbBus[p] != -1 && - PREFSMAN->m_iMemoryCardUsbBus[p] != usd.iBus ) - continue; // not a match + // search for USB bus match + for( i=0; im_iMemoryCardUsbPort[p] != -1 && - PREFSMAN->m_iMemoryCardUsbPort[p] != usd.iPortOnHub ) - continue; // not a match + if( PREFSMAN->m_iMemoryCardUsbBus[p] != -1 && + PREFSMAN->m_iMemoryCardUsbBus[p] != usd.iBus ) + continue; // not a match - goto match; - } - - LOG->Trace( "Player %d memory card: none", p+1 ); - continue; // no matches + if( PREFSMAN->m_iMemoryCardUsbPort[p] != -1 && + PREFSMAN->m_iMemoryCardUsbPort[p] != usd.iPortOnHub ) + continue; // not a match + + goto match; + } + + LOG->Trace( "Player %d memory card: none", p+1 ); + continue; // no matches match: - m_Device[p] = vDevices[i]; // save a copy - LOG->Trace( "Player %d memory card: '%s'", p+1, m_Device[p].sOsMountDir.c_str() ); - vDevices.erase( vDevices.begin()+i ); // remove the device so we don't match it for another player + m_Device[p] = vUnassignedDevices[i]; // save a copy + LOG->Trace( "Player %d memory card: '%s'", p+1, m_Device[p].sOsMountDir.c_str() ); + vUnassignedDevices.erase( vUnassignedDevices.begin()+i ); // remove the device so we don't match it for another player + m_bTooLate[p] = m_bCardsLocked; + m_bWriteError[p] = false; + if( !m_bCardsLocked ) + if( !m_pDriver->MountAndTestWrite(&m_Device[p]) ) + m_bWriteError[p] = true; + + // play sound + if( m_bWriteError[p] ) + m_soundError.Play(); + else if( m_bTooLate[p] ) + m_soundTooLate.Play(); + else + m_soundReady.Play(); + } } } \ No newline at end of file diff --git a/stepmania/src/MemoryCardManager.h b/stepmania/src/MemoryCardManager.h index 242d24a72e..35746ee682 100644 --- a/stepmania/src/MemoryCardManager.h +++ b/stepmania/src/MemoryCardManager.h @@ -10,6 +10,7 @@ Chris Danford ----------------------------------------------------------------------------- */ +#include "GameConstantsAndTypes.h" // for MemoryCardState #include "PlayerNumber.h" #include "RageSound.h" #include "arch/MemoryCard/MemoryCardDriver.h" @@ -22,16 +23,14 @@ public: void Update( float fDelta ); - enum CardState { ready, too_late, write_error, no_card }; - - CardState GetCardState( PlayerNumber pn ); + MemoryCardState GetCardState( PlayerNumber pn ); CString GetOsMountDir( PlayerNumber pn ); // only valid when ready void LockCards( bool bLock ); // prevent removing or changing of memory cards protected: - void ReassignCards(); // do our best to assign a Device to each player + void AssignUnassignedCards(); // do our best to assign a Device to each player MemoryCardDriver *m_pDriver; @@ -42,7 +41,9 @@ protected: bool m_bWriteError[NUM_PLAYERS]; // couldn't write to the card UsbStorageDevice m_Device[NUM_PLAYERS]; // device in the memory card slot, NULL if none - RageSound m_soundConnect; + RageSound m_soundReady; + RageSound m_soundError; + RageSound m_soundTooLate; RageSound m_soundDisconnect; }; diff --git a/stepmania/src/MenuElements.cpp b/stepmania/src/MenuElements.cpp index c5d87faf17..750b1ec0ff 100644 --- a/stepmania/src/MenuElements.cpp +++ b/stepmania/src/MenuElements.cpp @@ -25,6 +25,7 @@ #define TIMER_SECONDS THEME->GetMetricI(m_sName,"TimerSeconds") #define STYLE_ICON THEME->GetMetricB(m_sName,"StyleIcon") +#define MEMORY_CARD_ICONS THEME->GetMetricB(m_sName,"MemoryCardIcons") MenuElements::MenuElements() @@ -52,6 +53,7 @@ void MenuElements::Load( CString sClassName ) m_autoHeader.Load( THEME->GetPathToG(m_sName+" header") ); m_autoHeader->SetName("Header"); + UtilSetXY( m_autoHeader, "MenuElements" ); UtilOnCommand( m_autoHeader, "MenuElements" ); this->AddChild( m_autoHeader ); @@ -61,14 +63,28 @@ void MenuElements::Load( CString sClassName ) m_sprStyleIcon.SetName( "StyleIcon" ); m_sprStyleIcon.Load( THEME->GetPathToG(sIconFileName) ); m_sprStyleIcon.StopAnimating(); + UtilSetXY( m_sprStyleIcon, "MenuElements" ); UtilOnCommand( m_sprStyleIcon, "MenuElements" ); this->AddChild( &m_sprStyleIcon ); } + if( MEMORY_CARD_ICONS ) + { + for( int p=0; pAddChild( &m_MemoryCardDisplay[p] ); + } + } + m_bTimerEnabled = (TIMER_SECONDS != -1); if( m_bTimerEnabled ) { m_MenuTimer->SetName( "Timer" ); + UtilSetXY( m_MenuTimer, "MenuElements" ); UtilOnCommand( m_MenuTimer, "MenuElements" ); if( TIMER_SECONDS > 0 && PREFSMAN->m_bMenuTimer && !GAMESTATE->m_bEditing ) m_MenuTimer->SetSeconds( TIMER_SECONDS ); @@ -79,11 +95,13 @@ void MenuElements::Load( CString sClassName ) m_autoFooter.Load( THEME->GetPathToG(m_sName+" footer") ); m_autoFooter->SetName("Footer"); + UtilSetXY( m_autoFooter, "MenuElements" ); UtilOnCommand( m_autoFooter, "MenuElements" ); this->AddChild( m_autoFooter ); m_textHelp->SetName( "HelpDisplay", "Help" ); m_textHelp->Load(); + UtilSetXY( m_textHelp, "MenuElements" ); UtilOnCommand( m_textHelp, "MenuElements" ); CStringArray asHelpTips; split( THEME->GetMetric(m_sName,"HelpText"), "\n", asHelpTips ); @@ -122,6 +140,8 @@ void MenuElements::StartTransitioning( ScreenMessage smSendWhenDone ) UtilOffCommand( m_autoHeader, "MenuElements" ); UtilOffCommand( m_sprStyleIcon, "MenuElements" ); + for( int p=0; pDraw(); m_sprStyleIcon.Draw(); + for( int p=0; pDraw(); m_autoFooter->Draw(); diff --git a/stepmania/src/MenuElements.h b/stepmania/src/MenuElements.h index fffb2a12c6..dbbad62062 100644 --- a/stepmania/src/MenuElements.h +++ b/stepmania/src/MenuElements.h @@ -18,6 +18,7 @@ #include "BGAnimation.h" #include "ActorUtil.h" #include "RageSound.h" +#include "MemoryCardDisplay.h" class MenuTimer; class HelpDisplay; @@ -47,6 +48,7 @@ public: // let owner tinker with these objects AutoActor m_autoHeader; Sprite m_sprStyleIcon; + MemoryCardDisplay m_MemoryCardDisplay[NUM_PLAYERS]; MenuTimer *m_MenuTimer; AutoActor m_autoFooter; HelpDisplay *m_textHelp; diff --git a/stepmania/src/ModeChoice.cpp b/stepmania/src/ModeChoice.cpp index 8dd9b4440b..3dc8e73ada 100644 --- a/stepmania/src/ModeChoice.cpp +++ b/stepmania/src/ModeChoice.cpp @@ -12,6 +12,7 @@ #include "SongManager.h" #include "PrefsManager.h" #include "arch/ArchHooks/ArchHooks.h" +#include "MemoryCardManager.h" void ModeChoice::Init() { @@ -288,6 +289,7 @@ void ModeChoice::Apply( PlayerNumber pn ) const if( m_style != STYLE_INVALID ) { PROFILEMAN->LoadFirstAvailableProfile( pn ); + MEMCARDMAN->LockCards( true ); } } diff --git a/stepmania/src/StepMania.dsp b/stepmania/src/StepMania.dsp index 68f370f45e..9683e4b16e 100644 --- a/stepmania/src/StepMania.dsp +++ b/stepmania/src/StepMania.dsp @@ -1,5 +1,5 @@ # Microsoft Developer Studio Project File - Name="StepMania" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# Microsoft Developer Studio Generated Build File, Format Version 60000 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 @@ -65,7 +65,7 @@ IntDir=.\../Debug6 TargetDir=\stepmania\stepmania\Program TargetName=StepMania-debug SOURCE="$(InputPath)" -PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ +PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi # End Special Build Tool @@ -82,24 +82,28 @@ PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" -XBCP=xbecopy.exe -# ADD BASE XBCP /NOLOGO -# ADD XBCP /NOLOGO -XBE=imagebld.exe -# ADD BASE XBE /nologo /stack:0x10000 /debug -# ADD XBE /nologo /stack:0x10000 /debug /out:"../default.xbe" -LINK32=link.exe -# ADD BASE LINK32 xapilibd.lib d3d8d.lib d3dx8d.lib xgraphicsd.lib dsoundd.lib dmusicd.lib xnetd.lib xboxkrnl.lib /nologo /incremental:no /debug /machine:I386 /subsystem:xbox /fixed:no /TMP -# ADD LINK32 xapilibd.lib d3d8d.lib d3dx8d.lib xgraphicsd.lib dsoundd.lib dmusicd.lib xnetd.lib xboxkrnl.lib /nologo /incremental:no /debug /machine:I386 /nodefaultlib:"libcd" /nodefaultlib:"libcmt" /out:"../StepManiaXbox-debug.exe" /subsystem:xbox /fixed:no /TMP -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo CPP=cl.exe # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_XBOX" /D "_DEBUG" /YX /FD /G6 /Ztmp /c # ADD CPP /nologo /W3 /Gm /GX /Zi /Od /I "." /I "SDL-1.2.5\include" /I "SDL_image-1.2" /I "plib-1.6.0" /I "SDL_sound-1.0.0" /D "WIN32" /D "_XBOX" /D "_DEBUG" /D "OGG_ONLY" /YX /FD /G6 /Ztmp /c +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 xapilibd.lib d3d8d.lib d3dx8d.lib xgraphicsd.lib dsoundd.lib dmusicd.lib xnetd.lib xboxkrnl.lib /nologo /incremental:no /debug /machine:I386 /subsystem:xbox /fixed:no /TMP +# ADD LINK32 xapilibd.lib d3d8d.lib d3dx8d.lib xgraphicsd.lib dsoundd.lib dmusicd.lib xnetd.lib xboxkrnl.lib /nologo /incremental:no /debug /machine:I386 /nodefaultlib:"libcd" /nodefaultlib:"libcmt" /out:"../StepManiaXbox-debug.exe" /subsystem:xbox /fixed:no /TMP +XBE=imagebld.exe +# ADD BASE XBE /nologo /stack:0x10000 /debug +# ADD XBE /nologo /stack:0x10000 /debug /out:"../default.xbe" +XBCP=xbecopy.exe +# ADD BASE XBCP /NOLOGO +# ADD XBCP /NOLOGO # Begin Special Build Tool -PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp \ - /Fo$(IntDir)\ +IntDir=.\Debug +TargetDir=\stepmania\stepmania +TargetName=default +SOURCE="$(InputPath)" +PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp \ + /Fo$(IntDir)\ PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi ia32.vdi # End Special Build Tool @@ -139,7 +143,7 @@ IntDir=.\../Release6 TargetDir=\stepmania\stepmania\Program TargetName=StepMania SOURCE="$(InputPath)" -PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ +PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi # End Special Build Tool @@ -157,27 +161,31 @@ PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania # PROP Intermediate_Dir "StepMania___Xbox_Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" -XBCP=xbecopy.exe -# ADD BASE XBCP /NOLOGO -# ADD XBCP /NOLOGO -XBE=imagebld.exe -# ADD BASE XBE /nologo /stack:0x10000 /debug -# ADD XBE /nologo /testid:"123456" /stack:0x10000 /debug /out:"../default.xbe" +CPP=cl.exe +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /I "." /I "SDL-1.2.5\include" /I "SDL_image-1.2" /I "plib-1.6.0" /D "WIN32" /D "_XBOX" /D "_DEBUG" /Fr /YX"global.h" /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /I "." /I "SDL-1.2.5\include" /I "SDL_image-1.2" /I "plib-1.6.0" /I "SDL_sound-1.0.0" /D "WIN32" /D "_XBOX" /D "NDEBUG" /YX"global.h" /FD /c +# SUBTRACT CPP /Fr +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 $(intdir)\verstub.obj xapilibd.lib d3d8d.lib d3dx8d.lib xgraphicsd.lib dsoundd.lib dmusicd.lib xnetd.lib xboxkrnl.lib /nologo /pdb:"../debug6/StepMania-debug.pdb" /map /debug /machine:IX86 /nodefaultlib:"libcmtd.lib" /out:"../StepMania-debug.exe" # SUBTRACT BASE LINK32 /verbose /profile /pdb:none /incremental:no /nodefaultlib # ADD LINK32 $(intdir)\verstub.obj xapilib.lib d3d8.lib d3dx8.lib xgraphics.lib dsound.lib dmusic.lib xnet.lib xboxkrnl.lib libcmt.lib /nologo /incremental:no /pdb:"../release6xbox/StepMania.pdb" /machine:I386 /nodefaultlib:"libc" /nodefaultlib:"libcmtd" /out:"../StepManiaXbox.exe" /subsystem:xbox /fixed:no /TMP /OPT:REF # SUBTRACT LINK32 /pdb:none /map /debug -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -CPP=cl.exe -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /I "." /I "SDL-1.2.5\include" /I "SDL_image-1.2" /I "plib-1.6.0" /D "WIN32" /D "_XBOX" /D "_DEBUG" /Fr /YX"global.h" /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "." /I "SDL-1.2.5\include" /I "SDL_image-1.2" /I "plib-1.6.0" /I "SDL_sound-1.0.0" /D "WIN32" /D "_XBOX" /D "NDEBUG" /YX"global.h" /FD /c -# SUBTRACT CPP /Fr +XBE=imagebld.exe +# ADD BASE XBE /nologo /stack:0x10000 /debug +# ADD XBE /nologo /testid:"123456" /stack:0x10000 /debug /out:"../default.xbe" +XBCP=xbecopy.exe +# ADD BASE XBCP /NOLOGO +# ADD XBCP /NOLOGO # Begin Special Build Tool -PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp \ - /Fo$(IntDir)\ +IntDir=.\StepMania___Xbox_Release +TargetDir=\stepmania\stepmania +TargetName=default +SOURCE="$(InputPath)" +PreLink_Cmds=disasm\verinc cl /Zl /nologo /c verstub.cpp \ + /Fo$(IntDir)\ PostBuild_Cmds=disasm\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi ia32.vdi # End Special Build Tool @@ -4018,6 +4026,25 @@ SOURCE=.\JukeboxMenu.h # End Source File # Begin Source File +SOURCE=.\MemoryCardDisplay.cpp + +!IF "$(CFG)" == "StepMania - Win32 Debug" + +!ELSEIF "$(CFG)" == "StepMania - Xbox Debug" + +!ELSEIF "$(CFG)" == "StepMania - Win32 Release" + +!ELSEIF "$(CFG)" == "StepMania - Xbox Release" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\MemoryCardDisplay.h +# End Source File +# Begin Source File + SOURCE=.\MenuElements.cpp !IF "$(CFG)" == "StepMania - Win32 Debug" diff --git a/stepmania/src/StepMania.vcproj b/stepmania/src/StepMania.vcproj index ff2f2154bb..0bf3e0f51e 100644 --- a/stepmania/src/StepMania.vcproj +++ b/stepmania/src/StepMania.vcproj @@ -1231,6 +1231,12 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)"\ + + + + diff --git a/stepmania/src/arch/MemoryCard/MemoryCardDriver.h b/stepmania/src/arch/MemoryCard/MemoryCardDriver.h index 2560a13301..b85a575907 100644 --- a/stepmania/src/arch/MemoryCard/MemoryCardDriver.h +++ b/stepmania/src/arch/MemoryCard/MemoryCardDriver.h @@ -12,6 +12,8 @@ struct UsbStorageDevice iDeviceOnBus = -1; iPortOnHub = -1; iUsbStorageIndex = -1; + sSerial = ""; + sOsMountDir = ""; }; int iBus; int iDeviceOnBus; diff --git a/stepmania/src/arch/MemoryCard/MemoryCardDriver_Windows.cpp b/stepmania/src/arch/MemoryCard/MemoryCardDriver_Windows.cpp index fe7153cadd..6fa3a396a0 100644 --- a/stepmania/src/arch/MemoryCard/MemoryCardDriver_Windows.cpp +++ b/stepmania/src/arch/MemoryCard/MemoryCardDriver_Windows.cpp @@ -51,7 +51,7 @@ void MemoryCardDriver_Windows::GetStorageDevices( vector& vDev bool MemoryCardDriver_Windows::MountAndTestWrite( UsbStorageDevice* pDevice ) { - if( !pDevice->sOsMountDir.empty() ) + if( pDevice->sOsMountDir.empty() ) return false; // TODO: Use RageFileDirect here to detect ready state? @@ -74,12 +74,11 @@ bool MemoryCardDriver_Windows::MountAndTestWrite( UsbStorageDevice* pDevice ) // Try to write a file. // TODO: Can we use RageFile for this? - CString sFile = pDevice->sOsMountDir; - sFile += "temp"; - int fd = open( sFile, _O_WRONLY|_O_CREAT|_O_TRUNC ); - if( fd == -1 ) + CString sFile = pDevice->sOsMountDir + "temp"; + FILE* fp = fopen( sFile, "w" ); + if( fp == NULL ) return false; - close( fd ); + fclose( fp ); remove( sFile ); return true;