diff --git a/stepmania/src/Background.h b/stepmania/src/Background.h index 9789d5cf67..f00146d367 100644 --- a/stepmania/src/Background.h +++ b/stepmania/src/Background.h @@ -38,6 +38,8 @@ public: virtual void TurnDangerOn() { m_bShowDanger = true; }; virtual void TurnDangerOff() { m_bShowDanger = false; }; + virtual bool IsDangerOn() { return m_bShowDanger; }; + protected: Sprite m_sprVisualizationOverlay; Sprite m_sprSongBackground; diff --git a/stepmania/src/BitmapText.cpp b/stepmania/src/BitmapText.cpp index 726ad71bf6..4488bb892d 100644 --- a/stepmania/src/BitmapText.cpp +++ b/stepmania/src/BitmapText.cpp @@ -105,7 +105,7 @@ bool BitmapText::Load( CString sFontFilePath ) split( sWidthsValue, ",", arrayCharWidths ); if( arrayCharWidths.GetSize() != Sprite::GetNumStates() ) - RageError( ssprintf("The number of widths specified in '%s' do not match the number of frames in the texture.", m_sFontFilePath) ); + RageError( ssprintf("The number of widths specified in '%s' (%d) do not match the number of frames in the texture (%u).", m_sFontFilePath, arrayCharWidths.GetSize(), Sprite::GetNumStates()) ); for( int i=0; iGetTextureCoordRect( i ); float fPixelsToChopOff = m_fFrameNoToWidth[i] - GetUnzoomedWidth(); - float fTexCoordsToChopOff = fPixelsToChopOff / m_pTexture->GetTextureWidth(); + float fTexCoordsToChopOff = fPixelsToChopOff / m_pTexture->GetSourceWidth(); pFrect->left -= fTexCoordsToChopOff/2; pFrect->right += fTexCoordsToChopOff/2; @@ -245,9 +245,9 @@ void BitmapText::RenderPrimitives() float fY; switch( m_VertAlign ) { - case align_top: fY = 0; break; - case align_middle: fY = (m_sTextLines.GetSize()-1) * fHeight / 2; break; - case align_bottom: fY = (m_sTextLines.GetSize()-1) * fHeight; break; + case align_top: fY = -(m_sTextLines.GetSize()) * fHeight / 2; break; break; + case align_middle: fY = 0; break; + case align_bottom: fY = (m_sTextLines.GetSize()) * fHeight / 2; break; default: ASSERT( true ); } @@ -293,15 +293,15 @@ void BitmapText::RenderPrimitives() // set vertex positions - v[iVNum++].p = D3DXVECTOR3( fX, fHeight/2, 0 ); // bottom left - v[iVNum++].p = D3DXVECTOR3( fX, -fHeight/2, 0 ); // top left + v[iVNum++].p = D3DXVECTOR3( fX, fY+fHeight/2, 0 ); // bottom left + v[iVNum++].p = D3DXVECTOR3( fX, fY-fHeight/2, 0 ); // top left fX += fCharWidth; float fExtraPixels = fPercentExtra * GetUnzoomedWidth(); - v[iVNum++].p = D3DXVECTOR3( fX+fExtraPixels, fHeight/2, 0 ); // bottom right - v[iVNum++].p = D3DXVECTOR3( fX+fExtraPixels, -fHeight/2, 0 ); // top right + v[iVNum++].p = D3DXVECTOR3( fX+fExtraPixels, fY+fHeight/2, 0 ); // bottom right + v[iVNum++].p = D3DXVECTOR3( fX+fExtraPixels, fY-fHeight/2, 0 ); // top right // set texture coordinates diff --git a/stepmania/src/MusicWheel.cpp b/stepmania/src/MusicWheel.cpp index d5423bfee5..7b9fe1592c 100644 --- a/stepmania/src/MusicWheel.cpp +++ b/stepmania/src/MusicWheel.cpp @@ -555,6 +555,7 @@ void MusicWheel::NextSort() { case STATE_IDLE: case STATE_SWITCHING_MUSIC: + case STATE_FLYING_ON_AFTER_NEXT_SORT: break; // fall through default: return; // don't continue diff --git a/stepmania/src/RageBitmapTexture.cpp b/stepmania/src/RageBitmapTexture.cpp index 1a6f94969e..98714eb639 100644 --- a/stepmania/src/RageBitmapTexture.cpp +++ b/stepmania/src/RageBitmapTexture.cpp @@ -67,6 +67,10 @@ void RageBitmapTexture::Create() { fmtTexture = D3DFMT_A4R4G4B4; } + else if( GAMEINFO->m_GameOptions.m_iDisplayColor == 16 ) + { + fmtTexture = D3DFMT_A4R4G4B4; + } else { switch( GAMEINFO->m_GameOptions.m_iTextureColor ) diff --git a/stepmania/src/RageTextureManager.cpp b/stepmania/src/RageTextureManager.cpp index 6a84028064..25938d4943 100644 --- a/stepmania/src/RageTextureManager.cpp +++ b/stepmania/src/RageTextureManager.cpp @@ -69,10 +69,8 @@ LPRageTexture RageTextureManager::LoadTexture( CString sTexturePath ) // RageLog( ssprintf("Found that '%s' is already loaded. Using the loaded copy.", sTexturePath) ); pTexture->m_iRefCount++; } - else + else // the texture is not already loaded { - RageLog( ssprintf("RageTextureManager: allocating space for '%s'.", sTexturePath) ); - CString sDrive, sDir, sFName, sExt; splitpath( FALSE, sTexturePath, sDrive, sDir, sFName, sExt ); @@ -81,6 +79,9 @@ LPRageTexture RageTextureManager::LoadTexture( CString sTexturePath ) else pTexture = (LPRageTexture) new RageBitmapTexture( m_pScreen, sTexturePath ); + + RageLog( "RageTextureManager: allocating space for '%s' (%ux%u).", sTexturePath, pTexture->GetTextureWidth(), pTexture->GetTextureHeight() ); + m_mapPathToTexture.SetAt( sTexturePath, pTexture ); } diff --git a/stepmania/src/Song.cpp b/stepmania/src/Song.cpp index c4d904dc63..52b43dff6e 100644 --- a/stepmania/src/Song.cpp +++ b/stepmania/src/Song.cpp @@ -11,8 +11,6 @@ #include "Util.h" -#include "IniFile.h" -#include "BmsFile.h" #include "Steps.h" #include "RageUtil.h" @@ -228,8 +226,8 @@ bool Song::LoadSongInfoFromBMSDir( CString sDir ) // Load the Song info from the first BMS file. Silly BMS duplicates the song info in every - // file, so this method assumes that the song info is identical for every BMS file in - // the directory. + // file. So, we read the song data from only the first BMS file and assume that the info + // is identical for every BMS file in the directory. CString sBMSFilePath = m_sSongDir + arrayBMSFileNames[0]; // load the Steps from the rest of the BMS files @@ -241,53 +239,93 @@ bool Song::LoadSongInfoFromBMSDir( CString sDir ) } - - BmsFile bms( sBMSFilePath ); - bms.ReadFile(); - - CMapStringToString &mapValues = bms.mapValues; - - POSITION pos = mapValues.GetStartPosition(); - while( pos != NULL ) + CStdioFile file; + if( !file.Open( sBMSFilePath, CFile::modeRead|CFile::shareDenyNone ) ) { - CString value_name; - CString data_string; - CStringArray data_array; - mapValues.GetNextAssoc( pos, value_name, data_string ); - split(data_string, ":", data_array); + RageError( ssprintf("Failed to open %s.", sBMSFilePath) ); + return false; + } + + CString line; + while( file.ReadString(line) ) // foreach line + { + CString value_name; // fill these in + CString value_data; + + // BMS value names can be separated by a space or a colon. + int iIndexOfFirstColon = line.Find( ":" ); + int iIndexOfFirstSpace = line.Find( " " ); + + if( iIndexOfFirstColon == -1 ) + iIndexOfFirstColon = 10000; + if( iIndexOfFirstSpace == -1 ) + iIndexOfFirstSpace = 10000; + + int iIndexOfSeparator = min( iIndexOfFirstSpace, iIndexOfFirstColon ); + + if( iIndexOfSeparator != 10000 ) + { + value_name = line.Mid( 0, iIndexOfSeparator ); + value_data = line; // the rest + value_data.Delete(0,iIndexOfSeparator+1); + } + else // no separator + { + value_name = line; + } + + + value_name.MakeLower(); + // handle the data - if( value_name == "#GENRE" ) - m_sCreator = data_array[0]; - else if( value_name == "#TITLE" ) { - m_sTitle = data_array[0]; - // strip steps type out of description leaving only song title (looks like 'Music ') - int iPosBracket = m_sTitle.Find( " <" ); - if( iPosBracket != -1 ) - m_sTitle = m_sTitle.Left( iPosBracket ); + if( -1 != value_name.Find("#genre") ) + { + m_sCreator = value_data; } - else if( value_name == "#ARTIST" ) - m_sArtist = data_array[0]; - else if( value_name == "#BPM" ) { + else if( -1 != value_name.Find("#title") ) + { + m_sTitle = value_data; + // strip steps type out of description leaving only song title (looks like 'B4U ') + m_sTitle.Replace( "(ANOTHER)", "" ); + m_sTitle.Replace( "(BASIC)", "" ); + m_sTitle.Replace( "(MANIAC)", "" ); + m_sTitle.Replace( "", "" ); + m_sTitle.Replace( "", "" ); + m_sTitle.Replace( "", "" ); + + } + else if( -1 != value_name.Find("#artist") ) + { + m_sArtist = value_data; + } + else if( -1 != value_name.Find("#bpm") ) + { BPMSegment new_seg; new_seg.m_fStartBeat = 0; - new_seg.m_fBPM = (float)atof( data_array[0] ); + new_seg.m_fBPM = (float)atof( value_data ); // add, then sort m_BPMSegments.Add( new_seg ); SortBPMSegmentsArray( m_BPMSegments ); RageLog( "Inserting new BPM change at beat %f, BPM %f", new_seg.m_fStartBeat, new_seg.m_fBPM ); } - else if( value_name == "#BackBMP" || value_name == "#backBMP") - m_sBackgroundPath = m_sSongDir + data_array[0]; - else if( value_name == "#WAV99" ) - m_sMusicPath = m_sSongDir + data_array[0]; - else if( value_name.GetLength() == 6 ) // this is probably step or offset data. Looks like "#00705" + else if( -1 != value_name.Find("#backbmp") ) + { + m_sBackgroundPath = m_sSongDir + value_data; + } + else if( -1 != value_name.Find("#wav") ) + { + m_sMusicPath = m_sSongDir + value_data; + } + else if( value_name.Left(1) == "#" + && IsAnInt( value_name.Mid(1,3) ) + && IsAnInt( value_name.Mid(4,2) ) ) // this is step or offset data. Looks like "#00705" { int iMeasureNo = atoi( value_name.Mid(1,3) ); int iTrackNum = atoi( value_name.Mid(4,2) ); - CString sNoteData = data_array[0]; + CString sNoteData = value_data; CArray arrayNotes; for( int i=0; i& arra for( int i=0; im_StepsMode; - - switch( gm ) // different logic for different game modes + + if( gm == pCurrentSteps->m_GameMode // if the current GameModes matches the Steps's GameMode + || (gm == MODE_VERSUS && pCurrentSteps->m_GameMode == MODE_SINGLE) ) { - case MODE_SINGLE: - if( sm == Steps::SMsingle4 ) - arrayAddTo.Add( pCurrentSteps ); - break; - case MODE_SOLO: - if( sm == Steps::SMsingle6 ) - arrayAddTo.Add( pCurrentSteps ); - break; - case MODE_VERSUS: - if( sm == Steps::SMsingle4 ) - arrayAddTo.Add( pCurrentSteps ); - break; - case MODE_COUPLE: - if( sm == Steps::SMcouple || sm == Steps::SMbattle ) - arrayAddTo.Add( pCurrentSteps ); - break; - case MODE_DOUBLE: - if( sm == Steps::SMdouble4 ) - arrayAddTo.Add( pCurrentSteps ); - break; + arrayAddTo.Add( pCurrentSteps ); } } diff --git a/stepmania/src/StepMania.RC b/stepmania/src/StepMania.RC index 7727767eaa..d859c63b19 100644 --- a/stepmania/src/StepMania.RC +++ b/stepmania/src/StepMania.RC @@ -114,6 +114,13 @@ END #endif // !_MAC + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +SPLASH BITMAP DISCARDABLE "splash.bmp" #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/stepmania/src/StepMania.cpp b/stepmania/src/StepMania.cpp index bda2c9bc5e..b1283d44f6 100644 --- a/stepmania/src/StepMania.cpp +++ b/stepmania/src/StepMania.cpp @@ -298,30 +298,50 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) //----------------------------------------------------------------------------- HRESULT CreateObjects( HWND hWnd ) { + //////////////////////////////// + // Draw a splash bitmap so the user isn't looking at a black screen + //////////////////////////////// + HBITMAP hSplashBitmap = (HBITMAP)LoadImage( + GetModuleHandle( NULL ), + TEXT("SPLASH"), + IMAGE_BITMAP, + 0, 0, LR_CREATEDIBSECTION ); + BITMAP bmp; + RECT rc; + GetClientRect( hWnd, &rc ); + // Display the splash bitmap in the window + HDC hDCWindow = GetDC( hWnd ); + HDC hDCImage = CreateCompatibleDC( NULL ); + SelectObject( hDCImage, hSplashBitmap ); + GetObject( hSplashBitmap, sizeof(bmp), &bmp ); + StretchBlt( hDCWindow, 0, 0, rc.right, rc.bottom, + hDCImage, 0, 0, + bmp.bmWidth, bmp.bmHeight, SRCCOPY ); + DeleteDC( hDCImage ); + ReleaseDC( hWnd, hDCWindow ); + + // Delete the bitmap + DeleteObject( hSplashBitmap ); + + + + ///////////////////////////////// + // Create game objects + ///////////////////////////////// srand( (unsigned)time(NULL) ); // seed number generator - RageLogStart(); - - SCREEN = new RageScreen( hWnd, true, SCREEN_WIDTH, SCREEN_HEIGHT, 16 ); - TM = new RageTextureManager( SCREEN ); - THEME = new ThemeManager; - WM = new WindowManager; - - // throw something up on the screen while the game resources are loading - WM->SetNewWindow( new WindowLoading ); - Render(); - ShowFrame(); - - // this stuff takes a long time... + SOUND = new RageSound( hWnd ); MUSIC = new RageSoundStream; INPUT = new RageInput( hWnd ); GAMEINFO= new GameInfo; + SCREEN = new RageScreen( hWnd ); BringWindowToTop( hWnd ); SetForegroundWindow( hWnd ); + // switch the screen resolution according to user's prefs GameOptions &go = GAMEINFO->m_GameOptions; SwitchDisplayMode( go.m_bWindowed, @@ -330,7 +350,12 @@ HRESULT CreateObjects( HWND hWnd ) go.m_iDisplayColor ); + TM = new RageTextureManager( SCREEN ); + THEME = new ThemeManager; + WM = new WindowManager; + + //WM->SetNewWindow( new WindowLoading ); //WM->SetNewWindow( new WindowSandbox ); //WM->SetNewWindow( new WindowMenuResults ); //WM->SetNewWindow( new WindowPlayerOptions ); @@ -538,17 +563,53 @@ BOOL SwitchDisplayMode( BOOL bWindowed, DWORD dwWidth, DWORD dwHeight, DWORD dwB { InvalidateObjects(); - BOOL bResult = SCREEN->SwitchDisplayMode( bWindowed, dwWidth, dwHeight, dwBPP ); - + // If the requested resolution doesn't work, keep switching until we find one that does. + + if( !SCREEN->SwitchDisplayMode( bWindowed, dwWidth, dwHeight, dwBPP ) ) + { + // We failed. Try full screen with same params. + bWindowed = false; + if( !SCREEN->SwitchDisplayMode( bWindowed, dwWidth, dwHeight, dwBPP ) ) + { + // Failed again. Try 16 BPP + dwBPP = 16; + if( !SCREEN->SwitchDisplayMode( bWindowed, dwWidth, dwHeight, dwBPP ) ) + { + // Failed again. Try 640x480 + dwWidth = 640; + dwHeight = 480; + if( !SCREEN->SwitchDisplayMode( bWindowed, dwWidth, dwHeight, dwBPP ) ) + { + // Failed again. Try 640x480 + dwWidth = 320; + dwHeight = 240; + if( !SCREEN->SwitchDisplayMode( bWindowed, dwWidth, dwHeight, dwBPP ) ) + { + RageError( "Tried every possible display mode, and couldn't change to any of them." ); + return false; + } + } + } + } + } + + RestoreObjects(); if( GAMEINFO ) { GAMEINFO->m_GameOptions.m_bWindowed = bWindowed; + GAMEINFO->m_GameOptions.m_iDisplayColor = dwBPP; + GAMEINFO->m_GameOptions.m_iResolution = dwWidth; GAMEINFO->SaveConfigToDisk(); } - return bResult; + if( WM ) + { + WM->SetSystemMessage( ssprintf("%s - %ux%u - %u bits", bWindowed ? "Windowed" : "FullScreen", dwWidth, dwHeight, dwBPP) ); + } + + return true; } diff --git a/stepmania/src/StepMania.dsp b/stepmania/src/StepMania.dsp index 93e1e85c83..a04f7755ef 100644 --- a/stepmania/src/StepMania.dsp +++ b/stepmania/src/StepMania.dsp @@ -743,5 +743,9 @@ SOURCE=.\TipDisplay.cpp SOURCE=.\TipDisplay.h # End Source File # End Group +# Begin Source File + +SOURCE=.\splash.bmp +# End Source File # End Target # End Project diff --git a/stepmania/src/TransitionStarWipe.cpp b/stepmania/src/TransitionStarWipe.cpp index 39c7c57b18..578abba233 100644 --- a/stepmania/src/TransitionStarWipe.cpp +++ b/stepmania/src/TransitionStarWipe.cpp @@ -85,7 +85,7 @@ void TransitionStarWipe::RenderPrimitives() int x_rect_leading_edge = x + ( bIsAnEvenRow ? - m_iStarWidth/2 : m_iStarWidth/2 ); int x_rect_trailing_edge = ( bIsAnEvenRow ? 0 : SCREEN_WIDTH ); int y_top = y - m_iStarHeight/2; - int y_bot = y + m_iStarHeight/2; + int y_bot = y + m_iStarHeight/2+1; m_rect.StretchTo( CRect(x_rect_leading_edge, y_top, x_rect_trailing_edge, y_bot) ); m_rect.SetDiffuseColor( D3DCOLOR_ARGB(255,0,0,0) ); m_rect.Draw();