2023-06-09 17:35:27 +08:00

538 lines
20 KiB
C#

using System.Text.RegularExpressions;
using System;
using System.Linq.Expressions;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace BFEditor
{
public class BoardEditorWindow : EditorWindow {
// private static void ShowWindow() {
// var window = GetWindow<BoardEditorWindow>();
// window.titleContent = new GUIContent("BoardWindow");
// window.Show();
// }
const string BOARD_EXCEL_KEY = "bf_board_excel_key";
const string BOARD_GRID_TYPE_KEY = "bf_board_grid_type_key";
const int gridCount = 49;
string battleImgDirectory = "Assets/arts/textures/ui/battle/";
string boardFilepath;
string boardGridTypePath;
string boardFiledName = "board";
string randomTypeStr = "";
int curIndex = 1;
Dictionary<int, Dictionary<string, string>> boardGridTypeDict = new Dictionary<int, Dictionary<string, string>>();
Dictionary<int, JArray> boardDict = new Dictionary<int, JArray>();
Dictionary<int, JArray> outPutBoardDict = new Dictionary<int, JArray>();
Dictionary<string, Texture> imgDict = new Dictionary<string, Texture>();
bool loadExcelOver = false;
Dictionary<int, string> elementTypeImgDict = new Dictionary<int, string>(){
[1] = "red_1",
[2] = "yellow_1",
[3] = "green_1",
[4] = "blue_1",
[5] = "purple_1"
};
Texture boardImg;
private void OnEnable()
{
loadExcelOver = false;
boardFilepath = GetBoardExcelPath();
if (boardFilepath.Equals(""))
{
boardFilepath = "选择配置表路径";
}
boardGridTypePath = GetBoardGridTypePath();
if (boardGridTypePath.Equals(""))
{
boardGridTypePath = "选择grid_type配置表路径";
}
string[] paths = Directory.GetFiles(battleImgDirectory);
foreach(var path in paths)
{
if(!path.EndsWith(".meta"))
{
string formatPath = Path.GetFileNameWithoutExtension(path);
imgDict[formatPath] = AssetDatabase.LoadAssetAtPath<Texture>(path);
}
}
boardImg = AssetDatabase.LoadAssetAtPath<Texture>("Assets/arts/textures/background/battle_common/chessboard_1.png");
}
string GetBoardExcelPath()
{
return PlayerPrefs.GetString(BOARD_EXCEL_KEY, "");
}
void SetBoardExcelPath(string path)
{
PlayerPrefs.SetString(BOARD_EXCEL_KEY, path);
}
string GetBoardGridTypePath()
{
return PlayerPrefs.GetString(BOARD_GRID_TYPE_KEY, "");
}
void SetBoardGridTypePath(string path)
{
PlayerPrefs.SetString(BOARD_GRID_TYPE_KEY, path);
}
BoardEditorWindow()
{
this.titleContent = new GUIContent("棋盘编辑器");
}
private void OnGUI() {
DrawBaseInfo();
DragBoard();
}
void DrawBaseInfo()
{
GUILayout.BeginVertical();
GUILayout.Space(10);
GUILayout.BeginHorizontal();
GUILayout.Label("grid_type 路径", GUILayout.Width(100));
GUILayout.Space(10);
GUILayout.TextField(boardGridTypePath, GUILayout.Width(300));
if (GUILayout.Button("选择", GUILayout.Width(80)))
{
string openPath = EditorUtility.OpenFilePanel("选择配置表", GetBoardGridTypePath(), "");
if (openPath.CompareTo("") != 0)
{
boardGridTypePath = openPath;
SetBoardGridTypePath(openPath);
}
}
GUILayout.EndHorizontal();
GUILayout.Space(10);
GUILayout.BeginHorizontal();
GUILayout.Label("配置表路径", GUILayout.Width(100));
GUILayout.Space(10);
GUILayout.TextField(boardFilepath, GUILayout.Width(300));
if (GUILayout.Button("选择", GUILayout.Width(80)))
{
string openPath = EditorUtility.OpenFilePanel("选择配置表", GetBoardExcelPath(), "");
if (openPath.CompareTo("") != 0)
{
boardFilepath = openPath;
SetBoardExcelPath(openPath);
}
}
GUILayout.EndHorizontal();
GUILayout.Space(10);
GUILayout.BeginHorizontal();
GUILayout.Label("字段名称", GUILayout.Width(100));
GUILayout.Space(10);
boardFiledName = GUILayout.TextField(boardFiledName, GUILayout.Width(200));
GUILayout.EndHorizontal();
GUILayout.Space(10);
if (GUILayout.Button("加载棋盘", GUILayout.Width(80)))
{
LoadBoardExcel();
}
GUILayout.BeginHorizontal();
if (!IsInNewBoard())
{
if (GUILayout.Button("上一张", GUILayout.Width(80)))
{
showSwitchBoardSaveDialog(Math.Max(curIndex - 1, 1));
}
}
GUILayout.BeginHorizontal(GUILayout.Width(80));
GUIStyle style = new GUIStyle(GUI.skin.label);
style.alignment = TextAnchor.MiddleCenter;
GUILayout.Label("当前编号id = ", style);
showSwitchBoardSaveDialog(int.Parse(GUILayout.TextField(curIndex.ToString(), GUILayout.Width(40))));
GUILayout.EndHorizontal();
if (!IsInNewBoard())
{
if (GUILayout.Button("下一张", GUILayout.Width(80)))
{
showSwitchBoardSaveDialog(Math.Min(curIndex + 1, boardDict.Count));
}
}
if (GUILayout.Button("复制当前棋盘", GUILayout.Width(80)))
{
if (!boardDict.ContainsKey(curIndex))
{
return;
}
JArray jo = boardDict[curIndex];
GUIUtility.systemCopyBuffer = JsonConvert.SerializeObject(jo);
}
if (GUILayout.Button("粘贴棋盘", GUILayout.Width(80)))
{
JArray jo = (JArray)JsonConvert.DeserializeObject(GUIUtility.systemCopyBuffer);
if (jo == null)
{
return;
}
boardDict[curIndex] = jo;
}
if (!IsInNewBoard())
{
if (GUILayout.Button("新建棋盘", GUILayout.Width(80)))
{
curIndex = outPutBoardDict.Count + 1;
boardDict[curIndex] = new JArray();
for (int i = 0; i < gridCount; i++)
{
JArray unit = (JArray)JsonConvert.DeserializeObject("[0, 0]");
boardDict[curIndex].Add(unit);
}
}
}
else
{
if (GUILayout.Button("退出新建棋盘", GUILayout.Width(80)))
{
boardDict.Remove(curIndex);
curIndex = outPutBoardDict.Count;
}
if (GUILayout.Button("保存当前棋盘", GUILayout.Width(80)))
{
SaveBoard(curIndex);
}
}
GUILayout.EndHorizontal();
GUILayout.EndVertical();
GUILayout.BeginArea(new Rect(730, 500, 500, 100));
GUILayout.BeginVertical();
GUILayout.Label("随机类型和数量[类型,数量] 空格 [类型,数量]");
randomTypeStr = GUILayout.TextField(randomTypeStr, GUILayout.Width(500));
if(GUILayout.Button("生成随机棋盘", GUILayout.Width(80)))
{
string[] units = randomTypeStr.Split('[');
Dictionary<int, int> dict = new Dictionary<int, int>();
for (int i = 0; i < units.Length; i++)
{
string formatStr = units[i].Replace("[", "").Replace("]", "").Replace(" ", "");
string[] unitList = formatStr.Split(',');
if (unitList.Length >= 2)
{
dict[int.Parse(unitList[0])] = int.Parse(unitList[1]);
}
}
List<int> list = new List<int>();
for (int i = 0; i < gridCount; i++)
{
list.Add(i);
}
Debug.Log(JsonConvert.SerializeObject(dict));
JArray ja = new JArray();
for (int i = 0; i < gridCount; i++)
{
JArray unit = (JArray)JsonConvert.DeserializeObject("[0, 0]");
ja.Add(unit);
}
foreach (int gridType in dict.Keys)
{
for(int i = 0; i < dict[gridType]; i++)
{
int index = UnityEngine.Random.Range(0, list.Count);
ja[list[index]][0] = gridType;
list.RemoveAt(index);
}
}
boardDict[curIndex] = ja;
}
GUILayout.EndArea();
if(GUI.Button(new Rect(1050, 10, 100, 30), "导出到Excel"))
{
if (CheckBoardChanged(curIndex))
{
switch (EditorUtility.DisplayDialogComplex("提示", "当前棋盘已经改变,是否保存", "确定", "放弃", "再次确认"))
{
case 0:
SaveBoard(curIndex);
SaveBoardExcel();
break;
case 1:
AbortBoard(curIndex);
SaveBoardExcel();
break;
case 2:
break;
default:
break;
}
}
else
{
SaveBoardExcel();
}
}
}
void LoadBoardExcel()
{
var desktopDir = System.Environment.GetFolderPath(System.Environment.SpecialFolder.DesktopDirectory);
var tempPath = System.IO.Path.Combine(desktopDir, "BoardEditorTemp.txt");
string relitivePath = Application.dataPath;
relitivePath = relitivePath.Remove(relitivePath.Length - 6, 6);
string pythonToolPath = relitivePath + "Tools/tranexcel_new";
// 读取grid_type配置表
BFEditorUtils.RunCommond("python", "load_board.py " + tempPath + " " + boardGridTypePath, pythonToolPath);
string boardGridTypeJson = File.ReadAllText(tempPath);
JObject jsonObj = (JObject)JsonConvert.DeserializeObject(boardGridTypeJson);
foreach (var item in jsonObj)
{
int key = int.Parse(item.Key);
Dictionary<string, string> dict = new Dictionary<string, string>();
foreach (var item2 in (JObject)item.Value)
{
dict[item2.Key] = item2.Value.ToString();
}
boardGridTypeDict[key] = dict;
}
// 读取boardFile配置表
BFEditorUtils.RunCommond("python", "load_board.py " + tempPath + " " + boardFilepath, pythonToolPath);
string boardFileJson = File.ReadAllText(tempPath);
jsonObj = (JObject)JsonConvert.DeserializeObject(boardFileJson);
foreach (var item in jsonObj){
if (item.Value[boardFiledName] != null)
{
int key = int.Parse(item.Key);
boardDict[key] = copyBoard((JArray)item.Value[boardFiledName]);
outPutBoardDict[key] = copyBoard((JArray)item.Value[boardFiledName]);
}
}
loadExcelOver = true;
}
void SaveBoardExcel()
{
var desktopDir = System.Environment.GetFolderPath(System.Environment.SpecialFolder.DesktopDirectory);
var tempPath = System.IO.Path.Combine(desktopDir, "BoardEditorTemp.txt");
Dictionary<int, Dictionary<string, JArray>> output = new Dictionary<int, Dictionary<string, JArray>>();
foreach(int key in outPutBoardDict.Keys)
{
output[key] = new Dictionary<string, JArray>();
output[key][boardFiledName] = copyBoard(outPutBoardDict[key]);
}
string relitivePath = Application.dataPath;
relitivePath = relitivePath.Remove(relitivePath.Length - 6, 6);
string pythonToolPath = relitivePath + "Tools/tranexcel_new";
File.WriteAllText(tempPath, JsonConvert.SerializeObject(output));
BFEditorUtils.RunCommond("python", "save_board.py " + tempPath + " " + boardFilepath, pythonToolPath);
}
void DragBoard()
{
Texture img;
GUI.DrawTexture(new Rect(0, 150, 702, 702), boardImg);
if(!loadExcelOver)
{
return;
}
int startOffset = 22;
int textureWidth = 94;
if (!boardDict.ContainsKey(curIndex))
{
return;
}
GUILayout.BeginArea(new Rect(0, 150, 702, 702));
GUILayout.BeginVertical();
JArray jo = boardDict[curIndex];
int posIndex = 0;
for (int row = 1; row <= 7; row++) {
GUILayout.BeginHorizontal();
for (int col = 1; col <= 7; col++) {
JArray gridInfo = (JArray)jo[posIndex];
if(gridInfo.Count < 2)
{
continue;
}
int gridType = (int)gridInfo[0];
int gridElementType = (int)gridInfo[1];
if(!boardGridTypeDict.ContainsKey(gridType))
{
continue;
}
// 绘制元素
if (elementTypeImgDict.ContainsKey(gridElementType))
{
img = imgDict[elementTypeImgDict[gridElementType]];
GUI.DrawTexture(new Rect(startOffset + (col - 1) * textureWidth, startOffset + (row - 1) * textureWidth, textureWidth, textureWidth), img);
}
// 绘制类型
if(boardGridTypeDict[gridType].ContainsKey("icon"))
{
string icon = boardGridTypeDict[gridType]["icon"];
if (imgDict.ContainsKey(icon))
{
img = imgDict[icon];
GUI.DrawTexture(new Rect(startOffset + (col - 1) * textureWidth, startOffset + (row - 1) * textureWidth, textureWidth, textureWidth), img);
}
}
posIndex++;
}
GUILayout.EndHorizontal();
}
GUILayout.EndVertical();
GUILayout.EndArea();
GUILayout.BeginArea(new Rect(730, 150, 510, 550));
GUILayout.BeginVertical();
GUILayout.BeginHorizontal();
GUILayout.Label("棋盘配置信息", GUILayout.Width(100), GUILayout.Height(30));
GUILayout.EndHorizontal();
posIndex = 0;
for (int row = 1; row <= 7; row++) {
GUILayout.BeginHorizontal();
for (int col = 1; col <= 7; col++) {
JArray gridInfo = (JArray)jo[posIndex];
if(gridInfo.Count < 2)
{
continue;
}
gridInfo[0] = int.Parse(GUILayout.TextField(gridInfo[0].ToString(), GUILayout.Width(25)));
gridInfo[1] = int.Parse(GUILayout.TextField(gridInfo[1].ToString(), GUILayout.Width(25)));
GUILayout.Space(10);
posIndex++;
}
GUILayout.EndHorizontal();
GUILayout.Space(10);
}
GUILayout.EndVertical();
GUILayout.EndArea();
}
bool CheckBoardChanged(int index)
{
if(boardDict.ContainsKey(index) && outPutBoardDict.ContainsKey(index))
{
if(outPutBoardDict[index].Count != boardDict[index].Count)
{
return true;
}
for (int i = 0; i < boardDict[index].Count; i++)
{
JArray tArray = (JArray)boardDict[index][i];
JArray tArray2 = (JArray)outPutBoardDict[index][i];
if (tArray.Count != tArray2.Count)
{
return true;
}
for (int j = 0; j < tArray.Count; j++)
{
if (tArray[j].ToString() != tArray2[j].ToString())
{
return true;
}
}
}
}
return false;
}
void SaveBoard(int index)
{
if(!boardDict.ContainsKey(index))
{
return;
}
outPutBoardDict[index] = copyBoard(boardDict[index]);
}
void AbortBoard(int index)
{
if(!outPutBoardDict.ContainsKey(index))
{
boardDict.Remove(index);
return;
}
boardDict[index] = copyBoard(outPutBoardDict[index]);
}
void showSwitchBoardSaveDialog(int targetIndex)
{
if (IsInNewBoard())
{
return;
}
if (targetIndex == curIndex)
{
return;
}
if (CheckBoardChanged(curIndex))
{
switch (EditorUtility.DisplayDialogComplex("提示", "当前棋盘已经改变,是否保存", "确定", "放弃", "再次确认"))
{
case 0:
SaveBoard(curIndex);
curIndex = targetIndex;
break;
case 1:
AbortBoard(curIndex);
curIndex = targetIndex;
break;
case 2:
break;
default:
break;
}
}
else
{
curIndex = targetIndex;
}
}
JArray copyBoard(JArray targetArray)
{
JArray resultArray = new JArray();
for (int i = 0; i < targetArray.Count; i++)
{
JArray unit = new JArray();
resultArray.Add(unit);
JArray temp = (JArray)targetArray[i];
for (int j = 0; j < temp.Count; j++)
{
unit.Add(int.Parse(temp[j].ToString()));
}
}
return resultArray;
}
bool IsInNewBoard()
{
if(!boardDict.ContainsKey(curIndex) && !outPutBoardDict.ContainsKey(curIndex))
{
return false;
}
return !outPutBoardDict.ContainsKey(curIndex);
}
}
}