From a9af62878ddb3603b5344189ae7bd864b6b854ac Mon Sep 17 00:00:00 2001 From: FreezeDriedMangoes Date: Sun, 22 May 2022 09:48:25 -0400 Subject: [PATCH] feat: added SubtitleHandler to allow mods to add custom subtitles --- .../External/Configs/StarSystemConfig.cs | 2 + NewHorizons/Handlers/SubtitlesHandler.cs | 109 ++++++++++++++++++ NewHorizons/Handlers/TitleSceneHandler.cs | 6 + NewHorizons/Main.cs | 6 + 4 files changed, 123 insertions(+) create mode 100644 NewHorizons/Handlers/SubtitlesHandler.cs diff --git a/NewHorizons/External/Configs/StarSystemConfig.cs b/NewHorizons/External/Configs/StarSystemConfig.cs index 196bc7b6..22201a15 100644 --- a/NewHorizons/External/Configs/StarSystemConfig.cs +++ b/NewHorizons/External/Configs/StarSystemConfig.cs @@ -4,6 +4,8 @@ namespace NewHorizons.External.Configs { public class StarSystemConfig { + public string subtitleFilepath; + [DefaultValue(true)] public bool canEnterViaWarpDrive = true; [DefaultValue(true)] public bool enableTimeLoop = true; [DefaultValue(true)] public bool destroyStockPlanets = true; diff --git a/NewHorizons/Handlers/SubtitlesHandler.cs b/NewHorizons/Handlers/SubtitlesHandler.cs new file mode 100644 index 00000000..a7966fd1 --- /dev/null +++ b/NewHorizons/Handlers/SubtitlesHandler.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using UnityEngine.InputSystem; +using UnityEngine.UI; +using NewHorizons.Utility; +using OWML.Common; + +namespace NewHorizons.Handlers +{ + class SubtitlesHandler : MonoBehaviour + { + public static int SUBTITLE_HEIGHT = 97; + public static int SUBTITLE_WIDTH = 669; // nice + + Graphic graphic; + Image image; + + public float fadeSpeed = 0.01f; + float fade = 1; + bool fadingAway = true; + + static List possibleSubtitles = new List(); + static bool eoteSubtitleHasBeenInserted = false; + int subtitleIndex; + + System.Random randomizer; + + public void Start() + { + randomizer = new System.Random(); + + graphic = GetComponent(); + image = GetComponent(); + + if (!eoteSubtitleHasBeenInserted) + { + possibleSubtitles.Insert(0, image.sprite); // ensure that the Echoes of the Eye subtitle always appears first + eoteSubtitleHasBeenInserted = true; + } + } + + public static void AddSubtitle(IModBehaviour mod, string filepath) + { + + var tex = ImageUtilities.GetTexture(mod, filepath); + if (tex == null) return; + + // var sprite = Sprite.Create(tex, new Rect(0.0f, 0.0f, tex.width, tex.height), new Vector2(0.5f, 0.5f), 100.0f); + var sprite = Sprite.Create(tex, new Rect(0.0f, 0.0f, tex.width, SUBTITLE_HEIGHT), new Vector2(0.5f, 0.5f), 100.0f); + AddSubtitle(sprite); + } + + public static void AddSubtitle(Sprite sprite) + { + possibleSubtitles.Add(sprite); + } + + public void Update() + { + if (fadingAway) + { + fade -= fadeSpeed; + + if (fade <= 0) + { + fade = 0; + ChangeSubtitle(); + fadingAway = false; + } + } + else + { + fade += fadeSpeed; + + if (fade >= 1) + { + fade = 1; + fadingAway = true; + } + } + + graphic.color = new Color(1, 1, 1, fade); + } + + public void ChangeSubtitle() + { + // to pick a new random subtitle without requiring retries, we generate a random offset less than the length of the possible subtitles array + // we then add that offset to the current index, modulo NUMBER_OF_POSSIBLE_SUBTITLES + // since the offset can never be NUMBER_OF_POSSIBLE_SUBTITLES, it will never wrap all the way back around to the initial subtitleIndex + + // note, this makes the code more confusing, but Random.Next(min, max) generates a random number on the range [min, max) + // that is, the below code will generate numbers up to and including Count-1, not Count. + var newIndexOffset = randomizer.Next(1, possibleSubtitles.Count); + subtitleIndex = (subtitleIndex % newIndexOffset) % possibleSubtitles.Count; + + image.sprite = possibleSubtitles[subtitleIndex]; + } + } +} diff --git a/NewHorizons/Handlers/TitleSceneHandler.cs b/NewHorizons/Handlers/TitleSceneHandler.cs index f0e82aa0..2b8d0740 100644 --- a/NewHorizons/Handlers/TitleSceneHandler.cs +++ b/NewHorizons/Handlers/TitleSceneHandler.cs @@ -11,6 +11,12 @@ namespace NewHorizons.Handlers { public static class TitleSceneHandler { + public static void InitSubtitles() + { + GameObject subtitleContainer = GameObject.Find("TitleMenu/TitleCanvas/TitleLayoutGroup/Logo_EchoesOfTheEye"); + subtitleContainer.AddComponent(); + } + public static void DisplayBodyOnTitleScreen(List bodies) { //Try loading one planet why not diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index a1203e28..860117e8 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -199,6 +199,7 @@ namespace NewHorizons if (scene.name == "TitleScreen" && _useCustomTitleScreen) { TitleSceneHandler.DisplayBodyOnTitleScreen(BodyDict.Values.ToList().SelectMany(x => x).ToList()); + TitleSceneHandler.InitSubtitles(); } if (scene.name == "EyeOfTheUniverse" && IsWarping) @@ -313,6 +314,11 @@ namespace NewHorizons if (name != "SolarSystem") SetDefaultSystem(name); } + if (starSystemConfig.subtitleFilepath != null) + { + SubtitlesHandler.AddSubtitle(mod, starSystemConfig.subtitleFilepath); + } + var system = new NewHorizonsSystem(name, starSystemConfig, mod); SystemDict[name] = system; }