using System.Collections.Generic; using UnityEngine; using System; using System.Linq; using FairyGUI; 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 int picStatus { get { return _isPic ? 1 : 0; } } private List _equipDatas = new List(); public int[] equipDatas { get { return _equipDatas.ToArray(); } } //角色基础分+部件基础分 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; } } 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); } } private void Remove(int value) { if (_equipDatas == null) { return; } if (_equipDatas.Contains(value)) { _equipDatas.Remove(value); DressUpUtil.RemoveItem(value, _sceneObj); score -= DressUpMenuItemDataManager.GetItemScore(value); } } /// /// 仅判断换装部件是否已穿着 /// /// /// public bool CheckDressUpItemIsOn(int id) { if (id == _bgId) { 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 = ItemUtil.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 = ItemUtil.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 has1 = false; //是否有连衣裙 bool has2 = false; //是否有内搭 bool has3 = false; //是否有上衣 // bool has4 = false; //是否有下装 bool has5 = false; //是否有默认内搭 // bool has30000 = false; //是否有默认下装 // bool has50000 = false; for (int i = 0; i < _equipDatas.Count; i++) { int itemID = (int)_equipDatas[i]; int subType = ItemUtil.GetItemSubType(itemID); if (subType == (int)ConstDressUpItemType.FA_XING) { has1 = true; } else if (subType == ConstDressUpItemType.LIAN_YI_QUN) { has2 = true; } else if (subType == ConstDressUpItemType.NEI_DA) { has3 = true; } else if (subType == ConstDressUpItemType.XIA_ZHUANG) { has5 = true; } } if (!has1) { Add(10000); } if (!has2) { if (!has5) { Add(50000); } if (!has3) { Add(30000); } } } } 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); int[] tempList = equipDatas; foreach (int itemID in tempList) { AddOrRemove(itemID, false, false, true); } if (checkDefault) { checkDefaultItem(); UpdatePicAction(); } RoleLevelCfg roleLevelCfg = RoleLevelCfgArray.Instance.GetCfg(RoleDataManager.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) { int[] 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 = ItemUtil.GetItemSubType(itemID); if (!_isPic || isSceneType) { if (!noSceneType || !isSceneType) { if (excludeType == null || Array.IndexOf(excludeType, subType) < 0) { AddOrRemove(itemID, false, true); } } } } } checkDefaultItem(); UpdatePicAction(); } public void PutOnSuitSaved(int index) { TakeOffAll(false); CustomSuitData suitSavedData = CustomSuitDataManager.GetSuitList(index); if (suitSavedData.bg > 0) { AddOrRemove(suitSavedData.bg, false); } foreach (int itemID in suitSavedData.equipDatas) { AddOrRemove(itemID, false, true); } _suitId = suitSavedData.suitId; _isPic = suitSavedData.pic > 0; 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(StoryDataManager.currentLevelID); StoryFightCfg fightCfg = StoryFightCfgArray.Instance.GetCfg(levelCfg.fightID); //推荐搭配自动穿必穿品 if (fightCfg.needItemId > 0 && DressUpMenuItemDataManager.CheckHasItem(fightCfg.needItemId) && recommendList.IndexOf(fightCfg.needItemId) < 0) { 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(); } public bool CheckCurrentScoreEnough() { return StoryDataManager.CheckCurrentScoreEnough(score); } public bool CheckEquipedFightNeeded() { StoryLevelCfg levelCfg = StoryLevelCfgArray.Instance.GetCfg(StoryDataManager.currentLevelID); 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); } } }