allow each step to generate more than one result

This commit is contained in:
Florian Stinglmayr 2022-01-21 20:03:17 +01:00
parent 7274436ff2
commit 3e15096dfc
6 changed files with 78 additions and 59 deletions

View File

@ -4,10 +4,8 @@ using EDJournal;
namespace EliteBGS.BGS { namespace EliteBGS.BGS {
public class Cartographics : LogEntry { public class Cartographics : LogEntry {
public Cartographics(MultiSellExplorationDataEntry e, string current_system, string current_station) { public Cartographics(MultiSellExplorationDataEntry e) {
Entries.Add(e); Entries.Add(e);
System = current_system;
Station = current_station;
} }
public int TotalSum { public int TotalSum {

View File

@ -35,6 +35,6 @@ namespace EliteBGS.BGS {
throw new NotImplementedException("not implemented"); throw new NotImplementedException("not implemented");
} }
public string Name => this.ToString(); public string Name => ToString();
} }
} }

View File

@ -65,7 +65,7 @@ namespace EliteBGS.BGS {
objectives.ForEach(x => x.Clear()); objectives.ForEach(x => x.Clear());
foreach (var e in relevant) { foreach (var e in relevant) {
LogEntry entry = null; List<LogEntry> results = new List<LogEntry>();
bool collate = false; bool collate = false;
if (e.Is(Events.Docked)) { if (e.Is(Events.Docked)) {
@ -94,10 +94,10 @@ namespace EliteBGS.BGS {
} }
} else if (e.Is(Events.MissionCompleted)) { } else if (e.Is(Events.MissionCompleted)) {
var completed = e as MissionCompletedEntry; var completed = e as MissionCompletedEntry;
entry = new MissionCompleted(completed) { results.Add(new MissionCompleted(completed) {
System = current_system, System = current_system,
Station = current_station Station = current_station
}; });
if (completed.HumanReadableNameWasGenerated) { if (completed.HumanReadableNameWasGenerated) {
/* If the human readable name was generated, we send a log message. Because the /* If the human readable name was generated, we send a log message. Because the
* generated names all sort of suck, we should have more human readable names in * generated names all sort of suck, we should have more human readable names in
@ -118,7 +118,7 @@ namespace EliteBGS.BGS {
"Please adjust start date to when the mission was accepted to include it in the list."); "Please adjust start date to when the mission was accepted to include it in the list.");
continue; continue;
} }
entry = new MissionFailed(accepted) { Failed = failed, System = current_system }; results.Add(new MissionFailed(accepted) { Failed = failed, System = current_system });
if (failed.HumanReadableName == null) { if (failed.HumanReadableName == null) {
OnLog?.Invoke("Human readable name for mission \"" + OnLog?.Invoke("Human readable name for mission \"" +
failed.Name + failed.Name +
@ -131,27 +131,28 @@ namespace EliteBGS.BGS {
} else if (e.Is(Events.MultiSellExplorationData)) { } else if (e.Is(Events.MultiSellExplorationData)) {
/* For multi-sell-exploraton-data only the controlling faction of the station sold to matters. /* For multi-sell-exploraton-data only the controlling faction of the station sold to matters.
*/ */
entry = new Cartographics(e as MultiSellExplorationDataEntry, current_system, current_station); results.Add(new Cartographics(e as MultiSellExplorationDataEntry) {
entry.Faction = controlling_faction; System = current_system,
Station = current_station,
Faction = controlling_faction
});
} else if (e.Is(Events.RedeemVoucher)) { } else if (e.Is(Events.RedeemVoucher)) {
/* Same for selling combat vouchers. Only the current controlling faction matters here. /* Same for selling combat vouchers. Only the current controlling faction matters here.
*/ */
entry = new Vouchers(); results.Add(new Vouchers(e as RedeemVoucherEntry) {
entry.Entries.Add(e); System = current_system,
entry.System = current_system; Station = current_station,
entry.Station = current_station; Faction = (e as RedeemVoucherEntry).Factions.FirstOrDefault() ?? "",
entry.Faction = (e as RedeemVoucherEntry).Factions.FirstOrDefault() ?? ""; ControllingFaction = controlling_faction,
entry.ControllingFaction = controlling_faction; });
collate = true; collate = true;
} else if (e.Is(Events.SellMicroResources)) { } else if (e.Is(Events.SellMicroResources)) {
entry = new SellMicroResources() { results.Add(new SellMicroResources(e as SellMicroResourcesEntry) {
Faction = controlling_faction, Faction = controlling_faction,
Station = current_station, Station = current_station,
System = current_system System = current_system
}; });
entry.Entries.Add(e);
} else if (e.Is(Events.MarketBuy)) { } else if (e.Is(Events.MarketBuy)) {
MarketBuyEntry buy = e as MarketBuyEntry; MarketBuyEntry buy = e as MarketBuyEntry;
if (string.IsNullOrEmpty(buy.Type) || buy.BuyPrice == 0) { if (string.IsNullOrEmpty(buy.Type) || buy.BuyPrice == 0) {
@ -169,60 +170,60 @@ namespace EliteBGS.BGS {
profit = sell.TotalSale - (avg * sell.Count); profit = sell.TotalSale - (avg * sell.Count);
} }
entry = new SellCargo() { results.Add(new SellCargo(e as MarketSellEntry) {
Faction = controlling_faction, Faction = controlling_faction,
Station = current_station, Station = current_station,
System = current_system, System = current_system,
Profit = profit Profit = profit
}; });
entry.Entries.Add(e);
} }
if (entry == null) { if (results == null || results.Count <= 0) {
continue; continue;
} }
/* Find all objectives that generally match. foreach (LogEntry entry in results) {
*/ /* Find all objectives that generally match.
var matches = objectives
.Where(x => x.Matches(entry) > 0)
.OrderBy(x => x.Matches(entry))
;
Objective objective = null;
if (matches != null && matches.Count() > 0) {
/* Then select the one that matches the most.
*/ */
objective = matches var matches = objectives
.Where(x => x.Matches(entry) > 0)
.OrderBy(x => x.Matches(entry)) .OrderBy(x => x.Matches(entry))
.Reverse()
.First()
; ;
} else {
/* create a new objective if we don't have one */
objective = new Objective() {
Station = entry.Station,
Faction = entry.Faction,
System = entry.System,
};
objectives.Add(objective);
}
LogEntry existing = null; Objective objective = null;
if (matches != null && matches.Count() > 0) {
existing = objective.LogEntries.Find(x => { /* Then select the one that matches the most.
try { */
return x.CompareTo(entry) == 0; objective = matches
} catch (NotImplementedException) { .OrderBy(x => x.Matches(entry))
return false; .Reverse()
.First()
;
} else {
/* create a new objective if we don't have one */
objective = new Objective() {
Station = entry.Station,
Faction = entry.Faction,
System = entry.System,
};
objectives.Add(objective);
} }
});
if (collate && existing != null) { LogEntry existing = null;
existing.Entries.Add(e);
} else if (!collate || existing == null) { existing = objective.LogEntries.Find(x => {
objective.LogEntries.Add(entry); try {
return x.CompareTo(entry) == 0;
} catch (NotImplementedException) {
return false;
}
});
if (collate && existing != null) {
existing.Entries.Add(e);
} else if (!collate || existing == null) {
objective.LogEntries.Add(entry);
}
} }
} }
} }

