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}\"."); } }
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; } }
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; } } }
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); } }