// 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;
}
}
}