using System; using System.Collections.Generic; using ET; namespace GFGGame { //玩家换装助手,用于跨界面流程的换装对象数据存储及部分方法封装 public class MyDressUpHelper { private static DressUpObj _dressUpObj; public static DressUpObj dressUpObj { get { if (_dressUpObj == null) { _dressUpObj = new DressUpObj(); } return _dressUpObj; } } private static int _stepIndex = -1; public static int stepIndex { get { return _stepIndex; } } private static List _dressMemory = new List(); public static List dressMemory { get { return _dressMemory; } } public const int MAX_MEMORY_STEP = 20;//最大记录步数 public static CustomSuitData GetCurSuitDataClone(int index) { CustomSuitData suitSavedData = new CustomSuitData(index); suitSavedData.dressUpData = MyDressUpHelper.dressUpObj.DressUpDataClone(); return suitSavedData; } /// /// 检测是否穿戴完整(穿着连衣裙或同时穿着上装下装) /// /// public static bool CheckPutOnFinish(List itemList = null) { List equipDatas; if (itemList == null) { if (MyDressUpHelper.dressUpObj.suitId > 0) return true; equipDatas = MyDressUpHelper.dressUpObj.itemList; } else { equipDatas = itemList; } bool isLianYiQun = false; bool isShangYi = false; bool isXiaZhuang = false; for (int i = 0; i < equipDatas.Count; i++) { var itemId = equipDatas[i]; ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemId); if (itemCfg == null) { Log.Warning($"id为 {itemId} 的物品没有配置,请查找原因!"); continue; } if (itemCfg.subType == ConstDressUpItemType.LIAN_YI_QUN && itemCfg.id != ConstItemID.DEFULT_LIAN_YI_QUN) { isLianYiQun = true; break; } if (itemCfg.subType == ConstDressUpItemType.SHANG_YI) { isShangYi = true; } if (itemCfg.subType == ConstDressUpItemType.NEI_DA && itemCfg.id != ConstItemID.DEFULT_NEI_DA) { isShangYi = true; } if (itemCfg.subType == ConstDressUpItemType.XIA_ZHUANG && itemCfg.id != ConstItemID.DEFULT_XIA_ZHUANG) { isXiaZhuang = true; } } return isLianYiQun || isXiaZhuang && isShangYi; } public static bool CheckEquipedFightNeeded() { StoryLevelCfg levelCfg = StoryLevelCfgArray.Instance.GetCfg(InstanceZonesDataManager.currentLevelCfgId); StoryFightCfg fightCfg = StoryFightCfgArray.Instance.GetCfg(levelCfg.fightID); if (fightCfg.needItemId > 0) { return dressUpObj.CheckDressUpItemIsOn(fightCfg.needItemId); } else if (fightCfg.needSuitId > 0) { return dressUpObj.CheckSuitIsOn(fightCfg.needSuitId); } return true; } public static void PutOnSuitSavedByPos(int index) { CustomSuitData suitSavedData = CustomSuitDataManager.GetSuitList(index); dressUpObj.PutOnDressUpData(suitSavedData.dressUpData); } //返回当前饰品穿戴数量 public static int GetCurrentOrnamentCount() { int count = 0; for (int i = 0; i < dressUpObj.itemList.Count; i++) { if (DressUpMenuItemCfg1Array.Instance.CheckIsOrnamentsType(dressUpObj.itemList[i])) { count++; } } return count; } public static void PutOnRecommendItems2() { Dictionary> itemsDic = GetRecommendItems(); List recommendList = new List(); foreach (int key in itemsDic.Keys) { if (key == ConstDressUpItemType.SHANG_YI || key == ConstDressUpItemType.XIA_ZHUANG || key == ConstDressUpItemType.LIAN_YI_QUN) continue; recommendList.AddRange(itemsDic[key]); } StoryLevelCfg levelCfg = StoryLevelCfgArray.Instance.GetCfg(InstanceZonesDataManager.currentLevelCfgId); //StoryLevelCfg levelCfg = StoryLevelCfgArray.Instance.GetCfg(id); StoryFightCfg fightCfg = StoryFightCfgArray.Instance.GetCfg(levelCfg.fightID); SuitCfg suitCfg = SuitCfgArray.Instance.GetCfg(fightCfg.needSuitId); int[] suitParts = suitCfg == null ? new int[] { } : suitCfg.partsArr; int shangyiId = itemsDic.ContainsKey(ConstDressUpItemType.SHANG_YI) && itemsDic[ConstDressUpItemType.SHANG_YI].Count > 0 ? itemsDic[ConstDressUpItemType.SHANG_YI][0] : 0; int xiazhuangId = itemsDic.ContainsKey(ConstDressUpItemType.XIA_ZHUANG) && itemsDic[ConstDressUpItemType.XIA_ZHUANG].Count > 0 ? itemsDic[ConstDressUpItemType.XIA_ZHUANG][0] : ConstItemID.DEFULT_XIA_ZHUANG; int neidaId = itemsDic.ContainsKey(ConstDressUpItemType.NEI_DA) && itemsDic[ConstDressUpItemType.NEI_DA].Count > 0 ? itemsDic[ConstDressUpItemType.NEI_DA][0] : ConstItemID.DEFULT_NEI_DA; int lianyiqunId = itemsDic.ContainsKey(ConstDressUpItemType.LIAN_YI_QUN) && itemsDic[ConstDressUpItemType.LIAN_YI_QUN].Count > 0 ? itemsDic[ConstDressUpItemType.LIAN_YI_QUN][0] : ConstItemID.DEFULT_LIAN_YI_QUN; if (fightCfg.needItemId > 0 && (shangyiId == fightCfg.needItemId || xiazhuangId == fightCfg.needItemId || neidaId == fightCfg.needItemId) || fightCfg.needSuitId > 0 && (Array.IndexOf(suitParts, shangyiId) >= 0 || Array.IndexOf(suitParts, xiazhuangId) >= 0 || Array.IndexOf(suitParts, neidaId) >= 0)) { if (shangyiId > 0) recommendList.Add(shangyiId); recommendList.Add(xiazhuangId); recommendList.Add(neidaId); } else if (fightCfg.needItemId > 0 && lianyiqunId == fightCfg.needItemId || fightCfg.needSuitId > 0 && Array.IndexOf(suitParts, lianyiqunId) >= 0) { recommendList.Add(lianyiqunId); } else { int shangyiScore = ItemDataManager.GetItemAdditionScore(shangyiId, InstanceZonesDataManager.currentScoreType); int xiazhuangScore = ItemDataManager.GetItemAdditionScore(xiazhuangId, InstanceZonesDataManager.currentScoreType); int neidaScore = ItemDataManager.GetItemAdditionScore(neidaId, InstanceZonesDataManager.currentScoreType); int lianyiqunScore = ItemDataManager.GetItemAdditionScore(lianyiqunId, InstanceZonesDataManager.currentScoreType); if (lianyiqunScore > (shangyiScore + xiazhuangScore + neidaScore)) { recommendList.Add(lianyiqunId); } else { if (shangyiId > 0) recommendList.Add(shangyiId); recommendList.Add(xiazhuangId); recommendList.Add(neidaId); } } dressUpObj.PutOnItemList(recommendList); } private static Dictionary> GetRecommendItems( int id = 0) { GetClassifyDictionaty(out Dictionary> needListBySubType, out Dictionary> recommendListBySubType); DressUpMenuItemCfg1[] menuCfg1s = DressUpMenuItemCfg1Array.Instance.dataArray; Dictionary> itemsDic = new Dictionary>(); for (int i = 0; i < menuCfg1s.Length - 4; i++)//最后四个不处理(套装、动作、道具、背景) { DressUpMenuItemCfg1 menuCfg1 = menuCfg1s[i]; List recommendItems = new List(); itemsDic[menuCfg1.id] = recommendItems; if (menuCfg1.subMenusArr.Length == 0)//普通部件有必需品就用必需品,没有必需品就用推荐品 { if (needListBySubType.ContainsKey(menuCfg1.type) && needListBySubType[menuCfg1.type].Count > 0) { recommendItems.Add(needListBySubType[menuCfg1.type][0]); continue; } if (recommendListBySubType.ContainsKey(menuCfg1.type) && recommendListBySubType[menuCfg1.type].Count > 0) { recommendItems.Add(recommendListBySubType[menuCfg1.type][0]); continue; } } else { List needOrnament = new List();//饰品的必需品列表 List recommecdOrnament = new List();//饰品的推荐品列表 for (int j = 0; j < menuCfg1.subMenusArr.Length; j++) { DressUpMenuItemCfg2 menuCfg2 = DressUpMenuItemCfg2Array.Instance.GetCfg(menuCfg1.subMenusArr[j]); if (menuCfg2.type != (int)ConstDressUpItemType.TE_SHU) { if (needListBySubType.ContainsKey(menuCfg2.type) && needListBySubType[menuCfg2.type].Count > 0) { needOrnament.AddRange(needListBySubType[menuCfg2.type]); continue; } if (recommendListBySubType.ContainsKey(menuCfg2.type) && recommendListBySubType[menuCfg2.type].Count > 0) { recommecdOrnament.AddRange(recommendListBySubType[menuCfg2.type]); continue; } } else { if (needListBySubType.ContainsKey(menuCfg2.type) && needListBySubType[menuCfg2.type].Count > 0) { needOrnament.AddRange(needListBySubType[menuCfg2.type]); } if (recommendListBySubType.ContainsKey(menuCfg2.type) && recommendListBySubType[menuCfg2.type].Count > 0) { int needCount = Math.Min(recommendListBySubType[menuCfg2.type].Count, 3 - needListBySubType[menuCfg2.type].Count); //特殊部件必需品不足三件,从推荐品里补足 recommendListBySubType[menuCfg2.type] = recommendListBySubType[menuCfg2.type].GetRange(0, needCount); recommecdOrnament.AddRange(recommendListBySubType[menuCfg2.type]); } } } DressUpMenuItemDataManager.SortItemListByHighScore(needOrnament); needOrnament = needOrnament.GetRange(0, Math.Min(needOrnament.Count, GlobalCfgArray.globalCfg.dressLimitCount)); recommendItems.AddRange(needOrnament); DressUpMenuItemDataManager.SortItemListByHighScore(recommecdOrnament); recommecdOrnament = recommecdOrnament.GetRange(0, Math.Min(recommecdOrnament.Count, GlobalCfgArray.globalCfg.dressLimitCount - needOrnament.Count)); recommendItems.AddRange(recommecdOrnament); } } return itemsDic; } //获取本关卡所有必需品Dictionary和每个类型的最高分推荐Dictionary,两个Dictionary内部件互斥(必需品不会出现在推荐品里) private static void GetClassifyDictionaty(out Dictionary> needListBySubType, out Dictionary> recommendListBySubType) { StoryLevelCfg levelCfg = StoryLevelCfgArray.Instance.GetCfg(InstanceZonesDataManager.currentLevelCfgId); StoryFightCfg fightCfg = StoryFightCfgArray.Instance.GetCfg(levelCfg.fightID); needListBySubType = new Dictionary>(); recommendListBySubType = new Dictionary>(); Dictionary> itemDatasDic = DressUpMenuItemDataManager.ItemDatasBySubTypeDic; foreach (int subType in itemDatasDic.Keys) { if (DressUpMenuItemCfg1Array.Instance.CheckIsSceneTypeBySubType(subType)) continue; if (!needListBySubType.ContainsKey(subType)) { needListBySubType.Add(subType, new List()); } List itemDatas = new List(itemDatasDic[subType]); DressUpMenuItemDataManager.SortItemListByHighScore(itemDatas); if (fightCfg.needSuitId > 0) { int[] suitParts = SuitCfgArray.Instance.GetCfg(fightCfg.needSuitId).partsArr; for (int i = 0; i < suitParts.Length; i++) { if (itemDatas.IndexOf(suitParts[i]) >= 0)//当前类型里是否包含此部件, { needListBySubType[subType].Add(suitParts[i]); } } } if (fightCfg.needItemId > 0) { if (itemDatas.IndexOf(fightCfg.needItemId) >= 0 && needListBySubType[subType].IndexOf(fightCfg.needItemId) < 0) { needListBySubType[subType].Add(fightCfg.needItemId); } } DressUpMenuItemDataManager.SortItemListByHighScore(needListBySubType[subType]); int maxCount = subType == (int)ConstDressUpItemType.TE_SHU ? 3 : 1;//特殊部件最多穿3个,其他部件只能穿一个; needListBySubType[subType] = needListBySubType[subType].Count > maxCount ? needListBySubType[subType].GetRange(0, maxCount) : needListBySubType[subType]; if (!recommendListBySubType.ContainsKey(subType)) { recommendListBySubType.Add(subType, new List()); } int index = 0; while (recommendListBySubType[subType].Count < maxCount && itemDatas.Count > index)//不足3个从列表里补足 { int partId = itemDatas[index]; if (needListBySubType[subType].IndexOf(partId) < 0)//必需品列表里还没有此部件才会被添加进去 { recommendListBySubType[subType].Add(partId); } index++; } DressUpMenuItemDataManager.SortItemListByHighScore(recommendListBySubType[subType]); } } //获取一套套装战斗时可用部件(剔除超过5件的饰品) public static List GetSuitFightItems(int suitId) { List items = new List(); List ornamentItems = new List(); int[] suitParts = SuitCfgArray.Instance.GetCfg(suitId).partsArr; for (int i = 0; i < suitParts.Length; i++) { if (DressUpMenuItemCfg1Array.Instance.CheckIsOrnamentsType(suitParts[i])) { ornamentItems.Add(suitParts[i]); } else { items.Add(suitParts[i]); } } DressUpMenuItemDataManager.SortItemListByHighScore(ornamentItems); int count = Math.Min(ornamentItems.Count, GlobalCfgArray.globalCfg.dressLimitCount); ornamentItems = ornamentItems.GetRange(0, count); items.AddRange(ornamentItems); return items; } public static bool OnClickBtnLastStep() { if (_stepIndex - 1 < 0) return false; _stepIndex--; MyDressUpHelper.dressUpObj.PutOnDressUpData(_dressMemory[_stepIndex]); return true; } public static bool OnClickBtnNextStep() { if (_stepIndex + 1 >= _dressMemory.Count) return false; _stepIndex++; MyDressUpHelper.dressUpObj.PutOnDressUpData(_dressMemory[_stepIndex]); return true; } public static void AddMemoryDressup() { _stepIndex++; if (_stepIndex == MAX_MEMORY_STEP) { _stepIndex = MAX_MEMORY_STEP - 1; _dressMemory.RemoveAt(0); } if (_dressMemory.Count > _stepIndex) { _dressMemory.RemoveRange(_stepIndex, _dressMemory.Count - _stepIndex); } _dressMemory.Add(MyDressUpHelper.dressUpObj.DressUpDataClone()); // UpdateStepBtn(); } public static void ResetMemory() { DressUpMenuItemDataManager.Clear(); _stepIndex = -1; _dressMemory.Clear(); } } }