using UnityEngine; using System.Collections; using UnityEditor; using System.Collections.Generic; using UnityEditor.SceneManagement; using System.Text; using System; using System.IO; using System.Linq; namespace JamesGame { public static class BattleFieldEditor { public static void DrawBattleFieldEditorGUI(this BattleFieldSceneCreator battleEditor, ref int currBattleLevelId) { /** * Conifgs */ ChallengeDataDefine challengeCfg = null; FieldDataDefine fieldCfg = null; FieldShapeDataDefine fieldShapeCfg = null; /** * 关卡 */ GUILayout.BeginHorizontal(); GUILayout.Label("关卡:"); var tmpBattleLevelId = EditorGUILayout.IntPopup(currBattleLevelId, battleLevelStrIds, battleLevelIds); if (!battleLevelIdChanged) battleLevelIdChanged = currBattleLevelId != tmpBattleLevelId; currBattleLevelId = tmpBattleLevelId; if (GUILayout.Button("<<")) { battleLevelIdChanged = true; currBattleLevelId -= 10; currBattleLevelId = Math.Max(1, currBattleLevelId); } if (GUILayout.Button("<")) { battleLevelIdChanged = true; currBattleLevelId--; currBattleLevelId = Math.Max(1, currBattleLevelId); } if (GUILayout.Button(">")) { battleLevelIdChanged = true; currBattleLevelId++; } if (GUILayout.Button(">>")) { battleLevelIdChanged = true; currBattleLevelId += 10; } if (currBattleLevelId > 0 && (battleLevelIdChanged || challengeCfg == null)) { challengeCfg = ConfigEditor.challengeDataCfgs[currBattleLevelId]; fieldCfg = ConfigEditor.fieldDataCfgs[challengeCfg.FieldID]; fieldShapeCfg = ConfigEditor.fieldShapeCfgs[fieldCfg.FieldShapeID]; } GUILayout.FlexibleSpace(); GUILayout.Label("筛选:"); var tmpBattleLevelIdFilter = _battleLevelIdFilter; _battleLevelIdFilter = EditorGUILayout.TextField(_battleLevelIdFilter); if (tmpBattleLevelIdFilter != _battleLevelIdFilter) { _battleLevelIds = null; _battleLevelStrIds = null; } GUILayout.FlexibleSpace(); if (GUILayout.Button("复制")) { var newId = AddBattleLevel(currBattleLevelId); battleEditor.ChangeCurrBattleLevelId(newId); battleEditor.Reload(); } if (GUILayout.Button("删除")) { RemoveBattleLevel(currBattleLevelId); var enu = ConfigEditor.challengeDataCfgs.Keys.GetEnumerator(); enu.MoveNext(); battleEditor.ChangeCurrBattleLevelId(enu.Current); battleEditor.Reload(); } if (GUILayout.Button("刷新")) { RefreshLevelIds(battleEditor); } GUILayout.EndHorizontal(); /** * 关卡类型 * 0,有限子弹; 1,有限时间; */ if (constraintVal <= 0 || battleLevelIdChanged) { constraintType = challengeCfg == null ? 0 : (challengeCfg.ConstraintType == (int)Global.Enum_ConstraintType.Count ? 0 : 1); constraintVal = challengeCfg == null ? 0 : challengeCfg.ConstraintValue; } GUILayout.BeginHorizontal(); GUILayout.Label("限制:"); constraintType = EditorGUILayout.Popup(constraintType, new string[] { "子弹", "秒数" }); GUILayout.FlexibleSpace(); GUILayout.Label("x"); constraintVal = EditorGUILayout.IntField(constraintVal); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); /** * 通关分数 */ if (goldScore <= 0 || battleLevelIdChanged) { var scores = challengeCfg == null ? new List { 0, 0, 0, 0 } : challengeCfg.Condition; if (scores.Count > 3) huangScore = scores[3]; if (scores.Count > 2) goldScore = scores[2]; if (scores.Count > 1) silverScore = scores[1]; if (scores.Count > 0) bronzeScore = scores[0]; } GUILayout.BeginHorizontal(); GUILayout.Label("皇冠:"); huangScore = EditorGUILayout.IntField(huangScore); GUILayout.FlexibleSpace(); GUILayout.Label("金:"); goldScore = EditorGUILayout.IntField(goldScore); GUILayout.FlexibleSpace(); GUILayout.Label("银:"); silverScore = EditorGUILayout.IntField(silverScore); GUILayout.FlexibleSpace(); GUILayout.Label("铜:"); bronzeScore = EditorGUILayout.IntField(bronzeScore); GUILayout.EndHorizontal(); /********************风力**************************************/ var level = DataManager.Instance.csvData.GetLevelByID(currBattleLevelId); if (windMin <= 0 || battleLevelIdChanged) { windMin = level.windMin; windMax = level.windMax; windChange = level.windChange; } GUILayout.BeginHorizontal(); GUILayout.Label("最小风:"); windMin = EditorGUILayout.FloatField(windMin); GUILayout.FlexibleSpace(); GUILayout.Label("最大风:"); windMax = EditorGUILayout.FloatField(windMax); GUILayout.FlexibleSpace(); GUILayout.Label("每几轮重随机:"); windChange = EditorGUILayout.IntField(windChange); GUILayout.EndHorizontal(); /*************************************************************/ /** * 场景 */ GUILayout.BeginHorizontal(); GUILayout.Label("场景:"); if (currBattleLevelId > 0 && battleLevelIdChanged) { for (int i = 0; i < bakeScenes.Length; i++) { if (fieldShapeCfg.ResourceName == "Bake_" + bakeScenes[i]) { bakeSceneIdx = i; break; } } } bakeSceneIdx = EditorGUILayout.Popup(bakeSceneIdx, bakeScenes); var bakeSceneId = _bakeScenesIds[bakeSceneIdx]; if (GUILayout.Button("Load")) { var bakeSceneName = "Bake_" + bakeScenes[bakeSceneIdx] + ".unity"; EditorSceneManager.OpenScene("Assets/Scenes/" + bakeSceneName); } GUILayout.FlexibleSpace(); if (GUILayout.Button("Refresh")) { _bakeScenesNames = null; } GUILayout.EndHorizontal(); /** * 距离标记 */ if (battleLevelIdChanged || distanceSignIdx1 == 0) { if (fieldCfg != null) { var highlightSigns = fieldCfg.Mark.Split('@')[0].Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries); var signList = new List(distanceSigns); distanceSignIdx1 = signList.IndexOf(highlightSigns[0]); distanceSignIdx2 = highlightSigns.Length > 1 ? signList.IndexOf(highlightSigns[1]) : 0; distanceSignIdx3 = highlightSigns.Length > 2 ? signList.IndexOf(highlightSigns[2]) : 0; } } GUILayout.BeginHorizontal(); GUILayout.Label("距离标记高亮:"); distanceSignIdx1 = EditorGUILayout.Popup(distanceSignIdx1, distanceSigns); distanceSignIdx2 = EditorGUILayout.Popup(distanceSignIdx2, distanceSigns); distanceSignIdx3 = EditorGUILayout.Popup(distanceSignIdx3, distanceSigns); GUILayout.EndHorizontal(); if (battleLevelIdChanged) { if (fieldCfg != null) { var markArr = fieldCfg.Mark.Split('@'); distanceSignX = 0f; distanceSignY = 0f; switch (markArr.Length) { case 2: distanceSignX = float.Parse(markArr[1]); break; case 3: distanceSignX = float.Parse(markArr[1]); distanceSignY = float.Parse(markArr[2]); break; } } } GUILayout.BeginHorizontal(); GUILayout.Label("距离标记坐标:"); GUILayout.Label("x:"); distanceSignX = EditorGUILayout.FloatField(distanceSignX); GUILayout.Label("y:"); distanceSignY = EditorGUILayout.FloatField(distanceSignY); GUILayout.EndHorizontal(); /** * 靶子组合 */ GUILayout.BeginHorizontal(); GUILayout.Label("靶子组合:"); if (battleLevelIdChanged) newChallengeTargetDataId = -1; if (battleEditor.GetTargetDataIds().Length == 0) { } // Tmp For Init newChallengeTargetDataId = EditorGUILayout.IntPopup(newChallengeTargetDataId, battleEditor.GetTargetDataStrIds(), battleEditor.GetTargetDataIds()); if (GUILayout.Button("新增")) { if (newChallengeTargetDataId > 0) { if (!ConfigEditor.ExistTragetGroupCfg(fieldCfg.ID, newChallengeTargetDataId)) { int startId = fieldCfg.ID * 10000; int newGroupId = startId; foreach (var tmpGroup in ConfigEditor.targetGroupCfgs.Values) { int leftNumber = tmpGroup.ID - startId; if (leftNumber >= 0 && leftNumber < 10000) { if (tmpGroup.ID + 1 > newGroupId) { newGroupId = tmpGroup.ID + 1; } } } var groupCfg = new TargetGroupDefine { ID = newGroupId, GroupID = fieldCfg.ID, TargetID = newChallengeTargetDataId, }; ConfigEditor.targetGroupCfgs.Add(groupCfg.ID, groupCfg); } else { Debug.LogError("已存在,请勿重复添加"); } } newChallengeTargetDataId = -1; } if (GUILayout.Button("重置")) { ConfigEditor.RefreshTargetGroupCfgs(); newChallengeTargetDataId = -1; } GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); //var targetGroupId = _roundFactoryGroupIdDic[roundFactorGroupIdx]; // RoundFactorGroupId 暂时和 TargetGroupId 一致 // //var predata = ConfigEditor.LoadGamePredata(); var targets = ConfigEditor.GetTargetCfgsByGroupId(fieldCfg.ID); foreach (var targetCfg in targets) { GUILayout.BeginHorizontal(); if (GUILayout.Button("X")) { TargetGroupDefine tmp = null; foreach (var groupCfg in ConfigEditor.targetGroupCfgs.Values) { if (groupCfg.GroupID == fieldCfg.ID && groupCfg.TargetID == targetCfg.ID) { tmp = groupCfg; break; } } ConfigEditor.targetGroupCfgs.Remove(tmp.ID); } GUILayout.Space(10f); var roundTargets = RoundTarget.GetRoundTargetDict(DataManager.Instance.csvData.GetLevelByID(challengeCfg.ID).roundTargetIds); var round = (roundTargets == null || !roundTargets.ContainsKey(targetCfg.ID)) ? 0 : roundTargets[targetCfg.ID]; EditorGUILayout.LabelField("波次:" + round, GUILayout.Width(50f)); if (targetCfg.ResourceName.IndexOf("#") > 0) { string[] targetExInfo = targetCfg.ResourceName.Split('#'); if (targetExInfo.Length == 3) { GUILayout.Label(targetCfg.ID + " " + targetExInfo[0]); } } else { GUILayout.Label(targetCfg.ID + " " + targetCfg.ResourceName); } GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); } /** * */ GUILayout.Space(10f); GUILayout.BeginHorizontal(); if (GUILayout.Button("Preview")) { EditorSceneManager.OpenScene("Assets/ShootGame/Test/Scenes/BattleLevelEditor.unity"); var editorTmpRoot = BattleFieldSceneCreator.CreateEditorTmpRoot(); var levelProxy = editorTmpRoot.GetComponent(); if (levelProxy == null) { levelProxy = editorTmpRoot.AddComponent(); } if (currBattleLevelId > 0) { UpdateChallengeConfig(currBattleLevelId,huangScore, goldScore, silverScore, bronzeScore, constraintType, constraintVal); UpdateFieldConfig( currBattleLevelId, bakeSceneId, distanceSignIdx1 == 0 ? 0 : int.Parse(distanceSigns[distanceSignIdx1]), distanceSignIdx2 == 0 ? 0 : int.Parse(distanceSigns[distanceSignIdx2]), distanceSignIdx3 == 0 ? 0 : int.Parse(distanceSigns[distanceSignIdx3]), distanceSignX, distanceSignY ); // var editorProxy = editorTmpRoot.GetComponent(); editorProxy.targetChallengeId = challengeCfg.ID; editorProxy.targetRoundFactorGroupId = fieldCfg.RoundFactorGroupID; editorProxy.targetFieldShapeId = fieldCfg.FieldShapeID; editorProxy.challengeCfg = challengeCfg; editorProxy.fieldCfg = fieldCfg; } // EditorApplication.isPlaying = true; } /** * Save */ if (GUILayout.Button("Save")) { if (currBattleLevelId > 0) { UpdateChallengeConfig(currBattleLevelId,huangScore, goldScore, silverScore, bronzeScore, constraintType, constraintVal); UpdateFieldConfig( currBattleLevelId, bakeSceneId, distanceSignIdx1 == 0 ? 0 : int.Parse(distanceSigns[distanceSignIdx1]), distanceSignIdx2 == 0 ? 0 : int.Parse(distanceSigns[distanceSignIdx2]), distanceSignIdx3 == 0 ? 0 : int.Parse(distanceSigns[distanceSignIdx3]), distanceSignX, distanceSignY ); level.windMin = windMin; level.windMax = windMax; level.windChange = windChange; } //ConfigEditor.SaveData2Jsonparts(); ConfigEditor.SaveData2Excel_chuan(); battleEditor.Reload(); BattleFieldSceneCreator.CompileGameConfigs(); DataManager.Instance.InitData(); } if (GUILayout.Button("调整关卡顺序")) { ReorderLevels(battleEditor); } if (GUILayout.Button("去除433关之后")) { var ids = new List(ConfigEditor.challengeDataCfgs.Keys); foreach (var k in ids) { if (k > Global.MaxLevel) { ConfigEditor.challengeDataCfgs.Remove(k); } } ConfigEditor.Remove433ChallengeID(); } GUILayout.EndHorizontal(); battleLevelIdChanged = false; } private static bool IsShuffledArray(int[] arr) { int length = arr.Length; int[] expected = Enumerable.Range(1, length).ToArray(); int[] sortedArr = (int[])arr.Clone(); Array.Sort(sortedArr); return sortedArr.SequenceEqual(expected); } private static void ReorderLevelConfigs(IDictionary configs, IReadOnlyList newLevelIdMap, Action configModifier) { var tempConfigs = new T[newLevelIdMap.Count]; int newLevelId; for (int newLevelIdIdx = 0; newLevelIdIdx < newLevelIdMap.Count; newLevelIdIdx++) { int oldLevelId = newLevelIdMap[newLevelIdIdx]; newLevelId = newLevelIdIdx + 1; var config = configs[oldLevelId]; configModifier.Invoke(newLevelId, config); tempConfigs[newLevelIdIdx] = config; } configs.Clear(); newLevelId = 1; foreach (var config in tempConfigs) { configs.Add(newLevelId, config); newLevelId++; } } private static void ReorderLevels(BattleFieldSceneCreator battleEditor) { // DataWriter.SaveChallengeData(gameDataDir, "ChallengeData", challengeDataCfgs); // DataWriter.SaveFieldData(gameDataDir, "FieldData", fieldDataCfgs); // DataWriter.SaveTargetData(gameDataDir, "TargetData", targetDataCfgs); // DataWriter.SaveTargetGroupData(gameDataDir, "TargetGroup", targetGroupCfgs); // DataWriter.SaveFieldShapeData(gameDataDir, "FieldShapeData", fieldShapeCfgs); // DataWriter.SaveLevelData(gameDataDir, "Level", levelCfgs); var newLevelIdMap = new int[] { 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 }; // Check LevelIdMap valid { if (newLevelIdMap.Length != ConfigEditor.challengeDataCfgs.Count) { Debug.LogError("关卡数量不一样"); return; } if (!IsShuffledArray(newLevelIdMap)) { Debug.LogError("关卡顺序配置错误"); return; } } ReorderLevelConfigs(ConfigEditor.challengeDataCfgs, newLevelIdMap, (newLevelId, config) => { config.ID = newLevelId; config.FieldID = newLevelId; }); ReorderLevelConfigs(ConfigEditor.fieldDataCfgs, newLevelIdMap, (newLevelId, config) => { config.ID = newLevelId; config.RoundFactorGroupID = newLevelId; }); { var oldLevelCfgs = ConfigEditor.levelCfgs.Values.ToArray(); ReorderLevelConfigs(ConfigEditor.levelCfgs, newLevelIdMap, (newLevelId, config) => { config.ID = newLevelId; config.realID = newLevelId; }); for (int levelIdx = 0; levelIdx < ConfigEditor.levelCfgs.Count; levelIdx++) { int levelId = levelIdx + 1; var oldConfig = oldLevelCfgs[levelIdx]; var newConfig = ConfigEditor.levelCfgs[levelId]; newConfig.coinsStar1 = oldConfig.coinsStar1; newConfig.coinsStar2 = oldConfig.coinsStar2; newConfig.coinsStar3 = oldConfig.coinsStar3; newConfig.coinsBullet = oldConfig.coinsBullet; newConfig.coinsCombo = oldConfig.coinsCombo; } } { var groupedDictionary = ConfigEditor.targetGroupCfgs.Values.GroupBy(item => item.GroupID).ToDictionary(group => group.Key, group => group.ToArray()); for (int newLevelIdIdx = 0; newLevelIdIdx < newLevelIdMap.Length; newLevelIdIdx++) { int oldLevelId = newLevelIdMap[newLevelIdIdx]; var newLevelId = newLevelIdIdx + 1; var groupConfigs = groupedDictionary[oldLevelId]; foreach (var config in groupConfigs) { config.GroupID = newLevelId; } } } //ConfigEditor.SaveData2Jsonparts(); ConfigEditor.SaveData2Excel_chuan(); battleEditor.Reload(); BattleFieldSceneCreator.CompileGameConfigs(); DataManager.Instance.InitData(); } public static void ClearBattleFieldEditorDataCache(this BattleFieldSceneCreator battleEditor) { _battleLevelIds = null; _battleLevelStrIds = null; _bakeScenesNames = null; } public static int AddBattleLevel(int duplicateId) { var dupChallengeCfg = ConfigEditor.challengeDataCfgs[duplicateId]; // int newChallengeCfgId = -1; foreach (var kv in ConfigEditor.challengeDataCfgs) { if (newChallengeCfgId <= kv.Key) newChallengeCfgId = kv.Key + 1; } var newChallengeCfg = new ChallengeDataDefine { ID = newChallengeCfgId, FieldID = newChallengeCfgId, DecStaminaCnt = dupChallengeCfg.DecStaminaCnt, ConstraintType = dupChallengeCfg.ConstraintType, ConstraintValue = dupChallengeCfg.ConstraintValue, Condition = dupChallengeCfg.Condition, Reward_ID_1 = dupChallengeCfg.Reward_ID_1, }; ConfigEditor.challengeDataCfgs.Add(newChallengeCfg.ID, newChallengeCfg); // Duplicate latest one var maxFieldCfg = ConfigEditor.fieldDataCfgs[dupChallengeCfg.FieldID]; var newFieldCfg = new FieldDataDefine { ID = newChallengeCfg.FieldID, RoundFactorGroupID = newChallengeCfg.FieldID, FieldShapeID = maxFieldCfg.FieldShapeID, DefaultPlayerPos = maxFieldCfg.DefaultPlayerPos, Mark = maxFieldCfg.Mark, }; ConfigEditor.fieldDataCfgs.Add(newFieldCfg.ID, newFieldCfg); ConfigEditor.SaveChallengeAndFieldData2ExcelAndJson(); // return newChallengeCfg.ID; } public static void RemoveBattleLevel(int id) { var challengeCfg = ConfigEditor.challengeDataCfgs[id]; var fieldCfg = ConfigEditor.fieldDataCfgs[challengeCfg.FieldID]; ConfigEditor.fieldDataCfgs.Remove(fieldCfg.ID); ConfigEditor.challengeDataCfgs.Remove(id); ConfigEditor.SaveChallengeAndFieldData2ExcelAndJson(); } public static void RefreshLevelIds(this BattleFieldSceneCreator battleEditor) { _battleLevelIds = null; _battleLevelStrIds = null; } private static void UpdateFieldConfig(int challengeId, int fieldShapeId, int distanceSign1, int distanceSign2, int distanceSign3, float distanceSignX, float distanceSignY) { var challengeCfg = ConfigEditor.challengeDataCfgs[challengeId]; var fieldCfg = ConfigEditor.fieldDataCfgs[challengeCfg.FieldID]; // Performan config change fieldCfg.FieldShapeID = fieldShapeId; // Distance signs var distanceIntSigns = new List { distanceSign1, distanceSign2, distanceSign3, }; distanceIntSigns.Sort(); distanceIntSigns.Reverse(); fieldCfg.Mark = new StringBuilder() .Append(distanceIntSigns[0] == 0 ? string.Empty : "" + distanceIntSigns[0]) .Append(distanceIntSigns[1] == 0 ? string.Empty : "|" + distanceIntSigns[1]) .Append(distanceIntSigns[2] == 0 ? string.Empty : "|" + distanceIntSigns[2]) .Append(Mathf.Approximately(distanceSignX, 0f) ? string.Empty : "@" + distanceSignX) .Append(Mathf.Approximately(distanceSignY, 0) ? string.Empty : "@" + distanceSignY) .ToString(); } private static void UpdateBakedScenes() { var fileNames = Directory.GetFiles(Path.Combine(Application.dataPath, "Scenes"), "*Bake_*.unity"); var scenes = new List(); foreach (var fileName in fileNames) { FileInfo fi = new FileInfo(fileName); scenes.Add(fi.Name.Replace("Bake_", "").Replace(".unity", "")); } _bakeScenesNames = scenes.ToArray(); } /** * Data */ // //private static int currBattleLevelId = 1; private static bool battleLevelIdChanged = true; // Scores private static int huangScore; private static int goldScore; private static int silverScore; private static int bronzeScore; // 风力 private static float windMin = -1; private static float windMax = -1; private static int windChange = -1; // Constraint private static int constraintType = 0; private static int constraintVal = 0; private static void UpdateChallengeConfig(int challengeId,int huangScore, int goldScore, int silverScore, int bronzeScore, int constraintType, int constraintVal) { var cfg = ConfigEditor.challengeDataCfgs[challengeId]; List cond = new List(); cond.Add(bronzeScore); cond.Add(silverScore); cond.Add(goldScore); cond.Add(huangScore); cfg.Condition = cond; cfg.ConstraintType = constraintType == 0 ? (int)Global.Enum_ConstraintType.Count : (int)Global.Enum_ConstraintType.Time; cfg.ConstraintValue = constraintVal; } // Battle Level Ids private static string _battleLevelIdFilter = string.Empty; private static string[] _battleLevelStrIds; private static string[] battleLevelStrIds { get { if (_battleLevelStrIds == null) InitBattleLevelIds(); return _battleLevelStrIds; } } private static int[] _battleLevelIds; private static int[] battleLevelIds { get { if (_battleLevelIds == null) InitBattleLevelIds(); return _battleLevelIds; } } private static void InitBattleLevelIds() { // var enu = ConfigEditor.challengeDataCfgs.Keys.GetEnumerator(); var ints = new List { }; var strs = new List { }; while (enu.MoveNext()) { var strInt = enu.Current.ToString(); if (!strInt.StartsWith(_battleLevelIdFilter, StringComparison.Ordinal)) continue; ints.Add(enu.Current); strs.Add(strInt); } _battleLevelIds = ints.ToArray(); _battleLevelStrIds = strs.ToArray(); } // Bake Scene private static int bakeSceneIdx = 0; private static string[] _bakeScenesNames; private static int[] _bakeScenesIds; private static string[] bakeScenes { get { if (_bakeScenesNames == null) { var ids = new List(); var names = new List(); foreach (var kv in ConfigEditor.fieldShapeCfgs) { ids.Add(kv.Key); names.Add(kv.Value.ResourceName.Replace("Bake_", "")); } _bakeScenesIds = ids.ToArray(); _bakeScenesNames = names.ToArray(); } return _bakeScenesNames; } } // Distance signs private static int distanceSignIdx1 = 0; private static int distanceSignIdx2 = 0; private static int distanceSignIdx3 = 0; private static string[] distanceSigns = { "-", "30", "50", "70", "90", "110", "130" }; private static float distanceSignX = 0f; private static float distanceSignY = 0f; // Target Data private static int newChallengeTargetDataId = -1; } }