diff --git a/stepmania/src/Game.h b/stepmania/src/Game.h index 9c7ce8c4e0..ee0c8ec547 100644 --- a/stepmania/src/Game.h +++ b/stepmania/src/Game.h @@ -22,7 +22,8 @@ enum Game GAME_IIDX, // Beatmania IIDX GAME_MANIAX, // DanceManiax GAME_TECHNO, // TechnoMotion - GAME_PNM, // pop n music + GAME_PNM, // pop n music + GAME_LIGHTS, // cabinet lights (not really a game) NUM_GAMES, // leave this at the end GAME_INVALID, }; diff --git a/stepmania/src/GameConstantsAndTypes.h b/stepmania/src/GameConstantsAndTypes.h index 87a3ec29b8..a80e6014da 100644 --- a/stepmania/src/GameConstantsAndTypes.h +++ b/stepmania/src/GameConstantsAndTypes.h @@ -142,6 +142,7 @@ enum StepsType STEPS_TYPE_TECHNO_SINGLE8, STEPS_TYPE_PNM_FIVE, STEPS_TYPE_PNM_NINE, + STEPS_TYPE_LIGHTS_CABINET, NUM_STEPS_TYPES, // leave this at the end STEPS_TYPE_INVALID, }; diff --git a/stepmania/src/GameInput.h b/stepmania/src/GameInput.h index 57e3d8fbc2..5fbb52715e 100644 --- a/stepmania/src/GameInput.h +++ b/stepmania/src/GameInput.h @@ -230,6 +230,26 @@ enum // PnM Buttons NUM_PNM_BUTTONS, // leave this at the end }; +enum // LightsButtons +{ + LIGHTS_BUTTON_MARQUEE_UP_LEFT, + LIGHTS_BUTTON_MARQUEE_UP_RIGHT, + LIGHTS_BUTTON_MARQUEE_LR_LEFT, + LIGHTS_BUTTON_MARQUEE_LR_RIGHT, + LIGHTS_BUTTON_BUTTONS_LEFT, + LIGHTS_BUTTON_BUTTONS_RIGHT, + LIGHTS_BUTTON_BASS_LEFT, + LIGHTS_BUTTON_BASS_RIGHT, + LIGHTS_BUTTON_START, + LIGHTS_BUTTON_BACK, + LIGHTS_BUTTON_MENULEFT, + LIGHTS_BUTTON_MENURIGHT, + LIGHTS_BUTTON_MENUUP, + LIGHTS_BUTTON_MENUDOWN, + LIGHTS_BUTTON_COIN, + LIGHTS_BUTTON_OPERATOR, + NUM_LIGHTS_BUTTONS, // leave this at the end +}; struct GameInput diff --git a/stepmania/src/GameManager.cpp b/stepmania/src/GameManager.cpp index e4ca3199cc..071c55377f 100644 --- a/stepmania/src/GameManager.cpp +++ b/stepmania/src/GameManager.cpp @@ -21,6 +21,7 @@ #include "NoteSkinManager.h" #include "SDL_keysym.h" // for SDLKeys #include "ThemeManager.h" +#include "LightsManager.h" // for NUM_CABINET_LIGHTS GameManager* GAMEMAN = NULL; // global and accessable from anywhere in our program @@ -65,8 +66,9 @@ struct { { "maniax-single", 4 }, { "maniax-double", 8 }, { "techno-single8", 8 }, - { "pnm-five", 5 }, - { "pnm-nine", 9 }, + { "pnm-five", 5 }, + { "pnm-nine", 9 }, + { "lights-cabinet", NUM_CABINET_LIGHTS }, }; // @@ -1031,6 +1033,106 @@ GameDef g_GameDefs[NUM_GAMES] = }, } }, + { // GAME_LIGHTS + "lights", // m_szName + "Lights", // m_szDescription + 1, // m_iNumControllers + NUM_LIGHTS_BUTTONS, // m_iButtonsPerController + { // m_szButtonNames + "MarqueeUpLeft", + "MarqueeUpRight", + "MarqueeLrLeft", + "MarqueeLrRight", + "ButtonsLeft", + "ButtonsRight", + "BassLeft", + "BassRight", + "Start", + "Back", + "MenuLeft", + "MenuRight", + "MenuUp", + "MenuDown", + "Insert Coin", + "Operator", + }, + { // m_szSecondaryFunction + "(MenuLeft)", + "(MenuRight)", + "(MenuUp)", + "(MenuDown)", + "", + "", + "", + "", + "", + "", + "(dedicated)", + "(dedicated)", + "(dedicated)", + "(dedicated)", + "", + "", + }, + { // m_DedicatedMenuButton + LIGHTS_BUTTON_MENULEFT, // MENU_BUTTON_LEFT + LIGHTS_BUTTON_MENURIGHT, // MENU_BUTTON_RIGHT + LIGHTS_BUTTON_MENUUP, // MENU_BUTTON_UP + LIGHTS_BUTTON_MENUDOWN, // MENU_BUTTON_DOWN + LIGHTS_BUTTON_START, // MENU_BUTTON_START + LIGHTS_BUTTON_BACK, // MENU_BUTTON_BACK + LIGHTS_BUTTON_COIN, // MENU_BUTTON_COIN + LIGHTS_BUTTON_OPERATOR // MENU_BUTTON_OPERATOR + }, + { // m_SecondaryMenuButton + LIGHTS_BUTTON_MARQUEE_UP_LEFT, // MENU_BUTTON_LEFT + LIGHTS_BUTTON_MARQUEE_UP_RIGHT, // MENU_BUTTON_RIGHT + LIGHTS_BUTTON_MARQUEE_LR_LEFT, // MENU_BUTTON_UP + LIGHTS_BUTTON_MARQUEE_LR_RIGHT, // MENU_BUTTON_DOWN + LIGHTS_BUTTON_START, // MENU_BUTTON_START + LIGHTS_BUTTON_BACK, // MENU_BUTTON_BACK + LIGHTS_BUTTON_COIN, // MENU_BUTTON_COIN + LIGHTS_BUTTON_OPERATOR, // MENU_BUTTON_OPERATOR + }, + { // m_iDefaultKeyboardKey + { // PLAYER_1 + SDLK_LEFT, // LIGHTS_BUTTON_MARQUEE_UP_LEFT, + SDLK_RIGHT, // LIGHTS_BUTTON_MARQUEE_UP_RIGHT, + SDLK_UP, // LIGHTS_BUTTON_MARQUEE_LR_LEFT, + SDLK_DOWN, // LIGHTS_BUTTON_MARQUEE_LR_RIGHT, + -1, //no default key // LIGHTS_BUTTON_BUTTONS_LEFT, + -1, //no default key // LIGHTS_BUTTON_BUTTONS_RIGHT, + -1, //no default key // LIGHTS_BUTTON_BASS_LEFT, + -1, //no default key // LIGHTS_BUTTON_BASS_RIGHT, + SDLK_RETURN, // LIGHTS_BUTTON_START, + SDLK_ESCAPE, // LIGHTS_BUTTON_BACK + SDLK_DELETE, // LIGHTS_BUTTON_MENULEFT + SDLK_PAGEDOWN, // LIGHTS_BUTTON_MENURIGHT + SDLK_HOME, // LIGHTS_BUTTON_MENUUP + SDLK_END, // LIGHTS_BUTTON_MENUDOWN + SDLK_F1, // LIGHTS_BUTTON_COIN + SDLK_SCROLLOCK // LIGHTS_BUTTON_OPERATOR + }, + { // PLAYER_2 + SDLK_KP4, // LIGHTS_BUTTON_MARQUEE_UP_LEFT, + SDLK_KP6, // LIGHTS_BUTTON_MARQUEE_UP_RIGHT, + SDLK_KP8, // LIGHTS_BUTTON_MARQUEE_LR_LEFT, + SDLK_KP2, // LIGHTS_BUTTON_MARQUEE_LR_RIGHT, + SDLK_KP7, // LIGHTS_BUTTON_BUTTONS_LEFT, + SDLK_KP9, // LIGHTS_BUTTON_BUTTONS_RIGHT, + -1, //no default key // LIGHTS_BUTTON_BASS_LEFT, + -1, //no default key // LIGHTS_BUTTON_BASS_RIGHT, + SDLK_KP_ENTER, // LIGHTS_BUTTON_START, + SDLK_KP0, // LIGHTS_BUTTON_BACK + SDLK_KP_DIVIDE, // LIGHTS_BUTTON_MENULEFT + SDLK_KP_MULTIPLY, // LIGHTS_BUTTON_MENURIGHT + SDLK_KP_MINUS, // LIGHTS_BUTTON_MENUUP + SDLK_KP_PLUS, // LIGHTS_BUTTON_MENUDOWN + -1, // LIGHTS_BUTTON_COIN + -1 // LIGHTS_BUTTON_OPERATOR + }, + } + }, }; StyleDef g_StyleDefs[NUM_STYLES] = @@ -1219,7 +1321,7 @@ StyleDef g_StyleDefs[NUM_STYLES] = }, /* { // STYLE_DANCE_SOLO_VERSUS "dance-solo-versus", // m_szName - STEPS_TYPE_DANCE_SOLO, // m_StepsType + STEPS_TYPE_DANCE_SOLO, // m_StepsType StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType { 160, 480 }, // m_iCenterX 6, // m_iColsPerPlayer @@ -2185,6 +2287,41 @@ StyleDef g_StyleDefs[NUM_STYLES] = 0,1,2,3,4,5,6,7,8 }, }, + { // STYLE_LIGHTS_CABINET + GAME_LIGHTS, // m_Game + true, // m_bUsedForGameplay + true, // m_bUsedForEdit + "cabinet", // m_szName + STEPS_TYPE_LIGHTS_CABINET, // m_StepsType + StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType + { 320, 320 }, // m_iCenterX + NUM_CABINET_LIGHTS, // m_iColsPerPlayer + { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; + { // PLAYER_1 + { TRACK_1, GAME_CONTROLLER_1, LIGHTS_BUTTON_MARQUEE_UP_LEFT, -DANCE_COL_SPACING*3.5f }, + { TRACK_2, GAME_CONTROLLER_1, LIGHTS_BUTTON_MARQUEE_UP_RIGHT, -DANCE_COL_SPACING*2.5f }, + { TRACK_3, GAME_CONTROLLER_1, LIGHTS_BUTTON_MARQUEE_LR_LEFT, -DANCE_COL_SPACING*1.5f }, + { TRACK_4, GAME_CONTROLLER_1, LIGHTS_BUTTON_MARQUEE_LR_RIGHT, -DANCE_COL_SPACING*0.5f }, + { TRACK_5, GAME_CONTROLLER_2, LIGHTS_BUTTON_BUTTONS_LEFT, +DANCE_COL_SPACING*0.5f }, + { TRACK_6, GAME_CONTROLLER_2, LIGHTS_BUTTON_BUTTONS_RIGHT, +DANCE_COL_SPACING*1.5f }, + { TRACK_7, GAME_CONTROLLER_2, LIGHTS_BUTTON_BASS_LEFT, +DANCE_COL_SPACING*2.5f }, + { TRACK_8, GAME_CONTROLLER_2, LIGHTS_BUTTON_BASS_RIGHT, +DANCE_COL_SPACING*3.5f }, + }, + { // PLAYER_2 + { TRACK_1, GAME_CONTROLLER_1, LIGHTS_BUTTON_MARQUEE_UP_LEFT, -DANCE_COL_SPACING*3.5f }, + { TRACK_2, GAME_CONTROLLER_1, LIGHTS_BUTTON_MARQUEE_UP_RIGHT, -DANCE_COL_SPACING*2.5f }, + { TRACK_3, GAME_CONTROLLER_1, LIGHTS_BUTTON_MARQUEE_LR_LEFT, -DANCE_COL_SPACING*1.5f }, + { TRACK_4, GAME_CONTROLLER_1, LIGHTS_BUTTON_MARQUEE_LR_RIGHT, -DANCE_COL_SPACING*0.5f }, + { TRACK_5, GAME_CONTROLLER_2, LIGHTS_BUTTON_BUTTONS_LEFT, +DANCE_COL_SPACING*0.5f }, + { TRACK_6, GAME_CONTROLLER_2, LIGHTS_BUTTON_BUTTONS_RIGHT, +DANCE_COL_SPACING*1.5f }, + { TRACK_7, GAME_CONTROLLER_2, LIGHTS_BUTTON_BASS_LEFT, +DANCE_COL_SPACING*2.5f }, + { TRACK_8, GAME_CONTROLLER_2, LIGHTS_BUTTON_BASS_RIGHT, +DANCE_COL_SPACING*3.5f }, + }, + }, + { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; + 0,1,2,3,4,5,6,7 + }, + }, }; diff --git a/stepmania/src/LightsManager.cpp b/stepmania/src/LightsManager.cpp index 22cc62db79..1a96d5eb03 100644 --- a/stepmania/src/LightsManager.cpp +++ b/stepmania/src/LightsManager.cpp @@ -54,8 +54,7 @@ LightsManager::LightsManager(CString sDriver) m_pDriver = MakeLightsDriver(sDriver); - m_fSecsLeftInMarqueeBlink = 0; - m_fSecsLeftInBassBlink = 0; + ZERO( m_fSecsLeftInBlink ); } LightsManager::~LightsManager() @@ -65,14 +64,19 @@ LightsManager::~LightsManager() void LightsManager::Update( float fDeltaTime ) { - m_fSecsLeftInMarqueeBlink = max( 0, m_fSecsLeftInMarqueeBlink - fDeltaTime ); - m_fSecsLeftInBassBlink = max( 0, m_fSecsLeftInBassBlink - fDeltaTime ); + // update lights falloff + { + FOREACH_CabinetLight( cl ) + m_fSecsLeftInBlink[cl] = max( 0, m_fSecsLeftInBlink[cl] - fDeltaTime ); + } // - // Update cabinet lights + // Set new lights state cabinet lights // - FOREACH_CabinetLight( cl ) - m_LightsState.m_bCabinetLights[cl] = false; + { + FOREACH_CabinetLight( cl ) + m_LightsState.m_bCabinetLights[cl] = false; + } switch( m_LightsMode ) { @@ -147,17 +151,10 @@ void LightsManager::Update( float fDeltaTime ) bool bAllMarqueeLightsOn = !GAMESTATE->m_bPastHereWeGo; - bool bOn; - - bOn = bAllMarqueeLightsOn || (m_fSecsLeftInMarqueeBlink > 0); - m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_UP_LEFT] = bOn; - m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_UP_RIGHT] = bOn; - m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_LR_LEFT] = bOn; - m_LightsState.m_bCabinetLights[LIGHT_MARQUEE_LR_RIGHT] = bOn; - - bOn = m_fSecsLeftInBassBlink > 0; - m_LightsState.m_bCabinetLights[LIGHT_BASS_LEFT] = bOn; - m_LightsState.m_bCabinetLights[LIGHT_BASS_RIGHT] = bOn; + { + FOREACH_CabinetLight( cl ) + m_LightsState.m_bCabinetLights[cl] = m_fSecsLeftInBlink[cl] > 0 ; + } } break; case LIGHTSMODE_STAGE: @@ -264,14 +261,9 @@ void LightsManager::Update( float fDeltaTime ) m_pDriver->Set( &m_LightsState ); } -void LightsManager::GameplayBlinkMarqueeLights() +void LightsManager::GameplayBlinkLight( CabinetLight cl ) { - m_fSecsLeftInMarqueeBlink = 0.1f; -} - -void LightsManager::GameplayBlinkBassLights() -{ - m_fSecsLeftInBassBlink = 0.1f; + m_fSecsLeftInBlink[cl] = LIGHTS_FALLOFF_SECONDS; } void LightsManager::SetLightsMode( LightsMode lm ) diff --git a/stepmania/src/LightsManager.h b/stepmania/src/LightsManager.h index d07c4e0aac..290ac3be3b 100644 --- a/stepmania/src/LightsManager.h +++ b/stepmania/src/LightsManager.h @@ -15,6 +15,8 @@ #include "GameInput.h" #include "EnumHelper.h" +const float LIGHTS_FALLOFF_SECONDS = 0.1f; + enum CabinetLight { LIGHT_MARQUEE_UP_LEFT, @@ -60,15 +62,13 @@ public: void Update( float fDeltaTime ); - void GameplayBlinkMarqueeLights(); - void GameplayBlinkBassLights(); + void GameplayBlinkLight( CabinetLight cl ); void SetLightsMode( LightsMode lm ); LightsMode GetLightsMode(); private: - float m_fSecsLeftInMarqueeBlink; - float m_fSecsLeftInBassBlink; + float m_fSecsLeftInBlink[NUM_CABINET_LIGHTS]; LightsDriver* m_pDriver; LightsMode m_LightsMode; diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index ac04c9feb7..1de32374ce 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -1053,20 +1053,18 @@ void ScreenGameplay::LoadNextSong() // // Load lights data // - m_MarqueeLightsNoteData.Init(); - m_BassLightsNoteData.Init(); - StepsType st = GAMESTATE->GetCurrentStyleDef()->m_StepsType; - ASSERT( GAMESTATE->m_pCurSong ); - Steps* pStepsEasy = GAMESTATE->m_pCurSong->GetStepsByDifficulty( st, DIFFICULTY_EASY, false ); - Steps* pStepsMedium = GAMESTATE->m_pCurSong->GetStepsByDifficulty( st, DIFFICULTY_MEDIUM, false ); - if( pStepsEasy ) pStepsEasy->GetNoteData( &m_BassLightsNoteData ); - if( pStepsMedium ) pStepsMedium->GetNoteData( &m_MarqueeLightsNoteData ); - - // optimization: collapse to one and free unused tracks - NoteDataUtil::CollapseToOne(m_BassLightsNoteData); - m_BassLightsNoteData.SetNumTracks(1); - NoteDataUtil::CollapseToOne(m_MarqueeLightsNoteData); - m_MarqueeLightsNoteData.SetNumTracks(1); + { + m_CabinetLightsNoteData.Init(); + ASSERT( GAMESTATE->m_pCurSong ); + vector vSteps; + GAMESTATE->m_pCurSong->GetSteps( vSteps, STEPS_TYPE_LIGHTS_CABINET ); + if( !vSteps.empty() ) + vSteps[0]->GetNoteData( &m_CabinetLightsNoteData ); + + // Convert to 4s so that we can check if we're inside a hold with just + // GetTapNote(). + m_CabinetLightsNoteData.ConvertHoldNotesTo4s(); + } } float ScreenGameplay::StartPlayingSong(float MinTimeToNotes, float MinTimeToMusic) @@ -1402,11 +1400,12 @@ void ScreenGameplay::Update( float fDeltaTime ) // // update lights // - bool bBlinkMarqueeLights = false; + bool bBlink[NUM_CABINET_LIGHTS]; + ZERO( bBlink ); bool bBlinkBassLights = false; bool bCrossedABeat = false; { - float fPositionSeconds = GAMESTATE->m_fMusicSeconds - 0.05f; // trigger the light a tiny bit early + float fPositionSeconds = GAMESTATE->m_fMusicSeconds - LIGHTS_FALLOFF_SECONDS/2; // trigger the light a tiny bit early fPositionSeconds += (SOUND->GetPlayLatency()) * GAMESTATE->m_SongOptions.m_fMusicRate; float fSongBeat = GAMESTATE->m_pCurSong->GetBeatFromElapsedTime( fPositionSeconds ); @@ -1421,8 +1420,8 @@ void ScreenGameplay::Update( float fDeltaTime ) for( int r=iRowLastCrossed+1; r<=iRowNow; r++ ) // for each index we crossed since the last update { - bBlinkMarqueeLights |= m_MarqueeLightsNoteData.IsThereATapOrHoldHeadAtRow( r ); - bBlinkBassLights |= m_BassLightsNoteData.IsThereATapOrHoldHeadAtRow( r ); + FOREACH_CabinetLight( cl ) + bBlink[cl] |= (m_CabinetLightsNoteData.GetTapNote( cl, r ) != TAP_EMPTY); } iRowLastCrossed = iRowNow; @@ -1430,10 +1429,11 @@ void ScreenGameplay::Update( float fDeltaTime ) bool bOverrideBlink = (GAMESTATE->m_fSongBeat < GAMESTATE->m_pCurSong->m_fFirstBeat) && bCrossedABeat; - if( bOverrideBlink || bBlinkMarqueeLights ) - LIGHTSMAN->GameplayBlinkMarqueeLights(); - if( bOverrideBlink || bBlinkBassLights ) - LIGHTSMAN->GameplayBlinkBassLights(); + FOREACH_CabinetLight( cl ) + { + if( bOverrideBlink || bBlink[cl] ) + LIGHTSMAN->GameplayBlinkLight( cl ); + } // // update song position meter diff --git a/stepmania/src/ScreenGameplay.h b/stepmania/src/ScreenGameplay.h index 632cea07a5..e07ab90c20 100644 --- a/stepmania/src/ScreenGameplay.h +++ b/stepmania/src/ScreenGameplay.h @@ -180,8 +180,7 @@ protected: BeginnerHelper m_BeginnerHelper; - NoteData m_MarqueeLightsNoteData; - NoteData m_BassLightsNoteData; + NoteData m_CabinetLightsNoteData; }; diff --git a/stepmania/src/Song.cpp b/stepmania/src/Song.cpp index c44af87ba1..e1d43399cc 100644 --- a/stepmania/src/Song.cpp +++ b/stepmania/src/Song.cpp @@ -867,23 +867,25 @@ void Song::GetSteps( vector& arrayAddTo, StepsType nt, Difficulty dc, in if( !Max ) break; - if( nt != STEPS_TYPE_INVALID && m_apNotes[i]->m_StepsType != nt ) + Steps* pSteps = m_apNotes[i]; + + if( nt != STEPS_TYPE_INVALID && pSteps->m_StepsType != nt ) continue; - if( dc != DIFFICULTY_INVALID && dc != m_apNotes[i]->GetDifficulty() ) + if( dc != DIFFICULTY_INVALID && dc != pSteps->GetDifficulty() ) continue; - if( iMeterLow != -1 && iMeterLow > m_apNotes[i]->GetMeter() ) + if( iMeterLow != -1 && iMeterLow > pSteps->GetMeter() ) continue; - if( iMeterHigh != -1 && iMeterHigh < m_apNotes[i]->GetMeter() ) + if( iMeterHigh != -1 && iMeterHigh < pSteps->GetMeter() ) continue; - if( sDescription != "" && sDescription != m_apNotes[i]->GetDescription() ) + if( sDescription != "" && sDescription != pSteps->GetDescription() ) continue; - if( !bIncludeAutoGen && m_apNotes[i]->IsAutogen() ) + if( !bIncludeAutoGen && pSteps->IsAutogen() ) continue; if( Max != -1 ) --Max; - arrayAddTo.push_back( m_apNotes[i] ); + arrayAddTo.push_back( pSteps ); } } diff --git a/stepmania/src/Style.h b/stepmania/src/Style.h index eeb8c5324e..e28d229a9d 100644 --- a/stepmania/src/Style.h +++ b/stepmania/src/Style.h @@ -46,6 +46,7 @@ enum Style STYLE_TECHNO_SINGLE8, STYLE_PNM_FIVE, STYLE_PNM_NINE, + STYLE_LIGHTS_CABINET, NUM_STYLES, // leave this at the end STYLE_INVALID, };