Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / mapEditorCreateRoom / MapEditorCreateRoomPanel.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using Godot;

namespace UI.MapEditorCreateRoom;

public partial class MapEditorCreateRoomPanel : MapEditorCreateRoom
{
    //key: 组名称, value: 选项索引
    private Dictionary<string, int> _groupMap = new Dictionary<string, int>();

    public override void OnCreateUi()
    {
        //初始化选项
        var groupButton = S_GroupSelect.Instance;
        var index = 0;
        foreach (var mapGroupInfo in MapProjectManager.GroupData)
        {
            var id = index++;
            _groupMap.Add(mapGroupInfo.Value.Name, id);
            groupButton.AddItem(mapGroupInfo.Value.Name, id);
        }

        var selectButton = S_TypeSelect.Instance;
        var roomTypes = Enum.GetValues<DungeonRoomType>();
        for (var i = 0; i < roomTypes.Length; i++)
        {
            var item = roomTypes[i];
            var text = DungeonManager.DungeonRoomTypeToDescribeString(item);
            selectButton.AddItem(text, (int)item);
        }
    }

    /// <summary>
    /// 设置选中的组
    /// </summary>
    public void SetSelectGroup(string groupName)
    {
        if (_groupMap.TryGetValue(groupName, out var value))
        {
            S_GroupSelect.Instance.Selected = value;
            return;
        }
        
        S_GroupSelect.Instance.Selected = -1;
    }

    /// <summary>
    /// 设置选中的房间类型
    /// </summary>
    public void SetSelectType(int index)
    {
        S_TypeSelect.Instance.Selected = index;
    }

    /// <summary>
    /// 填完数据后获取数据对象, 并进行验证, 如果验证失败, 则返回 null
    /// </summary>
    public MapProjectManager.MapRoomInfo GetRoomInfo()
    {
        var mapRoomInfo = new MapProjectManager.MapRoomInfo();
        mapRoomInfo.Name = S_RoomNameInput.Instance.Text;
        //检查名称是否合规
        if (!Regex.IsMatch(mapRoomInfo.Name, "^\\w+$"))
        {
            EditorTipsManager.ShowTips("错误", "房间名称'" + mapRoomInfo.Name + "'不符合名称约束, 房间名称只允许包含大小写字母和数字!");
            return null;
        }
        
        var groupIndex = S_GroupSelect.Instance.Selected;
        foreach (var pair in _groupMap)
        {
            if (pair.Value == groupIndex)
            {
                mapRoomInfo.Group = pair.Key;
            }
        }

        if (mapRoomInfo.Group == null)
        {
            EditorTipsManager.ShowTips("错误", "组名错误!");
            return null;
        }
        
        var typeIndex = S_TypeSelect.Instance.Selected;
        mapRoomInfo.RoomType = (DungeonRoomType)typeIndex;
        
        //检测是否有同名房间
        var temp = mapRoomInfo.Group + "/" + DungeonManager.DungeonRoomTypeToString(mapRoomInfo.RoomType) + "/" + mapRoomInfo.Name;
        var path = GameConfig.RoomTileDir + temp;
        var dir = new DirectoryInfo(path);
        if (dir.Exists && dir.GetFiles().Length > 0)
        {
            EditorTipsManager.ShowTips("错误", $"已经有相同路径的房间了!\n路径: {temp}");
            return null;
        }
        
        return mapRoomInfo;
    }
}