private void ShowStatus()
        {
            var roomTemplate       = (RoomTemplateSettings)target;
            var originalBackground = GUI.backgroundColor;

            Handles.BeginGUI();
            GUILayout.BeginArea(new Rect(10, 10, 180, 100));
            GUILayout.BeginVertical(EditorStyles.helpBox);

            GUILayout.Label("Room template status", EditorStyles.boldLabel);

            var isOutlineValid = roomTemplate.GetOutline() != null;
            var outlineText    = isOutlineValid ? "valid" : "<color=#870526ff>invalid</color>";
            var areDoorsValid  = false;
            var doorsText      = "N/A";

            if (isOutlineValid)
            {
                var doorsCheck = RoomTemplateDiagnostics.CheckDoors(roomTemplate.gameObject);
                areDoorsValid = !doorsCheck.HasErrors;
                doorsText     = !doorsCheck.HasErrors ? "valid" : "<color=#870526ff>invalid</color>";

                if (areDoorsValid)
                {
                    var wrongManualDoorsCheck = RoomTemplateDiagnostics.CheckWrongManualDoors(roomTemplate.gameObject, out var _);

                    if (wrongManualDoorsCheck.HasErrors)
                    {
                        areDoorsValid = false;
                        doorsText    += $" <size=9><color=orange>(with warning)</color></size>";
                    }
                }
            }

            GUILayout.Label($"Outline: <b>{outlineText}</b>", new GUIStyle(EditorStyles.label)
            {
                richText = true
            });
            GUILayout.Label($"Doors: <b>{doorsText}</b>", new GUIStyle(EditorStyles.label)
            {
                richText = true
            });

            if (!isOutlineValid || !areDoorsValid)
            {
                GUILayout.Label($"<size=9>See the Room template settings component for details</size>", new GUIStyle(EditorStyles.label)
                {
                    richText = true, wordWrap = true
                });
            }

            GUILayout.EndVertical();
            GUILayout.EndArea();
            Handles.EndGUI();

            GUI.backgroundColor = originalBackground;
        }
Exemplo n.º 2
0
        /// <summary>
        ///     Computes a room room template from a given room template game object.
        /// </summary>
        /// <param name="roomTemplatePrefab"></param>
        /// <param name="roomTemplate"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public static bool TryGetRoomTemplate(GameObject roomTemplatePrefab, out RoomTemplateGrid2D roomTemplate, out ActionResult result)
        {
            roomTemplate = null;

            // Check that the room template has all the required components
            var requiredComponentsResult = RoomTemplateDiagnostics.CheckComponents(roomTemplatePrefab);

            if (requiredComponentsResult.HasErrors)
            {
                result = requiredComponentsResult;
                return(false);
            }

            PolygonGrid2D polygon = null;

            // TODO: improve
            try
            {
                polygon = GetPolygonFromRoomTemplate(roomTemplatePrefab);
            }
            catch (ArgumentException)
            {
                /* empty */
            }

            // Check that the outline of the room template is valid
            if (polygon == null)
            {
                result = new ActionResult();
                result.AddError("The outline of the room template is not valid. Please consult the documentation.");
                return(false);
            }

            var allowedTransformations = new List <TransformationGrid2D> {
                TransformationGrid2D.Identity
            };
            var roomTemplateComponent = roomTemplatePrefab.GetComponent <RoomTemplateSettings>();
            var repeatMode            = roomTemplateComponent?.RepeatMode ?? RoomTemplateRepeatMode.AllowRepeat;
            var doors    = roomTemplatePrefab.GetComponent <Doors>();
            var doorMode = doors.GetDoorMode();

            // Check that the doors are valid
            var doorsCheck = RoomTemplateDiagnostics.CheckDoors(polygon, doorMode);

            if (doorsCheck.HasErrors)
            {
                result = doorsCheck;
                return(false);
            }

            roomTemplate = new RoomTemplateGrid2D(polygon, doorMode, roomTemplatePrefab.name, repeatMode, allowedTransformations);

            result = new ActionResult();
            return(true);
        }
Exemplo n.º 3
0
        public void NoDoors()
        {
            var roomTemplate = GameObject.Find("NoDoors");

            Assert.That(roomTemplate, Is.Not.Null);

            var resultAll = RoomTemplateDiagnostics.CheckAll(roomTemplate);

            Assert.That(resultAll.HasErrors, Is.True);

            var resultComponents = RoomTemplateDiagnostics.CheckComponents(roomTemplate);

            Assert.That(resultComponents.HasErrors, Is.True);
        }
