using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Assets.HeroEditor4D.Common.Scripts.Collections;
using Assets.HeroEditor4D.Common.Scripts.Data;
using Assets.HeroEditor4D.Common.Scripts.Editor;
using UnityEditor;
using UnityEngine;
namespace HeroEditor4D.Common.Editor
{
///
/// Refreshes the main sprite collection when importing new sprite bundles.
///
public class SpriteCollectionRefresh : AssetPostprocessor
{
public static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
{
var spriteCollection = UnityEngine.Object.FindObjectOfType();
if (spriteCollection != null)
{
Refresh(spriteCollection);
}
}
public static void Refresh(SpriteCollection spriteCollection)
{
spriteCollection.Body = LoadSprites(spriteCollection, "/BodyParts/Body");
spriteCollection.Ears = LoadSprites(spriteCollection, "/BodyParts/Ears");
spriteCollection.Hair = LoadSprites(spriteCollection, "/BodyParts/Hair");
spriteCollection.Beard = LoadSprites(spriteCollection, "/BodyParts/Beard");
spriteCollection.Eyebrows = LoadSprites(spriteCollection, "/BodyParts/Eyebrows");
spriteCollection.Eyes = LoadSprites(spriteCollection, "/BodyParts/Eyes");
spriteCollection.Mouth = LoadSprites(spriteCollection, "/BodyParts/Mouth");
spriteCollection.Armor = LoadSprites(spriteCollection, "/Equipment/Armor");
spriteCollection.Cape = LoadSprites(spriteCollection, "/Equipment/Cape");
spriteCollection.Backpack = LoadSprites(spriteCollection, "/Equipment/Back");
spriteCollection.MeleeWeapon1H = LoadSprites(spriteCollection, "/Equipment/MeleeWeapon1H", 1);
spriteCollection.MeleeWeapon2H = LoadSprites(spriteCollection, "/Equipment/MeleeWeapon2H", 1);
spriteCollection.Shield = LoadSprites(spriteCollection, "/Equipment/Shield");
spriteCollection.Supplies = LoadSprites(spriteCollection, "/Equipment/Supplies", 1);
spriteCollection.Bow = LoadSprites(spriteCollection, "/Equipment/Bow");
spriteCollection.Crossbow = LoadSprites(spriteCollection, "/Equipment/Crossbow");
spriteCollection.Firearm1H = LoadSprites(spriteCollection, "/Equipment/Firearm1H");
spriteCollection.Firearm2H = LoadSprites(spriteCollection, "/Equipment/Firearm2H");
spriteCollection.Throwable = LoadSprites(spriteCollection, "/Equipment/Throwable");
spriteCollection.Makeup = LoadSprites(spriteCollection, "/Equipment/Makeup");
spriteCollection.Mask = LoadSprites(spriteCollection, "/Equipment/Mask");
spriteCollection.Earrings = LoadSprites(spriteCollection, "/Equipment/Earrings");
spriteCollection.Firearm1H.ForEach(FirearmMuzzleResolver.Resolve);
spriteCollection.Firearm2H.ForEach(FirearmMuzzleResolver.Resolve);
EditorUtility.SetDirty(spriteCollection);
if (spriteCollection.DebugLogging) Debug.Log("SpriteCollection: refreshed.");
}
private static List LoadSprites(SpriteCollection sc, string subPath, int nesting = 0)
{
var type = subPath.Split('/')[2];
var collection = new List();
foreach (var asset in sc.SpriteFolders)
{
if (asset == null) continue;
var path = AssetDatabase.GetAssetPath(asset) + subPath;
if (!Directory.Exists(path)) continue;
var include = sc.CollectionFilter.Where(i => !i.StartsWith("!")).ToList();
var exclude = sc.CollectionFilter.Where(i => i.StartsWith("!")).Select(i => i.Replace("!", "")).ToList();
var extensions = new List { "*.png" };
if (sc.IncludePsd) extensions.Add("*.psd");
foreach (var ext in extensions)
{
var entries = Directory.GetFiles(path, ext, SearchOption.AllDirectories)
.Select(p => p.Replace("\\", "/"))
.Select(p => new ItemSprite(GetEditionName(p), GetCollectionName(p, nesting), type, Path.GetFileNameWithoutExtension(p), p, AssetDatabase.LoadAssetAtPath(p), AssetDatabase.LoadAllAssetsAtPath(p).OfType().ToList()))
.Where(i => (include.Count == 0 || include.Contains(i.Collection)) && !exclude.Contains(i.Collection) || sc.CollectionFilterIgnore.Any(i.Path.Contains) && !exclude.Contains(i.Collection)).ToList();
collection.AddRange(entries);
}
}
foreach (var entry in collection)
{
foreach (Match match in Regex.Matches(entry.Path, @"\[(.+?)\]"))
{
entry.Tags.Add(match.Groups[1].Value);
}
}
return collection.OrderBy(i => i.Name).ToList();
}
private static string GetEditionName(string path)
{
var edition = path.Split('/')[2];
return edition;
}
private static string GetCollectionName(string path, int nesting)
{
var parent = Directory.GetParent(path);
for (var i = 0; i < nesting; i++)
{
parent = parent?.Parent;
}
if (parent == null) throw new NotSupportedException();
return parent.Name;
}
}
}