// *********************************************************************** // Assembly : Game // Author : Kimch // Created : 2022-02-24 // Description : // Last Modified By : // Last Modified On : // *********************************************************************** // // // *********************************************************************** using System.Collections; using System.Collections.Generic; using UnityEngine; namespace G { /// /// 皮肤管理 /// public class ChaSkinProxy : F.GameProxy { public class ChaSkinInfo { public readonly ItemChaSkin item; public int id => item.id; public ChaSkinInfo(ItemChaSkin chaSkin) { item = chaSkin; } public int saveState { get; set; } /// /// 属性 /// public CombatAttribute attribute; /// /// /// private int _combatValue; /// /// /// public int combatValue { get { if (isUnlock && item.combatValue > 0) { int result = 0; int status = this.saveState; for (int i = 0; i < 4; i++) { if ((status & (1 << i)) != 0) { result += item.combatValue; } } return result; } return 0; } } /// /// /// public Item.ItemInfo buyPrice { get { Item.ItemInfo result = new Item.ItemInfo(); int status = this.saveState; for (int i = 0; i < 4; i++) { if ((status & (1 << i)) == 0) { if (i == 0) { var priceInfo = item.costumeBuyPriceInfo; result.id = priceInfo.id; result.count += priceInfo.count; } else { var priceInfo = item.weaponBuyPriceInfo; result.id = priceInfo.id; result.count += priceInfo.count; } } } return result; } } /// /// 排序规则 /// public int sortOrder => item.id; /// /// /// public bool isUnlock { get { return true; } } public bool isDefault { get { return id == 2000; } } /// /// /// /// /// public bool Active(int kind) { if (kind >= 0) { int status = this.saveState; status |= (1 << kind); this.saveState = status; } else { this.saveState = 15; } return true; } /// /// /// /// /// public bool IsActive(int weapon) { if (isUnlock) { if (item.price != null && item.price.Length != 0) { if (weapon >= 0) { int status = this.saveState; return (status & (1 << weapon)) != 0; } else { int status = this.saveState; return status == 15; } } return true; } return false; } } #region Field readonly Dictionary _chaSkinInfos = new Dictionary(4); private readonly int[] _current = new int[4]; #endregion #region Property /// /// /// public int combatValue { get { int result = 0; foreach (var item in _chaSkinInfos.Values) { result += item.combatValue; } return result; } } #endregion #region Method public ChaSkinInfo GetCurrentSkin(int kind) { if (kind >= 0) return GetChaSkinInfo(_current[kind]); return null; } public void SetCurrentSkin(int id, int kind) { if (kind >= 0 && _current[kind] != id) { _current[kind] = id; SaveChaSkin(); } } /// /// /// /// /// public ChaSkinInfo GetChaSkinInfo(int id) { if (id == 0) id = 2000; _chaSkinInfos.TryGetValue(id, out var result); return result; } public IReadOnlyCollection GetChaSkinInfos() { return _chaSkinInfos.Values; } public void BuyChaSkin(ChaSkinInfo chaSkinInfo, int kind, Callback2 callback) { Item.ItemInfo priceInfo = default; if (kind == 0) { priceInfo = chaSkinInfo.item.costumePriceInfo; } else if (kind > 0) { priceInfo = chaSkinInfo.item.weaponPriceInfo; } else { priceInfo = chaSkinInfo.buyPrice; } var result = MoneyProxy.Instance.CheckAndCostMoney(priceInfo); if (result) { chaSkinInfo.Active(kind); SaveChaSkin(); PlayerProxy.Instance.UpdateGrowthCombatValue(true); callback?.Invoke(0, ""); } else { var moneyName = priceInfo.propItem.name; //callback?.Invoke(1, moneyName + "不足"); callback?.Invoke(1, moneyName); } } private void InitChaSkin() { _chaSkinInfos.Clear(); var chaSkins = ItemProxy.Instance.GetStaticItems(); for (int i = 0; i < chaSkins.Count; i++) { var chaSkin = chaSkins[i]; _chaSkinInfos.Add(chaSkin.id, new ChaSkinInfo(chaSkin)); } } private const string ARCHIVE_KEY_V1 = "cha_skins_v1"; private void LoadChaSkin() { var dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V1); if (dataList != null && dataList.Count > 0) { _current[0] = dataList[0]; _current[1] = dataList[1]; _current[2] = dataList[2]; _current[3] = dataList[3]; int skinInfoCount = dataList[4]; for (int i = 0; i < skinInfoCount; i++) { int id = dataList[i + i + 5]; int status = dataList[i + i + 6]; _chaSkinInfos.TryGetValue(id, out var result); result.saveState = status; } } else { bool save = false; foreach (var item in _chaSkinInfos) { int status = ArchiveProxy.Instance.GetInt(item.Key); if (status > 0) { item.Value.saveState = 1; save = true; } } if (save) { SaveChaSkin(); } } } private void SaveChaSkin() { var dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V1); if (dataList != null) { dataList.Clear(); dataList.Add(_current[0]); dataList.Add(_current[1]); dataList.Add(_current[2]); dataList.Add(_current[3]); dataList.Add(_chaSkinInfos.Count); foreach (var item in _chaSkinInfos) { dataList.Add(item.Key); dataList.Add(item.Value.saveState); } ArchiveProxy.Instance.SetIntList(ARCHIVE_KEY_V1, dataList); } } #endregion #region Unity && Proxy public static ChaSkinProxy Instance => GetInstance(); public override int priority => 901; public override void ReadArchive() { InitChaSkin(); LoadChaSkin(); } #endregion } }