Exemplo n.º 4
0
        public void WrongManualDoors()
        {
            var roomTemplate = GameObject.Find("WrongManualDoors");

            Assert.That(roomTemplate, Is.Not.Null);

            var resultAll = RoomTemplateDiagnostics.CheckAll(roomTemplate);

            Assert.That(resultAll.HasErrors, Is.False);

            var resultComponents = RoomTemplateDiagnostics.CheckWrongManualDoors(roomTemplate, out var _);

            Assert.That(resultComponents.HasErrors, Is.True);
        }
Exemplo n.º 5
0
        public void InvalidOutline()
        {
            var roomTemplate = GameObject.Find("InvalidOutline");

            Assert.That(roomTemplate, Is.Not.Null);

            var resultAll = RoomTemplateDiagnostics.CheckAll(roomTemplate);

            Assert.That(resultAll.HasErrors, Is.True);

            var resultComponents = RoomTemplateDiagnostics.CheckComponents(roomTemplate);

            Assert.That(resultComponents.HasErrors, Is.False);
        }
Exemplo n.º 6
0
        public void HybridDoorsDuplicate()
        {
            var roomTemplate = GameObject.Find("HybridDoorsDuplicate");

            Assert.That(roomTemplate, Is.Not.Null);

            var resultAll = RoomTemplateDiagnostics.CheckAll(roomTemplate);

            Assert.That(resultAll.HasErrors, Is.True);

            var resultComponents = RoomTemplateDiagnostics.CheckComponents(roomTemplate);

            Assert.That(resultComponents.HasErrors, Is.False);

            var resultDoors = RoomTemplateDiagnostics.CheckDoors(roomTemplate);

            Assert.That(resultDoors.HasErrors, Is.True);
        }
        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            DrawDefaultInspector();

            var roomTemplate  = (RoomTemplateSettings)target;
            var validityCheck = RoomTemplateDiagnostics.CheckAll(roomTemplate.gameObject);

            if (!validityCheck.HasErrors)
            {
                EditorGUILayout.HelpBox("The room template is valid.", MessageType.Info);

                var wrongManualDoorsCheck =
                    RoomTemplateDiagnostics.CheckWrongManualDoors(roomTemplate.gameObject, out var _);

                if (wrongManualDoorsCheck.HasErrors)
                {
                    EditorGUILayout.HelpBox(string.Join("\n", wrongManualDoorsCheck.Errors).Trim(), MessageType.Warning);
                }
            }
            else
            {
                var sb = new StringBuilder();
                sb.AppendLine("There are some problems with the room template:");

                var errors = string.Join("\n", validityCheck.Errors);
                sb.Append(errors);

                EditorGUILayout.HelpBox(sb.ToString(), MessageType.Error);
            }

            var hasOutlineOverride = roomTemplate.HasOutlineOverride();

            EditorGUILayout.HelpBox($"Using outline override: {hasOutlineOverride}", MessageType.None);

            if (hasOutlineOverride)
            {
                if (GUILayout.Button("Remove outline override", EditorStyles.miniButton))
                {
                    roomTemplate.RemoveOutlineOverride();
                }
            }
            else
            {
                if (GUILayout.Button("Add outline override", EditorStyles.miniButton))
                {
                    roomTemplate.AddOutlineOverride();
                }
            }

            var boundingBoxOutlineHandler = roomTemplate.GetComponent <BoundingBoxOutlineHandler>();
            var boundingBoxRemoved        = false;

            if (boundingBoxOutlineHandler == null)
            {
                if (GUILayout.Button("Add bounding box outline handler", EditorStyles.miniButton))
                {
                    roomTemplate.gameObject.AddComponent <BoundingBoxOutlineHandler>();
                    EditorUtility.SetDirty(roomTemplate);
                }
            }
            else
            {
                if (GUILayout.Button("Remove bounding box outline handler", EditorStyles.miniButton))
                {
                    DestroyImmediate(boundingBoxOutlineHandler, true);
                    boundingBoxRemoved = true;
                    EditorUtility.SetDirty(roomTemplate);
                }
            }

            serializedObject.ApplyModifiedProperties();

            if (boundingBoxRemoved)
            {
                GUIUtility.ExitGUI();
            }
        }