diff --git a/AttractVideoPlayer/AttractVideoPlayer.csproj b/AttractVideoPlayer/AttractVideoPlayer.csproj
new file mode 100644
index 0000000..579a70e
--- /dev/null
+++ b/AttractVideoPlayer/AttractVideoPlayer.csproj
@@ -0,0 +1,13 @@
+
+
+ Assembly-CSharp.AttractVideoPlayer.mm
+ Control attract video
+
+
+
+
+ 2.0
+ {6889330F-2E7E-4778-ADFF-70AF036F1BD5}
+
+
+
\ No newline at end of file
diff --git a/AttractVideoPlayer/MU3.OperationManager/patch_OperationManager.cs b/AttractVideoPlayer/MU3.OperationManager/patch_OperationManager.cs
new file mode 100644
index 0000000..4864ed1
--- /dev/null
+++ b/AttractVideoPlayer/MU3.OperationManager/patch_OperationManager.cs
@@ -0,0 +1,54 @@
+using MU3.Operation;
+using MU3.SceneObject;
+using MU3.Sequence;
+using MU3.Util;
+using System.Collections.ObjectModel;
+using UnityEngine;
+
+namespace MU3.Operation;
+
+class patch_OperationManager: OperationManager
+{
+ private static readonly string CurrentSongIndexFilePath = "BepInEx/monomod/AttractVideoPlayer.currentSongIndex.txt";
+ private ReadOnlyCollection _movieDataList;
+ public new MovieData movieData
+ {
+ get
+ {
+ if (_movieDataList.Count > 0)
+ {
+ int currentSongIndex = 0;
+ try
+ {
+ currentSongIndex = int.Parse(System.IO.File.ReadAllText(CurrentSongIndexFilePath));
+ }
+ catch (System.Exception)
+ {
+ saveCurrentSongIndex(0);
+ }
+
+ if (currentSongIndex < 0)
+ {
+ currentSongIndex = _movieDataList.Count - 1;
+ saveCurrentSongIndex(currentSongIndex);
+ }
+
+ if (currentSongIndex >= _movieDataList.Count)
+ {
+ currentSongIndex = 0;
+ saveCurrentSongIndex(currentSongIndex);
+ }
+
+ Debug.Log("currentSongIndex: " + currentSongIndex);
+
+ return _movieDataList[currentSongIndex];
+ }
+ return null;
+ }
+ }
+
+ private void saveCurrentSongIndex(int currentSongIndex)
+ {
+ System.IO.File.WriteAllText(CurrentSongIndexFilePath, currentSongIndex.ToString());
+ }
+}
\ No newline at end of file
diff --git a/AttractVideoPlayer/MU3.Sequence/patch_Advertise.cs b/AttractVideoPlayer/MU3.Sequence/patch_Advertise.cs
new file mode 100644
index 0000000..cdac034
--- /dev/null
+++ b/AttractVideoPlayer/MU3.Sequence/patch_Advertise.cs
@@ -0,0 +1,28 @@
+using Mono.Cecil;
+using MU3.AM;
+using MU3.Operation;
+using MU3.SceneObject;
+using MU3.Sequence;
+using MU3.Util;
+using UnityEngine;
+
+namespace MU3.Sequence;
+
+class patch_Advertise : Advertise
+{
+ private bool checkButtonOrAime()
+ {
+ if (SingletonStateMachine.instance.aimeReader.advCheck())
+ {
+ Singleton.instance.loginType = OperationManager.LoginType.Aime;
+ return true;
+ }
+ UIInput instance = Singleton.instance;
+ if (instance.getTriggerOn(UIInput.Key.Decision) || instance.getTriggerOn(UIInput.Key.OptionBackward) || instance.getTriggerOn(UIInput.Key.OptionForward) || instance.getTriggerOn(UIInput.Key.SkipRight) || instance.getTriggerOn(UIInput.Key.MenuLeft) || instance.getTriggerOn(UIInput.Key.MenuRight))
+ {
+ Singleton.instance.loginType = OperationManager.LoginType.Button;
+ return true;
+ }
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/AttractVideoPlayer/MU3/patch_AdvManager.cs b/AttractVideoPlayer/MU3/patch_AdvManager.cs
new file mode 100644
index 0000000..c2a5fe6
--- /dev/null
+++ b/AttractVideoPlayer/MU3/patch_AdvManager.cs
@@ -0,0 +1,66 @@
+using Mono.Cecil;
+using MU3.Operation;
+using MU3.SceneObject;
+using MU3.Sequence;
+using MU3.Util;
+using UnityEngine;
+
+namespace MU3;
+
+class patch_AdvManager : AdvManager
+{
+ private static readonly string CurrentSongIndexFilePath = "BepInEx/monomod/AttractVideoPlayer.currentSongIndex.txt";
+ private static readonly float DelayBetweenButtonPress = 0.5f;
+ private float lastButtonPressedTime = 0f;
+
+ private GameObject objMovie;
+ private CriManaMovieMaterial movieController;
+ private extern bool orig_initMovie();
+ public new bool initMovie()
+ {
+ return orig_initMovie();
+ }
+
+ private extern bool orig_exec();
+ public new bool exec()
+ {
+ if (Time.time - lastButtonPressedTime > DelayBetweenButtonPress)
+ {
+ if (Singleton.instance.getStateOn(UIInput.Key.Service))
+ {
+ lastButtonPressedTime = Time.time;
+
+ movieController?.player.Pause(!movieController.player.IsPaused());
+ }
+ else if (Singleton.instance.getStateOn(UIInput.Key.L2))
+ {
+ lastButtonPressedTime = Time.time;
+
+ addOffsetToCurrentSongIndexAndPlayMovie(-1);
+ }
+ else if (Singleton.instance.getStateOn(UIInput.Key.L3))
+ {
+ lastButtonPressedTime = Time.time;
+
+ addOffsetToCurrentSongIndexAndPlayMovie(1);
+ }
+ }
+
+ return orig_exec();
+ }
+ public void addOffsetToCurrentSongIndexAndPlayMovie(int offset)
+ {
+ try
+ {
+ int currentSongIndex = int.Parse(System.IO.File.ReadAllText(CurrentSongIndexFilePath)) + offset;
+ System.IO.File.WriteAllText(CurrentSongIndexFilePath, currentSongIndex.ToString());
+ }
+ catch (System.Exception) { }
+
+ movieController?.Stop();
+ Utility.destroyGameObject(ref movieController);
+ Utility.destroyGameObject(ref objMovie);
+
+ initMovie();
+ }
+}
\ No newline at end of file
diff --git a/Mu3Mods.sln b/Mu3Mods.sln
index 1e8bb06..9c71b3d 100644
--- a/Mu3Mods.sln
+++ b/Mu3Mods.sln
@@ -39,6 +39,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnlockMemoryChapters", "Unl
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PlatinumTiming", "PlatinumTiming\PlatinumTiming.csproj", "{099AD6AF-181A-4745-88C4-1D0466BECCB1}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AttractVideoPlayer", "AttractVideoPlayer\AttractVideoPlayer.csproj", "{6889330F-2E7E-4778-ADFF-70AF036F1BD5}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
@@ -117,6 +119,10 @@ Global
{099AD6AF-181A-4745-88C4-1D0466BECCB1}.Debug|x64.Build.0 = Debug|x64
{099AD6AF-181A-4745-88C4-1D0466BECCB1}.Release|x64.ActiveCfg = Release|x64
{099AD6AF-181A-4745-88C4-1D0466BECCB1}.Release|x64.Build.0 = Release|x64
+ {6889330F-2E7E-4778-ADFF-70AF036F1BD5}.Debug|x64.ActiveCfg = Debug|x64
+ {6889330F-2E7E-4778-ADFF-70AF036F1BD5}.Debug|x64.Build.0 = Debug|x64
+ {6889330F-2E7E-4778-ADFF-70AF036F1BD5}.Release|x64.ActiveCfg = Release|x64
+ {6889330F-2E7E-4778-ADFF-70AF036F1BD5}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE