Fixed UI extend button to actually move the stats box

Fixed DevDebugTools not accounting for map tile size (f Zeekers)
Added more debugging text
This commit is contained in:
LadyAliceMargatroid 2024-12-16 17:52:08 -08:00
parent a166b3d4a7
commit ef4ce26491
10 changed files with 158 additions and 55 deletions

View File

@ -25,7 +25,7 @@ namespace DunGenPlus.DevTools {
public RuntimeDungeon dungeon;
public GameObject devCamera;
public BasePanel[] panels;
public RectTransform canvasRectTransform;
public LayoutElement canvasLayoutElement;
public TMP_Dropdown dungeonFlowSelectionDropDown;
private ExtendedDungeonFlow[] dungeonFlows;
@ -52,6 +52,7 @@ namespace DunGenPlus.DevTools {
// canvas
public bool canvasExtended;
private bool canvasExtendedInAnimation;
private float canvasWidthTarget;
void Awake(){
@ -94,9 +95,16 @@ namespace DunGenPlus.DevTools {
}
void Update(){
var sizeDelta = canvasRectTransform.sizeDelta;
sizeDelta.x = Mathf.Lerp(sizeDelta.x, canvasWidthTarget, Time.deltaTime * 10f);
canvasRectTransform.sizeDelta = sizeDelta;
if (canvasExtendedInAnimation){
var currentWidth = canvasLayoutElement.preferredWidth;
if (Mathf.Abs(currentWidth - canvasWidthTarget) < 4f) {
canvasLayoutElement.preferredWidth = canvasWidthTarget;
canvasExtendedInAnimation = false;
} else {
canvasLayoutElement.preferredWidth = Mathf.Lerp(currentWidth, canvasWidthTarget, Time.deltaTime * 10f);
}
}
statusTextMesh.text = dungeon.Generator.Status.ToString();
@ -125,6 +133,7 @@ namespace DunGenPlus.DevTools {
}
public void ToggleCanvasExtended(){
canvasExtendedInAnimation = true;
canvasExtended = !canvasExtended;
canvasWidthTarget = canvasExtended ? 800f : 440f;
}
@ -220,6 +229,17 @@ namespace DunGenPlus.DevTools {
textList.AppendLine($"DoorwayPair Time: {DunGenPlusGenerator.DoorwayPairTime:F2} ms");
textList.AppendLine($"CalculateWeight Time: {DunGenPlusGenerator.CalculateWeightTime:F2} ms");
/*
var errors = generator.tilePlacementResultCounters;
if (errors.Count > 0) {
textList.AppendLine("");
textList.AppendLine("Reasons for faliure:");
foreach(var pair in errors){
textList.AppendLine($"{pair.Key} (x{pair.Value})");
}
}
*/
statsTextMesh.text = textList.ToString();
}
@ -228,6 +248,7 @@ namespace DunGenPlus.DevTools {
}
private void UpdatePanels() {
MainPanel.Instance?.UpdatePanel();
DunFlowPanel.Instance?.UpdatePanel(true);
DunGenPlusPanel.Instance?.UpdatePanel(true);
AssetsPanel.Instance?.UpdatePanel(true);

View File

@ -18,9 +18,13 @@ namespace DunGenPlus.DevTools.Panels {
internal IntInputField seedInputField;
internal TextUIElement lengthMultiplierField;
internal TextUIElement mapSizeMultiplierField;
internal TextUIElement factorySizeMultiplierField;
internal TextUIElement mapTileSizeField;
internal ExtendedLevel[] levels;
internal IEnumerable<string> levelOptions;
private ExtendedLevel selectedLevel;
private GameObject asyncParentGameobject;
@ -50,12 +54,20 @@ namespace DunGenPlus.DevTools.Panels {
manager.CreateHeaderUIField(parentTransform, "Levels");
manager.CreateLevelOptionsUIField(parentTransform, "Level", 0, SetLevel);
lengthMultiplierField = manager.CreateTextUIField(parentTransform, ("Length Multiplier", "Dungeon size multiplier based on the level."));
lengthMultiplierField = manager.CreateTextUIField(parentTransform, ("Length Multiplier", "Dungeon generation length multiplier based on the numerous factors."));
mapSizeMultiplierField = manager.CreateTextUIField(parentTransform, ("Map Size Multiplier", "Map size multiplier based on the round manager (fixed)."));
factorySizeMultiplierField = manager.CreateTextUIField(parentTransform, ("Factory Size Multiplier", "Factory size multiplier based on the level."));
mapTileSizeField = manager.CreateTextUIField(parentTransform, ("Map Tile Size", "Map tile size based on the dungeon."));
SetLevel(levels[0]);
asyncParentGameobject.SetActive(gen.GenerateAsynchronously);
}
public void UpdatePanel(){
SetLevel(selectedLevel);
}
public void SetSeed(int value) {
dungeon.Generator.Seed = value;
}
@ -87,20 +99,38 @@ namespace DunGenPlus.DevTools.Panels {
}
public void SetLevel(ExtendedLevel level){
var currentLevelLengthMultlpier = GetLevelMultiplier(level);
dungeon.Generator.LengthMultiplier = currentLevelLengthMultlpier;
var currentValues = GetLevelMultiplier(level);
dungeon.Generator.LengthMultiplier = currentValues.lengthMultiplier;
manager.UpdateDungeonBounds();
lengthMultiplierField.SetText($"Length multiplier: {currentLevelLengthMultlpier.ToString("F2")}");
var lengthString = currentValues.lengthMultiplier.ToString("F2");
var mapSizeString = currentValues.mapSizeMultiplier.ToString("F2");
var factoryString = currentValues.factorySizeMultiplier.ToString("F2");
var tileString = currentValues.mapTileSize.ToString("F2");
lengthMultiplierField.SetText($"Length multiplier: {lengthString} [{mapSizeString} / {tileString} * {factoryString}]");
mapSizeMultiplierField.SetText($"Map size multiplier: {mapSizeString}");
factorySizeMultiplierField.SetText($"Factory size multiplier: {factoryString}");
mapTileSizeField.SetText($"Map tile size: {tileString}");
selectedLevel = level;
}
private float GetLevelMultiplier(ExtendedLevel level){
private (float lengthMultiplier, float mapSizeMultiplier, float factorySizeMultiplier, float mapTileSize) GetLevelMultiplier(ExtendedLevel level){
var roundManager = RoundManager.Instance;
if (roundManager == null) {
Plugin.logger.LogError("RoundManager somehow null. Can't set level length multiplier");
return 1f;
var mapSizeMultiplier = 1f;
if (roundManager != null) {
mapSizeMultiplier = roundManager.mapSizeMultiplier;
} else {
Plugin.logger.LogError("RoundManager somehow null.");
}
return roundManager.mapSizeMultiplier * level.SelectableLevel.factorySizeMultiplier;
var factorySizeMultiplier = level.SelectableLevel.factorySizeMultiplier;
var mapTileSize = selectedExtendedDungeonFlow.MapTileSize;
var num2 = mapSizeMultiplier / mapTileSize * factorySizeMultiplier;
num2 = (float)((double)Mathf.Round(num2 * 100f) / 100f);
return (num2, mapSizeMultiplier, factorySizeMultiplier, mapTileSize);
}
}

View File

@ -150,6 +150,7 @@
<Compile Include="Components\Scrap\RandomGuaranteedScrapSpawn.cs" />
<Compile Include="DevTools\Panels\AssetsPanel.cs" />
<Compile Include="Generation\DunGenPlusGenerationPaths.cs" />
<Compile Include="Generation\DunGenPlusGeneratorDebug.cs" />
<Compile Include="Generation\DunGenPlusGeneratorGlobalProps.cs" />
<Compile Include="MainPathExtender.cs" />
<Compile Include="Managers\EnemyManager.cs" />

View File

@ -327,42 +327,6 @@ namespace DunGenPlus.Generation {
AddForcedTiles(gen);
}
public static void PrintAddTileError(DungeonGenerator gen, TileProxy previousTile, DungeonArchetype archetype, IEnumerable<TileSet> useableTileSets, int branchId, int lineLength, float lineRatio){
var prevName = previousTile != null ? previousTile.Prefab.name : "NULL";
var archetypeName = archetype ? archetype.name : "NULL";
var tileSetNames = string.Join(", ", useableTileSets);
var stringList = new List<string>();
stringList.Add($"Main branch gen failed at Branch {branchId} (Length: {lineLength}, Ratio: {lineRatio})");
stringList.Add($"Prev tile: {prevName}");
stringList.Add($"Archetype: {archetypeName}");
stringList.Add($"Tilesets: {tileSetNames}");
stringList.Add($"Reason: {DungeonGeneratorPatch.lastTilePlacementResult}");
if (previousTile != null) {
var availableDoorways = string.Join(", ", previousTile.UnusedDoorways.Select(d => d.DoorwayComponent.gameObject.name));
var usedDoorways = string.Join(", ", previousTile.UsedDoorways.Select(d => d.DoorwayComponent.gameObject.name));
stringList.Add($"Available Doorways: {availableDoorways}");
stringList.Add($"Used Doorways: {usedDoorways}");
if (API.IsDevDebugModeActive()){
var allTiles = GetDoorwayPairs(gen, previousTile, useableTileSets, archetype, lineRatio);
var uniqueTiles = string.Join(", ", allTiles.Select(t => t.NextTemplate.Prefab).Distinct().Select(d => d.name));
stringList.Add($"Next Possible Tiles: {uniqueTiles}");
}
}
stringList.Add(string.Empty);
Plugin.logger.LogDebug(string.Join("\n", stringList));
}
public static void PrintAddTileErrorQuick(DungeonGenerator gen, int lineLength){
PrintAddTileError(gen, DungeonGeneratorPatch.lastAttachTo, DungeonGeneratorPatch.lastArchetype, DungeonGeneratorPatch.lastUseableTileSets, 0, lineLength, DungeonGeneratorPatch.lastNormalizedDepth);
}
private static IEnumerator GenerateBranchPaths(DungeonGenerator gen, TileProxy mainRoom, string message, LogLevel logLevel){
Plugin.logger.Log(logLevel, $"Switching to default dungeon branch generation: {message}");

View File

@ -0,0 +1,63 @@
using DunGen.Graph;
using DunGen;
using HarmonyLib;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using UnityEngine;
using DunGenPlus.Collections;
using DunGenPlus.Components;
using BepInEx.Logging;
using DunGenPlus.DevTools;
using DunGenPlus.Patches;
namespace DunGenPlus.Generation {
internal partial class DunGenPlusGenerator {
public static void PrintAddTileError(DungeonGenerator gen, TileProxy previousTile, DungeonArchetype archetype, IEnumerable<TileSet> useableTileSets, int branchId, int lineLength, float lineRatio){
var prevName = previousTile != null ? previousTile.Prefab.name : "NULL";
var archetypeName = archetype ? archetype.name : "NULL";
var tileSetNames = string.Join(", ", useableTileSets);
var stringList = new List<string>();
stringList.Add($"Main branch gen failed at Branch {branchId} (Length: {lineLength}, Ratio: {lineRatio})");
stringList.Add($"Prev tile: {prevName}");
stringList.Add($"Archetype: {archetypeName}");
stringList.Add($"Tilesets: {tileSetNames}");
stringList.Add($"Reason: {lastTilePlacementResult}");
if (previousTile != null) {
var availableDoorways = string.Join(", ", previousTile.UnusedDoorways.Select(d => d.DoorwayComponent.gameObject.name));
var usedDoorways = string.Join(", ", previousTile.UsedDoorways.Select(d => d.DoorwayComponent.gameObject.name));
stringList.Add($"Available Doorways: {availableDoorways}");
stringList.Add($"Used Doorways: {usedDoorways}");
if (API.IsDevDebugModeActive()){
var allTiles = GetDoorwayPairs(gen, previousTile, useableTileSets, archetype, lineRatio);
var uniqueTiles = string.Join(", ", allTiles.Select(t => t.NextTemplate.Prefab).Distinct().Select(d => d.name));
stringList.Add($"Next Possible Tiles: {uniqueTiles}");
}
}
stringList.Add(string.Empty);
Plugin.logger.LogDebug(string.Join("\n", stringList));
}
public static void PrintAddTileErrorQuick(DungeonGenerator gen, int lineLength){
PrintAddTileError(gen, DungeonGeneratorPatch.lastAttachTo, DungeonGeneratorPatch.lastArchetype, DungeonGeneratorPatch.lastUseableTileSets, 0, lineLength, DungeonGeneratorPatch.lastNormalizedDepth);
}
public static TilePlacementResult lastTilePlacementResult;
public static void RecordLastTilePlacementResult(DungeonGenerator gen, TilePlacementResult result){
lastTilePlacementResult = result;
}
}
}

View File

@ -29,6 +29,9 @@ namespace DunGenPlus.Managers {
d.Cleanup();
}
// we can leave early if doorway cleanup is not used (most likely for most dungeons anyway)
if (doorwayCleanupList.Count == 0) return;
try{
var dungeonGen = RoundManager.Instance.dungeonGenerator;
var navmesh = dungeonGen.transform.parent.GetComponentInChildren<UnityNavMeshAdapter>();

View File

@ -336,11 +336,32 @@ namespace DunGenPlus.Patches {
}
}
public static TilePlacementResult lastTilePlacementResult;
[HarmonyPrefix]
[HarmonyPatch(typeof(DungeonGenerator), "AddTilePlacementResult")]
public static void AddTilePlacementResultPatch(TilePlacementResult result){
lastTilePlacementResult = result;
[HarmonyTranspiler]
[HarmonyPatch(typeof(DungeonGenerator), "AddTile")]
public static IEnumerable<CodeInstruction> AddTileDebugPatch(IEnumerable<CodeInstruction> instructions){
var addTileSequence = new InstructionSequenceStandard("Add Tile Placement");
addTileSequence.AddBasic(OpCodes.Callvirt);
addTileSequence.AddBasic(OpCodes.Ldc_I4_0);
addTileSequence.AddBasic(OpCodes.Bgt);
addTileSequence.AddBasicLocal(OpCodes.Ldloc_S, 9);
foreach(var instruction in instructions){
if (addTileSequence.VerifyStage(instruction)) {
var specialFunction = typeof(DunGenPlusGenerator).GetMethod("RecordLastTilePlacementResult", BindingFlags.Static | BindingFlags.Public);
yield return new CodeInstruction(OpCodes.Ldarg_0);
yield return new CodeInstruction(OpCodes.Ldloc_S, 9);
yield return new CodeInstruction(OpCodes.Call, specialFunction);
yield return instruction;
continue;
}
yield return instruction;
}
addTileSequence.ReportComplete();
}
[HarmonyTranspiler]

View File

@ -25,7 +25,7 @@ namespace DunGenPlus {
internal const string modGUID = "dev.ladyalice.dungenplus";
private const string modName = "Dungeon Generation Plus";
private const string modVersion = "1.3.0";
private const string modVersion = "1.3.1";
internal readonly Harmony Harmony = new Harmony(modGUID);

Binary file not shown.