Skip to content

Commit 8a25456

Browse files
committed
Make absolutely sure that Replays don't mess up mods & noteskins
1 parent 3a3602d commit 8a25456

File tree

4 files changed

+36
-6
lines changed

4 files changed

+36
-6
lines changed

src/Etterna/Models/Misc/PlayerAI.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ float PlayerAI::replayRate = 1.f;
1818
RString PlayerAI::replayModifiers = "";
1919
RString PlayerAI::oldModifiers = "";
2020
float PlayerAI::oldRate = 1.f;
21+
RString PlayerAI::oldNoteskin = "";
2122

2223
TapNoteScore
2324
PlayerAI::GetTapNoteScore(const PlayerState* pPlayerState)
@@ -73,6 +74,7 @@ PlayerAI::ResetScoreData()
7374
replayModifiers.clear();
7475
oldModifiers.clear();
7576
oldRate = 1.f;
77+
oldNoteskin.clear();
7678
}
7779

7880
void

src/Etterna/Models/Misc/PlayerAI.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class PlayerAI
5353

5454
static RString oldModifiers;
5555
static RString replayModifiers;
56+
static RString oldNoteskin;
5657
static float replayRate;
5758
static float oldRate;
5859

src/Etterna/Screen/Gameplay/ScreenGameplayReplay.cpp

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,6 @@ ScreenGameplayReplay::ScreenGameplayReplay()
4444
ASSERT_M(PlayerAI::pScoreData != nullptr,
4545
"Replay Highscore Info was empty.");
4646

47-
// Save current noteskin
48-
auto ns =
49-
GAMESTATE->m_pPlayerState->m_PlayerOptions.GetPreferred().m_sNoteSkin;
50-
5147
// Set up rate
5248
GAMESTATE->m_SongOptions.GetPreferred().m_fMusicRate = PlayerAI::replayRate;
5349

@@ -56,10 +52,22 @@ ScreenGameplayReplay::ScreenGameplayReplay()
5652
GAMESTATE->m_pPlayerState->m_PlayerOptions.Init();
5753
GAMESTATE->m_pPlayerState->m_PlayerOptions.GetPreferred().FromString(
5854
PlayerAI::replayModifiers);
55+
GAMESTATE->m_pPlayerState->m_PlayerOptions.GetCurrent().FromString(
56+
PlayerAI::replayModifiers);
57+
GAMESTATE->m_pPlayerState->m_PlayerOptions.GetSong().FromString(
58+
PlayerAI::replayModifiers);
59+
GAMESTATE->m_pPlayerState->m_PlayerOptions.GetStage().FromString(
60+
PlayerAI::replayModifiers);
5961

6062
// Undo noteskin change
61-
GAMESTATE->m_pPlayerState->m_PlayerOptions.GetPreferred()
62-
.FromOneModString(ns, RString());
63+
GAMESTATE->m_pPlayerState->m_PlayerOptions.GetPreferred().m_sNoteSkin =
64+
PlayerAI::oldNoteskin;
65+
GAMESTATE->m_pPlayerState->m_PlayerOptions.GetCurrent().m_sNoteSkin =
66+
PlayerAI::oldNoteskin;
67+
GAMESTATE->m_pPlayerState->m_PlayerOptions.GetSong().m_sNoteSkin =
68+
PlayerAI::oldNoteskin;
69+
GAMESTATE->m_pPlayerState->m_PlayerOptions.GetStage().m_sNoteSkin =
70+
PlayerAI::oldNoteskin;
6371
}
6472
}
6573

@@ -81,6 +89,20 @@ ScreenGameplayReplay::~ScreenGameplayReplay()
8189
GAMESTATE->m_pPlayerState->m_PlayerOptions.Init();
8290
GAMESTATE->m_pPlayerState->m_PlayerOptions.GetPreferred()
8391
.FromString(PlayerAI::oldModifiers);
92+
GAMESTATE->m_pPlayerState->m_PlayerOptions.GetCurrent().FromString(
93+
PlayerAI::oldModifiers);
94+
GAMESTATE->m_pPlayerState->m_PlayerOptions.GetSong().FromString(
95+
PlayerAI::oldModifiers);
96+
GAMESTATE->m_pPlayerState->m_PlayerOptions.GetStage().FromString(
97+
PlayerAI::oldModifiers);
98+
GAMESTATE->m_pPlayerState->m_PlayerOptions.GetPreferred()
99+
.m_sNoteSkin = PlayerAI::oldNoteskin;
100+
GAMESTATE->m_pPlayerState->m_PlayerOptions.GetCurrent()
101+
.m_sNoteSkin = PlayerAI::oldNoteskin;
102+
GAMESTATE->m_pPlayerState->m_PlayerOptions.GetSong().m_sNoteSkin =
103+
PlayerAI::oldNoteskin;
104+
GAMESTATE->m_pPlayerState->m_PlayerOptions.GetStage().m_sNoteSkin =
105+
PlayerAI::oldNoteskin;
84106
}
85107
GAMESTATE->m_SongOptions.Init();
86108
GAMESTATE->m_SongOptions.GetPreferred().m_fMusicRate =

src/Etterna/Screen/Others/ScreenSelectMusic.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1701,6 +1701,11 @@ class LunaScreenSelectMusic : public Luna<ScreenSelectMusic>
17011701
PlayerAI::replayRate = scoreRate;
17021702
PlayerAI::oldModifiers = oldMods;
17031703
PlayerAI::oldRate = oldRate;
1704+
auto ns =
1705+
GAMESTATE->m_pPlayerState->m_PlayerOptions.GetPreferred().m_sNoteSkin;
1706+
if (ns.empty())
1707+
ns = CommonMetrics::DEFAULT_NOTESKIN_NAME;
1708+
PlayerAI::oldNoteskin = ns;
17041709

17051710
// set mods based on the score, hopefully
17061711
// it is known that xmod->cmod and back does not work most of the time.

0 commit comments

Comments
 (0)