Client LuaCsForBarotrauma
BarotraumaClient/ClientSource/Events/Missions/Mission.cs
2 using Microsoft.Xna.Framework;
3 using System;
4 using System.Collections.Generic;
5 using System.Globalization;
6 using System.Linq;
7 using static Barotrauma.MissionPrefab;
8 
9 namespace Barotrauma
10 {
11  abstract partial class Mission
12  {
13  private readonly List<LocalizedString> shownMessages = new List<LocalizedString>();
14  public IEnumerable<LocalizedString> ShownMessages => shownMessages;
15 
16  public bool DisplayTargetHudIcons => Prefab.DisplayTargetHudIcons;
17 
18  public virtual IEnumerable<Entity> HudIconTargets => Enumerable.Empty<Entity>();
19 
23  public abstract bool DisplayAsCompleted { get; }
27  public abstract bool DisplayAsFailed { get; }
28 
29  public Color GetDifficultyColor()
30  {
32  }
33  public static Color GetDifficultyColor(int difficulty)
34  {
35  int v = difficulty;
36  float t = MathUtils.InverseLerp(MissionPrefab.MinDifficulty, MissionPrefab.MaxDifficulty, v);
37  return ToolBox.GradientLerp(t, GUIStyle.Green, GUIStyle.Orange, GUIStyle.Red);
38  }
39 
44  {
45  int baseReward = GetReward(sub);
46  int finalReward = GetFinalReward(sub);
47  string rewardAmountText = string.Format(CultureInfo.InvariantCulture, "{0:N0}", baseReward);
48  if (finalReward > baseReward)
49  {
50  rewardAmountText += $" + {string.Format(CultureInfo.InvariantCulture, "{0:N0}", finalReward - baseReward)}";
51  }
52  return TextManager.GetWithVariable("currencyformat", "[credits]", rewardAmountText);
53  }
54 
59  {
60  LocalizedString rewardText = GetRewardAmountText(sub);
61  return RichString.Rich(TextManager.GetWithVariable("missionreward", "[reward]", "‖color:gui.orange‖" + rewardText + "‖end‖"));
62  }
63 
65  {
66  List<LocalizedString> reputationRewardTexts = new List<LocalizedString>();
67  foreach (var reputationReward in ReputationRewards)
68  {
69  FactionPrefab factionPrefab;
70  if (reputationReward.FactionIdentifier == "location" )
71  {
72  factionPrefab = OriginLocation.Faction?.Prefab;
73  }
74  else
75  {
76  FactionPrefab.Prefabs.TryGet(reputationReward.FactionIdentifier, out factionPrefab);
77  }
78 
79  if (factionPrefab != null)
80  {
81  AddReputationText(factionPrefab, reputationReward.Amount);
82  if (!MathUtils.NearlyEqual(reputationReward.AmountForOpposingFaction, 0.0f) &&
83  FactionPrefab.Prefabs.TryGet(factionPrefab.OpposingFaction, out var opposingFactionPrefab))
84  {
85  AddReputationText(opposingFactionPrefab, reputationReward.AmountForOpposingFaction);
86  }
87  }
88  }
89 
90  void AddReputationText(FactionPrefab factionPrefab, float amount)
91  {
92  if (factionPrefab == null) { return; }
93 
94  float totalReputationChange = amount;
95  if (GameMain.GameSession?.Campaign?.Factions.Find(f => f.Prefab == factionPrefab) is Faction faction)
96  {
97  totalReputationChange = amount * faction.Reputation.GetReputationChangeMultiplier(amount);
98  }
99 
100  LocalizedString name = $"‖color:{XMLExtensions.ToStringHex(factionPrefab.IconColor)}‖{factionPrefab.Name}‖end‖";
101  float normalizedValue = MathUtils.InverseLerp(-100.0f, 100.0f, totalReputationChange);
102  string formattedValue = ((int)Math.Round(totalReputationChange)).ToString("+#;-#;0"); //force plus sign for positive numbers
103  LocalizedString rewardText = TextManager.GetWithVariables(
104  "reputationformat",
105  ("[reputationname]", name),
106  ("[reputationvalue]", $"‖color:{XMLExtensions.ToStringHex(Reputation.GetReputationColor(normalizedValue))}‖{formattedValue}‖end‖"));
107  reputationRewardTexts.Add(rewardText.Value);
108  }
109 
110 
111  if (reputationRewardTexts.Any())
112  {
113  return RichString.Rich(TextManager.AddPunctuation(':', TextManager.Get("reputation"), LocalizedString.Join(", ", reputationRewardTexts)));
114  }
115  else
116  {
117  return string.Empty;
118  }
119  }
120  partial void DistributeExperienceToCrew(IEnumerable<Character> crew, int experienceGain)
121  {
122  foreach (Character character in crew)
123  {
124  GiveMissionExperience(character.Info);
125  }
126  void GiveMissionExperience(CharacterInfo info)
127  {
128  if (info == null) { return; }
129  var experienceGainMultiplierIndividual = new AbilityMissionExperienceGainMultiplier(this, 1f, info.Character);
130  //check if anyone else in the crew has talents that could give a bonus to this one
131  foreach (var c in crew)
132  {
133  if (c == info.Character) { continue; }
134  c.CheckTalents(AbilityEffectType.OnAllyGainMissionExperience, experienceGainMultiplierIndividual);
135  }
136  info.Character?.CheckTalents(AbilityEffectType.OnGainMissionExperience, experienceGainMultiplierIndividual);
137  info.GiveExperience((int)(experienceGain * experienceGainMultiplierIndividual.Value));
138  }
139  }
140 
141  partial void ShowMessageProjSpecific(int missionState)
142  {
143  int messageIndex = missionState - 1;
144  if (messageIndex >= Headers.Length && messageIndex >= Messages.Length) { return; }
145  if (messageIndex < 0) { return; }
146 
147  LocalizedString header = messageIndex < Headers.Length ? Headers[messageIndex] : "";
148  LocalizedString message = messageIndex < Messages.Length ? Messages[messageIndex] : "";
149  if (!message.IsNullOrEmpty())
150  {
151  message = ModifyMessage(message);
152  }
153 
154  CoroutineManager.StartCoroutine(ShowMessageBoxWhenRoundSummaryIsNotActive(header, message));
155  }
156 
157  private IEnumerable<CoroutineStatus> ShowMessageBoxWhenRoundSummaryIsNotActive(LocalizedString header, LocalizedString message)
158  {
159  while (GUIMessageBox.VisibleBox?.UserData is RoundSummary)
160  {
161  yield return new WaitForSeconds(1.0f);
162  }
163  CreateMessageBox(header, message);
164  yield return CoroutineStatus.Success;
165  }
166 
167  protected void CreateMessageBox(LocalizedString header, LocalizedString message)
168  {
169  shownMessages.Add(message);
170  new GUIMessageBox(RichString.Rich(header), RichString.Rich(message), buttons: Array.Empty<LocalizedString>(), type: GUIMessageBox.Type.InGame, icon: Prefab.Icon)
171  {
172  IconColor = Prefab.IconColor
173  };
174  }
175 
176  public Identifier GetOverrideMusicType()
177  {
178  return Prefab.GetOverrideMusicType(State);
179  }
180 
181  public virtual void ClientRead(IReadMessage msg)
182  {
183  State = msg.ReadInt16();
184  }
185 
186  public virtual void ClientReadInitial(IReadMessage msg)
187  {
188  state = msg.ReadInt16();
189  }
190  }
191 }
FactionPrefab Prefab
Definition: Factions.cs:18
static GameSession?? GameSession
Definition: GameMain.cs:88
static LocalizedString Join(string separator, params LocalizedString[] subStrs)
abstract bool DisplayAsCompleted
Is the mission at a state at which the only thing left to do is to reach the end of the level?
int GetReward(Submarine sub)
Calculates the available reward, taking into account universal modifiers such as campaign settings
void CreateMessageBox(LocalizedString header, LocalizedString message)
abstract bool DisplayAsFailed
Is the mission at a state at which the mission cannot be completed anymore?
virtual LocalizedString ModifyMessage(LocalizedString message, bool color=true)
virtual RichString GetMissionRewardText(Submarine sub)
Returns the full reward text of the mission (e.g. "Reward: 2,000 mk" or "Reward: 500 mk x 2 (out of m...
readonly ImmutableArray< LocalizedString > Headers
Location OriginLocation
Where was this mission received from? Affects which faction we give reputation for if the mission is ...
ImmutableList< MissionPrefab.ReputationReward > ReputationRewards
int GetFinalReward(Submarine sub)
Get the final reward, taking talent bonuses into account if the mission has concluded and the talents...
LocalizedString GetRewardAmountText(Submarine sub)
Returns the amount of marks you get from the reward (e.g. "3,000 mk")
readonly ImmutableArray< LocalizedString > Messages
static RichString Rich(LocalizedString str, Func< string, string >? postProcess=null)
Definition: RichString.cs:67
AbilityEffectType
Definition: Enums.cs:125