working on "attack notes"

This commit is contained in:
Chris Danford
2003-11-12 08:13:02 +00:00
parent 746d9d29eb
commit 52100a727b
9 changed files with 101 additions and 34 deletions
+6 -3
View File
@@ -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 );
+20 -7
View File
@@ -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);
+5
View File
@@ -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,
+10 -1
View File
@@ -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];
+1 -1
View File
@@ -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;
+47 -15
View File
@@ -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:
{
+9 -4
View File
@@ -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 )
+3 -2
View File
@@ -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;
-1
View File
@@ -23,7 +23,6 @@ enum ScreenMessage {
SM_BeginFadingOut,
SM_GoToNextScreen,
SM_GoToPrevScreen,
SM_RegainingFocus,
SM_User = 100
};