public override void LoadContent(bool firstLoad) { base.LoadContent(firstLoad); SpriteBank = new SpriteBank(GFX.Game, "Graphics/EtherHelper/Sprites.xml"); }
public void ctor(Session session, Vector2?startPosition = default(Vector2?)) { if (CoreModule.Settings.LazyLoading) { MainThreadHelper.Do(() => VirtualContentExt.UnloadOverworld()); } // Vanilla TileToIndex mappings. SurfaceIndex.TileToIndex = new Dictionary <char, int> { { '1', 3 }, { '3', 4 }, { '4', 7 }, { '5', 8 }, { '6', 8 }, { '7', 8 }, { '8', 8 }, { '9', 13 }, { 'a', 8 }, { 'b', 23 }, { 'c', 8 }, { 'd', 8 }, { 'e', 8 }, { 'f', 8 }, { 'g', 8 }, { 'h', 33 }, { 'i', 4 }, { 'j', 8 }, { 'k', 3 }, { 'l', 25 }, { 'm', 44 }, { 'n', 40 }, { 'o', 43 } }; AreaData area = AreaData.Get(session); MapMeta meta = area.GetMeta(); string path; path = meta?.BackgroundTiles; if (string.IsNullOrEmpty(path)) { path = Path.Combine("Graphics", "BackgroundTiles.xml"); } GFX.BGAutotiler = new Autotiler(path); path = meta?.ForegroundTiles; if (string.IsNullOrEmpty(path)) { path = Path.Combine("Graphics", "ForegroundTiles.xml"); } GFX.FGAutotiler = new Autotiler(path); path = meta?.AnimatedTiles; if (string.IsNullOrEmpty(path)) { path = Path.Combine("Graphics", "AnimatedTiles.xml"); } GFX.AnimatedTilesBank = new AnimatedTilesBank(); XmlElement animatedData = Calc.LoadContentXML(path)["Data"]; foreach (XmlElement el in animatedData) { if (el != null) { GFX.AnimatedTilesBank.Add( el.Attr("name"), el.AttrFloat("delay", 0f), el.AttrVector2("posX", "posY", Vector2.Zero), el.AttrVector2("origX", "origY", Vector2.Zero), GFX.Game.GetAtlasSubtextures(el.Attr("path")) ); } } GFX.SpriteBank = new SpriteBank(GFX.Game, Path.Combine("Graphics", "Sprites.xml")); path = meta?.Sprites; if (!string.IsNullOrEmpty(path)) { SpriteBank bankOrig = GFX.SpriteBank; SpriteBank bankMod = new SpriteBank(GFX.Game, path); foreach (KeyValuePair <string, SpriteData> kvpBank in bankMod.SpriteData) { string key = kvpBank.Key; SpriteData valueMod = kvpBank.Value; if (bankOrig.SpriteData.TryGetValue(key, out SpriteData valueOrig)) { IDictionary animsOrig = valueOrig.Sprite.GetAnimations(); IDictionary animsMod = valueMod.Sprite.GetAnimations(); foreach (DictionaryEntry kvpAnim in animsMod) { animsOrig[kvpAnim.Key] = kvpAnim.Value; } valueOrig.Sources.AddRange(valueMod.Sources); } else { bankOrig.SpriteData[key] = valueMod; } } } // This is done exactly once in the vanilla GFX.LoadData method. PlayerSprite.ClearFramesMetadata(); PlayerSprite.CreateFramesMetadata("player"); PlayerSprite.CreateFramesMetadata("player_no_backpack"); PlayerSprite.CreateFramesMetadata("badeline"); PlayerSprite.CreateFramesMetadata("player_badeline"); PlayerSprite.CreateFramesMetadata("player_playback"); path = meta?.Portraits; if (string.IsNullOrEmpty(path)) { path = Path.Combine("Graphics", "Portraits.xml"); } GFX.PortraitsSpriteBank = new SpriteBank(GFX.Portraits, path); orig_ctor(session, startPosition); }
private void PostAreaLoad(On.Celeste.AreaData.orig_Load orig) { orig(); var heartTextures = new HashSet <string>(); int altsides = 0; foreach (var map in AreaData.Areas) { // Load "mapdir/mapname.altsideshelper.meta.yaml" as a AltSidesHelperMeta AltSidesHelperMeta meta; if (Everest.Content.TryGet("Maps/" + map.Mode[0].Path + ".altsideshelper.meta", out ModAsset metadata) && metadata.TryDeserialize(out meta)) { foreach (var mode in meta.Sides) { mode.ApplyPreset(); altsides++; heartTextures.Add(mode.ChapterPanelHeartIcon); } // Attach the meta to the AreaData w/ DynData DynData <AreaData> areaDynData = new DynData <AreaData>(map); areaDynData["AltSidesHelperMeta"] = meta; if (meta.AltSideData.IsAltSide) { var aside = AreaData.Get(meta.AltSideData.For); if (meta.AltSideData.CopyEndScreenData) { map.Meta.CompleteScreen = aside.Meta.CompleteScreen; } map.Meta.Mountain = aside.Meta.Mountain; map.MountainCursor = aside.MountainCursor; map.MountainCursorScale = aside.MountainCursorScale; map.MountainIdle = aside.MountainIdle; map.MountainSelect = aside.MountainSelect; map.MountainState = aside.MountainState; map.MountainZoom = aside.MountainZoom; } } } Logger.Log("AltSidesHelper", $"Loaded {altsides} alt-sides!"); SpriteBank crystalHeartSwaps = new SpriteBank(GFX.Gui, "Graphics/AltSidesHelper/Empty.xml"); // TODO: allow using XMLs too - load them and copy them in Dictionary <string, Sprite> sprites = new Dictionary <string, Sprite>(); foreach (var heart in heartTextures) { // our sprite ID will be "<heart sprite path keyified>" // we're talking along the lines of "collectables/heartgem/0/spin" // use the last part of the name as the loop paths, and the rest as element path var parts = heart.Split('/'); var loopPath = parts[parts.Length - 1]; string elemPath = heart.Substring(0, heart.Length - loopPath.Length); var sprite = new Sprite(GFX.Gui, elemPath); sprite.AddLoop("idle", loopPath, 0, new int[] { 0 }); sprite.AddLoop("spin", loopPath, 0.08f, new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); sprite.AddLoop("fastspin", loopPath, 0.08f, new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); sprite.Play("idle"); sprite.CenterOrigin(); sprites.Add(heart.DialogKeyify(), sprite); } int hearts = 0; foreach (var kvp in sprites) { hearts++; crystalHeartSwaps.SpriteData[kvp.Key] = new SpriteData(GFX.Gui) { Sprite = kvp.Value }; } HeartSpriteBank = crystalHeartSwaps; Logger.Log("AltSidesHelper", $"Loaded {hearts} crystal heart UI textures."); }