361 lines
6.8 KiB
C#
361 lines
6.8 KiB
C#
// ***********************************************************************
|
|
// 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
|
|
}
|
|
}
|