// *********************************************************************** // Assembly : Game // Author : Kimch // Created : 2021-06-05 // Description : // Last Modified By : // Last Modified On : // *********************************************************************** // // // *********************************************************************** using System.Collections; using System.Collections.Generic; using CodeStage.AntiCheat.ObscuredTypes; using UnityEngine; namespace G { /// /// /// public class CityProxy : F.GameProxy { public class CityInfo { public readonly ItemCity item; public int id => item.id; /// /// 繁荣度 /// public int prosperity; public readonly List guildList = new List(); 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; /// /// /// 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(ceId); if (ce != null && ce.type == 1) { _beautyId = ce.typeArgs[0]; return _beautyId; } } } return _beautyId; } } /// /// 游历次数 /// public int travelCount { get; set; } /// /// 城主 /// 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(item.events[0]); } else { int i = 0; L_RND: i++; int rndId = GlobalUtils.GetRandom(item.events); var cityEvent = ItemProxy.Instance.GetStaticItem(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 _allCityDict = new Dictionary(); private ObscuredInt _lastCityId = 1; #endregion #region Property /// /// /// public int travelCount { get { return PlayerProxy.Instance.motility; } } /// /// /// public int travelCountMax { get { return PlayerProxy.Instance.motilityMax; } } /// /// /// public string recoverTimeText { get { return PlayerProxy.Instance.motilityRecoverTime; } } /// /// /// public CityInfo lastTravelCity { get { if (_allCityDict.TryGetValue(_lastCityId, out var result)) { return result; } return _allCityDict[1]; } } #endregion #region Method /// /// /// /// public IReadOnlyCollection 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.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.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(); public override void LoadCompleted() { var cityItems = ItemProxy.Instance.GetStaticItems(); 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 } }