Compare commits

...

20 Commits

Author SHA1 Message Date
84a26ad956 add a new mission name 2022-11-09 08:59:12 +01:00
f2778df092 fix bug in organic data class 2022-11-05 20:43:32 +01:00
1dd78d04b8 update mission list 2022-08-24 09:53:09 +02:00
8f9e1b1429 I have no idea anymore why I needed this function 2022-08-24 09:48:56 +02:00
3a5d4dd60f add load game entry 2022-04-28 10:16:40 +02:00
2bef2a6c81 StarPos can have negative values 2022-04-28 09:58:41 +02:00
9b31077a11 add Commander event 2022-04-28 09:57:50 +02:00
86bd9f76c1 add starpos to necessary events 2022-04-26 15:18:08 +02:00
1dd95aff82 implement new Update 11 journal file names 2022-03-15 18:08:09 +01:00
bace2f1db5 more mission names 2022-03-06 17:57:31 +01:00
fa8fdbceeb a few more mission names 2022-02-27 16:13:21 +01:00
9c978a03d5 more mission names 2022-02-26 13:17:30 +01:00
0ec8689210 more mission names 2022-02-24 22:46:59 +01:00
f367b99fa8 add a few new mission names 2022-02-24 22:42:27 +01:00
2c848505cb add mission name reported by Shakaka 2022-02-14 18:07:14 +01:00
bc0d4265d9 also change other mission ids 2022-02-14 17:46:53 +01:00
e8df57b55a missionids seem to require ulong 2022-02-14 17:45:41 +01:00
6784eba6c6 refactor MissionAccepted 2022-02-14 17:44:41 +01:00
2813a19186 provide faction and target faction in completed missions 2022-02-14 17:25:38 +01:00
69f76ba3fb provide detailed faction information from Location and FSDJump 2022-02-12 19:49:11 +01:00
17 changed files with 332 additions and 79 deletions

1
.gitignore vendored
View File

@@ -7,3 +7,4 @@
/bin/Release /bin/Release
/bin/Debug /bin/Debug
/packages/Newtonsoft.Json.13.0.1 /packages/Newtonsoft.Json.13.0.1
/.vs/edjournal/v17/.suo

16
CommanderEntry.cs Normal file
View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EDJournal {
public class CommanderEntry : Entry {
public string Name { get; set; }
public string FID { get; set; }
protected override void Initialise() {
Name = JSON.Value<string>("Name") ?? "";
FID = JSON.Value<string>("FID") ?? "";
}
}
}

View File

