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 DiplomacyStateInfoList; public List FeelingStateInfoList; public List FeelingStrategyInfoList; public List 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 AllyBreakText; [MultilingualField(false,true,false)]public List AllyOfferText; [MultilingualField(false,true,false)]public List AllyAcceptText; [MultilingualField(false,true,false)]public List AllyRefuseText; [MultilingualField(false,true,false)]public List RelationTrustText; [MultilingualField(false,true,false)]public List RelationAppreciateText; [MultilingualField(false,true,false)]public List RelationIndifferentText; [MultilingualField(false,true,false)]public List RelationSuspicionText; [MultilingualField(false,true,false)]public List RelationTerribleText; }