TH1/Unity/Assets/Scripts/TH1_DataAssetsScript/DiplomacyDataAssets.cs
2026-01-27 15:31:53 +08:00

265 lines
10 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 DiplomacyUIAnnounceOfferAllyTitle;
[MultilingualField] public string DiplomacyUIAnnounceAcceptAllyTitle;
[MultilingualField] public string DiplomacyUIAnnounceRefuseAllyTitle;
[MultilingualField] public string DiplomacyUIAnnounceBreakAllyTitle;
[MultilingualField] public string DiplomacyUIAnnounceEmbassyTitle;
[MultilingualField] public string DiplomacyUIAnnounceEmbassyPassiveTitle;
[MultilingualField] public string DiplomacyUIAnnounceBreakEmbassyTitle;
[MultilingualField] public string DiplomacyUIAnnounceBreakEmbassyPassiveTitle;
[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 string GetDiplomacyAnnounceTextTitle(PlayerActionType type,bool breakEmbassy = false)
{
switch(type)
{
case PlayerActionType.AcceptAlly:
return DiplomacyUIAnnounceAcceptAllyTitle;
case PlayerActionType.OfferAlly:
return DiplomacyUIAnnounceOfferAllyTitle;
case PlayerActionType.RefuseAlly:
return DiplomacyUIAnnounceRefuseAllyTitle;
case PlayerActionType.BreakAlly:
return DiplomacyUIAnnounceBreakAllyTitle;
case PlayerActionType.Embassy:
return breakEmbassy ? DiplomacyUIAnnounceBreakEmbassyTitle : DiplomacyUIAnnounceEmbassyTitle;
}
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 Color StateBGColor;
public Sprite StateIcon;
}
[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;
public string GetSpeaker()
{
switch (force)
{
case Forces.Remilia:
return nameof(GiantType.EgyptianRemilia);
case Forces.Kaguya:
return nameof(GiantType.FrenchKaguya);
case Forces.Kanako:
return nameof(GiantType.GermanyKanako);
case Forces.Satori:
return nameof(GiantType.IndianSatori);
case Forces.Reimu:
return "NorwayReimu";
case Forces.Byakuren:
return "BritishByakuren";
case Forces.Miko:
return "PersianMiko";
case Forces.Zanmu:
return "ByzantineZanmu";
}
return nameof(GiantType.None);
}
[MultilingualField(false,true,false)]public List<string> AllyBreakText;
[MultilingualField(false,true,false)]public List<string> AllyOfferText;
[MultilingualField(false,true,false)]public List<string> AllyAcceptText;
[MultilingualField(false,true,false)]public List<string> AllyRefuseText;
[MultilingualField(false,true,false)]public List<string> RelationTrustText;
[MultilingualField(false,true,false)]public List<string> RelationAppreciateText;
[MultilingualField(false,true,false)]public List<string> RelationIndifferentText;
[MultilingualField(false,true,false)]public List<string> RelationSuspicionText;
[MultilingualField(false,true,false)]public List<string> RelationTerribleText;
}