@@ -13,12 +13,14 @@ namespace EDJournal {
public class Entry { public class Entry {
private static readonly Dictionary<string, Type> classes = new Dictionary<string, Type> { private static readonly Dictionary<string, Type> classes = new Dictionary<string, Type> {
{ Events.Bounty, typeof(BountyEntry) }, { Events.Bounty, typeof(BountyEntry) },
{ Events.Commander, typeof(CommanderEntry) },
{ Events.CommitCrime, typeof(CommitCrimeEntry) }, { Events.CommitCrime, typeof(CommitCrimeEntry) },
{ Events.Died, typeof(DiedEntry) }, { Events.Died, typeof(DiedEntry) },
{ Events.Docked, typeof(DockedEntry) }, { Events.Docked, typeof(DockedEntry) },
{ Events.FactionKillBond, typeof(FactionKillBondEntry) }, { Events.FactionKillBond, typeof(FactionKillBondEntry) },
{ Events.FSDJump, typeof(FSDJumpEntry) }, { Events.FSDJump, typeof(FSDJumpEntry) },
{ Events.HullDamage, typeof(HullDamageEntry) }, { Events.HullDamage, typeof(HullDamageEntry) },
{ Events.LoadGame, typeof(LoadGameEntry) },
{ Events.Location, typeof(LocationEntry) }, { Events.Location, typeof(LocationEntry) },
{ Events.MarketBuy, typeof(MarketBuyEntry) }, { Events.MarketBuy, typeof(MarketBuyEntry) },
{ Events.MarketSell, typeof(MarketSellEntry) }, { Events.MarketSell, typeof(MarketSellEntry) },

View File

@@ -1,6 +1,7 @@
namespace EDJournal { namespace EDJournal {
public class Events { public class Events {
public static readonly string Bounty = "Bounty"; public static readonly string Bounty = "Bounty";
public static readonly string Commander = "Commander";
public static readonly string CommitCrime = "CommitCrime"; public static readonly string CommitCrime = "CommitCrime";
public static readonly string Died = "Died"; public static readonly string Died = "Died";
public static readonly string Docked = "Docked"; public static readonly string Docked = "Docked";
@@ -8,6 +9,7 @@
public static readonly string FighterDestroyed = "FighterDestroyed"; public static readonly string FighterDestroyed = "FighterDestroyed";
public static readonly string FSDJump = "FSDJump"; public static readonly string FSDJump = "FSDJump";
public static readonly string HullDamage = "HullDamage"; public static readonly string HullDamage = "HullDamage";
public static readonly string LoadGame = "LoadGame";
public static readonly string Location = "Location"; public static readonly string Location = "Location";
public static readonly string MarketBuy = "MarketBuy"; public static readonly string MarketBuy = "MarketBuy";
public static readonly string MarketSell = "MarketSell"; public static readonly string MarketSell = "MarketSell";

View File

@@ -1,19 +1,32 @@
using Newtonsoft.Json.Linq; using System.Collections.Generic;
using Newtonsoft.Json.Linq;
namespace EDJournal { namespace EDJournal {
public class FSDJumpEntry : Entry { public class FSDJumpEntry : Entry {
protected override void Initialise() { protected override void Initialise() {
SystemAddress = JSON.Value<ulong?>("SystemAddress") ?? 0; SystemAddress = JSON.Value<ulong?>("SystemAddress") ?? 0;
StarSystem = JSON.Value<string>("StarSystem"); StarSystem = JSON.Value<string>("StarSystem");
StarPos = JSON.Value<JArray>("StarPos").ToObject<long[]>();
var faction = JSON.Value<JObject>("SystemFaction"); var faction = JSON.Value<JObject>("SystemFaction");
if (faction != null) { if (faction != null) {
SystemFaction = faction.Value<string>("Name"); SystemFaction = faction.Value<string>("Name");
} }
JArray factions = JSON.Value<JArray>("Factions");
if (factions != null) {
foreach (JObject system_faction in factions) {
Faction f = Faction.FromJSON(system_faction);
if (f != null) {
SystemFactions.Add(f);
} }
}
}
}
public long[] StarPos { get; set; }
public string StarSystem { get; set; } public string StarSystem { get; set; }
public string SystemFaction { get; set; } public string SystemFaction { get; set; }
public ulong SystemAddress { get; set; } public ulong SystemAddress { get; set; }
public List<Faction> SystemFactions { get; set; } = new List<Faction>();
} }
} }

102
Faction.cs Normal file
View File

@@ -0,0 +1,102 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
namespace EDJournal {
public class FactionState {
public string State { get; set; }
public long Trend { get; set; }
public static FactionState FromJSON(JObject j) {
if (j == null) {
return null;
}
FactionState s = new FactionState() {
State = j.Value<string>("State") ?? "",
Trend = j.Value<long?>("Trend") ?? 0,
};
if (string.IsNullOrEmpty(s.State)) {
return null;
}
return s;
}
}
public class Faction {
public string Name { get; set; }
public string FactionState { get; set; }
public string Government { get; set; }
public double Influence { get; set; }
public string Allegiance { get; set; }
public string Happiness { get; set; }
public string HappinessLocalised { get; set; }
public double MyReputation { get; set; }
public bool SquadronFaction { get; set; } = false;
public bool HomeSystem { get; set; } = false;
public List<FactionState> RecoveringStates { get; set; } = new List<FactionState>();
public List<FactionState> ActiveStates { get; set; } = new List<FactionState>();
public List<FactionState> PendingStates { get; set; } = new List<FactionState>();
public static Faction FromJSON(JObject j) {
if (j == null) {
return null;
}
Faction f = new Faction() {
Name = j.Value<string>("Name") ?? "",
FactionState = j.Value<string>("FactionState") ?? "",
Government = j.Value<string>("Government") ?? "",
Influence = j.Value<double?>("Influence") ?? 1.0,
Allegiance = j.Value<string>("Allegiance") ?? "",
Happiness = j.Value<string>("Happiness") ?? "",
HappinessLocalised = j.Value<string>("Happiness_Localised") ?? "",
MyReputation = j.Value<double?>("MyReputation") ?? 1.0,
SquadronFaction = j.Value<bool?>("SquadronFaction") ?? false,
HomeSystem = j.Value<bool?>("HomeSystem") ?? false,
};
if (string.IsNullOrEmpty(f.Name)) {
return null;
}
JArray recovering_states = j.Value<JArray>("RecoveringStates");
if (recovering_states != null) {
foreach (JObject s in recovering_states) {
FactionState state = EDJournal.FactionState.FromJSON(s);
if (state != null) {
f.RecoveringStates.Add(state);
}
}
}
JArray active_states = j.Value<JArray>("ActiveStates");
if (active_states != null) {
foreach (JObject s in active_states) {
FactionState state = EDJournal.FactionState.FromJSON(s);
if (state != null) {
f.ActiveStates.Add(state);
}
}
}
JArray pending_states = j.Value<JArray>("PendingStates");
if (pending_states != null) {
foreach (JObject s in pending_states) {
FactionState state = EDJournal.FactionState.FromJSON(s);
if (state != null) {
f.PendingStates.Add(state);
}
}
}
return f;
}
}
}

View File

@@ -8,24 +8,31 @@ using System.Globalization;
namespace EDJournal { namespace EDJournal {
public class JournalFile : IComparable<JournalFile> public class JournalFile : IComparable<JournalFile>
{ {
private string fullpath = null; public string FullPath { get; set; }
private string part = null; public int Part { get; set; }
private int intpart = 0; public DateTime DateTime { get; set; }
private DateTime datetime; public DateTime NormalisedDateTime { get; set; }
private DateTime normalised;
private List<Entry> entries = new List<Entry>(); public List<Entry> entries = new List<Entry>();
private static Regex fileregex = new Regex("Journal\\.(\\d+)\\.(\\d+)\\.log"); private static Regex fileregex = new Regex("Journal\\.(\\d+)\\.(\\d+)\\.log");
private static Regex update11regex = new Regex("Journal\\.([^\\.]+)\\.(\\d+).log");
private static string iso8601 = "yyyyMMddTHHmmss"; private static string iso8601 = "yyyyMMddTHHmmss";
private static string iso8601_notime = "yyyyMMdd";
public string FullPath => fullpath;
public static bool VerifyFile(string path) { public static bool VerifyFile(string path) {
string filename = Path.GetFileName(path); string filename = Path.GetFileName(path);
var matches = fileregex.Matches(filename); var matches = fileregex.Matches(filename);
return matches.Count != 0; if (matches.Count != 0) {
return true;
}
matches = update11regex.Matches(filename);
if (matches.Count != 0) {
return true;
}
return false;
} }
private void SetFilename(string path) { private void SetFilename(string path) {
@@ -35,32 +42,50 @@ namespace EDJournal {
} }
var matches = fileregex.Matches(filename); var matches = fileregex.Matches(filename);
if (matches.Count < 1) { if (matches.Count == 0) {
throw new JournalException(string.Format("Invalid journal file: {0}", filename)); matches = update11regex.Matches(filename);
if (matches.Count == 0) {
throw new JournalException(string.Format("invalid file format: {0}", filename));
}
} }
this.fullpath = path; FullPath = path;
this.part = matches[0].Groups[2].ToString(); var groups = matches[0].Groups;
this.intpart = int.Parse(part); string part = groups[2].ToString();
string timestamp = groups[1].ToString();
if (!timestamp.Contains("T")) {
/* pre update 11 file
*/
// The ISO is not quite correct on journal filenames, so build // The ISO is not quite correct on journal filenames, so build
// a proper ISO 8601 date time stamp out of it. // a proper ISO 8601 date time stamp out of it.
var date = new StringBuilder(); var date = new StringBuilder();
date.Append("20"); // Add the missing century in front. date.Append("20"); // Add the missing century in front.
date.Append(matches[0].Groups[1].ToString()); date.Append(timestamp);
date.Insert(8, "T"); // Add the "T" separating date and time date.Insert(8, "T"); // Add the "T" separating date and time
this.datetime = DateTime.ParseExact(date.ToString(), iso8601, CultureInfo.InvariantCulture);
this.normalised = DateTime.Parse(this.datetime.ToShortDateString()); timestamp = date.ToString();
} else {
/* post update 11 file, remove dashes
*/
timestamp = timestamp.Replace("-", "");
}
this.DateTime = DateTime.ParseExact(timestamp, iso8601, CultureInfo.InvariantCulture);
this.Part = int.Parse(part);
this.NormalisedDateTime = DateTime.Parse(DateTime.ToShortDateString());
} }
public int CompareTo(JournalFile other) { public int CompareTo(JournalFile other) {
if (datetime == null || other.datetime == null) { if (DateTime == null || other.DateTime == null) {
return 0; return 0;
} }
var comp = DateTime.Compare(datetime, other.datetime); var comp = DateTime.Compare(DateTime, other.DateTime);
if (comp == 0) { if (comp == 0) {
/* If we have the exact same datetime we compare by parts. /* If we have the exact same datetime we compare by parts.
*/ */
return intpart - other.intpart; return Part - other.Part;
} else { } else {
return comp; return comp;
} }
@@ -70,18 +95,6 @@ namespace EDJournal {
SetFilename(path); SetFilename(path);
} }
public DateTime Timestamp {
get { return datetime; }
}
public DateTime NormalisedTimestamp {
get { return normalised; }
}
public int Part {
get { return intpart; }
}
public IEnumerable<Entry> Entries { public IEnumerable<Entry> Entries {
get { get {
if (entries == null || entries.Count == 0) { if (entries == null || entries.Count == 0) {
@@ -101,7 +114,7 @@ namespace EDJournal {
/* This needs to be done this way, otherwise, if the game is still running the journal files cannot /* This needs to be done this way, otherwise, if the game is still running the journal files cannot
* be accessed. And it is very much convenient to generate logs while the game is still running. * be accessed. And it is very much convenient to generate logs while the game is still running.
*/ */
using (var fs = new FileStream(this.fullpath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (var fs = new FileStream(FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
using (var sr = new StreamReader(fs, Encoding.UTF8)) { using (var sr = new StreamReader(fs, Encoding.UTF8)) {
string line = null; string line = null;
while ((line = sr.ReadLine()) != null) { while ((line = sr.ReadLine()) != null) {

52
LoadGameEntry.cs Normal file
View File

@@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EDJournal {
public class LoadGameEntry : Entry {
public string Commander { get; set; }
public string FID { get; set; }
public bool Horizons { get; set; }
public bool Odyssey { get; set; }
public string Ship { get; set; }
public long ShipID { get; set; }
public bool StartLanded { get; set; }
public bool StartDead { get; set; }
public string GameMode { get; set; }
public string Group { get; set; }
public long Credits { get; set; }
public long Loan { get; set; }
public string ShipName { get; set; }
public string ShipIdent { get; set; }
public double FuelLevel { get; set; }
public double FuelCapacity { get; set; }
protected override void Initialise() {
Commander = JSON.Value<string>("Commander") ?? "";
FID = JSON.Value<string>("FID") ?? "";
// Game
Horizons = JSON.Value<bool?>("Horizons") ?? false;
Odyssey = JSON.Value<bool?>("Odyssey") ?? false;
// Ships
Ship = JSON.Value<string>("Ship") ?? "";
ShipID = JSON.Value<long?>("ShipID") ?? 0;
ShipName = JSON.Value<string>("ShipName") ?? "";
ShipIdent = JSON.Value<string>("ShipIdent") ?? "";
// Fuel
FuelLevel = JSON.Value<double?>("FuelLevel") ?? 0.0;
FuelCapacity = JSON.Value<double?>("FuelCapacity") ?? 0.0;
// Landed/Dead
StartLanded = JSON.Value<bool?>("StartLanded") ?? false;
StartDead = JSON.Value<bool?>("StartDead") ?? false;
// GameMode
GameMode = JSON.Value<string>("GameMode") ?? "";
// Group
Group = JSON.Value<string>("Group") ?? "";
// Wealth
Credits = JSON.Value<long?>("Credits") ?? 0;
Loan = JSON.Value<long?>("Loan") ?? 0;
}
}
}

View File

@@ -13,17 +13,31 @@ namespace EDJournal {
public ulong SystemAddress { get; set; } public ulong SystemAddress { get; set; }
public string Body { get; set; } public string Body { get; set; }
public bool Docked { get; set; } public bool Docked { get; set; }
public long[] StarPos { get; set; }
public List<Faction> SystemFactions { get; set; } = new List<Faction>();
protected override void Initialise() { protected override void Initialise() {
StarSystem = JSON.Value<string>("StarSystem") ?? ""; StarSystem = JSON.Value<string>("StarSystem") ?? "";
SystemAddress = JSON.Value<ulong?>("SystemAddress") ?? 0; SystemAddress = JSON.Value<ulong?>("SystemAddress") ?? 0;
Docked = JSON.Value<bool?>("Docked") ?? false; Docked = JSON.Value<bool?>("Docked") ?? false;
StationName = JSON.Value<string>("StationName") ?? ""; StationName = JSON.Value<string>("StationName") ?? "";
StarPos = JSON.Value<JArray>("StarPos").ToObject<long[]>();
JObject systemfaction = JSON.Value<JObject>("SystemFaction"); JObject systemfaction = JSON.Value<JObject>("SystemFaction");
if (systemfaction != null) { if (systemfaction != null) {
SystemFaction = systemfaction.Value<string>("Name") ?? ""; SystemFaction = systemfaction.Value<string>("Name") ?? "";
} }
JArray factions = JSON.Value<JArray>("Factions");
if (factions != null) {
foreach (JObject system_faction in factions) {
Faction f = Faction.FromJSON(system_faction);
if (f != null) {
SystemFactions.Add(f);
}
}
}
} }
} }
} }

View File

@@ -1,10 +1,9 @@
namespace EDJournal { namespace EDJournal {
public class MissionAbandonedEntry : Entry { public class MissionAbandonedEntry : Entry {
private int missionid = 0; public ulong MissionID { get; set; }
public int MissionID => missionid;
protected override void Initialise() { protected override void Initialise() {
missionid = JSON.Value<int?>("MissionID") ?? 0; MissionID = JSON.Value<ulong?>("MissionID") ?? 0;
} }
} }
} }

View File

@@ -1,33 +1,24 @@
namespace EDJournal { namespace EDJournal {
public class MissionAcceptedEntry : Entry { public class MissionAcceptedEntry : Entry {
private string faction = null; public string Faction { get; set; }
private string targetfaction = null; public string TargetFaction { get; set; }
private string name = null; public string Name { get; set; }
private string localisedname = null; public string LocalisedName { get; set; }
private string localisedtargettype = null; public string LocalisedTargetType { get; set; }
private int killcount = 0; public int KillCount { get; set; }
private int missionid = 0; public ulong MissionID { get; set; }
private int reward = 0; public long Reward { get; set; }
public string Faction => faction;
public string TargetFaction => targetfaction;
public string Name => name;
public string LocalisedName => localisedname;
public string LocalisedTargetType => localisedtargettype;
public int KillCount => killcount;
public int MissionID => missionid;
public int Reward => reward;
protected override void Initialise() { protected override void Initialise() {
faction = JSON.Value<string>("Faction") ?? ""; Faction = JSON.Value<string>("Faction") ?? "";
targetfaction = JSON.Value<string>("TargetFaction") ?? ""; TargetFaction = JSON.Value<string>("TargetFaction") ?? "";
name = JSON.Value<string>("Name") ?? ""; Name = JSON.Value<string>("Name") ?? "";
localisedname = JSON.Value<string>("LocalisedName") ?? ""; LocalisedName = JSON.Value<string>("LocalisedName") ?? "";
localisedtargettype = JSON.Value<string>("TargetType_Localised") ?? ""; LocalisedTargetType = JSON.Value<string>("TargetType_Localised") ?? "";
killcount = JSON.Value<int?>("KillCount") ?? 0; KillCount = JSON.Value<int?>("KillCount") ?? 0;
missionid = JSON.Value<int?>("MissionID") ?? 0; MissionID = JSON.Value<ulong?>("MissionID") ?? 0;
reward = JSON.Value<int?>("Reward") ?? 0; Reward = JSON.Value<long?>("Reward") ?? 0;
} }
} }
} }

View File

@@ -13,8 +13,10 @@ namespace EDJournal {
public Dictionary<string, Dictionary<ulong, string>> Influences => influences; public Dictionary<string, Dictionary<ulong, string>> Influences => influences;
protected override void Initialise() { protected override void Initialise() {
MissionID = JSON.Value<int?>("MissionID") ?? 0; MissionID = JSON.Value<ulong?>("MissionID") ?? 0;
Name = JSON.Value<string>("Name"); Name = JSON.Value<string>("Name");
Faction = JSON.Value<string>("Faction") ?? "";
TargetFaction = JSON.Value<string>("TargetFaction") ?? "";
if (JSON.ContainsKey("Commodity_Localised")) { if (JSON.ContainsKey("Commodity_Localised")) {
Commodity = JSON.Value<string>("Commodity_Localised"); Commodity = JSON.Value<string>("Commodity_Localised");
} }
@@ -68,7 +70,9 @@ namespace EDJournal {
public string Commodity { get; set; } public string Commodity { get; set; }
public int Count { get; set; } public int Count { get; set; }
public int Donated { get; set; } public int Donated { get; set; }
public int MissionID { get; set; } public ulong MissionID { get; set; }
public string Faction { get; set; }
public string TargetFaction { get; set; }
private void MakeHumanReadableName() { private void MakeHumanReadableName() {
if (readable_name != null || Name == null) { if (readable_name != null || Name == null) {

View File

@@ -1,7 +1,7 @@
namespace EDJournal { namespace EDJournal {
public class MissionFailedEntry : Entry { public class MissionFailedEntry : Entry {
public string Name { get; set; } public string Name { get; set; }
public int MissionID { get; set; } public ulong MissionID { get; set; }
public int Fine { get; set; } public int Fine { get; set; }
public string HumanReadableName { public string HumanReadableName {
@@ -12,7 +12,7 @@
protected override void Initialise() { protected override void Initialise() {
Name = JSON.Value<string>("Name") ?? ""; Name = JSON.Value<string>("Name") ?? "";
MissionID = JSON.Value<int?>("MissionID") ?? 0; MissionID = JSON.Value<ulong?>("MissionID") ?? 0;
Fine = JSON.Value<int?>("Fine") ?? 0; Fine = JSON.Value<int?>("Fine") ?? 0;
} }
} }

View File

@@ -1,36 +1,46 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<Missions> <Missions>
<Mission Name="Chain_FindThePirateLord_name">Assassination (Pirate Lord) (Chain)</Mission>
<Mission Name="Chain_RegainFooting_name">Regain Footing (Chain)</Mission> <Mission Name="Chain_RegainFooting_name">Regain Footing (Chain)</Mission>
<Mission Name="Chain_SalvageJustice_name">Assassination (Legal) (Chain)</Mission>
<Mission Name="Mission_Altruism_name">Donate</Mission> <Mission Name="Mission_Altruism_name">Donate</Mission>
<Mission Name="Mission_AltruismCredits_Bust_name">Donate Credits (Bust)</Mission> <Mission Name="Mission_AltruismCredits_Bust_name">Donate Credits (Bust)</Mission>
<Mission Name="Mission_AltruismCredits_Famine_name">Donate Credits (Famine)</Mission> <Mission Name="Mission_AltruismCredits_Famine_name">Donate Credits (Famine)</Mission>
<Mission Name="Mission_AltruismCredits_name">Donate Credits</Mission> <Mission Name="Mission_AltruismCredits_name">Donate Credits</Mission>
<Mission Name="Mission_Assassinate_Illegal_BLOPS_name">Assassination (Illegal)</Mission>
<Mission Name="Mission_Assassinate_Legal_Corporate_name">Corporate Assassination (Legal)</Mission> <Mission Name="Mission_Assassinate_Legal_Corporate_name">Corporate Assassination (Legal)</Mission>
<Mission Name="Mission_Assassinate_name">Assassination</Mission> <Mission Name="Mission_Assassinate_name">Assassination</Mission>
<Mission Name="Mission_Assassinate_Planetary_name">Assassination (Planetary Scan)</Mission>
<Mission Name="Mission_Collect_Bust_name">Provide (Bust)</Mission> <Mission Name="Mission_Collect_Bust_name">Provide (Bust)</Mission>
<Mission Name="Mission_Collect_CivilLiberty_name">Provide (Civil Liberty)</Mission> <Mission Name="Mission_Collect_CivilLiberty_name">Provide (Civil Liberty)</Mission>
<Mission Name="Mission_Collect_CivilUnrest_name">Provide (Civil Unrest)</Mission> <Mission Name="Mission_Collect_CivilUnrest_name">Provide (Civil Unrest)</Mission>
<Mission Name="Mission_Collect_Famine_name">Provide (Famine)</Mission> <Mission Name="Mission_Collect_Famine_name">Provide (Famine)</Mission>
<Mission Name="Mission_Collect_Industrial_name">Provide (Industrial)</Mission> <Mission Name="Mission_Collect_Industrial_name">Provide (Industrial)</Mission>
<Mission Name="Mission_Collect_name">Provide</Mission> <Mission Name="Mission_Collect_name">Provide</Mission>
<Mission Name="Mission_Collect_RankEmp_name">Provide (Imperial Navy)</Mission>
<Mission Name="Mission_Collect_Retreat_name">Provide (Retreat)</Mission>
<Mission Name="Mission_Courier_Democracy_name">Courier (Democracy)</Mission> <Mission Name="Mission_Courier_Democracy_name">Courier (Democracy)</Mission>
<Mission Name="Mission_Courier_Elections_name">Courier (Elections)</Mission> <Mission Name="Mission_Courier_Elections_name">Courier (Elections)</Mission>
<Mission Name="Mission_Courier_Expansion_name">Courier (Expansion)</Mission> <Mission Name="Mission_Courier_Expansion_name">Courier (Expansion)</Mission>
<Mission Name="Mission_Courier_Famine_name">Courier (Famine)</Mission> <Mission Name="Mission_Courier_Famine_name">Courier (Famine)</Mission>
<Mission Name="Mission_Courier_Lockdown_name">Courier (Lockdown)</Mission> <Mission Name="Mission_Courier_Lockdown_name">Courier (Lockdown)</Mission>
<Mission Name="Mission_Courier_name">Courier</Mission> <Mission Name="Mission_Courier_name">Courier</Mission>
<Mission Name="Mission_Courier_RankEmp_name">Courier (Empire)</Mission> <Mission Name="Mission_Courier_RankEmp_name">Courier (Imperial Navy)</Mission>
<Mission Name="Mission_Delivery_Agriculture_name">Delivery (Agriculture)</Mission> <Mission Name="Mission_Delivery_Agriculture_name">Delivery (Agriculture)</Mission>
<Mission Name="Mission_Delivery_Boom_name">Delivery (Boom)</Mission> <Mission Name="Mission_Delivery_Boom_name">Delivery (Boom)</Mission>
<Mission Name="Mission_Delivery_Democracy_name">Delivery (Democracy)</Mission> <Mission Name="Mission_Delivery_Democracy_name">Delivery (Democracy)</Mission>
<Mission Name="Mission_Delivery_Investment_name">Delivery (Investment)</Mission> <Mission Name="Mission_Delivery_Investment_name">Delivery (Investment)</Mission>
<Mission Name="Mission_Delivery_name">Delivery</Mission> <Mission Name="Mission_Delivery_name">Delivery</Mission>
<Mission Name="Mission_Delivery_RankEmp_name">Delivery (Imperial Rank)</Mission> <Mission Name="Mission_Delivery_RankEmp_name">Delivery (Imperial Navy)</Mission>
<Mission Name="Mission_Delivery_Retreat_name">Delivery (Retreat)</Mission> <Mission Name="Mission_Delivery_Retreat_name">Delivery (Retreat)</Mission>
<Mission Name="Mission_DeliveryWing_name">Delivery (Wing)</Mission>
<Mission Name="Mission_DeliveryWing_War_name">Delivery (Wing) (War)</Mission>
<Mission Name="Mission_Hack_BLOPS_Boom_name">Hack Surface Installation (Boom)</Mission> <Mission Name="Mission_Hack_BLOPS_Boom_name">Hack Surface Installation (Boom)</Mission>
<Mission Name="Mission_Hack_BLOPS_Elections_name">Hack Surface Installation (Elections)</Mission>
<Mission Name="Mission_Hack_BLOPS_Expansion_name">Hack Surface Installation (Expansion)</Mission> <Mission Name="Mission_Hack_BLOPS_Expansion_name">Hack Surface Installation (Expansion)</Mission>
<Mission Name="MISSION_Hack_BLOPS_name">Hack Surface Installation</Mission> <Mission Name="MISSION_Hack_BLOPS_name">Hack Surface Installation</Mission>
<Mission Name="Mission_HackMegaship_name">Hack Megaship</Mission> <Mission Name="Mission_HackMegaship_name">Hack Megaship</Mission>
<Mission Name="Mission_LongDistanceExpedition_Explorer_Boom_name">Long Distance Expedition (Boom)</Mission>
<Mission Name="Mission_LongDistanceExpedition_name">Long Distance Expedition</Mission> <Mission Name="Mission_LongDistanceExpedition_name">Long Distance Expedition</Mission>
<Mission Name="Mission_Massacre_Conflict_CivilWar_name">Massacre (Civil War)</Mission> <Mission Name="Mission_Massacre_Conflict_CivilWar_name">Massacre (Civil War)</Mission>
<Mission Name="Mission_Massacre_name">Massacre</Mission> <Mission Name="Mission_Massacre_name">Massacre</Mission>
@@ -42,7 +52,10 @@
<Mission Name="Mission_OnFoot_Collect_Contact_MB_name">On Foot Collect</Mission> <Mission Name="Mission_OnFoot_Collect_Contact_MB_name">On Foot Collect</Mission>
<Mission Name="Mission_OnFoot_Collect_MB_name">On Foot Collection</Mission> <Mission Name="Mission_OnFoot_Collect_MB_name">On Foot Collection</Mission>
<Mission Name="Mission_OnFoot_Delivery_Contact_MB_name">On Foot Delivery (Contact)</Mission> <Mission Name="Mission_OnFoot_Delivery_Contact_MB_name">On Foot Delivery (Contact)</Mission>
<Mission Name="Mission_OnFoot_Hack_Upload_Covert_MB_name">On Foot Hack (Covert Upload)</Mission>
<Mission Name="Mission_OnFoot_Hack_Upload_MB_name">On Foot Hack (Upload)</Mission>
<Mission Name="Mission_OnFoot_Heist_POI_MB_name">On Foot Heist (POI)</Mission> <Mission Name="Mission_OnFoot_Heist_POI_MB_name">On Foot Heist (POI)</Mission>
<Mission Name="Mission_OnFoot_Massacre_MB_name">On Foot Massacre</Mission>
<Mission Name="Mission_OnFoot_Onslaught_MB_name">On Foot Onslaught</Mission> <Mission Name="Mission_OnFoot_Onslaught_MB_name">On Foot Onslaught</Mission>
<Mission Name="Mission_OnFoot_Onslaught_Offline_MB_name">On Foot Onslaught (Offline)</Mission> <Mission Name="Mission_OnFoot_Onslaught_Offline_MB_name">On Foot Onslaught (Offline)</Mission>
<Mission Name="Mission_OnFoot_ProductionHeist_Covert_MB_name">On Foot Production Heist (Covert)</Mission> <Mission Name="Mission_OnFoot_ProductionHeist_Covert_MB_name">On Foot Production Heist (Covert)</Mission>
@@ -51,10 +64,13 @@
<Mission Name="Mission_OnFoot_RebootRestore_MB_name">On Foot Reboot/Restore</Mission> <Mission Name="Mission_OnFoot_RebootRestore_MB_name">On Foot Reboot/Restore</Mission>
<Mission Name="Mission_OnFoot_Sabotage_Production_Covert_MB_name">On Foot Sabotage Production (Covert)</Mission> <Mission Name="Mission_OnFoot_Sabotage_Production_Covert_MB_name">On Foot Sabotage Production (Covert)</Mission>
<Mission Name="Mission_OnFoot_Salvage_MB_name">On Foot Salvage</Mission> <Mission Name="Mission_OnFoot_Salvage_MB_name">On Foot Salvage</Mission>
<Mission Name="Mission_OnFoot_SalvageIllegal_MB_name">On Foot Salvage (Illegal)</Mission>
<Mission Name="Mission_PassengerBulk_AIDWORKER_ARRIVING">Aid Workers Seeking Transport</Mission> <Mission Name="Mission_PassengerBulk_AIDWORKER_ARRIVING">Aid Workers Seeking Transport</Mission>
<Mission Name="Mission_PassengerVIP">Passenger (VIP)</Mission> <Mission Name="Mission_PassengerVIP">Passenger (VIP)</Mission>
<Mission Name="Mission_PassengerVIP_Criminal_BOOM_name">Passenger Criminal (VIP) (Boom)</Mission>
<Mission Name="Mission_PassengerVIP_name">Passenger (VIP)</Mission> <Mission Name="Mission_PassengerVIP_name">Passenger (VIP)</Mission>
<Mission Name="Mission_PassengerVIP_Scientist_FAMINE_name">Passenger (VIP) (Famine)</Mission> <Mission Name="Mission_PassengerVIP_Scientist_FAMINE_name">Passenger Scientist (VIP) (Famine)</Mission>
<Mission Name="Mission_PassengerVIP_Tourist_BOOM_name">Passenger Tourist (VIP) (Boom)</Mission>
<Mission Name="Mission_Rescue_Planet_name">Planet Rescue</Mission> <Mission Name="Mission_Rescue_Planet_name">Planet Rescue</Mission>
<Mission Name="MISSION_Salvage_CivilUnrest_name">Salvage (Civil Unrest)</Mission> <Mission Name="MISSION_Salvage_CivilUnrest_name">Salvage (Civil Unrest)</Mission>
<Mission Name="MISSION_Salvage_Expansion_name">Salvage (Expansion)</Mission> <Mission Name="MISSION_Salvage_Expansion_name">Salvage (Expansion)</Mission>

View File

@@ -38,7 +38,7 @@ namespace EDJournal {
public JournalFile GetLastFile() { public JournalFile GetLastFile() {
var lastfile = Files var lastfile = Files
.OrderBy(x => x.Timestamp) .OrderBy(x => x.DateTime)
.Last() .Last()
; ;
return lastfile; return lastfile;
@@ -62,5 +62,28 @@ namespace EDJournal {
journalfiles.Sort(); journalfiles.Sort();
} }
public Entry FindMostRecent(string entry) {
var entries = journalfiles
.OrderByDescending(x => x.DateTime)
.ToArray()
;
if (entries == null || entries.Length == 0) {
return null;
}
foreach(JournalFile file in entries) {
Entry found = file.Entries
.OrderByDescending(x => x.Timestamp)
.First(x => x.Event == entry)
;
if (found != null) {
return found;
}
}
return null;
}
} }
} }

View File

@@ -43,6 +43,8 @@ namespace EDJournal {
} }
} }
public long TotalValue => BioData.Sum(x => x.TotalValue); public long TotalValue {
get { return BioData.Sum(x => x.TotalValue); }
}
} }
} }

View File

@@ -42,6 +42,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="BountyEntry.cs" /> <Compile Include="BountyEntry.cs" />
<Compile Include="CommanderEntry.cs" />
<Compile Include="CommitCrimeEntry.cs" /> <Compile Include="CommitCrimeEntry.cs" />
<Compile Include="Credits.cs" /> <Compile Include="Credits.cs" />
<Compile Include="CrimeTypes.cs" /> <Compile Include="CrimeTypes.cs" />
@@ -50,6 +51,7 @@
<Compile Include="EliteDangerous.cs" /> <Compile Include="EliteDangerous.cs" />
<Compile Include="Entry.cs" /> <Compile Include="Entry.cs" />
<Compile Include="Events.cs" /> <Compile Include="Events.cs" />
<Compile Include="Faction.cs" />
<Compile Include="FactionKillBondEntry.cs" /> <Compile Include="FactionKillBondEntry.cs" />
<Compile Include="FSDJumpEntry.cs" /> <Compile Include="FSDJumpEntry.cs" />
<Compile Include="HullDamageEntry.cs" /> <Compile Include="HullDamageEntry.cs" />
@@ -57,6 +59,7 @@
<Compile Include="JournalException.cs" /> <Compile Include="JournalException.cs" />
<Compile Include="JournalFile.cs" /> <Compile Include="JournalFile.cs" />
<Compile Include="JournalStream.cs" /> <Compile Include="JournalStream.cs" />
<Compile Include="LoadGameEntry.cs" />
<Compile Include="LocationEntry.cs" /> <Compile Include="LocationEntry.cs" />
<Compile Include="MarketBuyEntry.cs" /> <Compile Include="MarketBuyEntry.cs" />
<Compile Include="MarketSellEntry.cs" /> <Compile Include="MarketSellEntry.cs" />