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(FactionKillBondEntry entry) {
if (string.Compare(entry.VictimFaction, Thargoid.ThargoidFaction) != 0) {
if (!Factions.IsThargoid(entry.VictimFaction)) {
throw new Exception("Not a valid thargoid kill");
}

View File

@ -488,9 +488,12 @@ internal class RedeemVoucherParser : TransactionParserPart {
foreach (string faction in entry.Factions) {
bool relevantBond = false;
string relevantFaction = faction;
if (string.Compare(faction, Factions.PilotsFederationVouchers) == 0) {
// Target faction is pilots' federation, so we assume thargoid bonks
// Also assign this combat bond to the Pilots Federation
relevantFaction = Factions.PilotsFederation;
relevantBond = true;
}
@ -511,7 +514,7 @@ internal class RedeemVoucherParser : TransactionParserPart {
transactions.Add(new Vouchers(entry) {
System = context.CurrentSystem,
Station = context.CurrentStation,
Faction = faction,
Faction = relevantFaction,
ControllingFaction = context.ControllingFaction,
});
}
@ -600,9 +603,13 @@ internal class FactionKillBondParser : TransactionParserPart {
throw new NotImplementedException();
}
if (string.Compare(entry.VictimFaction, Thargoid.ThargoidFaction) == 0) {
if (Factions.IsThargoid(entry.VictimFaction)) {
// 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
.OfType<RedeemVoucherEntry>()
.Where(x => x.FactionBounties.ContainsKey(Faction))
.Sum(x => x.FactionBounties[Faction])
.ToList()
.Sum(x => (long)x.GetBountyForFaction(Faction))
;
}
}

View File

@ -4,7 +4,7 @@ using System.Collections.Generic;
namespace EDPlayerJournal.Entries;
public class RedeemVoucherEntry : Entry {
protected override void Initialise() {
Amount = (JSON.Value<int?>("Amount") ?? 0);
Amount = (JSON.Value<ulong?>("Amount") ?? 0);
Type = JSON.Value<string>("Type");
/* according to API, there should be a Factions structure */
@ -12,7 +12,7 @@ public class RedeemVoucherEntry : Entry {
if (factions != null) {
foreach (JObject faction in factions.Children<JObject>()) {
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) {
continue;
}
@ -35,8 +35,29 @@ public class RedeemVoucherEntry : Entry {
}
}
public int Amount { get; set; } = 0;
public ulong GetBountyForFaction(string? a) {
if (a == null) {
return 0;
}
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";
public List<string> Factions { get; set; } = new List<string>();
public Dictionary<string, long> FactionBounties { get; set; } = new Dictionary<string, long>();
/// <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>
public static string PilotsFederationVouchers = "PilotsFederation";
/// <summary>
/// Friendly name of the Pilots Federation
/// </summary>
public static string PilotsFederation = "Pilots' Federation";
/// <summary>
/// Internal name for the Thargoid faction
/// </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 {