using System.Collections.Generic; using System.Linq; using AIImages.Helpers; using Verse; namespace AIImages.Components { /// /// Компонент для хранения данных AI-сгенерированных портретов пешки /// public class PawnPortraitComp : ThingComp { /// /// Список путей к сохраненным портретам (галерея) /// private List portraitPaths = new List(); /// /// Есть ли сохраненные портреты /// public bool HasPortrait => portraitPaths != null && portraitPaths.Count > 0; /// /// Количество портретов в галерее /// public int PortraitCount => portraitPaths?.Count ?? 0; /// /// Получить все пути к портретам /// public List GetAllPortraits() => portraitPaths?.ToList() ?? new List(); /// /// Получить последний портрет (для обратной совместимости) /// public string PortraitPath => HasPortrait ? portraitPaths.Last() : null; /// /// Добавить новый портрет в галерею /// public void AddPortrait(string path) { if (string.IsNullOrEmpty(path)) return; if (portraitPaths == null) portraitPaths = new List(); portraitPaths.Add(path); DebugLogger.Log($"[AI Images] Added portrait to gallery: {path}"); } /// /// Удалить портрет из галереи /// public bool RemovePortrait(string path) { if (portraitPaths == null || string.IsNullOrEmpty(path)) return false; bool removed = portraitPaths.Remove(path); if (removed) { DebugLogger.Log($"[AI Images] Removed portrait from gallery: {path}"); } return removed; } /// /// Очистить все портреты /// public void ClearPortraits() { if (portraitPaths != null) { int count = portraitPaths.Count; portraitPaths.Clear(); DebugLogger.Log($"[AI Images] Cleared {count} portraits from gallery"); } } /// /// Сохранение/загрузка данных /// public override void PostExposeData() { base.PostExposeData(); bool isSaving = Scribe.mode == LoadSaveMode.Saving; bool isLoading = Scribe.mode == LoadSaveMode.LoadingVars; DebugLogger.Log( $"[AI Images] PostExposeData for {parent?.LabelShort} - Mode: {Scribe.mode}, Portrait count: {PortraitCount}" ); // Сохраняем список портретов Scribe_Collections.Look(ref portraitPaths, "aiPortraitPaths", LookMode.Value); // Обратная совместимость: если есть старый формат с одним портретом, добавляем его в список if (isLoading && (portraitPaths == null || portraitPaths.Count == 0)) { string oldPortraitPath = null; Scribe_Values.Look(ref oldPortraitPath, "aiPortraitPath", null); if (!string.IsNullOrEmpty(oldPortraitPath)) { portraitPaths = new List { oldPortraitPath }; DebugLogger.Log($"[AI Images] Migrated old single portrait to gallery: {oldPortraitPath}"); } } DebugLogger.Log( $"[AI Images] PostExposeData completed for {parent?.LabelShort} - Portrait count: {PortraitCount}, HasPortrait: {HasPortrait}" ); } } }