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; } }