Esempio n. 1
0
        private void SetPoemColour(On.Celeste.Poem.orig_ctor orig, Poem self, string text, int heartIndex, float heartAlpha)
        {
            var data = AreaData.Get((Engine.Scene as Level).Session.Area);
            var m    = GetModeMetaForAltSide(data);

            if (data != null)
            {
                Logger.Log("AltSidesHelper", $"Customising poem UI for \"{data.SID}\".");
            }
            if (!(m?.ShowHeartPoem) ?? false)
            {
                text = null;
            }
            orig(self, text, heartIndex, heartAlpha);
            // customize heart gem icon
            string animId = null;

            // our sprite ID will be "AltSidesHelper_<heart sprite path keyified>"
            // log duplicate entries for a map
            var   sid               = (Engine.Scene as Level).Session.Area.SID;
            Color?color             = null;
            AltSidesHelperMode mode = GetModeMetaForAltSide(AreaData.Get(sid));

            if (mode != null && mode.OverrideHeartTextures)
            {
                animId = mode.ChapterPanelHeartIcon.DialogKeyify();
                if (!mode.HeartColour.Equals(""))
                {
                    color = Calc.HexToColor(mode.HeartColour);
                }
            }

            if (animId != null)
            {
                if (HeartSpriteBank.Has(animId))
                {
                    HeartSpriteBank.CreateOn(self.Heart, animId);
                    self.Heart.Play("spin");
                    self.Heart.CenterOrigin();
                    Logger.Log("AltSidesHelper", $"Changed poem heart sprite for \"{data.SID}\".");
                }
            }
            if (color != null)
            {
                new DynData <Poem>(self)["Color"] = color;
                Logger.Log("AltSidesHelper", $"Changed poem colour for \"{data.SID}\".");
            }
        }
Esempio n. 2
0
 public void CopySettings(AltSidesHelperMode from)
 {
     if (string.IsNullOrEmpty(Label))
     {
         Label = from.Label;
     }
     if (string.IsNullOrEmpty(Icon))
     {
         Icon = from.Icon;
     }
     if (string.IsNullOrEmpty(DeathsIcon))
     {
         DeathsIcon = from.DeathsIcon;
     }
     if (string.IsNullOrEmpty(ChapterPanelHeartIcon))
     {
         ChapterPanelHeartIcon = from.ChapterPanelHeartIcon;
     }
     if (string.IsNullOrEmpty(InWorldHeartIcon))
     {
         InWorldHeartIcon = from.InWorldHeartIcon;
     }
     if (string.IsNullOrEmpty(JournalHeartIcon))
     {
         JournalHeartIcon = from.JournalHeartIcon;
     }
     if (string.IsNullOrEmpty(HeartColour))
     {
         HeartColour = from.HeartColour;
     }
     if (string.IsNullOrEmpty(EndScreenTitle))
     {
         EndScreenTitle = from.EndScreenTitle;
     }
     if (string.IsNullOrEmpty(EndScreenClearTitle))
     {
         EndScreenClearTitle = from.EndScreenClearTitle;
     }
     if (ShowHeartPoem == null)
     {
         ShowHeartPoem = from.ShowHeartPoem;
     }
     if (ShowBSideRemixIntro == null)
     {
         ShowBSideRemixIntro = from.ShowBSideRemixIntro;
     }
 }
Esempio n. 3
0
        private static void CustomizeCrystalHeart(OuiChapterPanel panel)
        {
            // customize heart gem icon
            string animId = null;

            // our sprite ID will be "AltSidesHelper_<heart sprite path keyified>"
            var data = AreaData.Get(panel.Area);
            AltSidesHelperMode mode = GetModeMetaForAltSide(data);

            if (mode != null)
            {
                Logger.Log("AltSidesHelper", $"Found meta for \"{data.SID}\" when customising UI heart.");
                if (mode.OverrideHeartTextures)
                {
                    animId = mode.ChapterPanelHeartIcon.DialogKeyify();
                    Logger.Log("AltSidesHelper", $"Will change UI heart sprite for \"{data.SID}\".");
                }
            }

            if (animId != null)
            {
                if (HeartSpriteBank.Has(animId))
                {
                    Logger.Log("AltSidesHelper", $"Replacing UI heart sprite for \"{data.SID}\".");
                    Sprite heartSprite = HeartSpriteBank.Create(animId);
                    var    selfdata    = new DynData <OuiChapterPanel>(panel);
                    var    oldheart    = selfdata.Get <HeartGemDisplay>("heart");
                    bool   prevVisible = oldheart.Sprites[0].Visible;
                    oldheart.Sprites[0] = heartSprite;
                    heartSprite.CenterOrigin();
                    heartSprite.Play("spin");
                    heartSprite.Visible      = prevVisible || oldheart.Sprites[1].Visible || oldheart.Sprites[2].Visible;
                    selfdata["AsHeartDirty"] = true;
                }
            }
        }
