725 lines
14 KiB
C#
725 lines
14 KiB
C#
// ***********************************************************************
|
|
// Assembly : Game
|
|
// Author : Kimch
|
|
// Created : 2021-04-12
|
|
// Description :
|
|
// Last Modified By :
|
|
// Last Modified On :
|
|
// ***********************************************************************
|
|
// <copyright file= "BeautyProxy" company="Kunpo"></copyright>
|
|
// <summary></summary>
|
|
// ***********************************************************************
|
|
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using CodeStage.AntiCheat.ObscuredTypes;
|
|
|
|
namespace G
|
|
{
|
|
/// <summary>
|
|
/// 红颜
|
|
/// </summary>
|
|
public class BeautyProxy : F.GameProxy
|
|
{
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public class BeautyInfo
|
|
{
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public readonly ItemBeauty item;
|
|
|
|
private readonly ItemBeautySkin[] _skins;
|
|
private readonly ItemBeautySkill[] _skills;
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public int id => item.id;
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
private ObscuredInt _friend = -1;
|
|
/// <summary>
|
|
/// 友好度(不能超过256)
|
|
/// </summary>
|
|
public int friend
|
|
{
|
|
get { return _friend; }
|
|
set { _friend = value; }
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public int friendMax => item.friendMax;
|
|
|
|
private ObscuredInt _level;
|
|
/// <summary>
|
|
/// intimacy 亲密度
|
|
/// </summary>
|
|
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;
|
|
/// <summary>
|
|
/// 经验
|
|
/// </summary>
|
|
public int exp
|
|
{
|
|
get { return _exp; }
|
|
set { _exp = value; }
|
|
}
|
|
|
|
private ObscuredInt _skinId;
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public int skinId
|
|
{
|
|
get => _skinId;
|
|
set => _skinId = value;
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public ItemBeautySkin skinItem
|
|
{
|
|
get
|
|
{
|
|
if (skinId == 0)
|
|
{
|
|
return _skins[0];
|
|
}
|
|
return ItemProxy.Instance.GetStaticItem<ItemBeautySkin>(skinId);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public ItemBeautySkin[] skins => _skins;
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public ItemBeautySkill[] skills => _skills;
|
|
|
|
public readonly BeautySkinInfo[] skinInfos;
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public int hasSkinCount
|
|
{
|
|
get
|
|
{
|
|
int result = 1;
|
|
for (int i = 1; i < _skins.Length; i++)
|
|
{
|
|
if (_skins[i].isHave)
|
|
result++;
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public int maxSkinCount
|
|
{
|
|
get => _skins.Length;
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 已结交
|
|
/// </summary>
|
|
public bool isFriend
|
|
{
|
|
get
|
|
{
|
|
if (this.isUnlock)
|
|
{
|
|
return this.friend >= this.friendMax;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public string gainWayText
|
|
{
|
|
get
|
|
{
|
|
var mission = MissionProxy.Instance.GetMission(item.gainWay);
|
|
if (mission != null)
|
|
{
|
|
return mission.description;
|
|
}
|
|
return "";
|
|
}
|
|
}
|
|
|
|
private int _businessFactor;
|
|
/// <summary>
|
|
/// 产业加成
|
|
/// </summary>
|
|
public int businessFactor
|
|
{
|
|
get { return _businessFactor; }
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="value"></param>
|
|
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<CombatAttribute>.Get();
|
|
this.GetAttributes2(results);
|
|
for (int i = 0; i < results.Count; i++)
|
|
{
|
|
result += results[i].value;
|
|
}
|
|
F.ListPool<CombatAttribute>.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<ItemBeautySkill>(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<ItemBeautySkin>(idList[i]);
|
|
skinInfos[i] = new BeautySkinInfo(ItemProxy.Instance.GetStaticItem<ItemBeautySkin>(idList[i]));
|
|
skinInfos[i].beauty = this;
|
|
}
|
|
skinInfos[0].isHave = true;
|
|
//第一个解锁
|
|
_skins[0].isHave = true;
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="skin"></param>
|
|
public void BuySkin(ItemBeautySkin skin)
|
|
{
|
|
skin.isHave = true;
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="skin"></param>
|
|
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<CombatAttribute> results)
|
|
{
|
|
for (int i = 0; i < _skills.Length; i++)
|
|
{
|
|
if (_skills[i].grade > 0)
|
|
{
|
|
_skills[i].GetAttributes(results);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获得产业加成属性
|
|
/// </summary>
|
|
/// <param name="results"></param>
|
|
public void GetAttributes2(List<CombatAttribute> results)
|
|
{
|
|
for (int i = 0; i < _skills.Length; i++)
|
|
{
|
|
if (_skills[i].grade > 0)
|
|
{
|
|
_skills[i].GetAttributes(results, (int)CombatAttributeId.产业加成百分比);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="data"></param>
|
|
/// <param name="offset"></param>
|
|
/// <returns></returns>
|
|
public int LoadData_v1(List<ObscuredInt> 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<ObscuredInt> 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<ObscuredInt> 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);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public class BeautySkinInfo
|
|
{
|
|
public readonly ItemBeautySkin item;
|
|
|
|
public int id => item.id;
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public bool isHave
|
|
{
|
|
get;
|
|
set;
|
|
}
|
|
|
|
public BeautyInfo beauty;
|
|
|
|
public BeautySkinInfo(ItemBeautySkin skinItem)
|
|
{
|
|
item = skinItem;
|
|
}
|
|
}
|
|
|
|
#region Field
|
|
|
|
private BeautyInfo[] _beauties;
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
private readonly List<BeautyInfo> _friendBeauties = new List<BeautyInfo>();
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
private readonly List<BeautyInfo> _strangerBeauties = new List<BeautyInfo>();
|
|
|
|
/// <summary>
|
|
/// 红颜问候
|
|
/// </summary>
|
|
private List<EntityItemProp> _gifts1;
|
|
/// <summary>
|
|
/// 赏赐红颜
|
|
/// </summary>
|
|
private List<EntityItemProp> _gifts2;
|
|
|
|
#endregion
|
|
|
|
#region Property
|
|
|
|
/// <summary>
|
|
/// 好友红颜
|
|
/// </summary>
|
|
public IReadOnlyList<BeautyInfo> friends
|
|
{
|
|
get => _friendBeauties;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 陌生红颜
|
|
/// </summary>
|
|
public IReadOnlyList<BeautyInfo> 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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 红颜问候
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public List<EntityItemProp> GetGifts1()
|
|
{
|
|
if (_gifts1 == null)
|
|
InitGifts();
|
|
return _gifts1;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 赏赐红颜
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public List<EntityItemProp> GetGifts2()
|
|
{
|
|
if (_gifts2 == null)
|
|
{
|
|
InitGifts();
|
|
}
|
|
return _gifts2;
|
|
}
|
|
|
|
private void InitGifts()
|
|
{
|
|
_gifts1 = new List<EntityItemProp>();
|
|
_gifts2 = new List<EntityItemProp>();
|
|
|
|
var gifts = ItemProxy.Instance.GetStaticItems<ItemProp>();
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="beauty"></param>
|
|
/// <param name="friend"></param>
|
|
/// <returns></returns>
|
|
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<CombatAttribute>.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<CombatAttribute>.Release(results);
|
|
}
|
|
|
|
private const string BEAUTIES_KEY_V1 = "beauties_v1";
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
private void LoadBeauties()
|
|
{
|
|
var beautyItems = ItemProxy.Instance.GetStaticItems<ItemBeauty>();
|
|
_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);
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
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<BeautyProxy>();
|
|
|
|
public override void ReadArchive()
|
|
{
|
|
LoadBeauties();
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|