# 🐛 Отладка мода RimWorld ## Способы отладки ### 1. 🔴 Attach to Process (Рекомендуется) Это самый удобный способ для отладки модов RimWorld. #### Visual Studio 1. **Измените .csproj для включения отладочных символов:** ```xml net472 latest ..\..\Assemblies false portable true ``` 2. **Соберите проект в Debug режиме:** ```bash cd Source/AIImages dotnet build -c Debug ``` 3. **Запустите RimWorld** 4. **В Visual Studio:** - Меню: `Debug` → `Attach to Process...` (или `Ctrl+Alt+P`) - Найдите процесс `RimWorldWin64.exe` - Нажмите `Attach` 5. **Установите breakpoint:** - Откройте файл с кодом (например, `PawnGizmoPatch.cs`) - Кликните слева от номера строки (появится красная точка) 6. **Триггерьте код в игре:** - Выберите пешку → код остановится на breakpoint! #### JetBrains Rider 1. **Настройте Run Configuration:** - `Run` → `Edit Configurations...` - `+` → `.NET Executable` - Имя: `RimWorld Debug` - Exe path: `D:\SteamLibrary\steamapps\common\RimWorld\RimWorldWin64.exe` - Working directory: `D:\SteamLibrary\steamapps\common\RimWorld` 2. **Соберите проект в Debug:** ```bash dotnet build -c Debug ``` 3. **Запустите через Rider:** - `Run` → `Debug 'RimWorld Debug'` (или `Shift+F9`) - Игра запустится с подключенным отладчиком 4. **Breakpoints:** - Работают так же, как в Visual Studio --- ### 2. 📝 Логирование (Простой способ) Если не нужна полная отладка, используйте логирование. #### Добавьте в код: ```csharp using Verse; // Информационное сообщение Log.Message("[AI Images] Pawn selected: " + __instance.Name); // Предупреждение Log.Warning("[AI Images] Something suspicious"); // Ошибка Log.Error("[AI Images] Something went wrong!"); ``` #### Просмотр логов: **В игре:** - Нажмите `Ctrl+F12` → откроется окно логов - Ищите строки с `[AI Images]` **Файл лога:** - Windows: `C:\Users\YourName\AppData\LocalLow\Ludeon Studios\RimWorld by Ludeon Studios\Player.log` - Или в папке RimWorld: `RimWorld\LogOutput\` --- ### 3. 🎮 Dev Mode в игре Включите режим разработчика для дополнительных инструментов. #### Как включить: 1. Запустите RimWorld 2. `Options` → `Settings` → включите `Development mode` 3. Перезапустите игру #### Что даёт Dev Mode: **Debug Actions Menu** (верхняя панель): - Можно создавать своих debug actions - Быстрое тестирование функций **Debug Inspector** (`Top bar` → `Tools` → `Debug inspector`): - Кликните на любой объект - Просмотр всех полей и свойств в реальном времени **Debug Log** (`Ctrl+F12`): - Расширенная информация - Трассировка стека #### Создание Debug Action: ```csharp using Verse; using RimWorld; namespace AIImages { public static class DebugActions { [DebugAction( "AI Images", "Test Window", actionType = DebugActionType.ToolMapForPawns, allowedGameStates = AllowedGameStates.PlayingOnMap )] public static void TestWindow(Pawn pawn) { Find.WindowStack.Add(new Window_AIImage(pawn)); Log.Message($"[AI Images] Opened window for {pawn.Name}"); } } } ``` Теперь в игре: - Верхняя панель → `Debug Actions` - Категория `AI Images` → `Test Window` - Кликните на пешку → окно откроется --- ### 4. 🔍 Продвинутая отладка #### dnSpy - декомпилятор с отладчиком **Установка:** 1. Скачайте dnSpy: https://github.com/dnSpy/dnSpy/releases 2. Распакуйте и запустите `dnSpy.exe` **Использование:** 1. `File` → `Open` → выберите `RimWorld\RimWorldWin64_Data\Managed\Assembly-CSharp.dll` 2. Изучайте код RimWorld! 3. Можно ставить breakpoints прямо в коде игры **Attach to Process:** 1. Запустите RimWorld 2. В dnSpy: `Debug` → `Attach to Process` 3. Выберите `RimWorldWin64.exe` 4. Ставьте breakpoints в коде игры или вашего мода --- ## ⚙️ Настройка проекта для отладки ### Обновите AIImages.csproj: ```xml net472 latest ..\..\Assemblies false portable true false None false true ``` ### Создайте .pdb файлы: После сборки в Debug режиме в папке `Assemblies/` появится: - `AIImages.dll` - ваш мод - `AIImages.pdb` - отладочные символы ✨ --- ## 🎯 Практические примеры ### Пример 1: Отладка Harmony патча **PawnGizmoPatch.cs:** ```csharp [HarmonyPostfix] public static IEnumerable Postfix(IEnumerable __result, Pawn __instance) { Log.Message($"[AI Images] GetGizmos called for: {__instance.Name}"); // 👈 Лог foreach (Gizmo gizmo in __result) { yield return gizmo; } if (__instance.IsColonist && __instance.Spawned && __instance.Faction == Faction.OfPlayer) { Log.Message($"[AI Images] Adding button for: {__instance.Name}"); // 👈 Лог yield return new Command_Action { defaultLabel = "AI Image", defaultDesc = "Open AI Image window", icon = ContentFinder.Get("UI/Commands/AttackMelee", true), action = delegate() { Log.Message($"[AI Images] Button clicked!"); // 👈 Лог Find.WindowStack.Add(new Window_AIImage(__instance)); } }; } } ``` ### Пример 2: Отладка окна **Window_AIImage.cs:** ```csharp public override void DoWindowContents(Rect inRect) { try { Log.Message($"[AI Images] Drawing window for: {pawn.Name}"); // 👈 Лог Text.Font = GameFont.Medium; Widgets.Label(new Rect(0f, 0f, inRect.width, 40f), "AI Image Window"); Text.Font = GameFont.Small; Widgets.Label(new Rect(0f, 50f, inRect.width, 30f), "Pawn: " + pawn.NameShortColored.Resolve()); Widgets.DrawBoxSolid( new Rect(10f, 100f, inRect.width - 20f, inRect.height - 150f), new Color(0.2f, 0.2f, 0.2f, 0.5f) ); Log.Message("[AI Images] Window drawn successfully"); // 👈 Лог } catch (System.Exception ex) { Log.Error($"[AI Images] Error drawing window: {ex}"); // 👈 Отлов ошибок } } ``` ### Пример 3: Try-Catch для отлова ошибок ```csharp public static IEnumerable Postfix(IEnumerable __result, Pawn __instance) { foreach (Gizmo gizmo in __result) { yield return gizmo; } if (__instance.IsColonist && __instance.Spawned) { Command_Action button = null; try { button = new Command_Action { defaultLabel = "AI Image", defaultDesc = "Open AI Image window", icon = ContentFinder.Get("UI/Commands/AttackMelee", true), action = delegate() { try { Find.WindowStack.Add(new Window_AIImage(__instance)); } catch (System.Exception ex) { Log.Error($"[AI Images] Failed to open window: {ex}"); } } }; } catch (System.Exception ex) { Log.Error($"[AI Images] Failed to create button: {ex}"); } if (button != null) { yield return button; } } } ``` --- ## 🚀 Быстрая отладка - Workflow ### Вариант 1: С Breakpoints (Visual Studio/Rider) ```bash # 1. Сборка в Debug cd Source/AIImages dotnet build -c Debug # 2. Запустите RimWorld # 3. Attach отладчик (Ctrl+Alt+P в VS) # 4. Поставьте breakpoint в коде # 5. Триггерьте код в игре → останавливается на breakpoint ``` ### Вариант 2: С логированием (быстрый) ```bash # 1. Добавьте Log.Message() в код # 2. Соберите dotnet build # 3. Запустите RimWorld # 4. Ctrl+F12 → смотрите логи в реальном времени ``` --- ## 📊 Полезные советы ### 1. Используйте префикс в логах ```csharp Log.Message("[AI Images] Your message"); ``` Так проще искать в логе: `Ctrl+F` → `[AI Images]` ### 2. Логируйте важные переменные ```csharp Log.Message($"[AI Images] Pawn: {pawn.Name}, Age: {pawn.ageTracker.AgeBiologicalYears}"); ``` ### 3. Conditional compilation ```csharp #if DEBUG Log.Message("[AI Images] Debug info"); #endif ``` Эти строки будут работать только в Debug сборке! ### 4. Проверяйте null ```csharp if (pawn?.health?.hediffSet != null) { // Безопасно использовать } ``` ### 5. Используйте Debug Actions для тестирования Создавайте тестовые функции с `[DebugAction]` - это быстрее, чем играть вручную. --- ## ⚠️ Частые проблемы ### Breakpoint не срабатывает ✅ Убедитесь, что: - Проект собран в Debug (`dotnet build -c Debug`) - Файл `.pdb` существует рядом с `.dll` - Отладчик подключен к правильному процессу - Код действительно выполняется (добавьте Log.Message для проверки) ### "Symbols not loaded" ✅ Решение: - Удалите `Assemblies/*.dll` и `Assemblies/*.pdb` - Пересоберите: `dotnet clean && dotnet build -c Debug` ### Игра тормозит с отладчиком ✅ Это нормально. Отладчик замедляет выполнение. --- ## 🎓 Дополнительные материалы - **Visual Studio Debugging Guide**: https://docs.microsoft.com/en-us/visualstudio/debugger/ - **Rider Debugging**: https://www.jetbrains.com/help/rider/Debugging_Code.html - **dnSpy**: https://github.com/dnSpy/dnSpy --- ## ✅ Готово! Теперь вы можете: - ✅ Подключать отладчик к RimWorld - ✅ Ставить breakpoints и смотреть переменные - ✅ Использовать логирование - ✅ Создавать Debug Actions для тестирования **Удачной отладки! 🐛→✨**