View File

@ -5,6 +5,13 @@ using EDJournal;
namespace EliteBGS.BGS { namespace EliteBGS.BGS {
public class SellCargo : LogEntry { public class SellCargo : LogEntry {
public int Profit { get; set; } public int Profit { get; set; }
public SellCargo() { }
public SellCargo(MarketSellEntry e) {
Entries.Add(e);
}
public override string ToString() { public override string ToString() {
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
var sold = Entries.OfType<MarketSellEntry>().ToArray(); var sold = Entries.OfType<MarketSellEntry>().ToArray();

View File

@ -12,6 +12,12 @@ namespace EliteBGS.BGS {
} }
} }
public SellMicroResources() { }
public SellMicroResources(SellMicroResourcesEntry e) {
Entries.Add(e);
}
public override string ToString() { public override string ToString() {
return string.Format("Sell Micro Resources: {0}", Credits.FormatCredits(TotalSum)); return string.Format("Sell Micro Resources: {0}", Credits.FormatCredits(TotalSum));
} }

View File

@ -6,6 +6,13 @@ namespace EliteBGS.BGS {
public class Vouchers : LogEntry { public class Vouchers : LogEntry {
private string type = null; private string type = null;
public Vouchers() {
}
public Vouchers(RedeemVoucherEntry e) {
Entries.Add(e);
}
public int TotalSum { public int TotalSum {
get { get {
return Entries return Entries