// ***********************************************************************
// Assembly : Game
// Author : Kimch
// Created : 2021-04-12
// Description :
// Last Modified By :
// Last Modified On :
// ***********************************************************************
//
//
// ***********************************************************************
using System.Collections;
using System.Collections.Generic;
using CodeStage.AntiCheat.ObscuredTypes;
namespace G
{
///
/// 红颜
///
public class BeautyProxy : F.GameProxy
{
///
///
///
public class BeautyInfo
{
///
///
///
public readonly ItemBeauty item;
private readonly ItemBeautySkin[] _skins;
private readonly ItemBeautySkill[] _skills;
///
///
///
public int id => item.id;
///
///
///
private ObscuredInt _friend = -1;
///
/// 友好度(不能超过256)
///
public int friend
{
get { return _friend; }
set { _friend = value; }
}
///
///
///
public int friendMax => item.friendMax;
private ObscuredInt _level;
///
/// intimacy 亲密度
///
public int level
{
get => _level;
set
{
if (value > _level)
{
_level = value;
for (int i = 0; i < _skills.Length; i++)
{
var skill = _skills[i];
if (skill.unlock[1] <= value && skill.grade == 0)
{
skill.grade = 1;
}
}
}
}
}
private ObscuredInt _exp;
///
/// 经验
///
public int exp
{
get { return _exp; }
set { _exp = value; }
}
private ObscuredInt _skinId;
///
///
///
public int skinId
{
get => _skinId;
set => _skinId = value;
}
///
///
///
public ItemBeautySkin skinItem
{
get
{
if (skinId == 0)
{
return _skins[0];
}
return ItemProxy.Instance.GetStaticItem(skinId);
}
}
///
///
///
public ItemBeautySkin[] skins => _skins;
///
///
///
public ItemBeautySkill[] skills => _skills;
public readonly BeautySkinInfo[] skinInfos;
///
///
///
public int hasSkinCount
{
get
{
int result = 1;
for (int i = 1; i < _skins.Length; i++)
{
if (_skins[i].isHave)
result++;
}
return result;
}
}
///
///
///
public int maxSkinCount
{
get => _skins.Length;
}
///
///
///
public bool isUnlock
{
get
{
if (this.friend >= 0)
{
return true;
}
else
{
var mission = MissionProxy.Instance.GetMission(item.gainWay);
if (mission != null && mission.isCompleted)
{
this.friend = 0;
return true;
}
return false;
}
}
}
///
/// 已结交
///
public bool isFriend
{
get
{
if (this.isUnlock)
{
return this.friend >= this.friendMax;
}
return false;
}
}
///
///
///
public string gainWayText
{
get
{
var mission = MissionProxy.Instance.GetMission(item.gainWay);
if (mission != null)
{
return mission.description;
}
return "";
}
}
private int _businessFactor;
///
/// 产业加成
///
public int businessFactor
{
get { return _businessFactor; }
}
///
///
///
///
public bool AddFriend(int value)
{
if (this.isUnlock)
{
this.friend += value;
return this.isFriend;
}
return false;
}
public void UpdateAttributes()
{
if (isUnlock)
{
int result = 0;
var results = F.ListPool.Get();
this.GetAttributes2(results);
for (int i = 0; i < results.Count; i++)
{
result += results[i].value;
}
F.ListPool.Release(results);
_businessFactor = result;
}
else
_businessFactor = 0;
}
public BeautyInfo(ItemBeauty item)
{
this.item = item;
var idList = item.skills;
_skills = new ItemBeautySkill[idList.Length];
for (int i = 0; i < idList.Length; i++)
{
_skills[i] = ItemProxy.Instance.GetStaticItem(idList[i]);
}
idList = item.skins;
skinInfos = new BeautySkinInfo[idList.Length];
_skins = new ItemBeautySkin[idList.Length];
for (int i = 0; i < idList.Length; i++)
{
_skins[i] = ItemProxy.Instance.GetStaticItem(idList[i]);
skinInfos[i] = new BeautySkinInfo(ItemProxy.Instance.GetStaticItem(idList[i]));
skinInfos[i].beauty = this;
}
skinInfos[0].isHave = true;
//第一个解锁
_skins[0].isHave = true;
}
///
///
///
///
public void BuySkin(ItemBeautySkin skin)
{
skin.isHave = true;
}
///
///
///
///
public void SetSkin(ItemBeautySkin skin)
{
this.skinId = skin.id;
}
public bool IsSetSkin(ItemBeautySkin skin)
{
if (this.skinId == 0)
return skin.id == _skins[0].id;
else
return this.skinId == skin.id;
}
public void GetAttributes(List results)
{
for (int i = 0; i < _skills.Length; i++)
{
if (_skills[i].grade > 0)
{
_skills[i].GetAttributes(results);
}
}
}
///
/// 获得产业加成属性
///
///
public void GetAttributes2(List results)
{
for (int i = 0; i < _skills.Length; i++)
{
if (_skills[i].grade > 0)
{
_skills[i].GetAttributes(results, (int)CombatAttributeId.产业加成百分比);
}
}
}
///
///
///
///
///
///
public int LoadData_v1(List data, int offset)
{
this.friend = data.SafeGet(offset++);
this.level = data.SafeGet(offset++);
this.exp = data.SafeGet(offset++);
this.skinId = data.SafeGet(offset++);
int i = 0;
int skinL = data.SafeGet(offset++);
for (i = 0; i < _skins.Length; i++)
{
if (i < skinL)
_skins[i].isHave = data.SafeGet(offset++) != 0;
else
_skins[i].isHave = false;
}
for (; i < skinL; i++)
{
data.SafeGet(offset++);
}
int skillL = data.SafeGet(offset++);
for (i = 0; i < _skills.Length; i++)
{
if (i < skillL)
_skills[i].grade = data.SafeGet(offset++);
else
_skills[i].grade = 0;
}
for (; i < skillL; i++)
{
data.SafeGet(offset++);
}
return offset;
}
public int LoadData(List data, int offset)
{
this.friend = data.SafeGet(offset++);
this.level = data.SafeGet(offset++);
this.exp = data.SafeGet(offset++);
this.skinId = data.SafeGet(offset++);
int i = 0;
int skinL = data.SafeGet(offset++);
for (i = 0; i < _skins.Length; i++)
{
if (i < skinL)
_skins[i].isHave = data.SafeGet(offset++) != 0;
else
_skins[i].isHave = false;
}
for (; i < skinL; i++)
{
data.SafeGet(offset++);
}
int skillL = data.SafeGet(offset++);
for (i = 0; i < _skills.Length; i++)
{
if (i < skillL)
_skills[i].grade = data.SafeGet(offset++);
else
_skills[i].grade = 0;
}
for (; i < skillL; i++)
{
data.SafeGet(offset++);
}
//
if (this.friend > 0)
{
this.friend = this.friendMax;
}
else
{
this.friend = -1;
}
return offset;
}
public void SaveData(List data)
{
data.Add(this.friend);
data.Add(this.level);
data.Add(this.exp);
data.Add(this.skinId);
data.Add(_skins.Length);
for (int i = 0; i < _skins.Length; i++)
{
data.Add(_skins[i].isHave ? 1 : 0);
}
data.Add(_skills.Length);
for (int i = 0; i < _skills.Length; i++)
{
data.Add(_skills[i].grade);
}
}
}
///
///
///
public class BeautySkinInfo
{
public readonly ItemBeautySkin item;
public int id => item.id;
///
///
///
public bool isHave
{
get;
set;
}
public BeautyInfo beauty;
public BeautySkinInfo(ItemBeautySkin skinItem)
{
item = skinItem;
}
}
#region Field
private BeautyInfo[] _beauties;
///
///
///
private readonly List _friendBeauties = new List();
///
///
///
private readonly List _strangerBeauties = new List();
///
/// 红颜问候
///
private List _gifts1;
///
/// 赏赐红颜
///
private List _gifts2;
#endregion
#region Property
///
/// 好友红颜
///
public IReadOnlyList friends
{
get => _friendBeauties;
}
///
/// 陌生红颜
///
public IReadOnlyList strangers
{
get => _strangerBeauties;
}
#endregion
#region Method
public BeautyInfo[] GetBeauties()
{
return _beauties;
}
public BeautyInfo GetBeauty(int id)
{
BeautyInfo result = null;
if (id > 0 && id <= _beauties.Length)
{
result = _beauties[id - 1];
return result;
}
return null;
}
///
/// 红颜问候
///
///
public List GetGifts1()
{
if (_gifts1 == null)
InitGifts();
return _gifts1;
}
///
/// 赏赐红颜
///
///
public List GetGifts2()
{
if (_gifts2 == null)
{
InitGifts();
}
return _gifts2;
}
private void InitGifts()
{
_gifts1 = new List();
_gifts2 = new List();
var gifts = ItemProxy.Instance.GetStaticItems();
for (int i = 0; i < gifts.Count; i++)
{
if (gifts[i].type == 8)
{
_gifts1.Add(ItemProxy.Instance.GetProp(gifts[i].id));
}
else if (gifts[i].type == 9)
{
_gifts2.Add(ItemProxy.Instance.GetProp(gifts[i].id));
}
}
}
public bool UpgradeBeautySkill(BeautyInfo beauty, ItemBeautySkill skill)
{
var cost = skill.upgradeCost.count;
if (skill.grade < skill.maxGrade && beauty.exp >= cost)
{
beauty.exp -= cost;
skill.grade++;
SaveBeauties();
UpdateAttributes(true);
MissionProxy.Instance.OnEvent(MissionProxy.红颜技能累计提升X次);
MissionProxy.Instance.OnEvent2(MissionProxy.指定红颜的X技能达到X级, skill.grade, beauty.id, skill.id);
PostNotification(GlobalDefine.EVENT_BEAUTY_GIFT);
return true;
}
else
{
return false;
}
}
public bool BuySkin(BeautyInfo beauty, ItemBeautySkin skin)
{
beauty.BuySkin(skin);
SaveBeauties();
UpdateAttributes(true);
return true;
}
public bool SetSkin(BeautyInfo beauty, ItemBeautySkin skin)
{
beauty.SetSkin(skin);
SaveBeauties();
return true;
}
public bool GiveGift(BeautyInfo beauty, int[] giftInfo)
{
for (int i = 0; i < giftInfo.Length; i++)
{
if (giftInfo[i] == Item.Id.kBeautyLevel)
{
i++;
beauty.level += giftInfo[i];
}
else if (giftInfo[i] == Item.Id.kBeautyExp)
{
i++;
beauty.exp += giftInfo[i];
}
}
MissionProxy.Instance.OnEvent2(MissionProxy.指定红颜亲密度达到X, beauty.level, beauty.id);
SaveBeauties();
if (giftInfo.Length == 2)
MissionProxy.Instance.OnEvent(MissionProxy.红颜送礼X次);
else
MissionProxy.Instance.OnEvent(MissionProxy.红颜问候X次);
PostNotification(GlobalDefine.EVENT_BEAUTY_GIFT);
return true;
}
///
///
///
///
///
///
public bool AddFriend(BeautyInfo beauty, int friend)
{
if (friend > 0 && beauty != null)
{
var active = beauty.AddFriend(friend);
MissionProxy.Instance.OnEvent(MissionProxy.指定红颜遇见X次, friend, beauty.id);
SaveBeauties();
return active;
}
return false;
}
public void UpdateAttributes(bool sendNotification)
{
var results = F.ListPool.Get();
for (int i = 0; i < _beauties.Length; i++)
{
if (_beauties[i].isUnlock)
{
_beauties[i].UpdateAttributes();
_beauties[i].GetAttributes(results);
}
}
PlayerProxy.Instance.UpdateBeautyCombatValue(results, sendNotification);
F.ListPool.Release(results);
}
private const string BEAUTIES_KEY_V1 = "beauties_v1";
///
///
///
private void LoadBeauties()
{
var beautyItems = ItemProxy.Instance.GetStaticItems();
_beauties = new BeautyInfo[beautyItems.Count];
for (int i = 0; i < _beauties.Length; i++)
{
_beauties[i] = new BeautyInfo(beautyItems[i]);
}
// 修改
var dataList = ArchiveProxy.Instance.GetIntList(BEAUTIES_KEY_V1);
if (dataList != null && dataList.Count > 0)
{
int offset = 0;
for (int i = 0; i < _beauties.Length; i++)
{
offset = _beauties[i].LoadData_v1(dataList, offset);
if (offset >= dataList.Count)
{
break;
}
}
}
UpdateAttributes(false);
}
///
///
///
public void SaveBeauties()
{
var dataList = ArchiveProxy.Instance.GetIntList(BEAUTIES_KEY_V1);
if (dataList != null)
{
dataList.Clear();
for (int i = 0; i < _beauties.Length; i++)
{
_beauties[i].SaveData(dataList);
}
ArchiveProxy.Instance.SetIntList(BEAUTIES_KEY_V1, dataList);
}
}
#endregion
#region Proxy
public static BeautyProxy Instance => GetInstance();
public override void ReadArchive()
{
LoadBeauties();
}
#endregion
}
}