diff --git a/AttractVideoPlayer/AttractVideoPlayer.csproj b/AttractVideoPlayer/AttractVideoPlayer.csproj
new file mode 100644
index 0000000..8343204
--- /dev/null
+++ b/AttractVideoPlayer/AttractVideoPlayer.csproj
@@ -0,0 +1,7 @@
+
+
+ Assembly-CSharp.AttractVideoPlayer.mm
+ Control attract video
+
+
+
\ 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..96b64e1
--- /dev/null
+++ b/AttractVideoPlayer/MU3.OperationManager/patch_OperationManager.cs
@@ -0,0 +1,45 @@
+using System;
+using System.Collections.ObjectModel;
+using System.IO;
+
+namespace MU3.Operation;
+
+class patch_OperationManager: OperationManager {
+ private static readonly string _fname = "data_advert_cache.txt";
+ private ReadOnlyCollection _movieDataList;
+ private int _movieIndex;
+
+ ~patch_OperationManager() {
+ try {
+ File.WriteAllText(_fname, _movieIndex.ToString());
+ } catch(Exception) {}
+ }
+ public int MovieIndex {
+ set {
+ _movieIndex = (value + _movieDataList.Count) % _movieDataList.Count;
+ }
+ get {
+ return _movieIndex;
+ }
+ }
+ public new MovieData movieData {
+ get {
+ if(_movieDataList.Count > 0) {
+ return _movieDataList[_movieIndex];
+ }
+ return null;
+ }
+ }
+
+ public extern void orig_initialize();
+
+ public new void initialize() {
+ orig_initialize();
+ try {
+ _movieIndex = Math.Max(0, int.Parse(File.ReadAllText(_fname)));
+ } catch(Exception) {
+ _movieIndex = 0;
+ }
+
+ }
+}
\ 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..ed96a89
--- /dev/null
+++ b/AttractVideoPlayer/MU3.Sequence/patch_Advertise.cs
@@ -0,0 +1,20 @@
+using MU3.Util;
+
+namespace MU3.Sequence;
+
+class patch_Advertise: Advertise {
+ // Exclude Back/Left/Right
+ private bool anyKeyDown() {
+ UIInput instance = Singleton.instance;
+ if(instance.getTriggerOn(UIInput.Key.Decision)
+ || instance.getTriggerOn(UIInput.Key.OptionBackward)
+ || instance.getTriggerOn(UIInput.Key.OptionForward)
+ || instance.getTriggerOn(UIInput.Key.SkipLeft)
+ || instance.getTriggerOn(UIInput.Key.SkipRight)
+ || instance.getTriggerOn(UIInput.Key.MenuLeft)
+ || instance.getTriggerOn(UIInput.Key.MenuRight)) {
+ 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..67708c5
--- /dev/null
+++ b/AttractVideoPlayer/MU3/patch_AdvManager.cs
@@ -0,0 +1,35 @@
+using MU3.Operation;
+using MU3.Util;
+using UnityEngine;
+
+namespace MU3;
+
+class patch_AdvManager: AdvManager {
+ private GameObject objMovie;
+ private CriManaMovieMaterial movieController;
+
+ private extern bool orig_exec();
+ public new bool exec() {
+ if(movieController?.player?.status == CriMana.Player.Status.Playing) {
+ if(Singleton.instance.getTriggerOn(UIInput.Key.Service)) {
+ movieController.player.Pause(!movieController.player.IsPaused());
+ } else if(Singleton.instance.getTriggerOn(UIInput.Key.L2)) {
+ addMovieOffset(-1);
+ } else if(Singleton.instance.getTriggerOn(UIInput.Key.L3)) {
+ addMovieOffset(1);
+ }
+ }
+
+ return orig_exec();
+ }
+ public void addMovieOffset(int offset) {
+ var om = (patch_OperationManager)Singleton.instance;
+ om.MovieIndex += offset;
+
+ 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