TH1/Unity/Assets/Scripts/TH1_DataAssetsScript/DiplomacyDataAssets.cs
2025-09-01 19:27:18 +08:00

208 lines
7.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using UnityEngine;
using RuntimeData;
using Logic.Multilingual;
using TH1_Logic.Action;
using TH1Resource;
[Serializable]
[CreateAssetMenu(fileName = "DiplomacyDataAssets", menuName = "TH1 Game Data/Diplomacy Data Asset")]
public class DiplomacyDataAssets : ScriptableObject
{
[MultilingualField] public string NoMeetText;
[MultilingualField] public string NoMeetPlayerName;
[MultilingualField] public string DiplomacyUITitle;
[MultilingualField] public string DiplomacyUITitleSelf;
[MultilingualField] public string DiplomacyUIAnnounceOfferAlly;
[MultilingualField] public string DiplomacyUIAnnounceAcceptAlly;
[MultilingualField] public string DiplomacyUIAnnounceRefuseAlly;
[MultilingualField] public string DiplomacyUIAnnounceBreakAlly;
[MultilingualField] public string DiplomacyUIAnnounceEmbassy;
[MultilingualField] public string DiplomacyUIAnnounceEmbassyPassive;
[MultilingualField] public string DiplomacyUIAnnounceBreakEmbassy;
[MultilingualField] public string DiplomacyUIAnnounceBreakEmbassyPassive;
[MultilingualField] public string DiplomacyUINotifyOfferAlly;
[MultilingualField] public string DiplomacyUINotifyEmbassy;
[MultilingualField] public string DiplomacyUIOtherRelationTitle;
public List<DiplomacyStateInfo> DiplomacyStateInfoList;
public List<FeelingStateInfo> FeelingStateInfoList;
public List<FeelingStrategyInfo> FeelingStrategyInfoList;
public List<DiplomacyChatInfo> DiplomacyChatInfoList;
public bool GetStateInfo(DiplomacyState state,out DiplomacyStateInfo info)
{
foreach(var t in DiplomacyStateInfoList)
if (state == t.DiplomacyState)
{
info = t;
return true;
}
info = null;
return false;
}
public bool GetFeelingInfo(FeelingState state,out FeelingStateInfo info)
{
foreach(var t in FeelingStateInfoList)
if (state == t.FeelingState)
{
info = t;
return true;
}
info = null;
return false;
}
public bool GetFeelingStragegyInfo(FeelingStrategy feelingStrategy,out FeelingStrategyInfo info)
{
foreach(var t in FeelingStrategyInfoList)
if (feelingStrategy == t.FeelingStrategy)
{
info = t;
return true;
}
info = null;
return false;
}
public bool GetDiplomacyChatInfo(Forces force,out DiplomacyChatInfo info)
{
foreach(var t in DiplomacyChatInfoList)
if (force == t.force)
{
info = t;
return true;
}
info = null;
return false;
}
public string GetDiplomacyAnnounceText(PlayerActionType type,bool breakEmbassy = false)
{
switch(type)
{
case PlayerActionType.AcceptAlly:
return DiplomacyUIAnnounceAcceptAlly;
case PlayerActionType.OfferAlly:
return DiplomacyUIAnnounceOfferAlly;
case PlayerActionType.RefuseAlly:
return DiplomacyUIAnnounceRefuseAlly;
case PlayerActionType.BreakAlly:
return DiplomacyUIAnnounceBreakAlly;
case PlayerActionType.Embassy:
return breakEmbassy ? DiplomacyUIAnnounceBreakEmbassy : DiplomacyUIAnnounceEmbassy;
}
return "";
}
public Sprite GetDiplomacyAnnounceStateSprite(PlayerActionType type)
{
switch(type)
{
case PlayerActionType.AcceptAlly:
return ResourceCache.Instance.SpriteCache.Ally;
case PlayerActionType.OfferAlly:
return ResourceCache.Instance.SpriteCache.Ally;
case PlayerActionType.RefuseAlly:
return ResourceCache.Instance.SpriteCache.BreakAlly;
case PlayerActionType.BreakAlly:
return ResourceCache.Instance.SpriteCache.BreakAlly;
case PlayerActionType.Embassy:
return ResourceCache.Instance.SpriteCache.Embassy;
}
return null;
}
public string GetDiplomacyTextByFeeling(Forces forces, FeelingState state)
{
DiplomacyChatInfo chatInfo = null;
foreach(var t in DiplomacyChatInfoList)
if (t.force == forces)
{
chatInfo = t;
break;
}
if (chatInfo == null) return "";
return state switch
{
FeelingState.Trust => chatInfo.RelationTrustText.Count == 0 ? "" : chatInfo.RelationTrustText[UnityEngine.Random.Range(0, chatInfo.RelationTrustText.Count)],
FeelingState.Appreciate => chatInfo.RelationAppreciateText.Count == 0 ? "" : chatInfo.RelationAppreciateText[UnityEngine.Random.Range(0, chatInfo.RelationAppreciateText.Count)],
FeelingState.Indifferent => chatInfo.RelationIndifferentText.Count == 0 ? "" : chatInfo.RelationIndifferentText[UnityEngine.Random.Range(0, chatInfo.RelationIndifferentText.Count)],
FeelingState.Suspicion => chatInfo.RelationSuspicionText.Count == 0 ? "" : chatInfo.RelationSuspicionText[UnityEngine.Random.Range(0, chatInfo.RelationSuspicionText.Count)],
FeelingState.Terrible => chatInfo.RelationTerribleText.Count == 0 ? "" : chatInfo.RelationTerribleText[UnityEngine.Random.Range(0, chatInfo.RelationTerribleText.Count)],
_ => ""
};
}
public string GetDiplomacyTextByAction(Forces forces, PlayerActionType action)
{
DiplomacyChatInfo chatInfo = null;
foreach(var t in DiplomacyChatInfoList)
if (t.force == forces)
{
chatInfo = t;
break;
}
if (chatInfo == null) return "";
return action switch
{
PlayerActionType.OfferAlly => chatInfo.AllyOfferText.Count == 0 ? "" : chatInfo.AllyOfferText[UnityEngine.Random.Range(0, chatInfo.AllyOfferText.Count)],
PlayerActionType.BreakAlly => chatInfo.AllyBreakText.Count == 0 ? "" : chatInfo.AllyBreakText[UnityEngine.Random.Range(0, chatInfo.AllyBreakText.Count)],
PlayerActionType.RefuseAlly => chatInfo.AllyRefuseText.Count == 0 ? "" : chatInfo.AllyRefuseText[UnityEngine.Random.Range(0, chatInfo.AllyRefuseText.Count)],
PlayerActionType.AcceptAlly => chatInfo.AllyAcceptText.Count == 0 ? "" : chatInfo.AllyAcceptText[UnityEngine.Random.Range(0, chatInfo.AllyAcceptText.Count)],
_ => ""
};
}
}
[Serializable]
public class DiplomacyStateInfo
{
public DiplomacyState DiplomacyState;
[MultilingualField] public string stateText;
public Color stateColor;
public Material stateBGMat;
}
[Serializable]
public class FeelingStateInfo
{
public FeelingState FeelingState;
[MultilingualField] public string feelingText;
public Color feelingColor;
}
[Serializable]
public class FeelingStrategyInfo
{
public FeelingStrategy FeelingStrategy;
[MultilingualField] public string FeelingStrategyTitle;
[MultilingualField] public string FeelingStrategyDesc;
public Color FeelingStrategyColor;
}
[Serializable]
public class DiplomacyChatInfo
{
public Forces force;
[MultilingualField]public List<string> AllyBreakText;
[MultilingualField]public List<string> AllyOfferText;
[MultilingualField]public List<string> AllyAcceptText;
[MultilingualField]public List<string> AllyRefuseText;
[MultilingualField]public List<string> RelationTrustText;
[MultilingualField]public List<string> RelationAppreciateText;
[MultilingualField]public List<string> RelationIndifferentText;
[MultilingualField]public List<string> RelationSuspicionText;
[MultilingualField]public List<string> RelationTerribleText;
}