2 using Microsoft.Xna.Framework;
4 using System.Collections.Generic;
5 using System.Globalization;
11 abstract partial class Mission
13 private readonly List<LocalizedString> shownMessages =
new List<LocalizedString>();
37 return ToolBox.GradientLerp(t, GUIStyle.Green, GUIStyle.Orange, GUIStyle.Red);
47 string rewardAmountText =
string.Format(CultureInfo.InvariantCulture,
"{0:N0}", baseReward);
48 if (finalReward > baseReward)
50 rewardAmountText += $
" + {string.Format(CultureInfo.InvariantCulture, "{0:N0}
", finalReward - baseReward)}";
52 return TextManager.GetWithVariable(
"currencyformat",
"[credits]", rewardAmountText);
61 return RichString.
Rich(TextManager.GetWithVariable(
"missionreward",
"[reward]",
"‖color:gui.orange‖" + rewardText +
"‖end‖"));
66 List<LocalizedString> reputationRewardTexts =
new List<LocalizedString>();
69 FactionPrefab factionPrefab;
70 if (reputationReward.FactionIdentifier ==
"location" )
76 FactionPrefab.Prefabs.TryGet(reputationReward.FactionIdentifier, out factionPrefab);
79 if (factionPrefab !=
null)
81 AddReputationText(factionPrefab, reputationReward.Amount);
82 if (!MathUtils.NearlyEqual(reputationReward.AmountForOpposingFaction, 0.0f) &&
83 FactionPrefab.Prefabs.TryGet(factionPrefab.OpposingFaction, out var opposingFactionPrefab))
85 AddReputationText(opposingFactionPrefab, reputationReward.AmountForOpposingFaction);
90 void AddReputationText(FactionPrefab factionPrefab,
float amount)
92 if (factionPrefab ==
null) {
return; }
94 float totalReputationChange = amount;
97 totalReputationChange = amount * faction.Reputation.GetReputationChangeMultiplier(amount);
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");
105 (
"[reputationname]", name),
106 (
"[reputationvalue]", $
"‖color:{XMLExtensions.ToStringHex(Reputation.GetReputationColor(normalizedValue))}‖{formattedValue}‖end‖"));
107 reputationRewardTexts.Add(rewardText.
Value);
111 if (reputationRewardTexts.Any())
120 partial
void DistributeExperienceToCrew(IEnumerable<Character> crew,
int experienceGain)
124 GiveMissionExperience(character.
Info);
126 void GiveMissionExperience(CharacterInfo info)
128 if (info ==
null) {
return; }
129 var experienceGainMultiplierIndividual =
new AbilityMissionExperienceGainMultiplier(
this, 1f, info.Character);
131 foreach (var c
in crew)
133 if (c == info.Character) {
continue; }
134 c.CheckTalents(
AbilityEffectType.OnAllyGainMissionExperience, experienceGainMultiplierIndividual);
136 info.Character?.CheckTalents(
AbilityEffectType.OnGainMissionExperience, experienceGainMultiplierIndividual);
137 info.GiveExperience((
int)(experienceGain * experienceGainMultiplierIndividual.Value));
141 partial
void ShowMessageProjSpecific(
int missionState)
143 int messageIndex = missionState - 1;
144 if (messageIndex >=
Headers.Length && messageIndex >=
Messages.Length) {
return; }
145 if (messageIndex < 0) {
return; }
147 LocalizedString header = messageIndex <
Headers.Length ?
Headers[messageIndex] :
"";
148 LocalizedString message = messageIndex <
Messages.Length ?
Messages[messageIndex] :
"";
149 if (!message.IsNullOrEmpty())
154 CoroutineManager.StartCoroutine(ShowMessageBoxWhenRoundSummaryIsNotActive(header, message));
157 private IEnumerable<CoroutineStatus> ShowMessageBoxWhenRoundSummaryIsNotActive(LocalizedString header, LocalizedString message)
159 while (GUIMessageBox.VisibleBox?.UserData is RoundSummary)
161 yield
return new WaitForSeconds(1.0f);
164 yield
return CoroutineStatus.Success;
169 shownMessages.Add(message);
172 IconColor =
Prefab.IconColor
IReadOnlyList< Faction > Factions
static GameSession?? GameSession
static LocalizedString Join(string separator, params LocalizedString[] subStrs)
Color GetDifficultyColor()
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
Identifier GetOverrideMusicType()
void CreateMessageBox(LocalizedString header, LocalizedString message)
abstract bool DisplayAsFailed
Is the mission at a state at which the mission cannot be completed anymore?
static Color GetDifficultyColor(int difficulty)
virtual LocalizedString ModifyMessage(LocalizedString message, bool color=true)
virtual void ClientReadInitial(IReadMessage msg)
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...
virtual IEnumerable< Entity > HudIconTargets
readonly ImmutableArray< LocalizedString > Headers
virtual void ClientRead(IReadMessage msg)
IEnumerable< LocalizedString > ShownMessages
Location OriginLocation
Where was this mission received from? Affects which faction we give reputation for if the mission is ...
ImmutableList< MissionPrefab.ReputationReward > ReputationRewards
RichString GetReputationRewardText()
bool DisplayTargetHudIcons
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)