add support for thargoid vouchers

This commit is contained in:
Florian Stinglmayr 2022-11-25 15:48:00 +01:00
parent e8de768d01
commit 8514331701
5 changed files with 101 additions and 12 deletions

View File

@ -28,7 +28,7 @@ public class ThargoidKill : Transaction {
public ThargoidKill() { } public ThargoidKill() { }
public ThargoidKill(FactionKillBondEntry entry) { public ThargoidKill(FactionKillBondEntry entry) {
if (string.Compare(entry.VictimFaction, Thargoid.ThargoidFaction) != 0) { if (!Factions.IsThargoid(entry.VictimFaction)) {
throw new Exception("Not a valid thargoid kill"); throw new Exception("Not a valid thargoid kill");
} }

View File

@ -488,9 +488,12 @@ internal class RedeemVoucherParser : TransactionParserPart {
foreach (string faction in entry.Factions) { foreach (string faction in entry.Factions) {
bool relevantBond = false; bool relevantBond = false;
string relevantFaction = faction;
if (string.Compare(faction, Factions.PilotsFederationVouchers) == 0) { if (string.Compare(faction, Factions.PilotsFederationVouchers) == 0) {
// Target faction is pilots' federation, so we assume thargoid bonks // Target faction is pilots' federation, so we assume thargoid bonks
// Also assign this combat bond to the Pilots Federation
relevantFaction = Factions.PilotsFederation;
relevantBond = true; relevantBond = true;
} }
@ -511,7 +514,7 @@ internal class RedeemVoucherParser : TransactionParserPart {
transactions.Add(new Vouchers(entry) { transactions.Add(new Vouchers(entry) {
System = context.CurrentSystem, System = context.CurrentSystem,
Station = context.CurrentStation, Station = context.CurrentStation,
Faction = faction, Faction = relevantFaction,
ControllingFaction = context.ControllingFaction, ControllingFaction = context.ControllingFaction,
}); });
} }
@ -600,9 +603,13 @@ internal class FactionKillBondParser : TransactionParserPart {
throw new NotImplementedException(); throw new NotImplementedException();
} }
if (string.Compare(entry.VictimFaction, Thargoid.ThargoidFaction) == 0) { if (Factions.IsThargoid(entry.VictimFaction)) {
// Thargoid bonk // Thargoid bonk
transactions.Add(new ThargoidKill(entry)); transactions.Add(new ThargoidKill(entry) {
System = context.CurrentSystem,
Faction = Factions.PilotsFederation,
Station = context.CurrentStation,
});
} }
} }
} }

View File

@ -20,8 +20,8 @@ public class Vouchers : Transaction {
} }
return Entries return Entries
.OfType<RedeemVoucherEntry>() .OfType<RedeemVoucherEntry>()
.Where(x => x.FactionBounties.ContainsKey(Faction)) .ToList()
.Sum(x => x.FactionBounties[Faction]) .Sum(x => (long)x.GetBountyForFaction(Faction))
; ;
} }
} }

View File

@ -4,7 +4,7 @@ using System.Collections.Generic;
namespace EDPlayerJournal.Entries; namespace EDPlayerJournal.Entries;
public class RedeemVoucherEntry : Entry { public class RedeemVoucherEntry : Entry {
protected override void Initialise() { protected override void Initialise() {
Amount = (JSON.Value<int?>("Amount") ?? 0); Amount = (JSON.Value<ulong?>("Amount") ?? 0);
Type = JSON.Value<string>("Type"); Type = JSON.Value<string>("Type");
/* according to API, there should be a Factions structure */ /* according to API, there should be a Factions structure */
@ -12,7 +12,7 @@ public class RedeemVoucherEntry : Entry {
if (factions != null) { if (factions != null) {
foreach (JObject faction in factions.Children<JObject>()) { foreach (JObject faction in factions.Children<JObject>()) {
string? faction_name = faction.Value<string>("Faction"); string? faction_name = faction.Value<string>("Faction");
long? faction_bounty = faction.Value<long?>("Amount"); ulong? faction_bounty = faction.Value<ulong?>("Amount");
if (faction_name == null || faction_name.Length <= 0 || faction_bounty == null) { if (faction_name == null || faction_name.Length <= 0 || faction_bounty == null) {
continue; continue;
} }
@ -35,8 +35,29 @@ public class RedeemVoucherEntry : Entry {
} }
} }
public int Amount { get; set; } = 0; public ulong GetBountyForFaction(string? a) {
public string? Type { get; set; } = "Bounty"; if (a == null) {
public List<string> Factions { get; set; } = new List<string>(); return 0;
public Dictionary<string, long> FactionBounties { get; set; } = new Dictionary<string, long>(); }
var relevant = FactionBounties.Where(x => EDPlayerJournal.Factions.CompareFactions(x.Key, a) == 0).ToList();
if (relevant == null || relevant.Count() == 0) {
return 0;
}
return (ulong)relevant.Sum(x => (decimal)x.Value);
}
public ulong Amount { get; set; } = 0;
public string? Type { get; set; } = "Bounty";
/// <summary>
/// List of factions
/// </summary>
public List<string> Factions { get; set; } = new();
/// <summary>
/// Bounties awarded by faction
/// </summary>
public Dictionary<string, ulong> FactionBounties { get; set; } = new();
} }

View File

@ -40,10 +40,71 @@ public class Factions {
/// </summary> /// </summary>
public static string PilotsFederationVouchers = "PilotsFederation"; public static string PilotsFederationVouchers = "PilotsFederation";
/// <summary>
/// Friendly name of the Pilots Federation
/// </summary>
public static string PilotsFederation = "Pilots' Federation";
/// <summary> /// <summary>
/// Internal name for the Thargoid faction /// Internal name for the Thargoid faction
/// </summary> /// </summary>
public static string Thargoid = "$faction_Thargoid;"; public static string ThargoidInternal = "$faction_Thargoid;";
/// <summary>
/// Localised name of the Thargoids
/// </summary>
public static string Thargoid = "Thargoids";
public static bool IsPilotsFederation(string? name) {
if (name == null) {
return false;
}
if (string.Compare(name, PilotsFederationInternal) == 0 ||
string.Compare(name, PilotsFederationVouchers) == 0 ||
string.Compare(name, PilotsFederation) == 0) {
return true;
}
return false;
}
public static bool IsThargoid(string? name) {
if (name == null) {
return false;
}
if (string.Compare(name, ThargoidInternal) == 0 ||
string.Compare(name, Thargoid) == 0) {
return true;
}
return false;
}
/// <summary>
/// Compares two factions names and sees if they are the same faction. Since
/// factions can have an internal name, and a public name, this function takes
/// these into account.
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public static int CompareFactions(string? a, string? b) {
if (a == null || b == null) {
return -1;
}
if (IsPilotsFederation(a) && IsPilotsFederation(b)) {
return 0;
}
if (IsThargoid(a) && IsThargoid(b)) {
return 0;
}
return string.Compare(a, b);
}
} }
public class Faction { public class Faction {