using System.Collections.Generic; using UnityEngine; using System; using System.Linq; using FairyGUI; using ET; namespace GFGGame { public class DressUpObjDataCache { private GameObject _sceneObj; private bool _needSetMask; public void setSceneObj(GameObject sceneObj, bool needSetMask = false) { _sceneObj = sceneObj; _needSetMask = needSetMask; } private int _bgId; public int bgId { get { return _bgId; } } private int _suitId; public int suitId { get { return _suitId; } } private bool _isPic; public bool picStatus { get { return _isPic; } } public byte[] FightRoleRes { get; set; } public Texture2D RoleTextuex { get; set; } private List _equipDatas = new List(); public List equipDatas { get { return _equipDatas.ToList(); } set { _equipDatas = value; } } //角色基础分+部件基础分 private int _score; public int score { get { return _score; } private set { _score = value; EventAgent.DispatchEvent(ConstMessage.DRESS_UP_SCORE_CHANGED, _score); } } //最终得分 private int _totalScore; public int totalScore { get { return _totalScore; } set { _totalScore = value; } } //战斗对象最终得分 private int _targetTotalScore; public int npcTotalScore { get { return _targetTotalScore; } set { _targetTotalScore = value; } } private bool _autoPlay = false; public bool autoPlay { get { return _autoPlay; } set { _autoPlay = value; if (!_autoPlay) fightSpeed = 1; StorageSProxy.ReqSetClientValue(ConstStorageId.STORAGE_AUTO_PLAY, _autoPlay == true ? 1 : 0).Coroutine(); } } public int maxFightSpeed = 2; private int _fightSpeed = 1; public int fightSpeed { get { return _fightSpeed; } set { _fightSpeed = value; StorageSProxy.ReqSetClientValue(ConstStorageId.STORAGE_FIGHT_AUTO_PLAY_SPEED, _fightSpeed).Coroutine(); } } private int _storyDialogSpeed = 1; public int dialogSpeed { get { return _storyDialogSpeed; } set { _storyDialogSpeed = value; StorageSProxy.ReqSetClientValue(ConstStorageId.STORAGE_DIALOG_AUTO_PLAY_SPEED, _storyDialogSpeed).Coroutine(); } } public void Dispose() { _sceneObj = null; } private void Add(int value) { if (!_equipDatas.Contains(value)) { _equipDatas.Add(value); DressUpUtil.AddItem(value, _sceneObj, _needSetMask); score += DressUpMenuItemDataManager.GetItemScore(value); } int dressSuitId = CheckCurDressIsSuit(); if (dressSuitId > 0) _suitId = dressSuitId; } private void Remove(int value) { if (_equipDatas == null) { return; } if (_equipDatas.Contains(value)) { _equipDatas.Remove(value); DressUpUtil.RemoveItem(value, _sceneObj); score -= DressUpMenuItemDataManager.GetItemScore(value); } } //检测当前穿戴是否是一件完整套装,且只穿了一件套装,返回套装id public int CheckCurDressIsSuit() { if (_suitId > 0) return _suitId; // var equipDatas = _equipDatas; int dressSuitId = 0; List equipDatas = new List(); for (int i = 0; i < _equipDatas.Count; i++) { if (DressUpMenuItemDataManager.CheckIsSceneType(_equipDatas[i])) continue; if (_equipDatas[i] != ConstItemID.DEFULT_FA_XING && _equipDatas[i] != ConstItemID.DEFULT_LIAN_YI_QUN && _equipDatas[i] != ConstItemID.DEFULT_NEI_DA && _equipDatas[i] != ConstItemID.DEFULT_XIA_ZHUANG) { int suitId = SuitCfgManager.Instance.GetItemSuitId(_equipDatas[i]); if (suitId <= 0) return 0;//有任何不属于套装的部件且不是原始服装,则当前穿戴不属于套装 if (dressSuitId != 0 && dressSuitId != suitId) return 0;//当前穿戴不同套装的部件,则当前穿戴不属于套装 dressSuitId = suitId; equipDatas.Add(_equipDatas[i]); } } if (dressSuitId == 0) return dressSuitId; int[] itemIds = SuitCfgManager.Instance.GetSuitItems(dressSuitId); for (int i = 0; i < itemIds.Length; i++) { if (DressUpMenuItemDataManager.CheckIsSceneType(itemIds[i])) continue; if (equipDatas.IndexOf(itemIds[i]) < 0) return 0;//套装部件穿戴不完整 } return dressSuitId; } /// /// 仅判断换装部件是否已穿着 /// /// /// public bool CheckDressUpItemIsOn(int id) { if (id == _bgId) { return true; } // if (suitId > 0) // { // int[] suitparts = SuitCfgArray.Instance.GetCfg(suitId).partsArr; // if (Array.IndexOf(suitparts, id) >= 0) // { // return true; // } // } return _equipDatas.Contains(id); } /// /// 仅判断套装是否穿上 /// /// /// public bool CheckSuitIsOn(int id) { SuitCfg suitCfg = SuitCfgArray.Instance.GetCfg(id); if (suitCfg == null) { return false; } int[] items = suitCfg.partsArr; foreach (int itemId in items) { bool isOn = CheckDressUpItemIsOn(itemId); if (!isOn) { return false; } } return true; } public void AddOrRemove(int value, bool checkDefault, bool isAdd = false, bool isRemove = false) { int subType = ItemUtilCS.GetItemSubType(value); if (subType == ConstDressUpItemType.BEI_JING) { _bgId = value; DressUpUtil.AddItem(_bgId, _sceneObj, _needSetMask); } else { if (!CheckDressUpItemIsOn(value)) { if (!isRemove) { checkRemoveSameType(subType); Add(value); } } else { if (!isAdd) { Remove(value); } } if (checkDefault) { checkDefaultItem(); } } } public void checkRemoveSameType(int type) { int count = 0; int firstTeshuId = 0; for (int i = 0; i < _equipDatas.Count; i++) { int itemID = (int)_equipDatas[i]; int subType = ItemUtilCS.GetItemSubType(itemID); if (subType == type || (type == ConstDressUpItemType.LIAN_YI_QUN && (subType == ConstDressUpItemType.SHANG_YI || subType == ConstDressUpItemType.XIA_ZHUANG || subType == ConstDressUpItemType.NEI_DA)) || (type == ConstDressUpItemType.SHANG_YI && subType == ConstDressUpItemType.LIAN_YI_QUN) || (type == ConstDressUpItemType.XIA_ZHUANG && subType == ConstDressUpItemType.LIAN_YI_QUN) || (type == ConstDressUpItemType.NEI_DA && subType == ConstDressUpItemType.LIAN_YI_QUN)) { Remove(itemID); i--; } if (subType > ConstDressUpItemType.TE_SHU) { if (count == 0) { firstTeshuId = itemID; } count++; } } if (type > ConstDressUpItemType.TE_SHU && count >= 3) { //特殊饰品最多穿三件,第四件会自动顶掉第一件 Remove(firstTeshuId); } } private void checkDefaultItem() { if (!IsSuitPic) { //检查默认资源 //是否有头发 bool hasFaXing = false; //是否有连衣裙 bool hasLianYiQun = false; //是否有内搭 bool hasNeiDa = false; //是否有上衣 bool hasShangYi = false; //是否有下装 bool hasXiaZhuang = false; //是否有默认内搭 bool hasNeiDaDefault = false; //是否有默认下装 bool hasXiaZhuangDefault = false; for (int i = 0; i < _equipDatas.Count; i++) { int itemID = (int)_equipDatas[i]; int subType = ItemUtilCS.GetItemSubType(itemID); if (subType == (int)ConstDressUpItemType.FA_XING) { hasFaXing = true; } else if (subType == ConstDressUpItemType.LIAN_YI_QUN) { hasLianYiQun = true; } else if (subType == ConstDressUpItemType.NEI_DA) { hasNeiDa = true; } else if (subType == ConstDressUpItemType.XIA_ZHUANG) { hasXiaZhuang = true; } else if (subType == ConstDressUpItemType.SHANG_YI) { hasShangYi = true; } if (itemID == ConstItemID.DEFULT_NEI_DA) { hasNeiDaDefault = true; } else if (itemID == ConstItemID.DEFULT_XIA_ZHUANG) { hasXiaZhuangDefault = true; } } if (!hasFaXing) { Add(10000); } if (!hasLianYiQun) { if (!hasShangYi && (!hasNeiDa || hasNeiDaDefault) && (!hasXiaZhuang || hasXiaZhuangDefault)) { Remove(ConstItemID.DEFULT_XIA_ZHUANG); Remove(ConstItemID.DEFULT_NEI_DA); Add(ConstItemID.DEFULT_LIAN_YI_QUN); } else { if (!hasXiaZhuang) { Add(ConstItemID.DEFULT_XIA_ZHUANG); } if (!hasNeiDa) { Add(ConstItemID.DEFULT_NEI_DA); } } } } } /// /// 检测是否穿戴完整(穿着连衣裙或同时穿着上装下装) /// /// public bool CheckPutOnFinish() { if (EquipDataCache.cacher.suitId > 0) return true; List equipDatas = EquipDataCache.cacher.equipDatas; bool isLianYiQun = false; bool isShangYi = false; bool isXiaZhuang = false; for (int i = 0; i < equipDatas.Count; i++) { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(equipDatas[i]); if (itemCfg.subType == ConstDressUpItemType.LIAN_YI_QUN && itemCfg.id != ConstItemID.DEFULT_LIAN_YI_QUN) { isLianYiQun = true; break; } if (itemCfg.subType == ConstDressUpItemType.SHANG_YI && 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; } private void UpdatePicAction() { if (IsSuitPic) { SuitCfg suitCfg = SuitCfgArray.Instance.GetCfg(_suitId); DressUpUtil.UpdateBody(suitCfg.picRes, _sceneObj, !string.IsNullOrEmpty(suitCfg.aniRes), suitCfg.effRes); } else { DressUpUtil.UpdateBody(null, _sceneObj, false, null, _needSetMask); } } public void TakeOffAll(bool checkDefault = true) { _suitId = 0; _isPic = false; // AddOrRemove(propID, false, true); var tempList = equipDatas; foreach (int itemID in tempList) { AddOrRemove(itemID, false, false, true); } if (checkDefault) { checkDefaultItem(); UpdatePicAction(); } RoleLevelCfg roleLevelCfg = RoleLevelCfgArray.Instance.GetCfg(GameGlobal.myNumericComponent.GetAsInt(NumericType.Lvl)); score = roleLevelCfg.baseScore; foreach (int itemId in _equipDatas) { score += DressUpMenuItemDataManager.GetItemScore(itemId); } } public void ChangeAction() { if (!HasSuitPicRes) { return; } SuitCfg suitCfg = SuitCfgArray.Instance.GetCfg(_suitId); _isPic = !_isPic; if (_isPic) { var tempList = equipDatas; foreach (int itemID in tempList) { if (!DressUpMenuItemDataManager.CheckIsSceneType(itemID)) { AddOrRemove(itemID, false, false, true); } } } else { int[] items = suitCfg.partsArr; foreach (int itemId in items) { if (!DressUpMenuItemDataManager.CheckIsSceneType(itemId)) { AddOrRemove(itemId, false, true); } } } checkDefaultItem(); UpdatePicAction(); } public void TryCancelSuit(int itemID) { if (_suitId > 0) { if (!DressUpMenuItemDataManager.CheckIsSceneType(itemID)) { if (_isPic) { ChangeAction(); } _suitId = 0; } } } public bool IsSuitPic { get { return _suitId > 0 && _isPic; } } public bool HasSuitPicRes { get { if (_suitId > 0) { SuitCfg suitCfg = SuitCfgArray.Instance.GetCfg(_suitId); if (suitCfg.picRes != null && suitCfg.picRes.Length > 0) { return true; } } return false; } } public void PutOnSuitCfg(int id, bool checkPic, bool noSceneType, int[] excludeType = null) { if (_suitId == id) { return; } TakeOffAll(false); _suitId = id; _isPic = HasSuitPicRes && checkPic; SuitCfg suitCfg = SuitCfgArray.Instance.GetCfg(_suitId); List items = new List(suitCfg.partsArr); if (suitCfg.partsOptionalArr != null && suitCfg.partsOptionalArr.Length > 0) { items.AddRange(suitCfg.partsOptionalArr); } int subType = 0; foreach (int itemID in items) { if (DressUpMenuItemDataManager.CheckHasItem(itemID)) { bool isSceneType = DressUpMenuItemDataManager.CheckIsSceneType(itemID); subType = ItemUtilCS.GetItemSubType(itemID); if (!_isPic || isSceneType) { if (!noSceneType || !isSceneType) { if (excludeType == null || Array.IndexOf(excludeType, subType) < 0) { AddOrRemove(itemID, false, true); } } } } } checkDefaultItem(); UpdatePicAction(); } public CustomSuitData GetCurSuitData(int index) { CustomSuitData suitSavedData = new CustomSuitData(index); suitSavedData.equipDatas = EquipDataCache.cacher.equipDatas; suitSavedData.bg = EquipDataCache.cacher.bgId; suitSavedData.pic = EquipDataCache.cacher.picStatus; suitSavedData.suitId = EquipDataCache.cacher.suitId; return suitSavedData; } public void PutOnSuitSaved(int index) { CustomSuitData suitSavedData = CustomSuitDataManager.GetSuitList(index); PutOnSuitMemory(suitSavedData); } public void PutOnSuitMemory(CustomSuitData suitSavedData) { TakeOffAll(false); if (suitSavedData.bg > 0) { AddOrRemove(suitSavedData.bg, false); } foreach (int itemID in suitSavedData.equipDatas) { AddOrRemove(itemID, false, true); } _suitId = suitSavedData.suitId; _isPic = suitSavedData.pic; checkDefaultItem(); UpdatePicAction(); } public void PutOnSuitSavedInFight(int index) { TakeOffAll(false); CustomSuitData suitSavedData = CustomSuitDataManager.GetSuitList(index); if (suitSavedData.suitId > 0) { PutOnSuitCfg(suitSavedData.suitId, false, true); } else { foreach (int itemID in suitSavedData.equipDatas) { if (!DressUpMenuItemDataManager.CheckIsSceneType(itemID)) { AddOrRemove(itemID, false, true); } } checkDefaultItem(); } } // public void PutOnCurrentSuitSaved() // { // PutOnSuitSaved(CustomSuitDataManager.currentIndex); // } public void PutOnDefaultSuitSaved(bool withBg = true) { TakeOffAll(false); CustomSuitData suitSavedData = CustomSuitDataManager.CreateDefaultSuitData(0); foreach (int itemID in suitSavedData.equipDatas) { AddOrRemove(itemID, false, true); } if (withBg) { if (suitSavedData.bg > 0) { AddOrRemove(suitSavedData.bg, false); } } checkDefaultItem(); UpdatePicAction(); } public void PutOnRecommendItems() { TakeOffAll(false); 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 = DressUpMenuItemDataManager.GetItemScore(recommendList[liangyiqunIndex]); int shangyiScore = DressUpMenuItemDataManager.GetItemScore(recommendList[shangyiIndex]); int xiazhuangScore = DressUpMenuItemDataManager.GetItemScore(recommendList[xiazhuangIndex]); int neidaScore = neidaIndex >= 0 ? DressUpMenuItemDataManager.GetItemScore(recommendList[neidaIndex]) : 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); } foreach (int itemID in recommendList) { AddOrRemove(itemID, false, true); } checkDefaultItem(); UpdatePicAction(); } private 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; } public bool CheckEquipedFightNeeded() { StoryLevelCfg levelCfg = StoryLevelCfgArray.Instance.GetCfg(InstanceZonesDataManager.currentLevelCfgId); StoryFightCfg fightCfg = StoryFightCfgArray.Instance.GetCfg(levelCfg.fightID); if (fightCfg.needItemId > 0) { return CheckDressUpItemIsOn(fightCfg.needItemId); } else if (fightCfg.needSuitId > 0) { return CheckSuitIsOn(fightCfg.needSuitId); } return true; } //根据位置原点和随机范围获取评分位置 public void GetCirclePos(Vector2 pos, int range, out float x, out float y) { int numX = UnityEngine.Random.Range(0, 2); int signX = numX % 2 == 0 ? 1 : -1; float rangeX = UnityEngine.Random.Range(0, range); x = pos.x + signX * (rangeX); int numY = UnityEngine.Random.Range(0, 2); int signY = numY % 2 == 0 ? 1 : -1; float rangeY = UnityEngine.Random.Range(0, range); y = pos.y + signY * (rangeY); } public int GetItemIdBuyType(int subType) { for (int i = 0; i < equipDatas.Count; i++) { if (equipDatas[i] != ConstItemID.DEFULT_LIAN_YI_QUN && equipDatas[i] != ConstItemID.DEFULT_NEI_DA && equipDatas[i] != ConstItemID.DEFULT_XIA_ZHUANG && equipDatas[i] != ConstItemID.DEFULT_FA_XING) { if (subType == ItemUtilCS.GetItemSubType(equipDatas[i])) { return equipDatas[i]; } } } if (suitId > 0) { return suitId; } return 0; } } }