361 lines
6.8 KiB
C#
Raw Normal View History

2025-05-18 01:04:31 +08:00
// ***********************************************************************
// Assembly : Game
// Author : Kimch
// Created : 2021-06-05
// Description :
// Last Modified By :
// Last Modified On :
// ***********************************************************************
// <copyright file= "CityProxy" company="Kunpo"></copyright>
// <summary></summary>
// ***********************************************************************
using System.Collections;
using System.Collections.Generic;
using CodeStage.AntiCheat.ObscuredTypes;
using UnityEngine;
namespace G
{
/// <summary>
///
/// </summary>
public class CityProxy : F.GameProxy
{
public class CityInfo
{
public readonly ItemCity item;
public int id => item.id;
/// <summary>
/// 繁荣度
/// </summary>
public int prosperity;
public readonly List<int> guildList = new List<int>();
private bool _isUnlock = false;
public bool isUnlock
{
get
{
if (_isUnlock)
{
return true;
}
if (item.unlock > 0)
{
var mission = MissionProxy.Instance.GetMission(item.unlock);
if (mission != null && mission.isCompleted)
{
return true;
}
return false;
}
return true;
}
}
private string _unlockText;
public string unlockText
{
get
{
if (!string.IsNullOrEmpty(_unlockText))
return _unlockText;
if (item.unlock > 0)
{
var mission = MissionProxy.Instance.GetMission(item.unlock);
if (mission != null)
{
_unlockText = mission.description + "解锁";
}
}
return _unlockText;
}
}
private int _beautyId = -1;
/// <summary>
///
/// </summary>
public int beautyId
{
get
{
if (_beautyId < 0 && item.events != null)
{
for (int i = 0, c = item.events.Length; i < c; i += 2)
{
int ceId = item.events[i];
var ce = ItemProxy.Instance.GetStaticItem<ItemCityEvent>(ceId);
if (ce != null && ce.type == 1)
{
_beautyId = ce.typeArgs[0];
return _beautyId;
}
}
}
return _beautyId;
}
}
/// <summary>
/// 游历次数
/// </summary>
public int travelCount
{
get;
set;
}
/// <summary>
/// 城主
/// </summary>
public bool isCastellan
{
get;
set;
}
public ItemCityEvent currCityEvent
{
get;
private set;
}
public void Travel(bool first)
{
travelCount += 1;
currCityEvent = null;
if (first)
{
currCityEvent = ItemProxy.Instance.GetStaticItem<ItemCityEvent>(item.events[0]);
}
else
{
int i = 0;
L_RND:
i++;
int rndId = GlobalUtils.GetRandom(item.events);
var cityEvent = ItemProxy.Instance.GetStaticItem<ItemCityEvent>(rndId);
if (cityEvent != null && cityEvent.isValid)
currCityEvent = cityEvent;
else if (i < 100)
goto L_RND;
else
{
}
}
}
public void Reset()
{
travelCount = 0;
_isUnlock = false;
}
public bool CheckNew()
{
if (!_isUnlock && item.unlock > 0)
{
var mission = MissionProxy.Instance.GetMission(item.unlock);
if (mission != null && mission.isCompleted)
{
_isUnlock = true;
return true;
}
}
else
{
_isUnlock = true;
}
return false;
}
public CityInfo(ItemCity itemCity)
{
item = itemCity;
}
}
#region Field
private readonly Dictionary<int, CityInfo> _allCityDict = new Dictionary<int, CityInfo>();
private ObscuredInt _lastCityId = 1;
#endregion
#region Property
/// <summary>
///
/// </summary>
public int travelCount
{
get { return PlayerProxy.Instance.motility; }
}
/// <summary>
///
/// </summary>
public int travelCountMax
{
get { return PlayerProxy.Instance.motilityMax; }
}
/// <summary>
///
/// </summary>
public string recoverTimeText
{
get { return PlayerProxy.Instance.motilityRecoverTime; }
}
/// <summary>
///
/// </summary>
public CityInfo lastTravelCity
{
get
{
if (_allCityDict.TryGetValue(_lastCityId, out var result))
{
return result;
}
return _allCityDict[1];
}
}
#endregion
#region Method
/// <summary>
///
/// </summary>
/// <returns></returns>
public IReadOnlyCollection<CityInfo> GetAllCities()
{
return _allCityDict.Values;
}
public CityInfo RandomTravel()
{
PlayerProxy.Instance.UseMotilityForTravel();
bool isNew = true;
CityInfo newCity = null;
foreach (var item in _allCityDict)
{
if (item.Value.CheckNew())
{
newCity = item.Value;
}
}
if (newCity == null)
{
int lastCity = _lastCityId;
var list = F.ListPool<CityInfo>.Get();
foreach (var cityInfo in _allCityDict.Values)
{
if (cityInfo.id != lastCity && cityInfo.isUnlock)
{
list.Add(cityInfo);
}
}
newCity = list.Count > 0 ? list[Random.Range(0, list.Count)] : _allCityDict[1];
F.ListPool<CityInfo>.Release(list);
isNew = false;
}
_lastCityId = newCity.id;
newCity.Travel(isNew);
SaveCity();
MissionProxy.Instance.OnEvent(MissionProxy.);
#if UNITY_EDITOR
Debug.Log(StringLoggingExtensions.Colored($"游历{newCity.item.name}", Color.yellow));
#endif
return newCity;
}
public int GetRedPoint()
{
return this.travelCount;
}
private const string ARCHIVE_KEY_V1 = "city_v1";
private void LoadCity()
{
foreach (var item in _allCityDict)
{
item.Value.Reset();
}
var dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V1);
if (dataList != null && dataList.Count > 0)
{
_lastCityId = dataList.SafeGet(0);
//for (int i = 1, c = dataList.Count; i < c; i++)
//{
// GlobalUtils.SplitNumber824(dataList[i], out int id, out int count);
// if (_allCityDict.TryGetValue(id, out var cityInfo))
// {
// cityInfo.travelCount = count;
// }
//}
}
foreach (var item in _allCityDict)
{
item.Value.CheckNew();
}
}
private void SaveCity()
{
var dataList = ArchiveProxy.Instance.GetIntList(ARCHIVE_KEY_V1);
if (dataList != null)
{
dataList.Clear();
dataList.Add(_lastCityId);
//foreach (var cityInfo in _allCityDict.Values)
//{
// dataList.Add(GlobalUtils.CombineNumber824(cityInfo.id, cityInfo.travelCount));
//}
ArchiveProxy.Instance.SetIntList(ARCHIVE_KEY_V1, dataList);
}
}
#endregion
#region Proxy
public static CityProxy Instance => GetInstance<CityProxy>();
public override void LoadCompleted()
{
var cityItems = ItemProxy.Instance.GetStaticItems<ItemCity>();
if (cityItems != null)
{
for (int i = 0; i < cityItems.Count; i++)
{
_allCityDict.Add(cityItems[i].id, new CityInfo(cityItems[i]));
}
}
}
public override void ReadArchive()
{
LoadCity();
}
#endregion
}
}