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

358 lines
9.9 KiB
C#

// ***********************************************************************
// Assembly : Game
// Author : Kimch
// Created : 2022-02-24
// Description :
// Last Modified By :
// Last Modified On :
// ***********************************************************************
// <copyright file= "SkinProxy" company="Kunpo"></copyright>
// <summary></summary>
// ***********************************************************************
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace G
{
/// <summary>
/// 皮肤管理
/// </summary>
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;
}
/// <summary>
/// 属性
/// </summary>
public CombatAttribute attribute;
/// <summary>
///
/// </summary>
private int _combatValue;
/// <summary>
///
/// </summary>
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;
}
}
/// <summary>
///
/// </summary>
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;
}
}
/// <summary>
/// 排序规则
/// </summary>
public int sortOrder => item.id;
/// <summary>
///
/// </summary>
public bool isUnlock
{
get { return true; }
}
public bool isDefault
{
get { return id == 2000; }
}
/// <summary>
///
/// </summary>
/// <param name="kind"></param>
/// <returns></returns>
public bool Active(int kind)
{
if (kind >= 0)
{
int status = this.saveState;
status |= (1 << kind);
this.saveState = status;
}
else
{
this.saveState = 15;
}
return true;
}
/// <summary>
///
/// </summary>
/// <param name="weapon"></param>
/// <returns></returns>
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<int, ChaSkinInfo> _chaSkinInfos = new Dictionary<int, ChaSkinInfo>(4);
private readonly int[] _current = new int[4];
#endregion
#region Property
/// <summary>
///
/// </summary>
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();
}
}
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public ChaSkinInfo GetChaSkinInfo(int id)
{
if (id == 0)
id = 2000;
_chaSkinInfos.TryGetValue(id, out var result);
return result;
}
public IReadOnlyCollection<ChaSkinInfo> 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<ItemChaSkin>();
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<ChaSkinProxy>();
public override int priority => 901;
public override void ReadArchive()
{
InitChaSkin();
LoadChaSkin();
}
#endregion
}
}