2025-05-18 01:04:31 +08:00

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