//**********************************************//
//作者:#何健#
//日期:#2016.10.14#
//简述:#装备数据结构#
//*********************************************//
using UnityEngine;
using System;
using System.Collections.Generic;
using Thousandto.Cfg.Data;
using Thousandto.Code.Global;
using Thousandto.Code.Center;
using Thousandto.Plugins.Common;
namespace Thousandto.Code.Logic
{
///
/// 类Equipment说明
///
public class Equipment: ItemBase
{
#region//静态变量
public static Dictionary> EquipBaseAttDic = null;
public static Dictionary> EquipSpecialAttDic = null;
public static Dictionary> EquipGodAttDic = null;
#endregion
#region //私有变量
private DeclareEquip _equip; //装备表数据
private int _suitID; //当前套装ID
private DeclareEquipSuit _suitCfg; //当前套装配置
private int _curSuitEquipCount;//当前装备的套装数量
private int _curLevelSuitEquipCount; //当前套装等级的套装数量
private List _activeSuitNums; //激活的套装数量列表
private List _activeSuitIds; //激活的套装的id列表
private uint _power;
//基础属性
private Dictionary _baseAttrs;
private Dictionary _specialAttrs;
private Dictionary _godAttrs;
private MSG_backpack.ItemInfo _itemInfoFromServer;
#endregion
#region //属性
public DeclareEquip ItemInfo
{
get
{
return _equip;
}
}
public int SuitID
{
get
{
return _suitID;
}
}
public DeclareEquipSuit SuitCfg
{
get
{
return _suitCfg;
}
}
public int CurSuitEquipCount
{
get
{
return _curSuitEquipCount;
}
set
{
_curSuitEquipCount = value;
}
}
public int CurLevelSuitEquipCount
{
get
{
return _curLevelSuitEquipCount;
}
set
{
_curLevelSuitEquipCount = value;
}
}
public List ActiveSuitNums
{
get
{
if (_activeSuitNums == null)
{
_activeSuitNums = new List();
}
return _activeSuitNums;
}
}
public List ActiveSuitIds
{
get
{
if (_activeSuitIds == null)
{
_activeSuitIds = new List();
}
return _activeSuitIds;
}
}
#endregion
#region//继承父类
public override bool Initialization()
{
base.Initialization();
_equip = DeclareEquip.Get( CfgID );
if (_equip == null)
{
Debug.LogError("equip info initialization declareequip is null id = " + CfgID);
}
_suitID = 0;
_suitCfg = null;
return true;
}
public override void UnInitialization()
{
_baseAttrs.Clear();
}
public override int GetItemType()
{
return ItemType.Equip;
}
public override string GetName()
{
string ret = "";
if (null != ItemInfo)
{
if (SuitCfg != null)
{
ret = SuitCfg.Prefix + ItemInfo.Name;
}
else
{
ret = ItemInfo.Name;
}
}
return ret;
}
public override int GetIcon()
{
int ret = -1;
if (ItemInfo != null)
ret = ItemInfo.Icon;
return ret;
}
public override int GetEffect()
{
int ret = -1;
if (ItemInfo != null)
ret = ItemInfo.Effect;
return ret;
}
public override int GetQuality()
{
int ret = -1;
if (ItemInfo != null)
ret = ItemInfo.Quality;
return ret;
}
public override int GetStarNum()
{
var ret = 0;
if (ItemInfo != null)
ret = ItemInfo.DiamondNumber;
return ret;
}
public override string GetOcc()
{
if (ItemInfo != null)
{
return ItemInfo.Gender;
}
return "";
}
public override int GetPart()
{
var ret = -1;
if (ItemInfo != null)
ret = ItemInfo.Part;
return ret;
}
public override int GetGrade()
{
var ret = 0;
if (ItemInfo != null)
ret = ItemInfo.Grade;
return ret;
}
public override uint GetPower()
{
return _power;
}
public override bool IsCanUse( int useType = ItemOpertion.Use )
{
return base.IsCanUse( useType );
}
public override bool CheckLevel( int level )
{
return ItemInfo.Level <= level;
}
public override bool CheackOcc( int sex )
{
if (Occ.IndexOf("9") >= 0)
return true;
bool ret = false;
if ( ItemInfo.Gender.IndexOf(sex.ToString()) >= 0 )
{
ret = true;
}
else
{
ret = false;
}
return ret;
}
public override bool CheckBetterThanDress()
{
var dressEquip = GameCenter.EquipmentSystem.GetPlayerDressEquip(Part);
if(dressEquip != null)
{
return Power > dressEquip.Power;
}
return true;
}
public override bool CheckCanEquip()
{
return GameCenter.EquipmentSystem.OnCheckCanEquip(this);
}
public override bool CheckClass()
{
if (ItemInfo.Classlevel <= 0)
return true;
else
{
LocalPlayer p = GameCenter.GameSceneSystem.GetLocalPlayer();
if (p != null)
{
if (p.ChangeJobLevel >= ItemInfo.Classlevel)
{
return true;
}
else
{
return false;
}
}
}
return false;
}
public override bool isTimeOut()
{
return base.isTimeOut();
}
public override bool IsNeedSecond( int useType = ItemOpertion.Use )
{
bool ret= false;
if (ItemInfo == null)
{
return false;
}
switch ( useType )
{
case ItemOpertion.Use:
ret = ItemInfo.Quality >= 4; //紫色以上装备就需要提示
break;
case ItemOpertion.Split:
ret = false;
break;
case ItemOpertion.Sell:
case ItemOpertion.Stall:
case ItemOpertion.Resolve:
ret = ItemInfo.Quality >= 4; //紫色以上装备就需要提示
break;
}
return ret;
}
public override bool IsUsedInBatches()
{
return false;
}
//检测是否可以上架
public override bool CanAuction()
{
if (!GameCenter.MainFunctionSystem.FunctionIsVisible(FunctionStartIdCode.Auchtion))
return false;
if (IsBind)
return false;
if (ItemInfo.AuctionMaxPrice == 0)
return false;
return true;
}
//使用物品
public override void UseItem()
{
GameCenter.EquipmentSystem.RequestEquipWear(this);
}
//获取和已穿戴装备的战斗力差
public override int GetDressPowerDiff()
{
var dressEquip = GameCenter.EquipmentSystem.GetPlayerDressEquip(Part);
if (dressEquip != null)
{
return (int)Power - (int)dressEquip.Power;
}
return (int)Power;
}
//判断是否是首饰
public bool IsJewelry()
{
if (Part == EquipmentType.FingerRing || Part == EquipmentType.Necklace)
return true;
return false;
}
#endregion
#region//公共接口
public Equipment( MSG_backpack.ItemInfo info ):
base(info)
{
Initialization();
_suitID = info.suitId;
_suitCfg = DeclareEquipSuit.Get(_suitID);
SetAttribute();
_itemInfoFromServer = info;
}
public Equipment( Equipment info ):
base(info)
{
Initialization();
_suitID = info._suitID;
_suitCfg = info._suitCfg;
SetAttribute();
_itemInfoFromServer = info._itemInfoFromServer;
}
public string ToProtoBufferBytes()
{
byte[] bytes = Plugins.Common.ProtoBufUtils.Serialize(_itemInfoFromServer);
return Convert.ToBase64String(bytes);
}
public static Equipment ToEquipment(string str)
{
Equipment result;
byte[] message = Convert.FromBase64String(str);
MSG_backpack.ItemInfo itemInfo = new MSG_backpack.ItemInfo();
ProtoBufUtils.Deserialize(itemInfo, message);
result = new Equipment(itemInfo);
return result;
}
public Equipment(int id) :
base(id)
{
Initialization();
_suitID = 0;
_suitCfg = null;
SetAttribute();
}
///
/// 获取装备的最基本的属性值
///
/// 属性类型,属性值
public Dictionary GetBaseAttribute()
{
if (_baseAttrs != null)
return _baseAttrs;
return new Dictionary();
}
///
/// 获取装备的最基本的属性值
///
/// 属性类型,属性值
public Dictionary GetSpecialAttribute()
{
if (_specialAttrs != null)
return _specialAttrs;
return new Dictionary();
}
///
/// 获取装备的最基本的属性值
///
/// 属性类型,属性值
public Dictionary GetGodAttribute()
{
if (_godAttrs != null)
return _godAttrs;
return new Dictionary();
}
//是否有效
public override bool IsValid()
{
return _equip != null;
}
//增加套装激活数
public void AddSuitActiveNum(int num, int id)
{
if(!ActiveSuitNums.Contains(num))
{
ActiveSuitNums.Add(num);
ActiveSuitIds.Add(id);
}
}
//清除套装激活数
public void ClearSuitActiveNum()
{
ActiveSuitNums.Clear();
ActiveSuitIds.Clear();
}
#endregion
#region//私有方法
///
/// 计算当前装备的属性值
///
///
/// 属性类型,增加的属性值
private void SetAttribute()
{
if (EquipBaseAttDic == null)
{
EquipBaseAttDic = new Dictionary>(512);
}
if(EquipBaseAttDic.ContainsKey(_equip.Id))
{
_baseAttrs = EquipBaseAttDic[_equip.Id];
}
else
{
if (_baseAttrs == null)
_baseAttrs = new Dictionary();
_baseAttrs.Clear();
if (_equip == null) return;
var attrsArr = _equip.Attribute1.Split(GameDefine.SplitSemicolon, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < attrsArr.Length; i++)
{
string[] attrs = attrsArr[i].Split(GameDefine.SplitUnderline, StringSplitOptions.RemoveEmptyEntries);
if (attrs.Length == 2)
{
int iType = int.Parse(attrs[0]);
int baseAttr = int.Parse(attrs[1]);
if (_baseAttrs.ContainsKey(iType))
continue;
_baseAttrs.Add(iType, (ulong)baseAttr);
}
}
//将属性缓存起来,下次使用的时候不会再次GC
EquipBaseAttDic[_equip.Id] = _baseAttrs;
}
if (EquipSpecialAttDic == null)
{
EquipSpecialAttDic = new Dictionary>(512);
}
if (EquipSpecialAttDic.ContainsKey(_equip.Id))
{
_specialAttrs = EquipSpecialAttDic[_equip.Id];
}
else
{
if (_specialAttrs == null)
_specialAttrs = new Dictionary();
_specialAttrs.Clear();
var attrsArr = _equip.Attribute2.Split(GameDefine.SplitSemicolon, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < attrsArr.Length; i++)
{
string[] attrs = attrsArr[i].Split(GameDefine.SplitUnderline, StringSplitOptions.RemoveEmptyEntries);
if (attrs.Length == 2)
{
int iType = int.Parse(attrs[0]);
int baseAttr = int.Parse(attrs[1]);
if (_specialAttrs.ContainsKey(iType))
continue;
_specialAttrs.Add(iType, (ulong)baseAttr);
}
}
//将属性缓存起来,下次使用的时候不会再次GC
EquipSpecialAttDic[_equip.Id] = _specialAttrs;
}
if (EquipGodAttDic == null)
{
EquipGodAttDic = new Dictionary>(512);
}
if (EquipGodAttDic.ContainsKey(_equip.Id))
{
_godAttrs = EquipGodAttDic[_equip.Id];
}
else
{
if (_godAttrs == null)
_godAttrs = new Dictionary();
_godAttrs.Clear();
var attrsArr = _equip.Attribute3.Split(GameDefine.SplitSemicolon, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < attrsArr.Length; i++)
{
string[] attrs = attrsArr[i].Split(GameDefine.SplitUnderline, StringSplitOptions.RemoveEmptyEntries);
if (attrs.Length == 2)
{
int iType = int.Parse(attrs[0]);
int baseAttr = int.Parse(attrs[1]);
if (_godAttrs.ContainsKey(iType))
continue;
_godAttrs.Add(iType, (ulong)baseAttr);
}
}
//将属性缓存起来,下次使用的时候不会再次GC
EquipGodAttDic[_equip.Id] = _godAttrs;
}
_power = FightPowerHelper.GetPropetryPower(_baseAttrs) + FightPowerHelper.GetPropetryPower(_specialAttrs) + FightPowerHelper.GetPropetryPower(_godAttrs);
}
#endregion
#region //辅助方法 此为静态方法
//装备职业名字
public static string GetOccNameWithOcc( string gender)
{
if (!string.IsNullOrEmpty(gender))
{
string rest = null;
var arr = gender.Split('_');
for(int i = 0; i < arr.Length; i++)
{
//如果在配置文件中找到,那么就返回名字,如果找不到,返回通用
var cfg = DeclarePlayerOccupation.Get(int.Parse(arr[i]));
if (cfg != null)
{
if (string.IsNullOrEmpty(rest))
rest = cfg.JobName;
else
rest = string.Format("{0},{1}", rest, cfg.JobName);
}
else
{
return DeclareMessageString.Get(DeclareMessageString.C_ITEM_OCC_NAME_COMMON);
}
}
return rest;
}
return DeclareMessageString.Get(DeclareMessageString.C_ITEM_OCC_NAME_COMMON);
}
///
/// 阶数转换,输入等阶
///
///
///
public static string LevelConvert(int level)
{
string str = "";
switch(level)
{
case 1:
case 2:
case 3:
case 4:
str = DeclareMessageString.Get(DeclareMessageString.C_GUILD_SORT_LEVEL_1 + level - 1);
break;
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
str = DeclareMessageString.Get(DeclareMessageString.C_GUILD_SORT_LEVEL_5 + level - 5);
break;
}
return str;
}
#endregion
}
}