using System; using System.Linq; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; using DepthsOfGreed.HandbookUI; public static class WallBuildAreaValidation { static void Check(bool condition,string message){if(!condition)throw new Exception(message);} public static void Validate() { GameObject test=null;HandbookTowerEntry tower=null; try { EditorSceneManager.OpenScene("Assets/Scenes/Tim_Test_UI.unity"); var area=UnityEngine.Object.FindFirstObjectByType(); Check(area && area.TryGetRadii(out _,out _,out _),"Scene has configured build boundaries"); Check(new SerializedObject(UnityEngine.Object.FindFirstObjectByType()).FindProperty("buildArea").objectReferenceValue==area,"Inspector reference wired"); test=new GameObject("TEMP_WallAreaValidation");var settings=test.AddComponent(); settings.innerBoundarySprite=area.innerBoundarySprite;settings.outerBoundarySprite=area.outerBoundarySprite;settings.boundarySource=WallBoundarySource.SpriteRenderers; string oldInner=settings.innerBoundarySprite.name,oldOuter=settings.outerBoundarySprite.name; try { settings.innerBoundarySprite.name="ArbitraryInnerObject";settings.outerBoundarySprite.name="ArbitraryOuterObject"; Check(settings.TryGetRadii(out float a,out float b,out _) && b>a,"Sprite assignment works after renaming"); } finally{settings.innerBoundarySprite.name=oldInner;settings.outerBoundarySprite.name=oldOuter;} settings.boundarySource=WallBoundarySource.CustomRadii;settings.innerBoundarySprite=null;settings.outerBoundarySprite=null;settings.innerRadius=1;settings.outerRadius=2; settings.transform.localScale=Vector3.one*5; Check(settings.TryGetRadii(out float inner,out float outer,out _) && inner==1 && outer==2,"Custom world radii ignore missing sprites and transform scale"); var prototype=test.AddComponent();prototype.Initialize(test.transform,Vector3.zero,inner,outer,null); var catalog=AssetDatabase.LoadAssetAtPath("Assets/HandbookData/TestTurmkatalog.asset");tower=UnityEngine.Object.Instantiate(catalog.towers.First(t=>t.id=="ammo_0"));tower.baseShape=BaseShape.Circle;tower.baseRadius=.2f; Check(prototype.CheckBuild(new BuildRequest(tower,new Vector3(1.5f,0,0))).Allowed,"Custom ring accepts fitting base"); Check(!prototype.CheckBuild(new BuildRequest(tower,new Vector3(1.1f,0,0))).Allowed,"Base must clear inner edge"); Check(!prototype.CheckBuild(new BuildRequest(tower,new Vector3(1.9f,0,0))).Allowed,"Base must clear outer edge"); settings.innerRadius=2;Check(!settings.TryGetRadii(out _,out _,out _),"Invalid custom ring rejected"); settings.boundarySource=WallBoundarySource.SpriteRenderers;Check(!settings.TryGetRadii(out _,out _,out _),"Missing sprite references rejected"); UnityEngine.Object.DestroyImmediate(tower);UnityEngine.Object.DestroyImmediate(test); Debug.Log("WALL_AREA_VALIDATION_OK: inspector binding, renamed sprites, custom radii, invalid values, placement and edge clearance.");EditorApplication.Exit(0); } catch(Exception e){if(tower)UnityEngine.Object.DestroyImmediate(tower);if(test)UnityEngine.Object.DestroyImmediate(test);Debug.LogException(e);EditorApplication.Exit(1);} } }