BattleFieldEditor.cs 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEditor;
  4. using System.Collections.Generic;
  5. using UnityEditor.SceneManagement;
  6. using System.Text;
  7. using System;
  8. using System.IO;
  9. using System.Linq;
  10. namespace JamesGame
  11. {
  12. public static class BattleFieldEditor
  13. {
  14. public static void DrawBattleFieldEditorGUI(this BattleFieldSceneCreator battleEditor, ref int currBattleLevelId)
  15. {
  16. /**
  17. * Conifgs
  18. */
  19. ChallengeDataDefine challengeCfg = null;
  20. FieldDataDefine fieldCfg = null;
  21. FieldShapeDataDefine fieldShapeCfg = null;
  22. /**
  23. * 关卡
  24. */
  25. GUILayout.BeginHorizontal();
  26. GUILayout.Label("关卡:");
  27. var tmpBattleLevelId = EditorGUILayout.IntPopup(currBattleLevelId, battleLevelStrIds, battleLevelIds);
  28. if (!battleLevelIdChanged) battleLevelIdChanged = currBattleLevelId != tmpBattleLevelId;
  29. currBattleLevelId = tmpBattleLevelId;
  30. if (GUILayout.Button("<<"))
  31. {
  32. battleLevelIdChanged = true;
  33. currBattleLevelId -= 10;
  34. currBattleLevelId = Math.Max(1, currBattleLevelId);
  35. }
  36. if (GUILayout.Button("<"))
  37. {
  38. battleLevelIdChanged = true;
  39. currBattleLevelId--;
  40. currBattleLevelId = Math.Max(1, currBattleLevelId);
  41. }
  42. if (GUILayout.Button(">"))
  43. {
  44. battleLevelIdChanged = true;
  45. currBattleLevelId++;
  46. }
  47. if (GUILayout.Button(">>"))
  48. {
  49. battleLevelIdChanged = true;
  50. currBattleLevelId += 10;
  51. }
  52. if (currBattleLevelId > 0 && (battleLevelIdChanged || challengeCfg == null))
  53. {
  54. challengeCfg = ConfigEditor.challengeDataCfgs[currBattleLevelId];
  55. fieldCfg = ConfigEditor.fieldDataCfgs[challengeCfg.FieldID];
  56. fieldShapeCfg = ConfigEditor.fieldShapeCfgs[fieldCfg.FieldShapeID];
  57. }
  58. GUILayout.FlexibleSpace();
  59. GUILayout.Label("筛选:");
  60. var tmpBattleLevelIdFilter = _battleLevelIdFilter;
  61. _battleLevelIdFilter = EditorGUILayout.TextField(_battleLevelIdFilter);
  62. if (tmpBattleLevelIdFilter != _battleLevelIdFilter)
  63. {
  64. _battleLevelIds = null;
  65. _battleLevelStrIds = null;
  66. }
  67. GUILayout.FlexibleSpace();
  68. if (GUILayout.Button("复制"))
  69. {
  70. var newId = AddBattleLevel(currBattleLevelId);
  71. battleEditor.ChangeCurrBattleLevelId(newId);
  72. battleEditor.Reload();
  73. }
  74. if (GUILayout.Button("删除"))
  75. {
  76. RemoveBattleLevel(currBattleLevelId);
  77. var enu = ConfigEditor.challengeDataCfgs.Keys.GetEnumerator(); enu.MoveNext();
  78. battleEditor.ChangeCurrBattleLevelId(enu.Current);
  79. battleEditor.Reload();
  80. }
  81. if (GUILayout.Button("刷新"))
  82. {
  83. RefreshLevelIds(battleEditor);
  84. }
  85. GUILayout.EndHorizontal();
  86. /**
  87. * 关卡类型
  88. * 0,有限子弹; 1,有限时间;
  89. */
  90. if (constraintVal <= 0 || battleLevelIdChanged)
  91. {
  92. constraintType = challengeCfg == null ? 0 : (challengeCfg.ConstraintType == (int)Global.Enum_ConstraintType.Count ? 0 : 1);
  93. constraintVal = challengeCfg == null ? 0 : challengeCfg.ConstraintValue;
  94. }
  95. GUILayout.BeginHorizontal();
  96. GUILayout.Label("限制:");
  97. constraintType = EditorGUILayout.Popup(constraintType, new string[] { "子弹", "秒数" });
  98. GUILayout.FlexibleSpace();
  99. GUILayout.Label("x");
  100. constraintVal = EditorGUILayout.IntField(constraintVal);
  101. GUILayout.FlexibleSpace();
  102. GUILayout.EndHorizontal();
  103. /**
  104. * 通关分数
  105. */
  106. if (goldScore <= 0 || battleLevelIdChanged)
  107. {
  108. var scores = challengeCfg == null ? new List<int> { 0, 0, 0, 0 } : challengeCfg.Condition;
  109. if (scores.Count > 3) huangScore = scores[3];
  110. if (scores.Count > 2) goldScore = scores[2];
  111. if (scores.Count > 1) silverScore = scores[1];
  112. if (scores.Count > 0) bronzeScore = scores[0];
  113. }
  114. GUILayout.BeginHorizontal();
  115. GUILayout.Label("皇冠:");
  116. huangScore = EditorGUILayout.IntField(huangScore);
  117. GUILayout.FlexibleSpace();
  118. GUILayout.Label("金:");
  119. goldScore = EditorGUILayout.IntField(goldScore);
  120. GUILayout.FlexibleSpace();
  121. GUILayout.Label("银:");
  122. silverScore = EditorGUILayout.IntField(silverScore);
  123. GUILayout.FlexibleSpace();
  124. GUILayout.Label("铜:");
  125. bronzeScore = EditorGUILayout.IntField(bronzeScore);
  126. GUILayout.EndHorizontal();
  127. /********************风力**************************************/
  128. var level = DataManager.Instance.csvData.GetLevelByID(currBattleLevelId);
  129. if (windMin <= 0 || battleLevelIdChanged)
  130. {
  131. windMin = level.windMin;
  132. windMax = level.windMax;
  133. windChange = level.windChange;
  134. }
  135. GUILayout.BeginHorizontal();
  136. GUILayout.Label("最小风:");
  137. windMin = EditorGUILayout.FloatField(windMin);
  138. GUILayout.FlexibleSpace();
  139. GUILayout.Label("最大风:");
  140. windMax = EditorGUILayout.FloatField(windMax);
  141. GUILayout.FlexibleSpace();
  142. GUILayout.Label("每几轮重随机:");
  143. windChange = EditorGUILayout.IntField(windChange);
  144. GUILayout.EndHorizontal();
  145. /*************************************************************/
  146. /**
  147. * 场景
  148. */
  149. GUILayout.BeginHorizontal();
  150. GUILayout.Label("场景:");
  151. if (currBattleLevelId > 0 && battleLevelIdChanged)
  152. {
  153. for (int i = 0; i < bakeScenes.Length; i++)
  154. {
  155. if (fieldShapeCfg.ResourceName == "Bake_" + bakeScenes[i])
  156. {
  157. bakeSceneIdx = i;
  158. break;
  159. }
  160. }
  161. }
  162. bakeSceneIdx = EditorGUILayout.Popup(bakeSceneIdx, bakeScenes);
  163. var bakeSceneId = _bakeScenesIds[bakeSceneIdx];
  164. if (GUILayout.Button("Load"))
  165. {
  166. var bakeSceneName = "Bake_" + bakeScenes[bakeSceneIdx] + ".unity";
  167. EditorSceneManager.OpenScene("Assets/Scenes/" + bakeSceneName);
  168. }
  169. GUILayout.FlexibleSpace();
  170. if (GUILayout.Button("Refresh"))
  171. {
  172. _bakeScenesNames = null;
  173. }
  174. GUILayout.EndHorizontal();
  175. /**
  176. * 距离标记
  177. */
  178. if (battleLevelIdChanged || distanceSignIdx1 == 0)
  179. {
  180. if (fieldCfg != null)
  181. {
  182. var highlightSigns = fieldCfg.Mark.Split('@')[0].Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
  183. var signList = new List<string>(distanceSigns);
  184. distanceSignIdx1 = signList.IndexOf(highlightSigns[0]);
  185. distanceSignIdx2 = highlightSigns.Length > 1 ? signList.IndexOf(highlightSigns[1]) : 0;
  186. distanceSignIdx3 = highlightSigns.Length > 2 ? signList.IndexOf(highlightSigns[2]) : 0;
  187. }
  188. }
  189. GUILayout.BeginHorizontal();
  190. GUILayout.Label("距离标记高亮:");
  191. distanceSignIdx1 = EditorGUILayout.Popup(distanceSignIdx1, distanceSigns);
  192. distanceSignIdx2 = EditorGUILayout.Popup(distanceSignIdx2, distanceSigns);
  193. distanceSignIdx3 = EditorGUILayout.Popup(distanceSignIdx3, distanceSigns);
  194. GUILayout.EndHorizontal();
  195. if (battleLevelIdChanged)
  196. {
  197. if (fieldCfg != null)
  198. {
  199. var markArr = fieldCfg.Mark.Split('@');
  200. distanceSignX = 0f;
  201. distanceSignY = 0f;
  202. switch (markArr.Length)
  203. {
  204. case 2:
  205. distanceSignX = float.Parse(markArr[1]);
  206. break;
  207. case 3:
  208. distanceSignX = float.Parse(markArr[1]);
  209. distanceSignY = float.Parse(markArr[2]);
  210. break;
  211. }
  212. }
  213. }
  214. GUILayout.BeginHorizontal();
  215. GUILayout.Label("距离标记坐标:");
  216. GUILayout.Label("x:");
  217. distanceSignX = EditorGUILayout.FloatField(distanceSignX);
  218. GUILayout.Label("y:");
  219. distanceSignY = EditorGUILayout.FloatField(distanceSignY);
  220. GUILayout.EndHorizontal();
  221. /**
  222. * 靶子组合
  223. */
  224. GUILayout.BeginHorizontal();
  225. GUILayout.Label("靶子组合:");
  226. if (battleLevelIdChanged) newChallengeTargetDataId = -1;
  227. if (battleEditor.GetTargetDataIds().Length == 0) { } // Tmp For Init
  228. newChallengeTargetDataId = EditorGUILayout.IntPopup(newChallengeTargetDataId, battleEditor.GetTargetDataStrIds(), battleEditor.GetTargetDataIds());
  229. if (GUILayout.Button("新增"))
  230. {
  231. if (newChallengeTargetDataId > 0)
  232. {
  233. if (!ConfigEditor.ExistTragetGroupCfg(fieldCfg.ID, newChallengeTargetDataId))
  234. {
  235. int startId = fieldCfg.ID * 10000;
  236. int newGroupId = startId;
  237. foreach (var tmpGroup in ConfigEditor.targetGroupCfgs.Values)
  238. {
  239. int leftNumber = tmpGroup.ID - startId;
  240. if (leftNumber >= 0 && leftNumber < 10000)
  241. {
  242. if (tmpGroup.ID + 1 > newGroupId)
  243. {
  244. newGroupId = tmpGroup.ID + 1;
  245. }
  246. }
  247. }
  248. var groupCfg = new TargetGroupDefine
  249. {
  250. ID = newGroupId,
  251. GroupID = fieldCfg.ID,
  252. TargetID = newChallengeTargetDataId,
  253. };
  254. ConfigEditor.targetGroupCfgs.Add(groupCfg.ID, groupCfg);
  255. }
  256. else
  257. {
  258. Debug.LogError("已存在,请勿重复添加");
  259. }
  260. }
  261. newChallengeTargetDataId = -1;
  262. }
  263. if (GUILayout.Button("重置"))
  264. {
  265. ConfigEditor.RefreshTargetGroupCfgs();
  266. newChallengeTargetDataId = -1;
  267. }
  268. GUILayout.FlexibleSpace();
  269. GUILayout.EndHorizontal();
  270. //var targetGroupId = _roundFactoryGroupIdDic[roundFactorGroupIdx]; // RoundFactorGroupId 暂时和 TargetGroupId 一致
  271. //
  272. //var predata = ConfigEditor.LoadGamePredata();
  273. var targets = ConfigEditor.GetTargetCfgsByGroupId(fieldCfg.ID);
  274. foreach (var targetCfg in targets)
  275. {
  276. GUILayout.BeginHorizontal();
  277. if (GUILayout.Button("X"))
  278. {
  279. TargetGroupDefine tmp = null;
  280. foreach (var groupCfg in ConfigEditor.targetGroupCfgs.Values)
  281. {
  282. if (groupCfg.GroupID == fieldCfg.ID && groupCfg.TargetID == targetCfg.ID)
  283. {
  284. tmp = groupCfg;
  285. break;
  286. }
  287. }
  288. ConfigEditor.targetGroupCfgs.Remove(tmp.ID);
  289. }
  290. GUILayout.Space(10f);
  291. var roundTargets = RoundTarget.GetRoundTargetDict(DataManager.Instance.csvData.GetLevelByID(challengeCfg.ID).roundTargetIds);
  292. var round = (roundTargets == null || !roundTargets.ContainsKey(targetCfg.ID)) ? 0 : roundTargets[targetCfg.ID];
  293. EditorGUILayout.LabelField("波次:" + round, GUILayout.Width(50f));
  294. if (targetCfg.ResourceName.IndexOf("#") > 0)
  295. {
  296. string[] targetExInfo = targetCfg.ResourceName.Split('#');
  297. if (targetExInfo.Length == 3)
  298. {
  299. GUILayout.Label(targetCfg.ID + " " + targetExInfo[0]);
  300. }
  301. }
  302. else
  303. {
  304. GUILayout.Label(targetCfg.ID + " " + targetCfg.ResourceName);
  305. }
  306. GUILayout.FlexibleSpace();
  307. GUILayout.EndHorizontal();
  308. }
  309. /**
  310. *
  311. */
  312. GUILayout.Space(10f);
  313. GUILayout.BeginHorizontal();
  314. if (GUILayout.Button("Preview"))
  315. {
  316. EditorSceneManager.OpenScene("Assets/ShootGame/Test/Scenes/BattleLevelEditor.unity");
  317. var editorTmpRoot = BattleFieldSceneCreator.CreateEditorTmpRoot();
  318. var levelProxy = editorTmpRoot.GetComponent<EditorBattleLevelProxy>();
  319. if (levelProxy == null)
  320. {
  321. levelProxy = editorTmpRoot.AddComponent<EditorBattleLevelProxy>();
  322. }
  323. if (currBattleLevelId > 0)
  324. {
  325. UpdateChallengeConfig(currBattleLevelId,huangScore, goldScore, silverScore, bronzeScore, constraintType, constraintVal);
  326. UpdateFieldConfig(
  327. currBattleLevelId, bakeSceneId,
  328. distanceSignIdx1 == 0 ? 0 : int.Parse(distanceSigns[distanceSignIdx1]),
  329. distanceSignIdx2 == 0 ? 0 : int.Parse(distanceSigns[distanceSignIdx2]),
  330. distanceSignIdx3 == 0 ? 0 : int.Parse(distanceSigns[distanceSignIdx3]),
  331. distanceSignX, distanceSignY
  332. );
  333. //
  334. var editorProxy = editorTmpRoot.GetComponent<EditorBattleLevelProxy>();
  335. editorProxy.targetChallengeId = challengeCfg.ID;
  336. editorProxy.targetRoundFactorGroupId = fieldCfg.RoundFactorGroupID;
  337. editorProxy.targetFieldShapeId = fieldCfg.FieldShapeID;
  338. editorProxy.challengeCfg = challengeCfg;
  339. editorProxy.fieldCfg = fieldCfg;
  340. }
  341. //
  342. EditorApplication.isPlaying = true;
  343. }
  344. /**
  345. * Save
  346. */
  347. if (GUILayout.Button("Save"))
  348. {
  349. if (currBattleLevelId > 0)
  350. {
  351. UpdateChallengeConfig(currBattleLevelId,huangScore, goldScore, silverScore, bronzeScore, constraintType, constraintVal);
  352. UpdateFieldConfig(
  353. currBattleLevelId, bakeSceneId,
  354. distanceSignIdx1 == 0 ? 0 : int.Parse(distanceSigns[distanceSignIdx1]),
  355. distanceSignIdx2 == 0 ? 0 : int.Parse(distanceSigns[distanceSignIdx2]),
  356. distanceSignIdx3 == 0 ? 0 : int.Parse(distanceSigns[distanceSignIdx3]),
  357. distanceSignX, distanceSignY
  358. );
  359. level.windMin = windMin;
  360. level.windMax = windMax;
  361. level.windChange = windChange;
  362. }
  363. //ConfigEditor.SaveData2Jsonparts();
  364. ConfigEditor.SaveData2Excel_chuan();
  365. battleEditor.Reload();
  366. BattleFieldSceneCreator.CompileGameConfigs();
  367. DataManager.Instance.InitData();
  368. }
  369. if (GUILayout.Button("调整关卡顺序"))
  370. {
  371. ReorderLevels(battleEditor);
  372. }
  373. if (GUILayout.Button("去除433关之后"))
  374. {
  375. var ids = new List<int>(ConfigEditor.challengeDataCfgs.Keys);
  376. foreach (var k in ids)
  377. {
  378. if (k > Global.MaxLevel)
  379. {
  380. ConfigEditor.challengeDataCfgs.Remove(k);
  381. }
  382. }
  383. ConfigEditor.Remove433ChallengeID();
  384. }
  385. GUILayout.EndHorizontal();
  386. battleLevelIdChanged = false;
  387. }
  388. private static bool IsShuffledArray(int[] arr)
  389. {
  390. int length = arr.Length;
  391. int[] expected = Enumerable.Range(1, length).ToArray();
  392. int[] sortedArr = (int[])arr.Clone();
  393. Array.Sort(sortedArr);
  394. return sortedArr.SequenceEqual(expected);
  395. }
  396. private static void ReorderLevelConfigs<T>(IDictionary<int, T> configs, IReadOnlyList<int> newLevelIdMap, Action<int, T> configModifier)
  397. {
  398. var tempConfigs = new T[newLevelIdMap.Count];
  399. int newLevelId;
  400. for (int newLevelIdIdx = 0; newLevelIdIdx < newLevelIdMap.Count; newLevelIdIdx++)
  401. {
  402. int oldLevelId = newLevelIdMap[newLevelIdIdx];
  403. newLevelId = newLevelIdIdx + 1;
  404. var config = configs[oldLevelId];
  405. configModifier.Invoke(newLevelId, config);
  406. tempConfigs[newLevelIdIdx] = config;
  407. }
  408. configs.Clear();
  409. newLevelId = 1;
  410. foreach (var config in tempConfigs)
  411. {
  412. configs.Add(newLevelId, config);
  413. newLevelId++;
  414. }
  415. }
  416. private static void ReorderLevels(BattleFieldSceneCreator battleEditor)
  417. {
  418. // DataWriter.SaveChallengeData(gameDataDir, "ChallengeData", challengeDataCfgs);
  419. // DataWriter.SaveFieldData(gameDataDir, "FieldData", fieldDataCfgs);
  420. // DataWriter.SaveTargetData(gameDataDir, "TargetData", targetDataCfgs);
  421. // DataWriter.SaveTargetGroupData(gameDataDir, "TargetGroup", targetGroupCfgs);
  422. // DataWriter.SaveFieldShapeData(gameDataDir, "FieldShapeData", fieldShapeCfgs);
  423. // DataWriter.SaveLevelData(gameDataDir, "Level", levelCfgs);
  424. var newLevelIdMap = new int[]
  425. {
  426. 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,33,36,34,35,39,32,38,37,40,42,43,45,41,44,46,48,49,47,50,52,53,51,55,56,54,57,59,58,60,61,63,64,62,65,68,66,69,67,70,72,73,71,74,76,79,77,75,78,80,82,83,81,84,86,87,89,85,88,90,93,91,94,92,95,97,96,99,98,100,102,105,103,101,104,107,109,106,108,110,112,113,116,111,114,117,115,119,118,120,122,123,121,125,124,126,128,127,129,130,132,135,133,137,131,134,139,136,138,140,142,143,141,144,146,148,145,149,147,150,151,154,152,155,153,159,156,158,157,160,162,163,167,161,164,166,165,169,168,170,173,171,175,174,179,172,178,176,177,180,182,184,186,181,185,188,183,189,187,190,193,191,194,195,197,192,198,196,199,202,200,203,201,204,206,207,205,209,208,210,213,212,211,215,214,218,217,216,219,220,222,221,224,223,226,225,229,228,227,230,232,235,231,234,236,233,239,238,237,240,243,241,244,247,245,242,249,246,248,250,252,254,253,251,256,258,255,259,257,260,263,261,264,266,262,269,265,268,267,270,273,272,275,271,276,279,274,278,277,280,282,281,284,287,283,286,285,289,288,290,293,292,291,295,297,294,296,299,298,300,303,302,305,301,304,308,307,306,309,310,312,313,315,311,314,317,319,316,318,320,322,321,324,323,328,326,325,327,329,332,330,333,331,334,336,335,337,339,338,340,344,341,343,342,346,345,347,349,348,350,353,352,354,351,356,358,355,357,359,361,360,362,364,366,363,367,369,365,368,370,373,371,376,374,372,379,375,378,377,382,380,384,383,386,381,388,385,387,389,390,393,392,391,395,394,397,396,399,398,400,403,402,401,405,407,404,409,406,408,410,413,412,411,415,414,417,419,416,418,421,423,420,424,422,428,426,425,427,429,430,433,431,434,436,432,435,438,437,439,440,443,442,441,445,444,448,447,446,449,452,451,450,454,453,457,455,456,459,458,461,460,463,462,464,467,466,465,468,470,469,471,473,472
  427. };
  428. // Check LevelIdMap valid
  429. {
  430. if (newLevelIdMap.Length != ConfigEditor.challengeDataCfgs.Count)
  431. {
  432. Debug.LogError("关卡数量不一样");
  433. return;
  434. }
  435. if (!IsShuffledArray(newLevelIdMap))
  436. {
  437. Debug.LogError("关卡顺序配置错误");
  438. return;
  439. }
  440. }
  441. ReorderLevelConfigs(ConfigEditor.challengeDataCfgs, newLevelIdMap, (newLevelId, config) =>
  442. {
  443. config.ID = newLevelId;
  444. config.FieldID = newLevelId;
  445. });
  446. ReorderLevelConfigs(ConfigEditor.fieldDataCfgs, newLevelIdMap, (newLevelId, config) =>
  447. {
  448. config.ID = newLevelId;
  449. config.RoundFactorGroupID = newLevelId;
  450. });
  451. {
  452. var oldLevelCfgs = ConfigEditor.levelCfgs.Values.ToArray();
  453. ReorderLevelConfigs(ConfigEditor.levelCfgs, newLevelIdMap, (newLevelId, config) =>
  454. {
  455. config.ID = newLevelId;
  456. config.realID = newLevelId;
  457. });
  458. for (int levelIdx = 0; levelIdx < ConfigEditor.levelCfgs.Count; levelIdx++)
  459. {
  460. int levelId = levelIdx + 1;
  461. var oldConfig = oldLevelCfgs[levelIdx];
  462. var newConfig = ConfigEditor.levelCfgs[levelId];
  463. newConfig.coinsStar1 = oldConfig.coinsStar1;
  464. newConfig.coinsStar2 = oldConfig.coinsStar2;
  465. newConfig.coinsStar3 = oldConfig.coinsStar3;
  466. newConfig.coinsBullet = oldConfig.coinsBullet;
  467. newConfig.coinsCombo = oldConfig.coinsCombo;
  468. }
  469. }
  470. {
  471. var groupedDictionary = ConfigEditor.targetGroupCfgs.Values.GroupBy(item => item.GroupID).ToDictionary(group => group.Key, group => group.ToArray());
  472. for (int newLevelIdIdx = 0; newLevelIdIdx < newLevelIdMap.Length; newLevelIdIdx++)
  473. {
  474. int oldLevelId = newLevelIdMap[newLevelIdIdx];
  475. var newLevelId = newLevelIdIdx + 1;
  476. var groupConfigs = groupedDictionary[oldLevelId];
  477. foreach (var config in groupConfigs)
  478. {
  479. config.GroupID = newLevelId;
  480. }
  481. }
  482. }
  483. //ConfigEditor.SaveData2Jsonparts();
  484. ConfigEditor.SaveData2Excel_chuan();
  485. battleEditor.Reload();
  486. BattleFieldSceneCreator.CompileGameConfigs();
  487. DataManager.Instance.InitData();
  488. }
  489. public static void ClearBattleFieldEditorDataCache(this BattleFieldSceneCreator battleEditor)
  490. {
  491. _battleLevelIds = null;
  492. _battleLevelStrIds = null;
  493. _bakeScenesNames = null;
  494. }
  495. public static int AddBattleLevel(int duplicateId)
  496. {
  497. var dupChallengeCfg = ConfigEditor.challengeDataCfgs[duplicateId];
  498. //
  499. int newChallengeCfgId = -1;
  500. foreach (var kv in ConfigEditor.challengeDataCfgs)
  501. {
  502. if (newChallengeCfgId <= kv.Key) newChallengeCfgId = kv.Key + 1;
  503. }
  504. var newChallengeCfg = new ChallengeDataDefine
  505. {
  506. ID = newChallengeCfgId,
  507. FieldID = newChallengeCfgId,
  508. DecStaminaCnt = dupChallengeCfg.DecStaminaCnt,
  509. ConstraintType = dupChallengeCfg.ConstraintType,
  510. ConstraintValue = dupChallengeCfg.ConstraintValue,
  511. Condition = dupChallengeCfg.Condition,
  512. Reward_ID_1 = dupChallengeCfg.Reward_ID_1,
  513. };
  514. ConfigEditor.challengeDataCfgs.Add(newChallengeCfg.ID, newChallengeCfg);
  515. // Duplicate latest one
  516. var maxFieldCfg = ConfigEditor.fieldDataCfgs[dupChallengeCfg.FieldID];
  517. var newFieldCfg = new FieldDataDefine
  518. {
  519. ID = newChallengeCfg.FieldID,
  520. RoundFactorGroupID = newChallengeCfg.FieldID,
  521. FieldShapeID = maxFieldCfg.FieldShapeID,
  522. DefaultPlayerPos = maxFieldCfg.DefaultPlayerPos,
  523. Mark = maxFieldCfg.Mark,
  524. };
  525. ConfigEditor.fieldDataCfgs.Add(newFieldCfg.ID, newFieldCfg);
  526. ConfigEditor.SaveChallengeAndFieldData2ExcelAndJson();
  527. //
  528. return newChallengeCfg.ID;
  529. }
  530. public static void RemoveBattleLevel(int id)
  531. {
  532. var challengeCfg = ConfigEditor.challengeDataCfgs[id];
  533. var fieldCfg = ConfigEditor.fieldDataCfgs[challengeCfg.FieldID];
  534. ConfigEditor.fieldDataCfgs.Remove(fieldCfg.ID);
  535. ConfigEditor.challengeDataCfgs.Remove(id);
  536. ConfigEditor.SaveChallengeAndFieldData2ExcelAndJson();
  537. }
  538. public static void RefreshLevelIds(this BattleFieldSceneCreator battleEditor)
  539. {
  540. _battleLevelIds = null;
  541. _battleLevelStrIds = null;
  542. }
  543. private static void UpdateFieldConfig(int challengeId, int fieldShapeId, int distanceSign1, int distanceSign2, int distanceSign3, float distanceSignX, float distanceSignY)
  544. {
  545. var challengeCfg = ConfigEditor.challengeDataCfgs[challengeId];
  546. var fieldCfg = ConfigEditor.fieldDataCfgs[challengeCfg.FieldID];
  547. // Performan config change
  548. fieldCfg.FieldShapeID = fieldShapeId;
  549. // Distance signs
  550. var distanceIntSigns = new List<int> { distanceSign1, distanceSign2, distanceSign3, };
  551. distanceIntSigns.Sort();
  552. distanceIntSigns.Reverse();
  553. fieldCfg.Mark = new StringBuilder()
  554. .Append(distanceIntSigns[0] == 0 ? string.Empty : "" + distanceIntSigns[0])
  555. .Append(distanceIntSigns[1] == 0 ? string.Empty : "|" + distanceIntSigns[1])
  556. .Append(distanceIntSigns[2] == 0 ? string.Empty : "|" + distanceIntSigns[2])
  557. .Append(Mathf.Approximately(distanceSignX, 0f) ? string.Empty : "@" + distanceSignX)
  558. .Append(Mathf.Approximately(distanceSignY, 0) ? string.Empty : "@" + distanceSignY)
  559. .ToString();
  560. }
  561. private static void UpdateBakedScenes()
  562. {
  563. var fileNames = Directory.GetFiles(Path.Combine(Application.dataPath, "Scenes"), "*Bake_*.unity");
  564. var scenes = new List<string>();
  565. foreach (var fileName in fileNames)
  566. {
  567. FileInfo fi = new FileInfo(fileName);
  568. scenes.Add(fi.Name.Replace("Bake_", "").Replace(".unity", ""));
  569. }
  570. _bakeScenesNames = scenes.ToArray();
  571. }
  572. /**
  573. * Data
  574. */
  575. //
  576. //private static int currBattleLevelId = 1;
  577. private static bool battleLevelIdChanged = true;
  578. // Scores
  579. private static int huangScore;
  580. private static int goldScore;
  581. private static int silverScore;
  582. private static int bronzeScore;
  583. // 风力
  584. private static float windMin = -1;
  585. private static float windMax = -1;
  586. private static int windChange = -1;
  587. // Constraint
  588. private static int constraintType = 0;
  589. private static int constraintVal = 0;
  590. private static void UpdateChallengeConfig(int challengeId,int huangScore, int goldScore, int silverScore, int bronzeScore, int constraintType, int constraintVal)
  591. {
  592. var cfg = ConfigEditor.challengeDataCfgs[challengeId];
  593. List<int> cond = new List<int>();
  594. cond.Add(bronzeScore);
  595. cond.Add(silverScore);
  596. cond.Add(goldScore);
  597. cond.Add(huangScore);
  598. cfg.Condition = cond;
  599. cfg.ConstraintType = constraintType == 0 ? (int)Global.Enum_ConstraintType.Count : (int)Global.Enum_ConstraintType.Time;
  600. cfg.ConstraintValue = constraintVal;
  601. }
  602. // Battle Level Ids
  603. private static string _battleLevelIdFilter = string.Empty;
  604. private static string[] _battleLevelStrIds;
  605. private static string[] battleLevelStrIds
  606. {
  607. get
  608. {
  609. if (_battleLevelStrIds == null) InitBattleLevelIds();
  610. return _battleLevelStrIds;
  611. }
  612. }
  613. private static int[] _battleLevelIds;
  614. private static int[] battleLevelIds
  615. {
  616. get
  617. {
  618. if (_battleLevelIds == null) InitBattleLevelIds();
  619. return _battleLevelIds;
  620. }
  621. }
  622. private static void InitBattleLevelIds()
  623. {
  624. //
  625. var enu = ConfigEditor.challengeDataCfgs.Keys.GetEnumerator();
  626. var ints = new List<int> { };
  627. var strs = new List<string> { };
  628. while (enu.MoveNext())
  629. {
  630. var strInt = enu.Current.ToString();
  631. if (!strInt.StartsWith(_battleLevelIdFilter, StringComparison.Ordinal)) continue;
  632. ints.Add(enu.Current);
  633. strs.Add(strInt);
  634. }
  635. _battleLevelIds = ints.ToArray();
  636. _battleLevelStrIds = strs.ToArray();
  637. }
  638. // Bake Scene
  639. private static int bakeSceneIdx = 0;
  640. private static string[] _bakeScenesNames;
  641. private static int[] _bakeScenesIds;
  642. private static string[] bakeScenes
  643. {
  644. get
  645. {
  646. if (_bakeScenesNames == null)
  647. {
  648. var ids = new List<int>();
  649. var names = new List<string>();
  650. foreach (var kv in ConfigEditor.fieldShapeCfgs)
  651. {
  652. ids.Add(kv.Key);
  653. names.Add(kv.Value.ResourceName.Replace("Bake_", ""));
  654. }
  655. _bakeScenesIds = ids.ToArray();
  656. _bakeScenesNames = names.ToArray();
  657. }
  658. return _bakeScenesNames;
  659. }
  660. }
  661. // Distance signs
  662. private static int distanceSignIdx1 = 0;
  663. private static int distanceSignIdx2 = 0;
  664. private static int distanceSignIdx3 = 0;
  665. private static string[] distanceSigns = { "-", "30", "50", "70", "90", "110", "130" };
  666. private static float distanceSignX = 0f;
  667. private static float distanceSignY = 0f;
  668. // Target Data
  669. private static int newChallengeTargetDataId = -1;
  670. }
  671. }