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