// Created : 2020-06-05 // Description : // Last Modified By : Kimch // Last Modified On : // *********************************************************************** // // // *********************************************************************** namespace G { using CodeStage.AntiCheat.ObscuredTypes; using System.Collections.Generic; using UnityEngine; /// /// /// public sealed class EntityItemEquipment : EntityItem { /// /// /// private int _grade = -1; /// /// /// private ItemEquipment _equipmentItem; /// /// /// public override int quality => _propItem.quality; /// /// /// public override int level => _propItem.level; /// /// 道具等级 /// public int propLevel => _propItem.level; /// /// 道具品质 /// public int propQuality => _propItem.quality; /// /// /// public int equipmentType => _equipmentItem.type; /// /// 武器类型 1:刀 2:双手武器 3:长兵器 4:弓箭 5:权杖 6:魔法 /// public int weaponKind => _equipmentItem.subType; /// /// /// public string assets { get { var weaponSkin = PlayerProxy.Instance.GetWeaponModel(weaponKind); return string.IsNullOrEmpty(weaponSkin) ? _equipmentItem.assets : weaponSkin; } } /// /// /// public string propName => _propItem.name; /// /// /// public string[] propIcon => _propItem.icon; /// /// 排序规则 /// public override int sortOrder => _sortOrder1; private int _sortOrder1 = -1; /// /// 按等级排序 /// public int sortOrder1 => _sortOrder1; private int _sortOrder2 = -1; /// /// 按品质排序 /// public int sortOrder2 => _sortOrder2; private bool _isNew; /// /// /// public bool isNew { get { var ret = _isNew; _isNew = false; return ret; } set { _isNew = value; } } private bool _isLocked; /// /// 锁住 /// public bool isLock { get { return _isLocked; } set { if (_isLocked != value) { if (value) { if (_sortOrder1 > 0 && _sortOrder1 < 1000000) { _sortOrder1 += 1000000; } if (_sortOrder2 > 0 && _sortOrder2 < 1000000) { _sortOrder2 += 1000000; } } else { if (_sortOrder1 > 1000000) { _sortOrder1 -= 1000000; } if (_sortOrder2 > 1000000) { _sortOrder2 -= 1000000; } } _isLocked = value; Save(); } } } /// /// 装上 /// public bool isEquip { get => PlayerProxy.Instance.IsSetEquipment(this); } /// /// /// public bool isWeapon { get => _equipmentItem.type == 0; } /// /// /// public CombatAttributeId elementId { get => basicAttribute.id; } /// /// 元素 /// public int elementIndex { get => Mathf.Clamp(basicAttribute.id - CombatAttributeId.ElementNone, 0, 5); } /// /// 元素数值 /// public int elementValue { get => Mathf.Max(0, basicAttribute.value); } private int _combatValue; /// /// /// public int combatValue { get { return _combatValue; } } /// /// /// public int combatValueFactor { get { var factorItem = ItemProxy.Instance.GetStaticItem(_propItem.level); return factorItem != null ? factorItem.value : 0; } } public int SetGrade(int value, IList attributes) { attributes.Clear(); if (value > 0) { int combatV = 0; for (int i = 0; i < extraAttributes.Count; i++) { var attribute = extraAttributes[i]; var chaLevel = ItemProxy.Instance.GetStaticItem(value); if (chaLevel != null) { attribute = chaLevel.GetEquipmentUpgradeAttribute(attribute); } attributes.Add(attribute); combatV += attribute.CalcCombatValue(); } return combatV; } return 0; } /// /// /// public override ItemEquipment item => _equipmentItem; /// /// 武器item /// public ItemWeapon weaponItem => _equipmentItem.type == 0 ? ItemProxy.Instance.GetStaticItem(_equipmentItem.subType) : null; /// /// /// public override ItemProp propItem => _propItem; /// /// 基础属性 /// public CombatAttribute basicAttribute; /// /// 额外属性 /// public readonly List extraAttributes = new List(); /// /// 特殊属性 /// public readonly List specialAttributes = new List(); private ObscuredInt _suitId; /// /// 套装Id /// public int suitId { get { return _suitId; } } protected override void Init() { base.Init(); _equipmentItem = ItemProxy.Instance.GetStaticItem(_itemId); _sortOrder1 = propLevel * 100 + quality * 10 - equipmentType; _sortOrder2 = quality * 10000 + propLevel * 10 - equipmentType; } /// /// /// /// /// public void GenerateAttributes(int initLevel, int initQuality) { _isNew = true; _grade = initLevel; int combatV = 0; int factor = combatValueFactor; //单一词条 var attributes = _equipmentItem.basicAttributes; if (attributes != null && attributes.Length > 0) { if (attributes.Length == 1) { var attr = attributes[0]; basicAttribute.id = (CombatAttributeId)attr[0]; basicAttribute.value = Random.Range(attr[1], attr[2]); } else { int maxWeight = 0; for (int i = 0, l = attributes.Length; i < l; i++) { maxWeight += attributes[i][3]; } int curWeight = Random.Range(0, maxWeight); for (int i = 0, l = attributes.Length; i < l; i++) { var attr = attributes[i]; curWeight -= attr[3]; if (curWeight < 0) { basicAttribute.id = (CombatAttributeId)attr[0]; basicAttribute.value = Random.Range(attr[1], attr[2]); break; //只取一件 } } } combatV += basicAttribute.CalcCombatValue(factor); } //固定词条 attributes = _equipmentItem.extraAttributes; if (attributes != null && attributes.Length > 0) { for (int i = 0, l = attributes.Length; i < l; i++) { var attr = attributes[i]; var attribute = new CombatAttribute { id = (CombatAttributeId)attr[0], value = Random.Range(attr[1], attr[2]) }; extraAttributes.Add(attribute); combatV += attribute.CalcCombatValue(factor); } } //特殊词条 attributes = _equipmentItem.specialAttributes; if (attributes != null && attributes.Length > 0) { int maxWeight = 0; for (int i = 0, l = attributes.Length; i < l; i++) { maxWeight += attributes[i][3]; } int attrCount = RndAtrributeAmount(this.propLevel, this.quality); for (int j = 0; j < attrCount; j++) { int curWeight = Random.Range(0, maxWeight); for (int i = 0, l = attributes.Length; i < l; i++) { var attr = attributes[i]; curWeight -= attr[3]; if (curWeight < 0) { var attribute = new CombatAttribute { id = (CombatAttributeId)attr[0], value = Random.Range(attr[1], attr[2]) }; specialAttributes.Add(attribute); combatV += attribute.CalcCombatValue(factor); break; } } } } if (_equipmentItem.suit != null && _equipmentItem.suit.Length > 0) { _suitId = GlobalUtils.GetRandom(_equipmentItem.suit); if (_suitId > 0) { var suitItem = ItemProxy.Instance.GetStaticItem(_suitId); combatV += suitItem.combatValue; } } _combatValue = combatV + item.combatValue; } public void Load(List dataList) { int index = 0; GlobalUtils.SplitNumber824(dataList.SafeGet(index++), out int locked, out int grade); _grade = grade; _isLocked = locked != 0; int combatV = 0; int factor = combatValueFactor; int sid, svalue; // GlobalUtils.SplitNumber824(dataList.SafeGet(index++), out sid, out svalue); basicAttribute = new CombatAttribute { id = (CombatAttributeId)sid, value = svalue, }; combatV += basicAttribute.CalcCombatValue(factor); // var ea_c = dataList.SafeGet(index++); for (int i = 0; i < ea_c; i++) { GlobalUtils.SplitNumber824(dataList.SafeGet(index++), out sid, out svalue); var attribute = new CombatAttribute { id = (CombatAttributeId)sid, value = svalue, }; extraAttributes.Add(attribute); combatV += attribute.CalcCombatValue(factor); } // var sa_c = dataList.SafeGet(index++); for (int i = 0; i < sa_c; i++) { GlobalUtils.SplitNumber824(dataList.SafeGet(index++), out sid, out svalue); var attribute = new CombatAttribute { id = (CombatAttributeId)sid, value = svalue, }; specialAttributes.Add(attribute); combatV += attribute.CalcCombatValue(factor); } //套装 _suitId = dataList.SafeGet(index++); if (_suitId > 0) { var suitItem = ItemProxy.Instance.GetStaticItem(_suitId); if (suitItem != null) combatV += suitItem.combatValue; else { var convertItem = ItemProxy.Instance.GetStaticItem(id); if (convertItem != null) { _suitId = convertItem.newId; suitItem = ItemProxy.Instance.GetStaticItem(_suitId); combatV += suitItem.combatValue; } else _suitId = 0; } } _combatValue = combatV + item.combatValue; } public void Save(List dataList) { dataList.Add(GlobalUtils.CombineNumber824(isLock ? 1 : 0, _grade)); //基础属性 dataList.Add(GlobalUtils.CombineNumber824((int)basicAttribute.id, basicAttribute.value)); //特殊属性 dataList.Add(extraAttributes.Count); for (int i = 0; i < extraAttributes.Count; i++) { dataList.Add(GlobalUtils.CombineNumber824((int)extraAttributes[i].id, extraAttributes[i].value)); } //特殊属性 dataList.Add(specialAttributes.Count); for (int i = 0; i < specialAttributes.Count; i++) { dataList.Add(GlobalUtils.CombineNumber824((int)specialAttributes[i].id, specialAttributes[i].value)); } //套装 dataList.Add(_suitId); } public void Load() { var dataList = ArchiveProxy.Instance.GetIntList(id); if (dataList != null && dataList.Count > 0) { Load(dataList); } } public void Save() { var dataList = ArchiveProxy.Instance.GetIntList(id); if (dataList != null) { dataList.Clear(); Save(dataList); ArchiveProxy.Instance.SetIntList(id, dataList); } } public void Remove() { ArchiveProxy.Instance.RemoveIntList(id); } public static void RemoveEquipment(int id) { ArchiveProxy.Instance.RemoveIntList(id); } /// /// /// /// /// private static int RndAtrributeAmount(int level, int quality) { int result = 0; switch (quality) { case Item.Quality.kGreen: result = 1; break; case Item.Quality.kBlue: result = 2; break; case Item.Quality.kPurple: result = 3; break; case Item.Quality.kYellow: result = 5; break; case Item.Quality.kRed: result = 6; break; } return result; } public static int SortByGrade(EntityItemEquipment equipment1, EntityItemEquipment equipment2) { return equipment2.sortOrder1 - equipment1.sortOrder1; } public static int SortByQuality(EntityItemEquipment equipment1, EntityItemEquipment equipment2) { return equipment2.sortOrder2 - equipment1.sortOrder2; } } }