备份CatanBuilding瘦身独立工程

This commit is contained in:
JSD\13999
2026-05-26 16:15:54 +08:00
commit 2d0e6a61b7
12001 changed files with 2431925 additions and 0 deletions

View File

@@ -0,0 +1,763 @@
using asap.core;
using Castle.Core.Internal;
using cfg;
using GameCore;
using System;
using System.Collections;
using System.Collections.Generic;
using Unity.Mathematics;
using UnityEngine;
namespace game
{
public class EventWashingData
{
private const string LocalKeySetKey = "ewdlksk"; // EventWashingData LocalKeySetKey 首字母
public int EventID { get; set; }
public int WashingID { get; set; }
public int StageID { get; set; }
public int StageIndex { get; set; }
public int StageCount { get; set; }
public int StepID { get; set; }
public int StepIndex { get; set; }
public int StepCount { get; set; }
public List<float> StepItems { get; set; }
public int StepEnergyConsume { get; set; }
public float Percent { get; set; } // 数值范围0-1
public float OmitPercent { get; set; }
public float Energy { get; set; } // 数值范围0-1
public float EnergyConsumptionSpeed { get; set; }
public bool IsOver { get; set; }
public int Token { get; set; }
public int ConsumedToken { get; set; }
public bool IsAllGameOver { get; set; }
public EventWashingData()
{
EventID = -1;
WashingID = -1;
StageID = -1;
StepID = -1;
Percent = 0;
IsOver = false;
Token = 0;
StepItems = new List<float>();
IsAllGameOver = false;
Token = 0;
}
public void Clear()
{
ClearAllLocalData();
StepItems.Clear();
StepItems = null;
}
public void AddLocalDataKey(string group, string key)
{
LocalStepData stepData = null;
List<string> list = null;
if (PlayerPrefs.HasKey(LocalKeySetKey) == true)
{
string data = PlayerPrefs.GetString(LocalKeySetKey);
try
{
stepData = Newtonsoft.Json.JsonConvert.DeserializeObject<LocalStepData>(data);
}
catch (Exception e)
{
Debug.LogError(e.Message);
stepData = new LocalStepData();
}
if (stepData.LocalDatas.TryGetValue(group, out list))
{
list.Add(key);
}
else
{
list = new List<string>();
list.Add(key);
stepData.LocalDatas.Add(group, list);
}
PlayerPrefs.SetString(LocalKeySetKey, Newtonsoft.Json.JsonConvert.SerializeObject(stepData));
}
else
{
stepData = new LocalStepData();
list = new List<string>();
list.Add(key);
stepData.LocalDatas.Add(group, list);
PlayerPrefs.SetString(LocalKeySetKey, Newtonsoft.Json.JsonConvert.SerializeObject(stepData));
}
PlayerPrefs.Save();
}
public void ClearLocalDataExceptGroup(string group)
{
if (PlayerPrefs.HasKey(LocalKeySetKey) == false) return;
string data = PlayerPrefs.GetString(LocalKeySetKey);
LocalStepData stepData = null;
try
{
stepData = Newtonsoft.Json.JsonConvert.DeserializeObject<LocalStepData>(data);
}
catch (Exception e)
{
Debug.LogError(e.Message);
return;
}
int count = 0;
foreach (var item in stepData.LocalDatas)
{
if (string.IsNullOrEmpty(item.Key) == false && item.Key.Equals(group) == false)
{
var list = item.Value;
count = list.Count;
for (int i = 0; i < count; ++i)
{
if (PlayerPrefs.HasKey(list[i]) == true) PlayerPrefs.DeleteKey(list[i]);
}
}
}
PlayerPrefs.Save();
}
public void ClearAllLocalData()
{
if (PlayerPrefs.HasKey(LocalKeySetKey) == false) return;
string data = PlayerPrefs.GetString(LocalKeySetKey);
LocalStepData stepData = null;
try
{
stepData = Newtonsoft.Json.JsonConvert.DeserializeObject<LocalStepData>(data);
}
catch (Exception e)
{
Debug.LogError(e.Message);
return;
}
int count = 0;
foreach (var item in stepData.LocalDatas)
{
if (string.IsNullOrEmpty(item.Key) == false)
{
var list = item.Value;
count = list.Count;
for (int i = 0; i < count; ++i)
{
if (PlayerPrefs.HasKey(list[i]) == true) PlayerPrefs.DeleteKey(list[i]);
}
}
}
PlayerPrefs.Save();
}
}
public class LocalStepData
{
public Dictionary<string, List<string>> LocalDatas = new Dictionary<string, List<string>>();
}
public class EventWashingDataManager
{
private Tables m_Tables;
private TbEventWashing m_TbEventWashing;
private TbEventWashingStage m_TbEventWashingStage;
private TbEventWashingStep m_TbEventWashingStep;
private EventWashing m_EventWashing = null;
private EventWashingData m_WashingData = null;
#if UNITY_EDITOR
private bool m_IsCheckCondition = true;
private int m_DefaultToken = 0;
#else
private bool m_IsCheckCondition = true;
private int m_DefaultToken = 0;
#endif
public EventWashingData WashingData { get => m_WashingData; }
private UIType m_InfoPopupPanel = null;
public UIType GetCurrentInfoPopupPanel()
{
if (m_InfoPopupPanel == null)
{
var data = GetCurrentEventWashing();
m_InfoPopupPanel = new UIType(data.PanelID);
}
return m_InfoPopupPanel;
}
#region
/// <summary>
/// 初始化
/// </summary>
public bool Init()
{
m_Tables = GContext.container.Resolve<Tables>();
if (m_Tables == null) return false;
m_TbEventWashing = m_Tables.TbEventWashing;
m_TbEventWashingStage = m_Tables.TbEventWashingStage;
m_TbEventWashingStep = m_Tables.TbEventWashingStep;
return true;
}
public bool InitGameData()
{
if (m_WashingData == null) GetFreshEventStep();
GetCurrentEventStep();
return true;
}
public void ClearActData()
{
m_InfoPopupPanel = null;
}
public EventWashing GetCurrentEventWashing()
{
if (m_WashingData == null) return null;
EventWashing washing = m_TbEventWashing.GetOrDefault(m_WashingData.WashingID);
return washing;
}
public void ActivateEvent(FishingEvent fishingEvent)
{
if (fishingEvent == null) return;
if (!Init()) return;
if (m_WashingData == null) GetFreshEventStep();
else FixWashingData();
}
/// <summary>
/// 从服务器获取数据
/// </summary>
public void GetDataFromServer(string json)
{
if (json.IsNullOrEmpty())
{
GameDebug.LogError("EventWashing get data from server has encountered empty data.");
return;
}
try
{
m_WashingData = Newtonsoft.Json.JsonConvert.DeserializeObject<EventWashingData>(json);
}
catch (Exception e)
{
GameDebug.LogError("EventWashing deserialize data has failed. Exception: " + e.ToString());
return;
}
if (!Init()) return;
//FixWashingData();
}
public void SyncData()
{
PlayFabMgr.Instance.UpdateUserDataValue(EventWashingConfig.SAVE_DATA_KEY, Newtonsoft.Json.JsonConvert.SerializeObject(m_WashingData));
}
public string GetShipName()
{
if (m_WashingData == null) return "";
int stageID = m_WashingData.StageID;
EventWashingStage stage = m_TbEventWashingStage.GetOrDefault(stageID);
if (stage == null) return "";
return LocalizationMgr.GetText(stage.Name_l10n_key);
}
public TimeSpan RemainingTime
{
get => DateTime.Parse((m_Tables.TbFishingEvent[m_WashingData.EventID].TimeDefinition as LimitedTime).EndTime)
- ZZTimeHelper.UtcNow();
}
public int FixWashingData()
{
if (m_WashingData == null) return 0;
// 获取当前开放并符合解锁条件的洗游艇活动ID
FishingEventData fishingEventData = GContext.container.Resolve<FishingEventData>();
FishingEvent fishingEvent = fishingEventData.GetEventByTypeAndSubType(4, 4, m_IsCheckCondition);
if (fishingEvent == null) return ClearWashingData();
int eventID = fishingEvent.ID;
int washingID = fishingEvent.RedirectID;
if (washingID < 0) return ClearWashingData();
if (eventID != m_WashingData.EventID || washingID != m_WashingData.WashingID) return ClearWashingData();
return 0;
}
private int ClearWashingData()
{
if (m_WashingData == null) return 0;
m_WashingData.Clear();
m_WashingData = null;
return 0;
}
public void GoToStep(int stageID, int stepID)
{
// 获取当前开放并符合解锁条件的洗游艇活动ID
FishingEventData fishingEventData = GContext.container.Resolve<FishingEventData>();
FishingEvent fishingEvent = fishingEventData.GetEventByTypeAndSubType(4, 4, m_IsCheckCondition);
if (fishingEvent == null)
{
Debug.LogError("=== 找不到 洗游艇 对应的 type=4 & subType=4且符合条件的活动。");
return;
}
int eventID = fishingEvent.ID;
int washingID = fishingEvent.RedirectID;
if (washingID < 0)
{
Debug.LogError("=== 洗游艇ID出错活动ID为" + eventID + ", 洗游艇ID:" + washingID);
return;
}
// 获取当前洗游艇活动数据
EventWashing washing = m_TbEventWashing.GetOrDefault(washingID);
if (washing == null)
{
Debug.LogError("=== 洗游艇找不到游艇数据washingID:" + washingID);
return;
}
// 获取游艇数据
int stageCount = washing.StageList.Count;
if (stageCount == 0)
{
Debug.LogError("=== 洗游艇对应StageList出错washingID:" + washingID);
return;
}
int stageIndex = -1;
for (int i = 0; i < stageCount; i++)
{
if (washing.StageList[i] == stageID)
{
stageIndex = i;
break;
}
}
if (stageIndex < 0)
{
Debug.LogError("=== 洗游艇stageID找不到对应数据stageID:" + stageID);
return;
}
EventWashingStage stage = m_TbEventWashingStage.GetOrDefault(stageID);
if (stage == null)
{
Debug.LogError("=== 洗游艇stepID找不到对应数据stageID:" + stageID);
return;
}
// 获取步骤数据
int stepCount = stage.StepList.Count;
if (stepCount == 0)
{
Debug.LogError("=== 洗游艇StepList出错StageID:" + stageID);
return;
}
int stepIndex = 0;
for (int i = 0; i < stepCount; i++)
{
if (stage.StepList[i] == stepID)
{
stepIndex = i;
break;
}
}
if (stepIndex < 0)
{
Debug.LogError("=== 洗游艇stepID找不到对应数据stepID:" + stepID);
return;
}
EventWashingStep eventWashingStep = m_TbEventWashingStep.GetOrDefault(stepID);
int token = 0;
if (m_WashingData != null) token = m_WashingData.Token;
m_WashingData = new EventWashingData();
m_WashingData.EventID = eventID;
m_WashingData.WashingID = washingID;
m_WashingData.StageID = stageID;
m_WashingData.StageIndex = stageIndex;
m_WashingData.StageCount = stageCount;
m_WashingData.StepID = stepID;
m_WashingData.StepIndex = stepIndex;
m_WashingData.StepCount = stepCount;
m_WashingData.StepItems.Clear();
m_WashingData.StepEnergyConsume = eventWashingStep.EnergyConsume;
m_WashingData.Percent = 0f;
m_WashingData.OmitPercent = 0f;
m_WashingData.IsOver = false;
m_WashingData.Token = token;
// 同步数据
SyncData();
}
public void ResetRefreshData()
{
ClearWashingData();
//if (m_WashingData != null)
//{
// m_WashingData.Token = 0;
// m_WashingData.ClearAllLocalData();
//}
//GetFreshEventStep();
}
public bool IsCurrentStepID(int stepID)
{
if (m_WashingData == null) return false;
return m_WashingData.StepID == stepID;
}
//public string GetBgm()
//{
// // 获取当前开放并符合解锁条件的洗游艇活动ID
// FishingEventData fishingEventData = GContext.container.Resolve<FishingEventData>();
// FishingEvent fishingEvent = fishingEventData.GetEventByTypeAndSubType(4, 4, m_IsCheckCondition);
// if (fishingEvent == null) return null;
// int eventID = fishingEvent.ID;
// int washingID = fishingEvent.RedirectID;
// if (washingID < 0) return null;
// // 获取当前洗游艇活动数据
// EventWashing washing = m_TbEventWashing.GetOrDefault(washingID);
// return washing.Bgm;
//}
#endregion
#region
public bool IsRedDotDisplayed()
{
if (m_WashingData == null) return false;
return m_WashingData.Token > 0 && m_WashingData.IsAllGameOver == false;
}
#endregion
#region
/// <summary>
/// 消费token
/// </summary>
/// <param name="count"></param>
/// <returns></returns>
public bool ConsumeTokens(int count)
{
bool isEnough = IsEnough(count);
if (isEnough == false) return false;
m_WashingData.ConsumedToken += count;
AddToken(-count);
#if AGG
using (var e = GEvent.GameEvent("event_washing"))
{
e.AddContent("step_id", m_WashingData.StepID)
.AddContent("independent_id", m_WashingData.ConsumedToken);
}
#endif
return isEnough;
}
public void AddToken(int count)
{
if (m_WashingData != null)
{
m_WashingData.Token += count;
}
else
{
//m_WashingData = new EventWashingData();
//m_WashingData.Token = count;
GetFreshEventStep();
if (m_WashingData == null) return;
m_WashingData.Token += count;
}
if (m_WashingData.Token > 0) RedPointManager.Instance.SetRedPointState(RedPointName.Home_Washing, true);
else RedPointManager.Instance.SetRedPointState(RedPointName.Home_Washing, false);
FishingYachtAct.Publish<EventWashingTokenUpdateData>(new EventWashingTokenUpdateData());
GContext.container.Resolve<FishingEventData>().SaveTransitionData(m_WashingData.EventID, m_WashingData.Token);
SyncData();
}
public int GetToken()
{
if (m_WashingData != null )
return m_WashingData.Token;
return 0;
}
public bool IsEnough(int spend)
{
if (m_WashingData == null) return false;
return (m_WashingData.Token - spend) >= 0;
}
public void SetEnergy(float energy, float speed)
{
if (m_WashingData == null) return;
if (energy < 0) m_WashingData.Energy = 0f;
else if (energy > 1f) m_WashingData.Energy = 1f;
else m_WashingData.Energy = energy;
if (speed < 0f) m_WashingData.EnergyConsumptionSpeed = 0f;
else m_WashingData.EnergyConsumptionSpeed = speed;
}
public void UpdateToken(float deltaTime)
{
if (m_WashingData != null)
{
float step = 1f / m_WashingData.StepEnergyConsume;
float nextEnergy = 1f - math.frac(m_WashingData.Percent / step);
if (m_WashingData.Energy < nextEnergy) m_WashingData.Energy = 0f;
if (m_WashingData.Energy > 0) m_WashingData.Energy = nextEnergy;
if (m_WashingData.Energy < 0) m_WashingData.Energy = 0;
}
}
public bool IsUpdateTokenOver()
{
if (m_WashingData == null) return true;
float step = 1f / m_WashingData.StepEnergyConsume;
int belongStep = (int)math.floor(m_WashingData.Percent / step) + 1;
if (belongStep > m_WashingData.StepEnergyConsume) m_WashingData.IsOver = true;
if (belongStep > m_WashingData.ConsumedToken && belongStep <= m_WashingData.StepEnergyConsume) return true;
return false;
}
public bool IsGameOver()
{
if (m_WashingData == null) return true;
return m_WashingData.IsOver;
}
#endregion
#region
public string GetPreLoadStepResName()
{
if (WashingData == null)
{
GetFreshEventStep();
}
else
{
GetCurrentEventStep();
}
string res = string.Format("GC_{0:D}_{1:D}_{2:D}", m_WashingData.WashingID, m_WashingData.StageID, m_WashingData.StepID);
return res;
}
public EventWashingStep GetFreshEventStep(bool isSyncData = true)
{
// 获取当前开放并符合解锁条件的洗游艇活动ID
FishingEventData fishingEventData = GContext.container.Resolve<FishingEventData>();
FishingEvent fishingEvent = fishingEventData.GetEventByTypeAndSubType(4, 4, m_IsCheckCondition);
if (fishingEvent == null) return null;
int eventID = fishingEvent.ID;
int washingID = fishingEvent.RedirectID;
if (washingID < 0) return null;
// 获取当前洗游艇活动数据
EventWashing washing = m_TbEventWashing.GetOrDefault(washingID);
if (washing == null) return null;
// 获取游艇数据
int stageCount = washing.StageList.Count;
if (stageCount == 0) return null;
int stageIndex = 0;
int stageID = washing.StageList[stageIndex];
EventWashingStage stage = m_TbEventWashingStage.GetOrDefault(stageID);
if (stage == null) return null;
// 获取步骤数据
int stepCount = stage.StepList.Count;
if (stepCount == 0) return null;
int stepIndex = 0;
int stepID = stage.StepList[stepIndex]; // 步骤ID
EventWashingStep eventWashingStep = m_TbEventWashingStep.GetOrDefault(stepID);
int token = m_DefaultToken;
if (m_WashingData != null) m_WashingData.ClearAllLocalData();
token = GContext.container.Resolve<FishingEventData>().GetInitWelcomeGift(eventID);
m_WashingData = new EventWashingData();
m_WashingData.EventID = eventID;
m_WashingData.WashingID = washingID;
m_WashingData.StageID = stageID;
m_WashingData.StageIndex = stageIndex;
m_WashingData.StageCount = stageCount;
m_WashingData.StepID = stepID;
m_WashingData.StepIndex = stepIndex;
m_WashingData.StepCount = stepCount;
m_WashingData.StepItems.Clear();
m_WashingData.StepEnergyConsume = eventWashingStep.EnergyConsume;
m_WashingData.Percent = 0f;
m_WashingData.OmitPercent = 0f;
m_WashingData.IsOver = false;
m_WashingData.Token = token;
m_WashingData.ConsumedToken = 0;
m_WashingData.IsAllGameOver = false;
GContext.container.Resolve<FishingEventData>().SaveTransitionData(m_WashingData.EventID, m_WashingData.Token);
// 同步数据
if (isSyncData == true) SyncData();
return eventWashingStep;
}
public bool HavePreEventStep()
{
if (m_WashingData == null) return false;
if (m_WashingData.StageIndex > 0) return true;
if (m_WashingData.StepIndex > 0) return true;
return false;
}
public bool HaveNextEventStep()
{
if (m_WashingData == null) return false;
if (m_WashingData.StageIndex < m_WashingData.StageCount - 1) return true;
if (m_WashingData.StepIndex < m_WashingData.StepCount - 1) return true;
return false;
}
public EventWashingStep GetNextEventStep(bool isSyncData = true)
{
// 获取当前开放并符合解锁条件的洗游艇活动ID
FishingEventData fishingEventData = GContext.container.Resolve<FishingEventData>();
FishingEvent fishingEvent = fishingEventData.GetEventByTypeAndSubType(4, 4, m_IsCheckCondition);
if (fishingEvent == null) return null;
int eventID = fishingEvent.ID;
int washingID = fishingEvent.RedirectID;
if (washingID < 0) return null;
if (washingID != m_WashingData.WashingID) return GetFreshEventStep();
// 获取当前洗游艇活动数据
EventWashing eventWashing = m_TbEventWashing.GetOrDefault(washingID);
if (eventWashing == null) return null;
bool haveNextStep = HaveNextEventStep();
if (haveNextStep == false) return null; // 所有活动结束
if (m_WashingData.StepIndex < m_WashingData.StepCount - 1)
{
m_WashingData.StepIndex += 1;
}
else
{
// 换船
m_WashingData.StageIndex += 1;
m_WashingData.StepIndex = 0;
}
int stageIndex = m_WashingData.StageIndex;
int stageCount = eventWashing.StageList.Count;
int stageID = eventWashing.StageList[stageIndex];
EventWashingStage eventWashingStage = m_TbEventWashingStage.GetOrDefault(stageID);
if (eventWashingStage == null) return null;
int stepIndex = m_WashingData.StepIndex;
int stepCount = eventWashingStage.StepList.Count;
int stepID = eventWashingStage.StepList[stepIndex];
EventWashingStep eventWashingStep = m_TbEventWashingStep.GetOrDefault(stepID);
m_WashingData.EventID = eventID;
m_WashingData.WashingID = washingID;
m_WashingData.StageID = stageID;
m_WashingData.StageIndex = stageIndex;
m_WashingData.StageCount = stageCount;
m_WashingData.StepID = stepID;
m_WashingData.StepIndex = stepIndex;
m_WashingData.StepCount = stepCount;
m_WashingData.StepItems.Clear();
m_WashingData.StepEnergyConsume = eventWashingStep.EnergyConsume;
m_WashingData.Percent = 0f;
m_WashingData.OmitPercent = 0f;
m_WashingData.IsOver = false;
m_WashingData.ConsumedToken = 0;
// 同步数据
if (isSyncData == true) SyncData();
return eventWashingStep;
}
public EventWashingStep GetCurrentEventStep()
{
// 获取当前开放并符合解锁条件的洗游艇活动ID
FishingEventData fishingEventData = GContext.container.Resolve<FishingEventData>();
FishingEvent fishingEvent = fishingEventData.GetEventByTypeAndSubType(4, 4, m_IsCheckCondition);
if (fishingEvent == null) return null;
int eventID = fishingEvent.ID;
int washingID = fishingEvent.RedirectID;
if (washingID < 0) return null;
if (eventID != m_WashingData.EventID || washingID != m_WashingData.WashingID) return GetFreshEventStep();
return m_TbEventWashingStep.GetOrDefault(m_WashingData.StepID);
}
#endregion
}
}