Client LuaCsForBarotrauma
AbilityConditionMission.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Collections.Immutable;
4 using System.Linq;
5 
6 namespace Barotrauma.Abilities
7 {
9  {
10  private readonly ImmutableHashSet<MissionType> missionType;
11  private readonly bool isAffiliated;
12 
13  public AbilityConditionMission(CharacterTalent characterTalent, ContentXElement conditionElement) : base(characterTalent, conditionElement)
14  {
15  string[] missionTypeStrings = conditionElement.GetAttributeStringArray("missiontype", new []{ "None" })!;
16  HashSet<MissionType> missionTypes = new HashSet<MissionType>();
17  isAffiliated = conditionElement.GetAttributeBool("isaffiliated", false);
18 
19  foreach (string missionTypeString in missionTypeStrings)
20  {
21  if (!Enum.TryParse(missionTypeString, out MissionType parsedMission) || parsedMission is MissionType.None)
22  {
23  if (!isAffiliated)
24  {
25  DebugConsole.ThrowError($"Error in AbilityConditionMission \"{characterTalent.DebugIdentifier}\" - \"{missionTypeString}\" is not a valid mission type.",
26  contentPackage: conditionElement.ContentPackage);
27  }
28  continue;
29  }
30 
31  missionTypes.Add(parsedMission);
32  }
33 
34  missionType = missionTypes.ToImmutableHashSet();
35  }
36 
37  protected override bool MatchesConditionSpecific(AbilityObject abilityObject)
38  {
39  if (abilityObject is IAbilityMission { Mission: { } mission })
40  {
41  if (!isAffiliated) { return CheckMissionType(); }
42 
43  if (GameMain.GameSession?.Campaign?.Factions is not { } factions) { return false; }
44 
45  foreach (var reputationReward in mission.ReputationRewards)
46  {
47  if (reputationReward.Amount <= 0) { continue; }
48  if (GetMatchingFaction(reputationReward.FactionIdentifier) is { } faction &&
50  {
51  return CheckMissionType();
52  }
53  }
54 
55  return false;
56 
57  Faction GetMatchingFaction(Identifier factionIdentifier) =>
58  factionIdentifier == "location"
59  ? mission.OriginLocation?.Faction
60  : factions.FirstOrDefault(f => factionIdentifier == f.Prefab.Identifier);
61 
62  bool CheckMissionType() => missionType.IsEmpty || missionType.Contains(mission.Prefab.Type);
63  }
64 
65  LogAbilityConditionError(abilityObject, typeof(IAbilityMission));
66  return false;
67  }
68  }
69 }
void LogAbilityConditionError(AbilityObject abilityObject, Type expectedData)
override bool MatchesConditionSpecific(AbilityObject abilityObject)
AbilityConditionMission(CharacterTalent characterTalent, ContentXElement conditionElement)
bool GetAttributeBool(string key, bool def)
string?[] GetAttributeStringArray(string key, string[]? def, bool convertToLowerInvariant=false)
Faction(CampaignMetadata? metadata, FactionPrefab prefab)
Definition: Factions.cs:20
static FactionAffiliation GetPlayerAffiliationStatus(Faction faction)
Get what kind of affiliation this faction has towards the player depending on who they chose to side ...
Definition: Factions.cs:30
static GameSession?? GameSession
Definition: GameMain.cs:88
FactionAffiliation
Definition: Factions.cs:9