add StepsType for cabinet lights

This commit is contained in:
Chris Danford
2004-04-20 02:35:30 +00:00
parent 3bbefc42d4
commit fc8d3ed363
10 changed files with 217 additions and 64 deletions
+2 -1
View File
@@ -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,
};
+1
View File
@@ -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,
};
+20
View File
@@ -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
+140 -3
View File
@@ -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
},
},
};
+17 -25
View File
@@ -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 )
+4 -4
View File
@@ -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;
+22 -22
View File
@@ -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<Steps*> 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
+1 -2
View File
@@ -180,8 +180,7 @@ protected:
BeginnerHelper m_BeginnerHelper;
NoteData m_MarqueeLightsNoteData;
NoteData m_BassLightsNoteData;
NoteData m_CabinetLightsNoteData;
};
+9 -7
View File
@@ -867,23 +867,25 @@ void Song::GetSteps( vector<Steps*>& 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 );
}
}
+1
View File
@@ -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,
};