diff --git a/EDPlayerJournal/BGS/Parsers/ShipTargetedParser.cs b/EDPlayerJournal/BGS/Parsers/ShipTargetedParser.cs new file mode 100644 index 0000000..7463b3e --- /dev/null +++ b/EDPlayerJournal/BGS/Parsers/ShipTargetedParser.cs @@ -0,0 +1,65 @@ +using EDPlayerJournal.Entries; + +namespace EDPlayerJournal.BGS; + +/// +/// With ship targeted we might find out to which faction a given NPC belonged. This is +/// useful later when said NPC gets killed or murdered. +/// +internal class ShipTargetedParser : ITransactionParserPart { + public void Parse(Entry e, TransactionParserContext context, TransactionParserOptions options, TransactionList transactions) { + ShipTargetedEntry? entry = e as ShipTargetedEntry; + if (entry == null) { + throw new NotImplementedException(); + } + + // Scan happens in stages, and sometimes this information is not known + // yet. Do now throw an error, this is expected behaviour. + if (!string.IsNullOrEmpty(entry.PilotNameLocalised) && + !string.IsNullOrEmpty(entry.Faction)) { + context.NPCFaction.TryAdd(entry.PilotNameLocalised, entry.Faction); + } + + string? faction = context.LastRecordedAwardingFaction; + + // We have seen a captain? + if (NPCs.IsWarzoneCaptain(entry.PilotName)) { + // if we have faction information, we can compare it to figure out + // whether it is the enemy or allied faction. but this is not always + // possible. In such a case we assume we have seen the enemy captain. + if (!string.IsNullOrEmpty(entry.Faction) && + !string.IsNullOrEmpty(faction)) { + if (string.Compare(faction, entry.Faction) != 0) { + context.HaveSeenEnemyCaptain = true; + } else { + context.HaveSeenAlliedCaptain = true; + } + } else { + context.HaveSeenEnemyCaptain = true; + } + } + + // Spec ops? + if (NPCs.IsSpecOps(entry.PilotName)) { + context.HaveSeenSpecOps = true; + } + + // Correspondent? + if (NPCs.IsWarzoneCorrespondent(entry.PilotName)) { + // if we have faction information, we can compare it to figure out + // whether it is the enemy or allied faction. but this is not always + // possible. In such a case we assume we have seen the enemy + // correspondent. + if (!string.IsNullOrEmpty(entry.Faction) && + !string.IsNullOrEmpty(faction)) { + if (string.Compare(faction, entry.Faction) != 0) { + context.HaveSeenEnemyCorrespondent = true; + } else { + context.HaveSeenAlliedCorrespondent = true; + } + } else { + context.HaveSeenEnemyCorrespondent = true; + } + } + } +} \ No newline at end of file diff --git a/EDPlayerJournal/BGS/TransactionParser.cs b/EDPlayerJournal/BGS/TransactionParser.cs index a6a3393..9064f85 100644 --- a/EDPlayerJournal/BGS/TransactionParser.cs +++ b/EDPlayerJournal/BGS/TransactionParser.cs @@ -137,41 +137,6 @@ internal class DockedParser : ITransactionParserPart { } } -/// -/// With ship targeted we might find out to which faction a given NPC belonged. This is -/// useful later when said NPC gets killed or murdered. -/// -internal class ShipTargetedParser : ITransactionParserPart { - public void Parse(Entry e, TransactionParserContext context, TransactionParserOptions options, TransactionList transactions) { - ShipTargetedEntry? entry = e as ShipTargetedEntry; - if (entry == null) { - throw new NotImplementedException(); - } - - // Scan happens in stages, and sometimes this information is not known - // yet. Do now throw an error, this is expected behaviour. - if (!string.IsNullOrEmpty(entry.PilotNameLocalised) && - !string.IsNullOrEmpty(entry.Faction)) { - context.NPCFaction.TryAdd(entry.PilotNameLocalised, entry.Faction); - } - - // We have seen a captain? - if (NPCs.IsWarzoneCaptain(entry.PilotName)) { - context.HaveSeenCaptain = true; - } - - // Spec ops? - if (NPCs.IsSpecOps(entry.PilotName)) { - context.HaveSeenSpecOps = true; - } - - // Correspondent? - if (NPCs.IsWarzoneCorrespondent(entry.PilotName)) { - context.HaveSeenCorrespondent = true; - } - } -} - /// /// Commit crime can result in a transaction, especially if the crime committed is /// murder. diff --git a/EDPlayerJournal/BGS/TransactionParserContext.cs b/EDPlayerJournal/BGS/TransactionParserContext.cs index 0d64532..d7a7c50 100644 --- a/EDPlayerJournal/BGS/TransactionParserContext.cs +++ b/EDPlayerJournal/BGS/TransactionParserContext.cs @@ -51,9 +51,11 @@ internal class TransactionParserContext { public ulong? HighestCombatBond { get; set; } public bool HaveSeenCapShip { get; set; } = false; - public bool HaveSeenCaptain { get; set; } = false; + public bool HaveSeenAlliedCaptain { get; set; } = false; + public bool HaveSeenEnemyCaptain { get; set; } = false; public bool HaveSeenSpecOps { get; set; } = false; - public bool HaveSeenCorrespondent { get; set; } = false; + public bool HaveSeenAlliedCorrespondent { get; set; } = false; + public bool HaveSeenEnemyCorrespondent { get; set; } = false; /// /// Returns true if the current session is legacy @@ -192,10 +194,14 @@ internal class TransactionParserContext { if (HaveSeenCapShip) { grade = CombatZones.DifficultyHigh; } else { - int warzoneNpcs = new List() { HaveSeenCaptain, HaveSeenCorrespondent, HaveSeenSpecOps } - .Where(x => x == true) - .Count() - ; + int warzoneNpcs = new List() { + HaveSeenEnemyCaptain, + HaveSeenEnemyCorrespondent, + HaveSeenSpecOps + } + .Where(x => x == true) + .Count() + ; if (warzoneNpcs >= 1 && grade == CombatZones.DifficultyLow) { grade = CombatZones.DifficultyMedium; @@ -222,8 +228,8 @@ internal class TransactionParserContext { // Sad truth is, if HaveSeenXXX is false, we just don't know for certain CapitalShip = HaveSeenCapShip ? true : null, SpecOps = HaveSeenSpecOps ? true : null, - EnemyCorrespondent = HaveSeenCorrespondent ? true : null, - EnemyCaptain = HaveSeenCaptain ? true : null, + EnemyCorrespondent = HaveSeenEnemyCorrespondent ? true : null, + EnemyCaptain = HaveSeenEnemyCaptain ? true : null, }; zone.Entries.Add(e); transactions.Add(zone); @@ -246,8 +252,10 @@ internal class TransactionParserContext { public void ResetCombatZone() { HighestCombatBond = null; HaveSeenCapShip = false; - HaveSeenCaptain = false; - HaveSeenCorrespondent = false; + HaveSeenAlliedCaptain = false; + HaveSeenEnemyCaptain = false; + HaveSeenAlliedCorrespondent = false; + HaveSeenEnemyCorrespondent = false; HaveSeenSpecOps = false; LastRecordedAwardingFaction = null; OnFootKills = 0;