Esempio n. 4
0
        private static void AddExtraModes(OuiChapterPanel self)
        {
            // check map meta for extra sides or side overrides
            //AltSidesHelperMeta meta = new DynData<AreaData>(self.Data).Get<AltSidesHelperMeta>("AltSidesHelperMeta");
            AltSidesHelperMeta meta = GetMetaForAreaData(self.Data);            //AltSidesMetadata[self.Data];

            if (meta?.Sides != null)
            {
                Logger.Log("AltSidesHelper", $"Customising panel UI for \"{self.Data.SID}\".");
                bool[] unlockedSides  = new bool[meta.Sides.Count()];
                int    siblings       = ((IList)modesField.GetValue(self)).Count;
                int    oldModes       = siblings;
                bool   bsidesunlocked = !self.Data.Interlude_Safe && self.Data.HasMode(AreaMode.BSide) && (self.DisplayedStats.Cassette || ((SaveData.Instance.DebugMode || SaveData.Instance.CheatMode) && self.DisplayedStats.Cassette == self.RealStats.Cassette));
                bool   csidesunlocked = !self.Data.Interlude_Safe && self.Data.HasMode(AreaMode.CSide) && SaveData.Instance.UnlockedModes >= 3 && Celeste.Celeste.PlayMode != Celeste.Celeste.PlayModes.Event;
                // find the new total number of unlocked modes
                int unlockedModeCount = 0;
                // if this map has a C-Side, this is whether they have C-sides unlocked. else, if this map has a B-Sides, its whether they have a cassette. else, true.
                bool prevUnlocked = self.Data.HasMode(AreaMode.CSide) ? csidesunlocked : self.Data.HasMode(AreaMode.BSide) ? bsidesunlocked : true;
                // if this map has a C-Side, this is whether they've beaten it; else, if this map has a B-Side, its whether they've completed it; else, its whether they've completed the level.
                bool prevCompleted = self.Data.HasMode(AreaMode.CSide) ? SaveData.Instance.GetAreaStatsFor(self.Data.ToKey()).Modes[(int)AreaMode.CSide].Completed : self.Data.HasMode(AreaMode.BSide) ? SaveData.Instance.GetAreaStatsFor(self.Data.ToKey()).Modes[(int)AreaMode.BSide].Completed : SaveData.Instance.GetAreaStatsFor(self.Data.ToKey()).Modes[(int)AreaMode.Normal].Completed;
                for (int i1 = 0; i1 < meta.Sides.Length; i1++)
                {
                    AltSidesHelperMode mode = meta.Sides[i1];
                    if (!mode.OverrideVanillaSideData)
                    {
                        if ((mode.UnlockMode.Equals("consecutive") && prevCompleted) || (mode.UnlockMode.Equals("with_previous") && prevUnlocked) || (mode.UnlockMode.Equals("triggered") && AltSidesSaveData.UnlockedAltSideIDs.Contains(mode.Map)) || (mode.UnlockMode.Equals("c_sides_unlocked") && csidesunlocked) || mode.UnlockMode.Equals("always") || SaveData.Instance.DebugMode || SaveData.Instance.CheatMode)
                        {
                            unlockedModeCount++;
                            siblings++;
                            prevUnlocked      = true;
                            prevCompleted     = SaveData.Instance.GetAreaStatsFor(AreaData.Get(mode.Map).ToKey()).Modes[(int)AreaMode.Normal].Completed;
                            unlockedSides[i1] = true;
                        }
                        else
                        {
                            prevUnlocked      = prevCompleted = false;
                            unlockedSides[i1] = false;
                        }
                    }
                    else
                    {
                        unlockedSides[i1] = true;
                    }
                }
                // adjust the original options to fit, and attach the map path & mode to the original options
                int origMode = 0;
                foreach (var vmode in (IList)modesField.GetValue(self))
                {
                    DynamicData data = new DynamicData(vmode);
                    if (siblings > 5)
                    {
                        data.Set("Siblings", siblings);
                        data.Set("Large", false);
                    }
                    data.Set("AreaKey", self.Data.ToKey((AreaMode)origMode));
                    origMode++;
                }

                // apply mode settings
                int newSides = 0;
                for (int i = 0; i < meta.Sides.Length /*&& newSides < unlockedModes*/; i++)
                {
                    AltSidesHelperMode mode = meta.Sides[i];
                    // only add if its unlocked
                    if (unlockedSides[i])
                    {
                        if (!mode.OverrideVanillaSideData)
                        {
                            object newOptn;
                            ((IList)modesField.GetValue(self)).Add(
                                newOptn = DynamicData.New(t_OuiChapterPanelOption)(new {
                                Label    = Dialog.Clean(mode.Label),
                                Icon     = GFX.Gui[mode.Icon],
                                ID       = "AltSidesHelperMode_" + i.ToString(),
                                Siblings = siblings > 5 ? siblings : 0
                            })
                                );
                            DynamicData data = new DynamicData(newOptn);
                            AreaData    map  = null;
                            foreach (var area in AreaData.Areas)
                            {
                                if (area.SID.Equals(mode.Map))
                                {
                                    map = area;
                                }
                            }
                            data.Set("AreaKey", map.ToKey());
                            newSides++;
                            Logger.Log("AltSidesHelper", $"Added new side for \"{self.Data.SID}\".");
                        }
                        else
                        {
                            // find the a-side and modify it
                            DynamicData data = new DynamicData(((IList)modesField.GetValue(self))[0]);
                            data.Set("Label", Dialog.Clean(mode.Label));
                            data.Set("Icon", GFX.Gui[mode.Icon]);
                            Logger.Log("AltSidesHelper", $"Modifying A-Side data for \"{self.Data.SID}\".");
                        }
                    }
                }
            }

            int count = ((IList)modesField.GetValue(self)).Count;

            for (int i = 0; i < count; i++)
            {
                //DynamicData data = new DynamicData(((IList)modesField.GetValue(self))[i]);
                //data.Invoke("SlideTowards", count, i);
            }
        }