Optionally load in P2 during PracticeMode playback.
Use the first PlayerNumber that comes in under export options, this fixes P2 loading by itself in PracticeMode.
This commit is contained in:
+53
-82
@@ -1404,9 +1404,10 @@ void ScreenEdit::Init()
|
||||
GAMESTATE->m_bInStepEditor = true;
|
||||
|
||||
SubscribeToMessage( "Judgment" );
|
||||
main_player_ = GAMESTATE->GetMasterPlayerNumber();
|
||||
|
||||
ASSERT( GAMESTATE->m_pCurSong != nullptr );
|
||||
ASSERT( GAMESTATE->m_pCurSteps[PLAYER_1] != nullptr );
|
||||
ASSERT( GAMESTATE->m_pCurSteps[main_player_] != nullptr );
|
||||
|
||||
EDIT_MODE.Load( m_sName, "EditMode" );
|
||||
ScreenWithMenuElements::Init();
|
||||
@@ -1422,14 +1423,10 @@ void ScreenEdit::Init()
|
||||
m_InputPlayerNumber = PLAYER_INVALID;
|
||||
|
||||
if( GAMESTATE->GetCurrentStyle(GAMESTATE->GetMasterPlayerNumber())->m_StyleType == StyleType_TwoPlayersSharedSides )
|
||||
m_InputPlayerNumber = PLAYER_1;
|
||||
|
||||
FOREACH_PlayerNumber( p )
|
||||
GAMESTATE->m_bSideIsJoined[p] = false;
|
||||
GAMESTATE->m_bSideIsJoined[PLAYER_1] = true;
|
||||
m_InputPlayerNumber = main_player_;
|
||||
|
||||
m_pSong = GAMESTATE->m_pCurSong;
|
||||
m_pSteps = GAMESTATE->m_pCurSteps[PLAYER_1];
|
||||
m_pSteps = GAMESTATE->m_pCurSteps[main_player_];
|
||||
|
||||
/* The user will most likely switch into Step Timing after laying down
|
||||
some initial notes. It also throws off many people at first glance.
|
||||
@@ -1476,20 +1473,22 @@ void ScreenEdit::Init()
|
||||
ModsLevel_Preferred, m_sNoteSkin, sNoteSkin );
|
||||
}
|
||||
}
|
||||
m_PlayerStateEdit.SetPlayerNumber(PLAYER_1);
|
||||
|
||||
m_PlayerStateEdit.SetPlayerNumber(main_player_);
|
||||
m_PlayerStateEdit.m_NotefieldZoom= 1.0f;
|
||||
|
||||
// If we always go with the GAMESTATE NoteSkin, we will have fun effects
|
||||
// like Vivid or Flat in the editor notefield. This is not conducive to
|
||||
// productive editing.
|
||||
// todo: We should allow certain noteskins (note-colored/rhythm) to be
|
||||
// displayed. (Perhaps this should be a noteskin metric.) -aj
|
||||
if( NOTESKIN->DoesNoteSkinExist( EDITOR_NOTE_SKINS[PLAYER_1].Get() ) )
|
||||
if( NOTESKIN->DoesNoteSkinExist( EDITOR_NOTE_SKINS[main_player_].Get() ) )
|
||||
{
|
||||
PO_GROUP_ASSIGN( m_PlayerStateEdit.m_PlayerOptions, ModsLevel_Stage, m_sNoteSkin, EDITOR_NOTE_SKINS[PLAYER_1].Get() );
|
||||
PO_GROUP_ASSIGN( m_PlayerStateEdit.m_PlayerOptions, ModsLevel_Stage, m_sNoteSkin, EDITOR_NOTE_SKINS[main_player_].Get() );
|
||||
}
|
||||
else
|
||||
{
|
||||
PO_GROUP_ASSIGN( m_PlayerStateEdit.m_PlayerOptions, ModsLevel_Stage, m_sNoteSkin, GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.GetStage().m_sNoteSkin );
|
||||
PO_GROUP_ASSIGN( m_PlayerStateEdit.m_PlayerOptions, ModsLevel_Stage, m_sNoteSkin, GAMESTATE->m_pPlayerState[main_player_]->m_PlayerOptions.GetStage().m_sNoteSkin );
|
||||
}
|
||||
m_PlayerStateEdit.m_PlayerOptions.FromString( ModsLevel_Stage, EDIT_MODIFIERS );
|
||||
|
||||
@@ -1504,7 +1503,7 @@ void ScreenEdit::Init()
|
||||
|
||||
m_NoteDataRecord.SetNumTracks( m_NoteDataEdit.GetNumTracks() );
|
||||
m_NoteFieldRecord.SetXY( RECORD_X, RECORD_Y );
|
||||
m_NoteFieldRecord.Init( GAMESTATE->m_pPlayerState[PLAYER_1], PLAYER_HEIGHT );
|
||||
m_NoteFieldRecord.Init( GAMESTATE->m_pPlayerState[main_player_], PLAYER_HEIGHT );
|
||||
m_NoteFieldRecord.Load( &m_NoteDataRecord, -120, 425 );
|
||||
this->AddChild( &m_NoteFieldRecord );
|
||||
|
||||
@@ -1527,12 +1526,8 @@ void ScreenEdit::Init()
|
||||
SetDirty(true);
|
||||
}
|
||||
|
||||
m_Player->Init( "Player", GAMESTATE->m_pPlayerState[PLAYER_1], nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr );
|
||||
m_Player->CacheAllUsedNoteSkins();
|
||||
GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerController = PC_HUMAN;
|
||||
m_Player->SetXY( PLAYER_X, PLAYER_Y );
|
||||
m_Player->SetZoom( SCREEN_HEIGHT/480 );
|
||||
this->AddChild( m_Player );
|
||||
player_manager_.AddPlayers(m_NoteDataEdit);
|
||||
player_manager_.AddPlayersToActorFrame(*this);
|
||||
|
||||
this->AddChild( &m_Foreground );
|
||||
|
||||
@@ -1609,8 +1604,7 @@ void ScreenEdit::PlayTicks()
|
||||
{
|
||||
if( m_EditState != STATE_PLAYING )
|
||||
return;
|
||||
|
||||
m_GameplayAssist.PlayTicks( m_Player->GetNoteData(), m_Player->GetPlayerState() );
|
||||
player_manager_.PlayTicks(m_GameplayAssist);
|
||||
}
|
||||
|
||||
static ThemeMetric<float> FADE_IN_PREVIEW("ScreenEdit", "FadeInPreview");
|
||||
@@ -3229,34 +3223,9 @@ bool ScreenEdit::InputPlay( const InputEventPlus &input, EditButton EditB )
|
||||
}
|
||||
|
||||
GameButtonType gbt = GAMESTATE->m_pCurGame->GetPerButtonInfo(input.GameI.button)->m_gbt;
|
||||
|
||||
if( GamePreferences::m_AutoPlay == PC_HUMAN && GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.GetCurrent().m_fPlayerAutoPlay == 0 )
|
||||
{
|
||||
const int iCol = GAMESTATE->GetCurrentStyle(GAMESTATE->GetMasterPlayerNumber())->GameInputToColumn( input.GameI );
|
||||
bool bRelease = input.type == IET_RELEASE;
|
||||
switch( input.pn )
|
||||
{
|
||||
case PLAYER_2:
|
||||
// ignore player 2 input unless this mode requires it
|
||||
if( GAMESTATE->GetCurrentStyle(GAMESTATE->GetMasterPlayerNumber())->m_StyleType != StyleType_TwoPlayersSharedSides )
|
||||
break;
|
||||
|
||||
[[fallthrough]];
|
||||
case PLAYER_1:
|
||||
{
|
||||
switch( gbt )
|
||||
{
|
||||
case GameButtonType_Step:
|
||||
if( iCol != -1 )
|
||||
m_Player->Step( iCol, -1, input.DeviceI.ts, false, bRelease );
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
if (player_manager_.HandleGameplayInput(input, gbt)) {
|
||||
return true;
|
||||
};
|
||||
|
||||
if( gbt == GameButtonType_Menu && input.type == IET_FIRST_PRESS )
|
||||
{
|
||||
@@ -3347,7 +3316,7 @@ void ScreenEdit::TransitionEditState( EditState em )
|
||||
case STATE_PLAYING:
|
||||
AdjustSync::HandleSongEnd();
|
||||
if (!GAMESTATE->m_bIsUsingStepTiming)
|
||||
GAMESTATE->m_pCurSteps[PLAYER_1]->m_Timing = backupStepTiming;
|
||||
GAMESTATE->m_pCurSteps[main_player_]->m_Timing = backupStepTiming;
|
||||
if( AdjustSync::IsSyncDataChanged() )
|
||||
ScreenSaveSync::PromptSaveSync();
|
||||
break;
|
||||
@@ -3374,12 +3343,14 @@ void ScreenEdit::TransitionEditState( EditState em )
|
||||
if( em != STATE_EDITING )
|
||||
{
|
||||
// Stop displaying course attacks, if any.
|
||||
GAMESTATE->m_pPlayerState[PLAYER_1]->RemoveActiveAttacks();
|
||||
// Load the player's default PlayerOptions.
|
||||
GAMESTATE->m_pPlayerState[PLAYER_1]->RebuildPlayerOptionsFromActiveAttacks();
|
||||
FOREACH_EnabledPlayer(pn) {
|
||||
GAMESTATE->m_pPlayerState[pn]->RemoveActiveAttacks();
|
||||
// Load the player's default PlayerOptions.
|
||||
GAMESTATE->m_pPlayerState[pn]->RebuildPlayerOptionsFromActiveAttacks();
|
||||
|
||||
// Snap to current options.
|
||||
GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.SetCurrentToLevel( ModsLevel_Stage );
|
||||
// Snap to current options.
|
||||
GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions.SetCurrentToLevel(ModsLevel_Stage);
|
||||
}
|
||||
}
|
||||
|
||||
switch( em )
|
||||
@@ -3413,8 +3384,8 @@ void ScreenEdit::TransitionEditState( EditState em )
|
||||
{
|
||||
// Substitute the song timing for the step timing during
|
||||
// preview if we're in song mode
|
||||
backupStepTiming = GAMESTATE->m_pCurSteps[PLAYER_1]->m_Timing;
|
||||
GAMESTATE->m_pCurSteps[PLAYER_1]->m_Timing.Clear();
|
||||
backupStepTiming = GAMESTATE->m_pCurSteps[main_player_]->m_Timing;
|
||||
GAMESTATE->m_pCurSteps[main_player_]->m_Timing.Clear();
|
||||
}
|
||||
|
||||
/* Reset the note skin, in case preferences have changed. */
|
||||
@@ -3434,28 +3405,25 @@ void ScreenEdit::TransitionEditState( EditState em )
|
||||
case STATE_PLAYING:
|
||||
// If we're in course display mode, set that up.
|
||||
SetupCourseAttacks();
|
||||
player_manager_.SetupAutoplay();
|
||||
player_manager_.ReloadNoteData(m_NoteDataEdit);
|
||||
|
||||
m_Player.Load( m_NoteDataEdit );
|
||||
|
||||
if( GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.GetCurrent().m_fPlayerAutoPlay != 0 )
|
||||
GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerController = PC_AUTOPLAY;
|
||||
else
|
||||
GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerController = GamePreferences::m_AutoPlay;
|
||||
|
||||
if( g_bEditorShowBGChangesPlay )
|
||||
if (g_bEditorShowBGChangesPlay)
|
||||
{
|
||||
/* FirstBeat affects backgrounds, so commit changes to memory (not to disk)
|
||||
* and recalc it. */
|
||||
Steps* pSteps = GAMESTATE->m_pCurSteps[PLAYER_1];
|
||||
ASSERT( pSteps != nullptr );
|
||||
pSteps->SetNoteData( m_NoteDataEdit );
|
||||
Steps* pSteps = GAMESTATE->m_pCurSteps[main_player_];
|
||||
ASSERT(pSteps != nullptr);
|
||||
pSteps->SetNoteData(m_NoteDataEdit);
|
||||
m_pSong->ReCalculateRadarValuesAndLastSecond();
|
||||
|
||||
// TODO: Background videos don't support seeking, when they do, make sure
|
||||
// to load the appropriate part of the video.
|
||||
m_Background.Unload();
|
||||
m_Background.LoadFromSong( m_pSong );
|
||||
m_Background.LoadFromSong(m_pSong);
|
||||
|
||||
m_Foreground.Unload();
|
||||
m_Foreground.LoadFromSong( m_pSong );
|
||||
m_Foreground.LoadFromSong(m_pSong);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -3489,7 +3457,8 @@ void ScreenEdit::TransitionEditState( EditState em )
|
||||
m_SnapDisplay.SetVisible( em == STATE_EDITING );
|
||||
m_NoteFieldEdit.SetVisible( em == STATE_EDITING );
|
||||
m_NoteFieldRecord.SetVisible( em == STATE_RECORDING || em == STATE_RECORDING_PAUSED );
|
||||
m_Player->SetVisible( em == STATE_PLAYING );
|
||||
|
||||
player_manager_.SetVisible(em == STATE_PLAYING);
|
||||
m_Foreground.SetVisible( g_bEditorShowBGChangesPlay && em != STATE_EDITING );
|
||||
|
||||
switch( em )
|
||||
@@ -3954,7 +3923,7 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM )
|
||||
{
|
||||
// The options may have changed the note skin.
|
||||
m_NoteFieldRecord.CacheAllUsedNoteSkins();
|
||||
m_Player->CacheAllUsedNoteSkins();
|
||||
player_manager_.CacheAllUsedNoteSkins();
|
||||
|
||||
// stop any music that screen may have been playing
|
||||
SOUND->StopMusic();
|
||||
@@ -4391,7 +4360,7 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM )
|
||||
for (Steps *s : apSteps)
|
||||
{
|
||||
// If we're not on the same style, let it go.
|
||||
if( GAMESTATE->m_pCurSteps[PLAYER_1]->m_StepsType != s->m_StepsType )
|
||||
if( GAMESTATE->m_pCurSteps[main_player_]->m_StepsType != s->m_StepsType )
|
||||
continue;
|
||||
// If autogenned, it isn't being saved.
|
||||
if( s->IsAutogen() )
|
||||
@@ -4411,8 +4380,8 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM )
|
||||
pSong->DeleteSteps( pSteps );
|
||||
if( m_pSteps == pSteps )
|
||||
m_pSteps = nullptr;
|
||||
if( GAMESTATE->m_pCurSteps[PLAYER_1].Get() == pSteps )
|
||||
GAMESTATE->m_pCurSteps[PLAYER_1].Set(nullptr);
|
||||
if( GAMESTATE->m_pCurSteps[main_player_].Get() == pSteps )
|
||||
GAMESTATE->m_pCurSteps[main_player_].Set(nullptr);
|
||||
}
|
||||
|
||||
|
||||
@@ -6164,13 +6133,14 @@ void ScreenEdit::SetupCourseAttacks()
|
||||
|
||||
void ScreenEdit::CopyToLastSave()
|
||||
{
|
||||
ASSERT( GAMESTATE->m_pCurSong != nullptr );
|
||||
ASSERT( GAMESTATE->m_pCurSteps[PLAYER_1] != nullptr );
|
||||
ASSERT(GAMESTATE->m_pCurSteps[main_player_] != nullptr);
|
||||
|
||||
m_SongLastSave = *GAMESTATE->m_pCurSong;
|
||||
m_vStepsLastSave.clear();
|
||||
const std::vector<Steps*> &vSteps = GAMESTATE->m_pCurSong->GetStepsByStepsType( GAMESTATE->m_pCurSteps[PLAYER_1]->m_StepsType );
|
||||
for (Steps *it : vSteps)
|
||||
m_vStepsLastSave.push_back( *it );
|
||||
const std::vector<Steps*>& vSteps = GAMESTATE->m_pCurSong->GetStepsByStepsType(GAMESTATE->m_pCurSteps[main_player_]->m_StepsType);
|
||||
for (Steps* it : vSteps) {
|
||||
m_vStepsLastSave.push_back(*it);
|
||||
}
|
||||
}
|
||||
|
||||
void ScreenEdit::CopyFromLastSave()
|
||||
@@ -6179,10 +6149,11 @@ void ScreenEdit::CopyFromLastSave()
|
||||
// 1) No steps can be created by ScreenEdit
|
||||
// 2) No steps can be deleted by ScreenEdit (except possibly when we exit)
|
||||
*GAMESTATE->m_pCurSong = m_SongLastSave;
|
||||
const std::vector<Steps*> &vSteps = GAMESTATE->m_pCurSong->GetStepsByStepsType( GAMESTATE->m_pCurSteps[PLAYER_1]->m_StepsType );
|
||||
ASSERT_M( vSteps.size() == m_vStepsLastSave.size(), ssprintf("Step sizes don't match: %d, %d", int(vSteps.size()), int(m_vStepsLastSave.size())) );
|
||||
for( unsigned i = 0; i < vSteps.size(); ++i )
|
||||
const std::vector<Steps*>& vSteps = GAMESTATE->m_pCurSong->GetStepsByStepsType(GAMESTATE->m_pCurSteps[main_player_]->m_StepsType);
|
||||
ASSERT_M(vSteps.size() == m_vStepsLastSave.size(), ssprintf("Step sizes don't match: %d, %d", int(vSteps.size()), int(m_vStepsLastSave.size())));
|
||||
for (unsigned i = 0; i < vSteps.size(); ++i) {
|
||||
*vSteps[i] = m_vStepsLastSave[i];
|
||||
}
|
||||
}
|
||||
|
||||
void ScreenEdit::RevertFromDisk()
|
||||
|
||||
Reference in New Issue
Block a user