working on "attack notes"
This commit is contained in:
@@ -44,6 +44,8 @@
|
||||
|
||||
const ScreenMessage SM_BackFromCourseOptionsMenu = (ScreenMessage)(SM_User+1);
|
||||
const ScreenMessage SM_BackFromCourseEntryOptionsMenu = (ScreenMessage)(SM_User+2);
|
||||
const ScreenMessage SM_BackFromPlayerOptions = (ScreenMessage)(SM_User+3);
|
||||
const ScreenMessage SM_BackFromSongOptions = (ScreenMessage)(SM_User+4);
|
||||
|
||||
enum CourseEntryMenuRow
|
||||
{
|
||||
@@ -393,7 +395,7 @@ void EditCoursesMenu::Start()
|
||||
GAMESTATE->m_PlayerOptions[PLAYER_1] = PlayerOptions();
|
||||
GAMESTATE->m_PlayerOptions[PLAYER_1].FromString( pEntry->modifiers );
|
||||
|
||||
SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions" );
|
||||
SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromPlayerOptions );
|
||||
break;
|
||||
case ROW_ENTRY_SONG_OPTIONS:
|
||||
m_soundStart.Play();
|
||||
@@ -401,7 +403,7 @@ void EditCoursesMenu::Start()
|
||||
GAMESTATE->m_SongOptions = SongOptions();
|
||||
GAMESTATE->m_SongOptions.FromString( pEntry->modifiers );
|
||||
|
||||
SCREENMAN->AddNewScreenToTop( "ScreenSongOptions" );
|
||||
SCREENMAN->AddNewScreenToTop( "ScreenSongOptions", SM_BackFromSongOptions );
|
||||
break;
|
||||
default:
|
||||
m_soundInvalid.Play();
|
||||
@@ -448,7 +450,8 @@ void EditCoursesMenu::HandleScreenMessage( const ScreenMessage SM )
|
||||
OnRowValueChanged( ROW_ENTRY_OPTIONS );
|
||||
}
|
||||
break;
|
||||
case SM_RegainingFocus:
|
||||
case SM_BackFromPlayerOptions:
|
||||
case SM_BackFromSongOptions:
|
||||
// coming back from PlayerOptions or SongOptions
|
||||
pEntry->modifiers = GAMESTATE->m_PlayerOptions[PLAYER_1].GetString() + "," + GAMESTATE->m_SongOptions.GetString();
|
||||
OnRowValueChanged( ROW_ENTRY_PLAYER_OPTIONS );
|
||||
|
||||
@@ -158,15 +158,28 @@ void NoteDataUtil::GetSMNoteDataString( const NoteData &in_, CString &out )
|
||||
|
||||
for( int r=iMeasureStartRow; r<=iMeasureLastRow; r+=iRowSpacing )
|
||||
{
|
||||
for( int t=0; t<in.GetNumTracks(); t++ ) {
|
||||
for( int t=0; t<in.GetNumTracks(); t++ )
|
||||
{
|
||||
TapNote tn = in.GetTapNote(t, r);
|
||||
char c;
|
||||
switch(in.GetTapNote(t, r)) {
|
||||
case TAP_EMPTY: c = '0'; break;
|
||||
case TAP_TAP: c = '1'; break;
|
||||
switch( tn )
|
||||
{
|
||||
case TAP_EMPTY: c = '0'; break;
|
||||
case TAP_TAP: c = '1'; break;
|
||||
case TAP_HOLD_HEAD: c = '2'; break;
|
||||
case TAP_HOLD_TAIL: c = '3'; break;
|
||||
case TAP_MINE: c = 'M'; break;
|
||||
default: ASSERT(0); c = '0'; break;
|
||||
case TAP_MINE: c = 'M'; break;
|
||||
default:
|
||||
if( tn >= TAP_ATTACK_BEGIN && tn <= TAP_ATTACK_END )
|
||||
{
|
||||
c = tn - TAP_ATTACK_BEGIN + 'a'; // TODO: overflow check?
|
||||
}
|
||||
else
|
||||
{
|
||||
ASSERT(0);
|
||||
c = '0';
|
||||
}
|
||||
break;
|
||||
}
|
||||
sRet.append(1, c);
|
||||
}
|
||||
@@ -682,7 +695,7 @@ void NoteDataUtil::AddMines( NoteData &in, float fStartBeat, float fEndBeat )
|
||||
}
|
||||
}
|
||||
|
||||
// Place mines right after hold so players must lift their foot.
|
||||
// Place mines right after hold so player must lift their foot.
|
||||
for( int i=0; i<in.GetNumHoldNotes(); i++ )
|
||||
{
|
||||
HoldNote &hn = in.GetHoldNote(i);
|
||||
|
||||
@@ -37,6 +37,11 @@ static const TapNote TAP_ADDITION = '5';
|
||||
// mine note - don't step!
|
||||
static const TapNote TAP_MINE = '6';
|
||||
|
||||
// attack note start. Use lowercase letters a-z.
|
||||
// Don't use uppercase letters - 'M' it taken for mine.
|
||||
static const TapNote TAP_ATTACK_BEGIN = 'a';
|
||||
static const TapNote TAP_ATTACK_END = 'z';
|
||||
|
||||
enum
|
||||
{
|
||||
TRACK_1 = 0,
|
||||
|
||||
@@ -14,8 +14,17 @@ CString NotesWriterDWI::NotesToDWIString( const TapNote cNoteCols[6] )
|
||||
CString taps, holds, ret;
|
||||
for( int col = 0; col < 6; ++col )
|
||||
{
|
||||
if( cNoteCols[col] == TAP_EMPTY || cNoteCols[col] == TAP_MINE )
|
||||
switch( cNoteCols[col] )
|
||||
{
|
||||
case TAP_EMPTY:
|
||||
case TAP_MINE:
|
||||
continue;
|
||||
default:
|
||||
if( cNoteCols[col] >= TAP_ATTACK_BEGIN && cNoteCols[col] <= TAP_ATTACK_END )
|
||||
continue;
|
||||
else
|
||||
ASSERT(0);
|
||||
}
|
||||
|
||||
if( cNoteCols[col] == TAP_HOLD_HEAD )
|
||||
holds += dirs[col];
|
||||
|
||||
@@ -633,7 +633,7 @@ void PlayerMinus::Step( int col, RageTimer tm )
|
||||
return;
|
||||
|
||||
// Unless the computer made a very good step, they were fooled by the mine
|
||||
if( tn == TAP_MINE && score <= TNS_GREAT )
|
||||
if( tn == TAP_MINE && score <= TNS_GOOD )
|
||||
{
|
||||
m_soundMine.Play();
|
||||
score = TNS_MISS;
|
||||
|
||||
@@ -89,6 +89,10 @@ const ScreenMessage SM_BackFromEditNotesStatistics = (ScreenMessage)(SM_User+3);
|
||||
const ScreenMessage SM_BackFromEditOptions = (ScreenMessage)(SM_User+4);
|
||||
const ScreenMessage SM_BackFromEditSongInfo = (ScreenMessage)(SM_User+5);
|
||||
const ScreenMessage SM_BackFromBGChange = (ScreenMessage)(SM_User+6);
|
||||
const ScreenMessage SM_BackFromPlayerOptions = (ScreenMessage)(SM_User+7);
|
||||
const ScreenMessage SM_BackFromSongOptions = (ScreenMessage)(SM_User+8);
|
||||
const ScreenMessage SM_BackFromInsertAttack = (ScreenMessage)(SM_User+9);
|
||||
const ScreenMessage SM_BackFromInsertAttackModifiers= (ScreenMessage)(SM_User+10);
|
||||
|
||||
|
||||
const CString HELP_TEXT =
|
||||
@@ -217,6 +221,19 @@ static const MenuRow g_BGChangeItems[] =
|
||||
};
|
||||
static Menu g_BGChange( "Background Change", g_BGChangeItems );
|
||||
|
||||
static const MenuRow g_InsertAttackItems[] =
|
||||
{
|
||||
{ "Duration", true, 2, { "0:10","0:20","0:30","0:40","0:50","1:00","1:10","1:20","1:30","1:40","1:50","2:00" } },
|
||||
{ "Set modifiers", true, 0, { "PRESS START" } },
|
||||
{ NULL, true, 0, { NULL } }
|
||||
};
|
||||
static Menu g_InsertAttack( "Insert Attack", g_InsertAttackItems );
|
||||
|
||||
// HACK: need to remember the track we're inserting on so
|
||||
// that we can lay the attack note after coming back from
|
||||
// menus.
|
||||
int g_iLastInsertAttackTrack = -1;
|
||||
|
||||
ScreenEdit::ScreenEdit( CString sName ) : Screen( sName )
|
||||
{
|
||||
LOG->Trace( "ScreenEdit::ScreenEdit()" );
|
||||
@@ -661,22 +678,23 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ
|
||||
|
||||
if( !bRemovedAHoldNote )
|
||||
{
|
||||
// Hold Shift to lay mine
|
||||
bool bLayMine =
|
||||
INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, SDLK_LSHIFT)) ||
|
||||
INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, SDLK_RSHIFT));
|
||||
|
||||
// We didn't remove a HoldNote, so the user wants to add or delete a TapNote
|
||||
if( m_NoteFieldEdit.GetTapNote(iCol, iSongIndex) == TAP_EMPTY )
|
||||
// Delete the tap note here if one already exists
|
||||
if( m_NoteFieldEdit.GetTapNote(iCol, iSongIndex) != TAP_EMPTY )
|
||||
{
|
||||
if( bLayMine )
|
||||
m_NoteFieldEdit.SetTapNote(iCol, iSongIndex, TAP_MINE );
|
||||
else
|
||||
m_NoteFieldEdit.SetTapNote(iCol, iSongIndex, TAP_TAP );
|
||||
m_NoteFieldEdit.SetTapNote(iCol, iSongIndex, TAP_EMPTY );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_NoteFieldEdit.SetTapNote(iCol, iSongIndex, TAP_EMPTY );
|
||||
// Hold LShift to lay mine, hold RShift to lay an attack
|
||||
if( INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, SDLK_LSHIFT)) )
|
||||
m_NoteFieldEdit.SetTapNote(iCol, iSongIndex, TAP_MINE );
|
||||
else if( INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, SDLK_RSHIFT)) )
|
||||
{
|
||||
g_iLastInsertAttackTrack = iCol;
|
||||
SCREENMAN->MiniMenu( &g_InsertAttack, SM_BackFromInsertAttack );
|
||||
}
|
||||
else
|
||||
m_NoteFieldEdit.SetTapNote(iCol, iSongIndex, TAP_TAP );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1240,10 +1258,24 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM )
|
||||
case SM_BackFromBGChange:
|
||||
HandleBGChangeChoice( (BGChangeChoice)ScreenMiniMenu::s_iLastLine, ScreenMiniMenu::s_iLastAnswers );
|
||||
break;
|
||||
case SM_RegainingFocus:
|
||||
case SM_BackFromPlayerOptions:
|
||||
case SM_BackFromSongOptions:
|
||||
// coming back from PlayerOptions or SongOptions
|
||||
m_soundMusic.SetPlaybackRate( GAMESTATE->m_SongOptions.m_fMusicRate );
|
||||
break;
|
||||
case SM_BackFromInsertAttack:
|
||||
GAMESTATE->StoreSelectedOptions(); // save so that we don't lose the options chosen for edit and playback
|
||||
SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromInsertAttackModifiers );
|
||||
break;
|
||||
case SM_BackFromInsertAttackModifiers:
|
||||
{
|
||||
PlayerOptions poChosen = GAMESTATE->m_PlayerOptions[PLAYER_1];
|
||||
CString sMods = poChosen.GetString();
|
||||
int row = BeatToNoteRow( GAMESTATE->m_fSongBeat );
|
||||
m_NoteFieldEdit.SetTapNote( g_iLastInsertAttackTrack, row, TAP_TAP );
|
||||
GAMESTATE->RestoreSelectedOptions(); // restore the edit and playback options
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1368,10 +1400,10 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, int* iAnswers )
|
||||
}
|
||||
break;
|
||||
case player_options:
|
||||
SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions" );
|
||||
SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromPlayerOptions );
|
||||
break;
|
||||
case song_options:
|
||||
SCREENMAN->AddNewScreenToTop( "ScreenSongOptions" );
|
||||
SCREENMAN->AddNewScreenToTop( "ScreenSongOptions", SM_BackFromSongOptions );
|
||||
break;
|
||||
case edit_song_info:
|
||||
{
|
||||
|
||||
@@ -321,6 +321,8 @@ ScreenManager::ScreenManager()
|
||||
m_SystemLayer = new ScreenSystemLayer;
|
||||
|
||||
m_ScreenBuffered = NULL;
|
||||
|
||||
m_MessageSendOnPop = SM_None;
|
||||
}
|
||||
|
||||
|
||||
@@ -583,10 +585,11 @@ retry:
|
||||
GAMESTATE->m_bIsOnSystemMenu = false;
|
||||
}
|
||||
|
||||
void ScreenManager::AddNewScreenToTop( CString sClassName )
|
||||
void ScreenManager::AddNewScreenToTop( CString sClassName, ScreenMessage messageSendOnPop )
|
||||
{
|
||||
Screen* pNewScreen = MakeNewScreen(sClassName);
|
||||
m_ScreenStack.push_back( pNewScreen );
|
||||
m_MessageSendOnPop = messageSendOnPop;
|
||||
}
|
||||
|
||||
#include "ScreenPrompt.h"
|
||||
@@ -617,9 +620,11 @@ void ScreenManager::PopTopScreen( ScreenMessage SM )
|
||||
//pScreenToPop->HandleScreenMessage( SM_LosingInputFocus );
|
||||
m_ScreenStack.erase(m_ScreenStack.end()-1, m_ScreenStack.end());
|
||||
m_ScreensToDelete.push_back( pScreenToPop );
|
||||
|
||||
Screen* pNewTopScreen = m_ScreenStack[m_ScreenStack.size()-1];
|
||||
pNewTopScreen->HandleScreenMessage( SM );
|
||||
|
||||
// post to the new top
|
||||
PostMessageToTopScreen( SM, 0 );
|
||||
PostMessageToTopScreen( m_MessageSendOnPop, 0 );
|
||||
m_MessageSendOnPop = SM_None;
|
||||
}
|
||||
|
||||
void ScreenManager::PostMessageToTopScreen( ScreenMessage SM, float fDelay )
|
||||
|
||||
@@ -39,11 +39,11 @@ public:
|
||||
void LoadPreppedScreen();
|
||||
void DeletePreppedScreen();
|
||||
void SetNewScreen( CString sClassName );
|
||||
void AddNewScreenToTop( CString sClassName );
|
||||
void AddNewScreenToTop( CString sClassName, ScreenMessage messageSendOnPop );
|
||||
void Prompt( ScreenMessage SM_SendWhenDone, CString sText, bool bYesNo = false, bool bDefaultAnswer = false, void(*OnYes)(void*) = NULL, void(*OnNo)(void*) = NULL, void* pCallbackData = NULL );
|
||||
void TextEntry( ScreenMessage SM_SendWhenDone, CString sQuestion, CString sInitialAnswer, void(*OnOK)(CString sAnswer) = NULL, void(*OnCanel)() = NULL );
|
||||
void MiniMenu( Menu* pDef, ScreenMessage SM_SendOnOK, ScreenMessage SM_SendOnCancel = SM_None );
|
||||
void PopTopScreen( ScreenMessage SM = SM_RegainingFocus );
|
||||
void PopTopScreen( ScreenMessage SM = SM_None );
|
||||
void SystemMessage( CString sMessage );
|
||||
|
||||
void PostMessageToTopScreen( ScreenMessage SM, float fDelay );
|
||||
@@ -57,6 +57,7 @@ public:
|
||||
|
||||
private:
|
||||
vector<Screen*> m_ScreenStack; // bottommost to topmost
|
||||
ScreenMessage m_MessageSendOnPop;
|
||||
vector<Screen*> m_ScreensToDelete;
|
||||
Screen *m_ScreenBuffered;
|
||||
ScreenSystemLayer *m_SystemLayer;
|
||||
|
||||
@@ -23,7 +23,6 @@ enum ScreenMessage {
|
||||
SM_BeginFadingOut,
|
||||
SM_GoToNextScreen,
|
||||
SM_GoToPrevScreen,
|
||||
SM_RegainingFocus,
|
||||
SM_User = 100
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user