79 lines
1.7 KiB
C#
79 lines
1.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public enum VisualTheme
|
|
{
|
|
Default,
|
|
EyeComfort
|
|
}
|
|
|
|
[Serializable]
|
|
public class VisualSpriteVariantPair
|
|
{
|
|
public string Group;
|
|
public Sprite Source;
|
|
public Sprite EyeComfort;
|
|
}
|
|
|
|
[CreateAssetMenu(fileName = "VisualSpriteVariantMap", menuName = "TH1 Game Data/Visual Sprite Variant Map")]
|
|
public class VisualSpriteVariantMapAsset : ScriptableObject
|
|
{
|
|
public List<VisualSpriteVariantPair> Pairs = new();
|
|
|
|
[NonSerialized] private Dictionary<Sprite, Sprite> _eyeComfortDict;
|
|
|
|
public Sprite Resolve(Sprite source, VisualTheme theme)
|
|
{
|
|
if (source == null || theme == VisualTheme.Default)
|
|
return source;
|
|
|
|
BuildDictIfNeeded();
|
|
|
|
return _eyeComfortDict.TryGetValue(source, out var replacement) && replacement != null
|
|
? replacement
|
|
: source;
|
|
}
|
|
|
|
public int CountMappedPairs(VisualTheme theme)
|
|
{
|
|
if (theme == VisualTheme.Default)
|
|
return 0;
|
|
|
|
int count = 0;
|
|
foreach (var pair in Pairs)
|
|
{
|
|
if (pair?.Source != null && pair.EyeComfort != null)
|
|
count++;
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
public void RebuildCache()
|
|
{
|
|
_eyeComfortDict = null;
|
|
BuildDictIfNeeded();
|
|
}
|
|
|
|
private void BuildDictIfNeeded()
|
|
{
|
|
if (_eyeComfortDict != null)
|
|
return;
|
|
|
|
_eyeComfortDict = new Dictionary<Sprite, Sprite>();
|
|
foreach (var pair in Pairs)
|
|
{
|
|
if (pair?.Source == null || pair.EyeComfort == null)
|
|
continue;
|
|
|
|
_eyeComfortDict[pair.Source] = pair.EyeComfort;
|
|
}
|
|
}
|
|
|
|
private void OnValidate()
|
|
{
|
|
_eyeComfortDict = null;
|
|
}
|
|
}
|