@@ -86,6 +86,7 @@ public static List<CreditsTag> Parse(string dialog) {
8686 private static SceneWrappingEntity < Overworld > overworldWrapper ;
8787
8888 public static SpriteBank HeartSpriteBank ;
89+ private static Dictionary < string , string > OverrideHeartSpriteIDs = new Dictionary < string , string > ( ) ;
8990
9091 private static AreaKey ? lastArea ;
9192
@@ -458,6 +459,17 @@ private static void customizeCrystalHeart(OuiChapterPanel panel) {
458459 }
459460 }
460461
462+ private static string mapSideName ( string mapSID , AreaMode side ) {
463+ string sideName = mapSID . DialogKeyify ( ) ;
464+ if ( side == AreaMode . BSide ) {
465+ sideName += "_B" ;
466+ } else if ( side == AreaMode . CSide ) {
467+ sideName += "_C" ;
468+ }
469+
470+ return sideName ;
471+ }
472+
461473 /// <summary>
462474 /// Returns the GUI heart sprite ID (for display in the chapter panel) matching the given map and side, to read from the HeartSpriteBank.
463475 /// </summary>
@@ -466,15 +478,12 @@ private static void customizeCrystalHeart(OuiChapterPanel panel) {
466478 /// <returns>The sprite ID to pass to HeartSpriteBank.Create to get the custom heart sprite, or null if none was found</returns>
467479 public static string GetGuiHeartSpriteId ( string mapSID , AreaMode side ) {
468480 string mapLevelSet = AreaData . Get ( mapSID ) ? . LevelSet . DialogKeyify ( ) ;
481+ string sideName = mapSideName ( mapSID , side ) ;
469482
470- string sideName = mapSID . DialogKeyify ( ) ;
471- if ( side == AreaMode . BSide ) {
472- sideName += "_B" ;
473- } else if ( side == AreaMode . CSide ) {
474- sideName += "_C" ;
475- }
476-
477- if ( HeartSpriteBank . Has ( "crystalHeart_" + sideName ) ) {
483+ if ( OverrideHeartSpriteIDs . TryGetValue ( sideName , out string spriteID ) && HeartSpriteBank . Has ( spriteID ) ) {
484+ // this map has an override custom heart registered: use it.
485+ return spriteID ;
486+ } else if ( HeartSpriteBank . Has ( "crystalHeart_" + sideName ) ) {
478487 // this map has a custom heart registered: use it.
479488 return "crystalHeart_" + sideName ;
480489 } else if ( HeartSpriteBank . Has ( "crystalHeart_" + mapLevelSet ) ) {
@@ -485,6 +494,34 @@ public static string GetGuiHeartSpriteId(string mapSID, AreaMode side) {
485494 return null ;
486495 }
487496
497+ /// <summary>
498+ /// Adds an override heart sprite ID to use for a given map.
499+ /// Useful when lots of heart sprites need to be overridden and replacing all of those manually in the sprite swap XML is too tedious.
500+ /// </summary>
501+ /// <param name="mapSID">The map SID to override the heart sprite for</param>
502+ /// <param name="side">The side to override the heart sprite for</param>
503+ /// <param name="spriteID">The sprite ID to override the map's heart with</param>
504+ public static void AddOverrideHeartSpriteID ( string mapSID , AreaMode side , string spriteID ) {
505+ string sideName = mapSideName ( mapSID , side ) ;
506+
507+ if ( OverrideHeartSpriteIDs . TryGetValue ( sideName , out _ ) )
508+ OverrideHeartSpriteIDs [ sideName ] = spriteID ;
509+ else
510+ OverrideHeartSpriteIDs . Add ( sideName , spriteID ) ;
511+ }
512+
513+ /// <summary>
514+ /// Removes the override heart sprite ID for a given map.
515+ /// </summary>
516+ /// <param name="mapSID">The map SID to remove the override for</param>
517+ /// <param name="side">The side to remove the override for</param>
518+ public static void RemoveOverrideHeartSpriteID ( string mapSID , AreaMode side ) {
519+ string sideName = mapSideName ( mapSID , side ) ;
520+
521+ if ( OverrideHeartSpriteIDs . TryGetValue ( sideName , out _ ) )
522+ OverrideHeartSpriteIDs . Remove ( sideName ) ;
523+ }
524+
488525 // AltSidesHelper does very similar stuff to us, and we want to override what it does if the XMLs are asking for it.
489526 private static void resetCrystalHeartAfterAltSidesHelper ( Action < OuiChapterPanel > orig , OuiChapterPanel panel ) {
490527 orig ( panel ) ;
@@ -1268,6 +1305,12 @@ private static class ModExports {
12681305 public static SpriteBank GetHeartSpriteBank ( ) {
12691306 return HeartSpriteBank ;
12701307 }
1308+ public static void AddOverrideHeartSpriteID ( string mapSID , AreaMode side , string spriteID ) {
1309+ InGameOverworldHelper . AddOverrideHeartSpriteID ( mapSID , side , spriteID ) ;
1310+ }
1311+ public static void RemoveOverrideHeartSpriteID ( string mapSID , AreaMode side , string spriteID ) {
1312+ InGameOverworldHelper . RemoveOverrideHeartSpriteID ( mapSID , side ) ;
1313+ }
12711314 public static string GetGuiHeartSpriteId ( string mapSID , AreaMode side ) {
12721315 return InGameOverworldHelper . GetGuiHeartSpriteId ( mapSID , side ) ;
12731316 }
0 commit comments