// ***********************************************************************
// Assembly : Unity
// Author : Kimch
// Created : 2019-06-05
// Description :
// Last Modified By :
// Last Modified On :
// ***********************************************************************
//
//
// ***********************************************************************
using CodeStage.AntiCheat.ObscuredTypes;
using F;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace G
{
///
///
///
partial class PlayerProxy
{
#region 角色装备
///
/// 装备槽
///
public class EquipmentSlotInfo
{
public readonly int id;
#region Grade
private ObscuredInt _grade;
///
///
///
public int grade
{
get { return _grade; }
set { _grade = value; }
}
public int maxGrade
{
get { return curEquipment != null ? curEquipment.level + 9 : 0; }
}
///
/// 强化战力
///
public int gradeCombatValue
{
get;
private set;
}
///
///
///
///
public void SetGrade(int value)
{
grade = value;
if (curEquipment != null)
{
gradeCombatValue = curEquipment.SetGrade(this.grade, upgradeAttributes);
}
}
#endregion
#region Suit
///
///
///
private ObscuredInt _slotSuitGrade;
///
///
///
public int slotSuitGrade
{
get { return _slotSuitGrade; }
set { _slotSuitGrade = value; }
}
///
///
///
///
public void SetSlotSuitGrade(int value)
{
slotSuitGrade = value;
}
public ItemSuit slotSuitItem
{
get { return ItemProxy.Instance.GetStaticItem(1); }
}
#endregion
#region Gem
public const int MAX_GEM_COUNT = 3;
///
///
///
public readonly EntityItemGem[] gems = new EntityItemGem[MAX_GEM_COUNT];
///
/// 宝石开启
///
public bool gemEnabled
{
get { return this.equipment != null; }
}
///
/// 最大可镶嵌宝石数量
///
public int setGemCountMax
{
get
{
int tmpGrade = this.grade;
if (tmpGrade >= 80)
{
return 3;
}
else if (tmpGrade >= 60)
{
return 2;
}
else if (tmpGrade >= 40)
{
return 1;
}
else
{
return 0;
}
}
}
public int GetGemUnlockGrade(int index)
{
if (index == 1)
{
return 40;
}
else if (index == 2)
{
return 60;
}
else if (index == 3)
{
return 80;
}
else
{
return 40;
}
}
///
///
///
///
///
public EntityItemGem GetGem(int index)
{
if (index >= 0 & index < MAX_GEM_COUNT)
{
return gems[index];
}
return null;
}
///
///
///
///
///
public bool SetGem(int index, int gemId)
{
if (gemId > 0 && index < MAX_GEM_COUNT)
{
gems[index] = ItemProxy.Instance.NewTemporaryGem(gemId);
}
return true;
}
#endregion
///
///
///
public EntityItemEquipment curEquipment;
///
/// 试用装备
///
public EntityItemEquipment tryEquipment;
///
/// 升级属性
///
public readonly List upgradeAttributes = new List(1);
public int equipmentId
{
get { return curEquipment != null ? curEquipment.id : 0; }
}
///
///
///
public EntityItemEquipment equipment
{
get { return tryEquipment ?? curEquipment; }
}
///
///
///
///
///
public bool IsSetEquipment(EntityItemEquipment equipment)
{
return equipmentId == equipment.id;
}
///
///
///
///
///
public bool SetEquipment(EntityItemEquipment equipment)
{
if (equipment.id == this.equipmentId)
{
return false;
}
curEquipment = equipment;
if (curEquipment != null)
{
curEquipment.SetGrade(this.grade, upgradeAttributes);
}
return true;
}
///
///
///
///
///
public bool SetEquipment(int equipmentId)
{
if (this.equipmentId == equipmentId)
{
return false;
}
curEquipment = ItemProxy.Instance.GetEquipment(equipmentId);
if (curEquipment != null)
{
gradeCombatValue = curEquipment.SetGrade(this.grade, upgradeAttributes);
}
return true;
}
public EquipmentSlotInfo(int id)
{
this.id = id;
}
///
///
///
///
///
public int GetAttributes(List results)
{
int resultCombatValue = 0;
var tmp = this.equipment;
if (tmp != null)
{
results.Add(tmp.basicAttribute);
results.AddRange(tmp.extraAttributes);
results.AddRange(tmp.specialAttributes);
results.AddRange(upgradeAttributes);
resultCombatValue = tmp.combatValue + gradeCombatValue;
}
for (int i = 0; i < gems.Length; i++)
{
if (gems[i] != null)
{
results.Add(gems[i].attribute);
resultCombatValue += gems[i].combatValue;
}
}
return resultCombatValue;
}
}
///
///
///
private readonly EquipmentSlotInfo[] _equipmentSlots = new EquipmentSlotInfo[(int)Item.EquipmentType.kMax];
///
///
///
private void InitEquipmentSlots()
{
for (int i = 0; i < _equipmentSlots.Length; i++)
{
_equipmentSlots[i] = new EquipmentSlotInfo(i);
}
}
///
///
///
///
public int GetValidEquipmentSlotCount()
{
int result = 0;
for (int i = 0; i < _equipmentSlots.Length; i++)
{
if (_equipmentSlots[i].curEquipment != null)
result++;
}
return result;
}
///
///
///
///
///
public EquipmentSlotInfo GetEquipmentSlot(EntityItemEquipment equipment)
{
if (equipment != null)
{
var result = _equipmentSlots[equipment.equipmentType];
if (result.IsSetEquipment(equipment))
return result;
}
return null;
}
///
///
///
///
///
public EquipmentSlotInfo GetEquipmentSlot(int index)
{
if (index < _equipmentSlots.Length)
{
return _equipmentSlots[index];
}
return null;
}
///
///
///
///
public EquipmentSlotInfo[] GetEquipmentSlots()
{
return _equipmentSlots;
}
///
///
///
///
///
///
public bool UpgradeEquipmentSlot(int index, bool onekey, bool sendNotification)
{
var equipment = _equipmentSlots[index].curEquipment;
if (equipment == null)
{
return false;
}
int maxGrade = equipment.level + 9;
int tmpGrade = _equipmentSlots[index].grade;
if (tmpGrade >= maxGrade)
{
PostNotification(GlobalDefine.EVENT_SHOW_TOAST, KLocalization.GetLocalString(16));
return false;
}
int costId = Item.Id.kChip;
bool result = false;
var costReduce = Mathf.Clamp01(GetAttributeValue(CombatAttributeId.CoinUpgradeCostReduce) * 0.01f);
int lastCost = 0;
if (tmpGrade > 0)
{
lastCost = ItemProxy.Instance.GetStaticItem(tmpGrade).equipmentUpgradeCostCount;
}
int gradeAdd = 0;
if (!onekey)
{
var chaLevelItem = ItemProxy.Instance.GetStaticItem(tmpGrade + 1);
costId = chaLevelItem.equipmentUpgradeCostId;
int currCost = chaLevelItem.equipmentUpgradeCostCount;
int cost = currCost - lastCost;
cost -= (int)(cost * costReduce);
if (MoneyProxy.Instance.CheckMoney(costId, cost))
{
tmpGrade += 1;
gradeAdd += 1;
MoneyProxy.Instance.CostMoney(costId, cost);
result = true;
}
}
else
{
int cost = 0;
while (tmpGrade < maxGrade)
{
var chaLevelItem = ItemProxy.Instance.GetStaticItem(tmpGrade + 1);
costId = chaLevelItem.equipmentUpgradeCostId;
int currCost = chaLevelItem.equipmentUpgradeCostCount;
int tmpCost = currCost - lastCost;
tmpCost -= (int)(tmpCost * costReduce);
if (MoneyProxy.Instance.CheckMoney(costId, tmpCost))
{
tmpGrade += 1;
gradeAdd += 1;
cost = tmpCost;
result = true;
}
else
{
break;
}
}
MoneyProxy.Instance.CostMoney(costId, cost);
}
if (result)
{
_equipmentSlots[index].SetGrade(tmpGrade);
SaveSlots();
UpdateAttributes();
int totalGrade = 0;
for (int i = 0; i < _equipmentSlots.Length; i++)
{
totalGrade += _equipmentSlots[i].grade;
}
MissionProxy.Instance.OnEvent2(MissionProxy.累计强化次数, totalGrade);
if (sendNotification)
PostNotification(GlobalDefine.EVENT_PLAYER_EQUIPMENT_CHANGED, onekey.ToString(), "upgrade");
PostNotification(GlobalDefine.EVENT_MONEY_CHANGED);
UI.ToastBox.ShowText("强化成功", 5);
}
else
{
UI.AdMoneyBox.ShowAdMoney(costId, true);
}
return result;
}
///
/// 代码有bug
///
///
///
///
///
///
public bool GetUpgradeEquipmentSlotCost(int index, bool onekey, out int costId, out int costCount)
{
costId = Item.Id.kChip;
costCount = 0;
var slot = _equipmentSlots[index];
if (slot.curEquipment == null)
{
return false;
}
int playerGrade = _equipmentSlots[index].maxGrade;
int slotGrade = slot.grade;
if (slotGrade >= playerGrade)
{
return false;
}
bool result = false;
var costReduce = Mathf.Clamp01(GetAttribute(CombatAttributeId.CoinUpgradeCostReduce).value * 0.01f);
int gradeAdd = 0;
int lastCost = 0;
if (slotGrade > 0)
{
lastCost = ItemProxy.Instance.GetStaticItem(slotGrade).equipmentUpgradeCostCount;
}
if (!onekey)
{
var chaLevelItem = ItemProxy.Instance.GetStaticItem(slotGrade + 1);
costId = chaLevelItem.equipmentUpgradeCostId;
int currCost = chaLevelItem.equipmentUpgradeCostCount;
costCount = currCost - lastCost;
costCount -= (int)(costCount * costReduce);
if (MoneyProxy.Instance.CheckMoney(costId, costCount))
{
slotGrade += 1;
gradeAdd += 1;
result = true;
}
}
else
{
costCount = 0;
while (slotGrade < playerGrade)
{
int currCost = ItemProxy.Instance.GetStaticItem(slotGrade + 1).equipmentUpgradeCostCount;
int tmpCost = currCost - lastCost;
tmpCost -= (int)(tmpCost * costReduce);
if (MoneyProxy.Instance.CheckMoney(costId, tmpCost))
{
slotGrade += 1;
gradeAdd += 1;
costCount = tmpCost;
result = true;
}
else
{
break;
}
}
}
return result;
}
///
///
///
///
///
public bool IsSetEquipment(EntityItemEquipment equipment)
{
if (equipment != null)
{
return _equipmentSlots[equipment.equipmentType].IsSetEquipment(equipment);
}
return false;
}
///
/// Item.EquipmentType
///
/// 部位
///
public EntityItemEquipment GetCurEquipment(int id)
{
return _equipmentSlots[id].curEquipment;
}
///
/// 获取武器 包括试用
///
///
public EntityItemEquipment GetCurWeapon()
{
return _equipmentSlots[0].equipment;
}
///
///
///
///
public void SetDefaultEquipment(int itemId)
{
var equipment = BagProxy.Instance.NewEquipment(itemId);
if (equipment != null)
{
if (_equipmentSlots[equipment.equipmentType].SetEquipment(equipment))
{
SaveSlots();
UpdateAttributes(false);
this.PostNotification(GlobalDefine.EVENT_PLAYER_EQUIPMENT_CHANGED, equipment, "set");
}
}
}
///
/// 装装备
///
///
///
public bool SetEquipment(EntityItemEquipment equipment)
{
if (equipment == null /*|| equipment.propLevel > grade*/)
{
return false;
}
if (_equipmentSlots[equipment.equipmentType].SetEquipment(equipment))
{
UpdateAttributes();
SaveSlots();
if (_equipmentSlots[0].tryEquipment == null)
this.PostNotification(GlobalDefine.EVENT_PLAYER_EQUIPMENT_CHANGED, equipment, "set");
MissionProxy.Instance.OnOverEvent(MissionProxy.装备累计穿戴_等级_品质_数量, 1, equipment.propLevel, equipment.quality);
}
return true;
}
///
///
///
///
public void SetEquipments(EntityItemEquipment[] equipments)
{
bool flag = false;
foreach (var equipment in equipments)
{
if (equipment != null)
{
if (_equipmentSlots[equipment.equipmentType].SetEquipment(equipment))
{
flag = true;
MissionProxy.Instance.OnOverEvent(MissionProxy.装备累计穿戴_等级_品质_数量, 1, equipment.propLevel, equipment.quality);
}
}
}
if (flag)
{
SaveSlots();
UpdateAttributes();
this.PostNotification(GlobalDefine.EVENT_PLAYER_EQUIPMENT_CHANGED, equipments, "sets");
}
}
///
///
///
///
///
public bool IsBetterEquipment(EntityItemEquipment equipment)
{
if (equipment == null /*|| equipment.propLevel > grade*/ || (equipment.isWeapon && _equipmentSlots[0].tryEquipment != null))
{
return false;
}
var setEquipment = GetCurEquipment(equipment.equipmentType);
if (setEquipment == null || setEquipment.combatValue < equipment.combatValue)
{
return true;
}
return false;
}
///
/// 试用
///
///
///
public bool TryoutEquipment(int equipmentId)
{
var equipment = ItemProxy.Instance.NewTemporaryEquipment(equipmentId);
if (equipment == null)
{
return false;
}
_equipmentSlots[0].tryEquipment = equipment;
UpdateAttributes();
this.PostNotification(GlobalDefine.EVENT_PLAYER_EQUIPMENT_CHANGED, equipment, "set");
return true;
}
///
/// 试用结束
///
public void TryoutFinish()
{
bool flag = false;
for (int i = 0; i < _equipmentSlots.Length; i++)
{
if (_equipmentSlots[i].tryEquipment != null)
{
_equipmentSlots[i].tryEquipment = null;
flag = true;
}
}
if (flag)
{
UpdateAttributes(false);
}
}
///
///
///
///
///
public bool SetGem(EntityItemGem gem)
{
if (gem.count <= 0)
return false;
var slot = GetEquipmentSlot(gem.item.slot);
if (slot != null)
{
int gemLevel = gem.level;
int lowGemIndex = -1;
for (int i = 0; i < slot.setGemCountMax; i++)
{
var slotGem = slot.gems[i];
if (slotGem == null)
{
slot.SetGem(i, gem.itemId);
gem.count -= 1;
return true;
}
else if (slotGem.level < gemLevel)
{
lowGemIndex = i;
gemLevel = slotGem.level;
}
}
if (lowGemIndex >= 0)
{
var slotGem = slot.GetGem(lowGemIndex);
slotGem.count += 1;
slot.SetGem(lowGemIndex, gem.itemId);
gem.count -= 1;
}
SaveSlots();
UpdateAttributes(true);
}
return false;
}
///
///
///
///
///
public bool SetGems(Dictionary> gemKVs)
{
bool result = false;
foreach (var gemKV in gemKVs)
{
var slot = GetEquipmentSlot(gemKV.Key);
if (slot != null && slot.gemEnabled)
{
int maxSetCount = slot.setGemCountMax;
int setCount = 0;
for (int j = gemKV.Value.Count - 1; j >= 0 && setCount < 3; j--)
{
var gem = gemKV.Value[j];
for (int i = 0; i < maxSetCount; i++)
{
if (gem.count > 0)
{
var slotGem = slot.GetGem(i);
if (slotGem == null)
{
slot.SetGem(i, gem.itemId);
gem.count -= 1;
setCount += 1;
}
else if (slotGem.level < gem.level)
{
slot.SetGem(i, gem.itemId);
gem.count -= 1;
slotGem.count += 1;
setCount += 1;
}
}
}
}
if (setCount > 0)
result = true;
}
}
if (result)
{
SaveSlots();
UpdateAttributes(true);
PostNotification(GlobalDefine.EVENT_GEM_CHANGED, null, "set");
}
return result;
}
///
///
///
///
///
public bool IsBetterGem(EntityItemGem gem)
{
var slot = GetEquipmentSlot(gem.item.slot);
if (slot != null)
{
for (int i = 0; i < slot.setGemCountMax; i++)
{
var slotGem = slot.gems[i];
if (slotGem == null || slotGem.level < gem.level)
{
return true;
}
}
}
return false;
}
///
///
///
///
private void UpdateAttributes(bool sendNotification = true)
{
UpdateAttributes(_equipmentSlots, sendNotification);
}
private readonly Dictionary _equipmentSuits = new Dictionary();
///
///
///
///
///
private void UpdateAttributes(EquipmentSlotInfo[] equipmentSlots, bool sendNotification)
{
var results = F.ListPool.Get();
_equipmentSuits.Clear();
int combatV = 0;
for (int i = 0; i < equipmentSlots.Length; i++)
{
combatV += equipmentSlots[i].GetAttributes(results);
if (equipmentSlots[i].curEquipment != null)
{
var equipmentSuitId = equipmentSlots[i].curEquipment.suitId;
if (equipmentSuitId > 0)
{
if (_equipmentSuits.ContainsKey(equipmentSuitId))
_equipmentSuits[equipmentSuitId] += 1;
else
_equipmentSuits.Add(equipmentSuitId, 1);
}
}
}
if (_equipmentSuits.Count > 0)
{
foreach (var suitKV in _equipmentSuits)
{
var suitItem = ItemProxy.Instance.GetStaticItem(suitKV.Key);
if (suitKV.Value >= 2)
{
var attribute = suitItem.GetAttribute2();
combatV += attribute.combatValue;
results.Add(attribute);
}
if (suitKV.Value >= 4)
{
var attribute = suitItem.GetAttribute4();
combatV += attribute.combatValue;
results.Add(attribute);
}
if (suitKV.Value >= 6)
{
var attribute = suitItem.GetAttribute6();
combatV += attribute.combatValue;
results.Add(attribute);
}
}
}
for (int i = 0; i < _suitInfos.Count; i++)
{
combatV += _suitInfos[i].GetAttributes(results);
}
UpdateEquipmentCombatValue(results, combatV, sendNotification);
F.ListPool.Release(results);
}
private const string ARCHIVE_KEY_OB = "eq_slots";
private const string ARCHIVE_KEY_V1 = "slots_v1";
///
///
///
private void LoadEquipmentSlots()
{
var dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V1);
if (dataList != null && dataList.Count > 0)
{
int index = 0;
for (int i = 0; i < _equipmentSlots.Length; i++)
{
_equipmentSlots[i].grade = dataList.SafeGet(index++);
_equipmentSlots[i].SetEquipment(dataList.SafeGet(index++));
var gemCount = dataList.SafeGet(index++);
for (int j = 0; j < gemCount; j++)
{
var gemId = dataList.SafeGet(index++);
_equipmentSlots[i].SetGem(j, gemId);
}
}
var suitCount = dataList.SafeGet(index++);
for (int i = 0; i < suitCount; i++)
{
int status = dataList.SafeGet(index++);
if (i < _suitInfos.Count)
_suitInfos[i].SetStatus(status);
}
//UpdateAttributes(false);
}
else
{
var saveList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_OB);
if (saveList != null && saveList.Count > 0)
{
bool flag = false;
int index = 0;
for (int i = 0; i < _equipmentSlots.Length; i++)
{
_equipmentSlots[i].grade = saveList.SafeGet(index++);
if (_equipmentSlots[i].SetEquipment(saveList.SafeGet(index++)))
{
flag = true;
}
}
for (int i = 0; i < _suitInfos.Count; i++)
{
_suitInfos[i].SetStatus(saveList.SafeGet(index++));
}
if (flag)
{
UpdateAttributes(false);
}
}
}
}
///
///
///
private void SaveSlots()
{
var saveList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V1);
if (saveList != null)
{
saveList.Clear();
for (int i = 0; i < _equipmentSlots.Length; i++)
{
var slot = _equipmentSlots[i];
saveList.Add(slot.grade);
saveList.Add(slot.equipmentId);
saveList.Add(slot.gems.Length);
for (int j = 0; j < slot.gems.Length; j++)
{
var gem = slot.gems[j];
saveList.Add(gem != null ? gem.id : 0);
}
}
saveList.Add(_suitInfos.Count);
for (int i = 0; i < _suitInfos.Count; i++)
{
saveList.Add(_suitInfos[i].GetStatus());
}
ArchiveProxy.Instance.SetIntList(ARCHIVE_KEY_V1, saveList);
}
ArchiveProxy.Instance.RemoveIntList(ARCHIVE_KEY_OB);
}
#endregion
#region 角色套装
///
/// 套装
///
public class EquipmentSlotSuit
{
public readonly ItemSuit item;
///
///
///
public int id => item.id;
public string description
{
get { return $"{item.name}({activeCount}/6)"; }
}
///
///
///
public string suitFxAsset
{
get
{
int tmp = stage;
if (tmp > 0)
{
return $"ef_suit_blue_{tmp}";
}
return "";
}
}
public int stageMax
{
get => 3;
}
public int stage
{
get
{
int ac = this.activeCount;
if (ac < 1)
{
return 0;
}
else if (ac < 3)
{
return 1;
}
else if (ac < 6)
{
return 2;
}
else
{
return 3;
}
}
}
public int stageCount1 => 1;
public int stageCount2 => 3;
public int stageCount3 => 6;
///
///
///
///
///
public int GetStageGrade(int stageCount)
{
int result = -1;
int count = 0;
for (int i = (int)Item.EquipmentType.kMax - 1; i >= 0; i--)
{
int grade = _grades[i];
if (grade > result)
{
result = grade;
count = 1;
}
else if (grade == result)
{
count++;
}
}
return count >= stageCount ? result : result - 1;
}
///
///
///
///
///
public string GetStageGradeText(int stageCount)
{
if (activeCount < stageCount)
return $"({stageCount}) ";
int stageGrade = GetStageGrade(stageCount);
return $"({Item.GetQualityText(stageGrade + 1) + stageCount}) ";
}
///
///
///
public string suitAttributesText2
{
get
{
var attributes = item.GetAttribute2ByGrade(GetStageGrade(stageCount1));
return GetStageGradeText(stageCount1) + attributes.ToString();
}
}
///
///
///
public string suitAttributesText4
{
get
{
var attributes = item.GetAttribute4ByGrade(GetStageGrade(stageCount2));
return GetStageGradeText(stageCount2) + attributes.ToString();
}
}
///
///
///
public string suitAttributesText6
{
get
{
var attributes = item.GetAttribute6ByGrade(GetStageGrade(stageCount3));
return GetStageGradeText(stageCount3) + attributes.ToString();
}
}
private int _status;
///
/// 激活数量
///
public int activeCount
{
get
{
int result = 0;
for (int i = 0; i < (int)Item.EquipmentType.kMax; i++)
{
if (_grades[i] > 0)
//if ((_status & (1 << i)) != 0)
result++;
}
return result;
}
}
///
/// 激活等级
///
public int activeGrade
{
get
{
int result = 0;
for (int i = (int)Item.EquipmentType.kMax - 1; i >= 0; i--)
{
if (_grades[i] > result)
result = _grades[i];
}
return result;
}
}
public EquipmentSlotSuit(ItemSuit suitItem)
{
this.item = suitItem;
}
public bool IsActiveSlot(int slot)
{
return (_status & (1 << slot)) != 0;
}
public void ActiveSuit(int slot)
{
_status |= (1 << slot);
}
private readonly ObscuredInt[] _grades = new ObscuredInt[(int)Item.EquipmentType.kMax];
public int maxGrade
{
get => 5;
}
public int GetGrade(int slot)
{
return _grades[slot];
}
public void SetGrade(int slot, int value)
{
_grades[slot] = value;
}
public void Upgrade(int slot)
{
_grades[slot] += 1;
}
public bool CanUpgrade(int slot)
{
var slotGrade = (int)_grades[slot];
if (slotGrade >= maxGrade)
return false;
for (int i = 0; i < _grades.Length; i++)
{
if (slotGrade > _grades[i])
return false;
}
return true;
}
public Item.ItemInfo GetUpgradeCost(int slot)
{
return item.GetCostByGrade(_grades[slot]);
}
public void SetStatus(int status)
{
if (status > 0)
{
_status = status;
for (int i = 0; i < (int)Item.EquipmentType.kMax; i++)
{
bool active = (_status & (1 << i)) != 0;
if (active)
{
_grades[i] = 1;
}
}
}
}
///
///
///
public int GetStatus()
{
return _status;
}
///
///
///
///
///
public int GetAttributes(List results)
{
int resutCV = 0;
int tmpCount = this.activeCount;
if (tmpCount >= stageCount1)
{
var attribute = item.GetAttribute2ByGrade(GetStageGrade(stageCount1));
resutCV += attribute.combatValue;
results.Add(attribute);
}
if (tmpCount >= stageCount2)
{
var attribute = item.GetAttribute4ByGrade(GetStageGrade(stageCount2));
resutCV += attribute.combatValue;
results.Add(attribute);
}
if (tmpCount >= stageCount3)
{
var attribute = item.GetAttribute6ByGrade(GetStageGrade(stageCount3));
resutCV += attribute.combatValue;
results.Add(attribute);
}
return resutCV;
}
}
private readonly List _suitInfos = new List();
///
///
///
private void InitEquipmentSlotSuits()
{
_suitInfos.Clear();
var suitItem = ItemProxy.Instance.GetStaticItem(1);
//if (suitItems != null)
// for (int i = 0; i < suitItems.Count; i++)
// {
_suitInfos.Add(new EquipmentSlotSuit(suitItem));
//}
}
///
///
///
///
public EquipmentSlotSuit GetCurrEquipmentSuit()
{
return _suitInfos[0];
}
///
///
///
///
///
public bool UpgradeEquipmentSlotSuit(int slot)
{
var suit = GetCurrEquipmentSuit();
if (slot >= 0 && suit != null && suit.CanUpgrade(slot) && MoneyProxy.Instance.CheckAndCostMoney(suit.GetUpgradeCost(slot)))
{
suit.Upgrade(slot);
SaveEquipmentSuits();
UpdateAttributes();
PostNotification(GlobalDefine.EVENT_EQUIPMENT_SUIT, null, "upgrade");
PostNotification(GlobalDefine.EVENT_MONEY_CHANGED, null, "suit");
return true;
}
return false;
}
public int GetEquipmentSuitActiveCount(int suitId)
{
int result = 0;
for (int i = 0; i < _equipmentSlots.Length; i++)
{
var equipment = _equipmentSlots[i].curEquipment;
if (equipment != null && equipment.suitId == suitId)
{
result++;
}
}
return result;
}
private const string SUIT_ARCHIVE_KEY_V1 = "suit_v1";
void LoadEquipmentSuits()
{
var dataList = ArchiveProxy.Instance.GetIntList(SUIT_ARCHIVE_KEY_V1);
if (dataList != null && dataList.Count > 0)
{
int index = 0;
int suitId = dataList[index++];
var suitInfo = _suitInfos[0];
for (int j = 0; j < 6; j++)
{
suitInfo.SetGrade(j, dataList[index++]);
}
}
}
void SaveEquipmentSuits()
{
var saveList = ArchiveProxy.Instance.GetIntList(SUIT_ARCHIVE_KEY_V1);
if (saveList != null)
{
saveList.Clear();
var suitInfo = _suitInfos[0];
saveList.Add(suitInfo.id);
for (int j = 0; j < 6; j++)
{
saveList.Add(suitInfo.GetGrade(j));
}
ArchiveProxy.Instance.SetIntList(SUIT_ARCHIVE_KEY_V1, saveList);
}
}
#endregion
#region 角色战斗属性
public const int ATTRIBUTES_INDEX_TOTAL = 0;
public const int ATTRIBUTES_INDEX_CHA = 1;
public const int ATTRIBUTES_INDEX_EQUIPMENT = 2;
public const int ATTRIBUTES_INDEX_KUNGFU = 3;
public const int ATTRIBUTES_INDEX_TITLE = 4;
public const int ATTRIBUTES_INDEX_BEAUTY = 5;
public const int ATTRIBUTES_INDEX_PET = 6;
public const int ATTRIBUTES_INDEX_BOOK = 7;
public const int ATTRIBUTES_INDEX_MAX = 6 + 1;
public const int COMBATVALUE_INDEX_MAX = 7 + 1;
///
///
///
private readonly int[] _combatValues = new int[COMBATVALUE_INDEX_MAX];
///
/// 角色数值
///
private readonly CombatAttribute[][] _allAttributes = new CombatAttribute[ATTRIBUTES_INDEX_MAX][];
///
/// 总属性
///
public CombatAttribute[] combatAttributes => _allAttributes[ATTRIBUTES_INDEX_TOTAL];
///
/// 成长属性
///
public CombatAttribute[] growthAttributes => _allAttributes[ATTRIBUTES_INDEX_CHA];
///
/// 装备属性
///
public CombatAttribute[] equipmentAttributes => _allAttributes[ATTRIBUTES_INDEX_EQUIPMENT];
///
/// 武学属性
///
public CombatAttribute[] kungfuAttributes => _allAttributes[ATTRIBUTES_INDEX_KUNGFU];
///
/// 称号属性
///
public CombatAttribute[] titleAttributes => _allAttributes[ATTRIBUTES_INDEX_TITLE];
///
///
///
public CombatAttribute[] beautyAttributes => _allAttributes[ATTRIBUTES_INDEX_BEAUTY];
///
///
///
public CombatAttribute[] petAttributes => _allAttributes[ATTRIBUTES_INDEX_PET];
///
///
///
public void InitCombatAttributes()
{
for (int i = 0; i < ATTRIBUTES_INDEX_MAX; i++)
{
var attributes = _allAttributes[i];
if (attributes == null)
{
attributes = new CombatAttribute[(int)CombatAttributeId.kMax];
for (var j = CombatAttributeId.kMin; j < CombatAttributeId.kMax; j++)
{
attributes[(int)j].id = j;
}
_allAttributes[i] = attributes;
}
else
{
for (var j = CombatAttributeId.kMin; j < CombatAttributeId.kMax; j++)
{
attributes[(int)j].value = 0;
}
}
}
}
///
///
///
///
///
public CombatAttribute GetAttribute(CombatAttributeId attributeId)
{
return _allAttributes[0][(int)attributeId];
}
///
///
///
///
///
public int GetAttributeValue(CombatAttributeId attributeId)
{
return _allAttributes[0][(int)attributeId].value;
}
///
///
///
///
///
private void AddAttribute(CombatAttribute[] source, CombatAttribute attribute)
{
source[(int)attribute.id].AddValue(attribute.value);
}
///
///
///
///
///
private void AddAttributes(CombatAttribute[] source, IList attributes)
{
foreach (var attribute in attributes)
{
source[(int)attribute.id].AddValue(attribute.value);
}
}
///
///
///
///
private void ResetAttributes(CombatAttribute[] attributes)
{
for (int i = 1; i < (int)CombatAttributeId.kMax; i++)
{
attributes[i].ResetValue();
}
}
///
///
///
///
///
public int GetCombatValue(int index)
{
return _combatValues[index];
}
///
/// 更新战力
///
///
///
///
/// 返回战力差
public int UpdateCombatValue(int index, int fixedCV = 0, int extraCV = 0)
{
//
for (int i = 1; i < (int)CombatAttributeId.kMax; i++)
{
_allAttributes[0][i].ResetValue();
for (int j = 1; j < ATTRIBUTES_INDEX_MAX; j++)
{
_allAttributes[0][i].AddValue(_allAttributes[j][i].value);
}
}
//
if (fixedCV == 0)
{
var attributes = _allAttributes[index];
for (int i = 1; i < (int)CombatAttributeId.kMax; i++)
{
fixedCV += attributes[i].combatValue;
}
}
fixedCV += extraCV;
int result = fixedCV - _combatValues[index];
_combatValues[index] = fixedCV;
_combatValues[0] = 0;
for (int i = 1; i < COMBATVALUE_INDEX_MAX; i++)
{
_combatValues[0] += _combatValues[i];
}
return result;
}
///
///
///
///
///
///
public int UpdateCombatValueWithoutAttributes(int index, int fixedCV = 0)
{
//
int result = fixedCV - _combatValues[index];
_combatValues[index] = fixedCV;
_combatValues[0] = 0;
for (int i = 1; i < COMBATVALUE_INDEX_MAX; i++)
{
_combatValues[0] += _combatValues[i];
}
return result;
}
///
/// 升级战力
///
public void UpdateGrowthCombatValue(bool sendNotification)
{
var attributes = this.growthAttributes;
ResetAttributes(attributes);
var cha = GetCurrentCha();
if (cha != null)
{
var initAttributes = cha.initAttributes;
for (int i = 0; i < initAttributes.Length; i++)
{
AddAttribute(attributes, new CombatAttribute
{
id = (CombatAttributeId)initAttributes[i][0],
value = initAttributes[i][1],
});
}
}
//var chaLevel = ItemProxy.Instance.GetStaticItem(this.grade);
//if (chaLevel != null)
//{
// for (int i = 0; i < chaLevel.attributes.Length; i++)
// {
// AddAttribute(attributes, new CombatAttribute
// {
// id = (CombatAttributeId)chaLevel.attributes[i][0],
// value = chaLevel.attributes[i][1],
// });
// }
//}
int skinCV = ChaSkinProxy.Instance.combatValue;
int result = UpdateCombatValue(ATTRIBUTES_INDEX_CHA, 0, skinCV);
if (sendNotification)
this.PostNotification(GlobalDefine.EVENT_PLAYER_ATTRIBUTES_CHANGED, result, "growth");
}
///
/// 装备战力
///
public void UpdateEquipmentCombatValue(IList results, int combatValue, bool sendNotification)
{
var attributes = this.equipmentAttributes;
if (sendNotification)
for (int i = 0; i < results.Count; i++)
{
var newAttr = results[i];
var oldAttr = attributes[(int)newAttr.id];
if (newAttr.value > oldAttr.value)
{
newAttr.value -= oldAttr.value;
UI.ToastBox.ShowText(newAttr.ToString2(), 4);
}
}
ResetAttributes(attributes);
AddAttributes(attributes, results);
int result = UpdateCombatValue(ATTRIBUTES_INDEX_EQUIPMENT, combatValue);
if (sendNotification)
this.PostNotification(GlobalDefine.EVENT_PLAYER_ATTRIBUTES_CHANGED, result, "equipment");
}
///
/// 武学战力
///
public void UpdateKungfuCombatValue(IList results, bool sendNotification)
{
var attributes = this.kungfuAttributes;
if (sendNotification)
for (int i = 0; i < results.Count; i++)
{
var newAttr = results[i];
var oldAttr = attributes[(int)newAttr.id];
if (newAttr.value > oldAttr.value)
{
newAttr.value -= oldAttr.value;
UI.ToastBox.ShowText(newAttr.ToString2(), 4);
}
}
ResetAttributes(attributes);
AddAttributes(attributes, results);
int result = UpdateCombatValue(ATTRIBUTES_INDEX_KUNGFU);
if (sendNotification)
this.PostNotification(GlobalDefine.EVENT_PLAYER_ATTRIBUTES_CHANGED, result, "kungfu");
}
///
///
///
public void UpdateTitleCombatValue(IList results, int combatValue, bool sendNotification)
{
var attributes = this.titleAttributes;
ResetAttributes(attributes);
AddAttributes(attributes, results);
int result = UpdateCombatValue(ATTRIBUTES_INDEX_TITLE, combatValue);
if (sendNotification)
this.PostNotification(GlobalDefine.EVENT_PLAYER_ATTRIBUTES_CHANGED, result, "title");
}
///
///
///
///
public void UpdateBeautyCombatValue(IList results, bool sendNotification)
{
var attributes = this.beautyAttributes;
ResetAttributes(attributes);
AddAttributes(attributes, results);
int result = UpdateCombatValue(ATTRIBUTES_INDEX_BEAUTY);
if (sendNotification)
this.PostNotification(GlobalDefine.EVENT_PLAYER_ATTRIBUTES_CHANGED, result, "beauty");
}
///
///
///
///
///
///
public void UpdatePetCombatValue(IList results, int combatValue, bool sendNotification)
{
var attributes = this.petAttributes;
ResetAttributes(attributes);
AddAttributes(attributes, results);
int result = UpdateCombatValue(ATTRIBUTES_INDEX_PET, combatValue);
if (sendNotification)
this.PostNotification(GlobalDefine.EVENT_PLAYER_ATTRIBUTES_CHANGED, result, "pet");
}
///
///
///
///
///
public void UpdateBookCombatValue(int combatValue, bool sendNotification)
{
int result = UpdateCombatValueWithoutAttributes(ATTRIBUTES_INDEX_BOOK, combatValue);
if (sendNotification)
this.PostNotification(GlobalDefine.EVENT_PLAYER_ATTRIBUTES_CHANGED, result, "book");
}
#endregion
}
}