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;
}
}
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.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 PutOnRecommendItems()
// {
// List recommendList = DressUpMenuItemDataManager.GetRecommendItemList();
// StoryLevelCfg levelCfg = StoryLevelCfgArray.Instance.GetCfg(InstanceZonesDataManager.currentLevelCfgId);
// StoryFightCfg fightCfg = StoryFightCfgArray.Instance.GetCfg(levelCfg.fightID);
// int liangyiqunIndex = -1;
// int shangyiIndex = -1;
// int xiazhuangIndex = -1;
// int neidaIndex = -1;
// for (int i = 0; i < recommendList.Count; i++)
// {
// int subType = ItemUtilCS.GetItemSubType(recommendList[i]);
// if (subType == ConstDressUpItemType.LIAN_YI_QUN)
// {
// liangyiqunIndex = i;
// continue;
// }
// if (subType == ConstDressUpItemType.SHANG_YI)
// {
// shangyiIndex = i;
// continue;
// }
// if (subType == ConstDressUpItemType.XIA_ZHUANG)
// {
// xiazhuangIndex = i;
// continue;
// }
// if (subType == ConstDressUpItemType.NEI_DA)
// {
// neidaIndex = i;
// continue;
// }
// }
// if (liangyiqunIndex >= 0 && (shangyiIndex >= 0 || xiazhuangIndex >= 0))
// {
// if (shangyiIndex < 0 && xiazhuangIndex >= 0) recommendList.RemoveAt(xiazhuangIndex);//上衣下装只有一件,则保留连衣裙
// if (xiazhuangIndex < 0 && shangyiIndex >= 0) recommendList.RemoveAt(shangyiIndex);
// if (shangyiIndex >= 0 && xiazhuangIndex >= 0)//同时拥有上衣、下装、连衣裙
// {
// int lianyiqunScore = ItemDataManager.GetItemAdditionScore(recommendList[liangyiqunIndex], InstanceZonesDataManager.currentScoreType);
// int shangyiScore = ItemDataManager.GetItemAdditionScore(recommendList[shangyiIndex], InstanceZonesDataManager.currentScoreType);
// int xiazhuangScore = ItemDataManager.GetItemAdditionScore(recommendList[xiazhuangIndex], InstanceZonesDataManager.currentScoreType);
// int neidaScore = neidaIndex >= 0 ? ItemDataManager.GetItemAdditionScore(recommendList[neidaIndex], InstanceZonesDataManager.currentScoreType) : 0;
// int subType = ItemUtilCS.GetItemSubType(fightCfg.needItemId);
// if (fightCfg.needItemId > 0 && recommendList.IndexOf(fightCfg.needItemId) >= 0 && (subType == ConstDressUpItemType.SHANG_YI || subType == ConstDressUpItemType.XIA_ZHUANG || subType == ConstDressUpItemType.NEI_DA || subType == ConstDressUpItemType.LIAN_YI_QUN))//推荐列表里有必需品且,必需品类型为上衣或下装或连衣裙,有先穿戴必须品,其次穿戴高分服装
// {
// if (subType == ConstDressUpItemType.LIAN_YI_QUN)
// {
// shangyiIndex = CheckIndex(ConstDressUpItemType.SHANG_YI, recommendList);
// if (shangyiIndex >= 0) recommendList.RemoveAt(shangyiIndex);
// xiazhuangIndex = CheckIndex(ConstDressUpItemType.XIA_ZHUANG, recommendList);
// if (xiazhuangIndex >= 0) recommendList.RemoveAt(xiazhuangIndex);
// neidaIndex = CheckIndex(ConstDressUpItemType.NEI_DA, recommendList);
// if (neidaIndex >= 0) recommendList.RemoveAt(neidaIndex);
// }
// else if (subType == ConstDressUpItemType.SHANG_YI || subType == ConstDressUpItemType.XIA_ZHUANG || subType == ConstDressUpItemType.NEI_DA)
// {
// liangyiqunIndex = CheckIndex(ConstDressUpItemType.LIAN_YI_QUN, recommendList);
// if (liangyiqunIndex >= 0) recommendList.RemoveAt(liangyiqunIndex);
// }
// }
// else
// {
// if (lianyiqunScore > shangyiScore + xiazhuangScore + neidaScore)
// {
// shangyiIndex = CheckIndex(ConstDressUpItemType.SHANG_YI, recommendList);
// if (shangyiIndex >= 0) recommendList.RemoveAt(shangyiIndex);
// xiazhuangIndex = CheckIndex(ConstDressUpItemType.XIA_ZHUANG, recommendList);
// if (xiazhuangIndex >= 0) recommendList.RemoveAt(xiazhuangIndex);
// neidaIndex = CheckIndex(ConstDressUpItemType.NEI_DA, recommendList);
// if (neidaIndex >= 0) recommendList.RemoveAt(neidaIndex);
// }
// else
// {
// liangyiqunIndex = CheckIndex(ConstDressUpItemType.LIAN_YI_QUN, recommendList);
// if (liangyiqunIndex >= 0) recommendList.RemoveAt(liangyiqunIndex);
// }
// }
// }
// }
// //推荐搭配自动穿必穿品
// if (fightCfg.needItemId > 0 && DressUpMenuItemDataManager.CheckHasItem(fightCfg.needItemId) && recommendList.IndexOf(fightCfg.needItemId) < 0)
// {
// int subType = ItemUtilCS.GetItemSubType(fightCfg.needItemId);
// for (int i = 0; i < recommendList.Count; i++)
// {
// int recommendSubType = ItemUtilCS.GetItemSubType(recommendList[i]);
// if (recommendSubType == subType)
// {
// recommendList.RemoveAt(i);
// break;
// }
// }
// recommendList.Add(fightCfg.needItemId);
// }
// else if (fightCfg.needSuitId > 0 && DressUpMenuSuitDataManager.CheckHaveSuit(fightCfg.needSuitId))
// {
// recommendList.Clear();
// SuitCfg cfg = SuitCfgArray.Instance.GetCfg(fightCfg.needSuitId);
// recommendList.AddRange(cfg.partsArr);
// }
// dressUpObj.PutOnItemList(recommendList);
// }
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);
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] : 0;
int neidaId = itemsDic.ContainsKey(ConstDressUpItemType.NEI_DA) && itemsDic[ConstDressUpItemType.NEI_DA].Count > 0 ? itemsDic[ConstDressUpItemType.NEI_DA][0] : 0;
int lianyiqunId = itemsDic.ContainsKey(ConstDressUpItemType.LIAN_YI_QUN) && itemsDic[ConstDressUpItemType.LIAN_YI_QUN].Count > 0 ? itemsDic[ConstDressUpItemType.LIAN_YI_QUN][0] : 0;
if (shangyiId == fightCfg.needItemId || Array.IndexOf(suitParts, shangyiId) >= 0
|| xiazhuangId == fightCfg.needItemId || Array.IndexOf(suitParts, xiazhuangId) >= 0
|| neidaId == fightCfg.needItemId || Array.IndexOf(suitParts, neidaId) >= 0)
{
recommendList.Add(shangyiId);
recommendList.Add(xiazhuangId);
recommendList.Add(neidaId);
}
else if (lianyiqunId == fightCfg.needItemId || 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
{
recommendList.Add(shangyiId);
recommendList.Add(xiazhuangId);
recommendList.Add(neidaId);
}
}
dressUpObj.PutOnItemList(recommendList);
}
private static Dictionary> GetRecommendItems()
{
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;
}
private static int CheckIndex(int _subType, List recommendList)
{
for (int i = 0; i < recommendList.Count; i++)
{
int itemSubType = ItemUtilCS.GetItemSubType(recommendList[i]);
if (itemSubType == _subType)
{
return i;
}
}
return -1;
}
}
}