158 Commits

Author SHA1 Message Date
29dc6e9cba bump package version 2023-02-04 16:02:29 +01:00
aeb16c675b update changelog 2023-02-04 16:01:19 +01:00
00f94ef939 update documentation to point to codeberg 2023-02-04 15:59:50 +01:00
785efad4c0 add updated values post 14.02 for thargoid kills 2023-02-04 15:55:55 +01:00
3a968a7c55 fix compilation error 2023-02-04 15:55:45 +01:00
44d5a2b91c add a few more mission names 2023-01-10 09:27:33 +01:00
69b6e8b306 add a whole set of new mission names 2023-01-10 09:25:04 +01:00
3bfe599c11 fix a "bug" thanks to Shakaka 2023-01-03 16:33:29 +01:00
0b47b7331e fix bug with failed missions 2022-12-28 10:43:45 +01:00
2fae724bd2 condense mission fails down 2022-12-28 10:41:26 +01:00
132d090fd5 add API to determine on foot missions 2022-12-28 09:53:02 +01:00
9d686bea61 add mining mission name 2022-12-28 09:51:34 +01:00
78c2636a40 update FAQ 2022-12-20 18:49:29 +01:00
4549413b00 add warning for empty mission faction 2022-12-20 18:48:00 +01:00
f32f1f7dff update web page 2022-12-20 18:43:18 +01:00
86f2356f35 release the new version 2022-12-20 18:42:56 +01:00
6608f33d8d update versions 2022-12-20 18:42:27 +01:00
42987cdb12 update changelog 2022-12-20 18:42:20 +01:00
4f6376d39b remove old code 2022-12-20 18:38:33 +01:00
273d151358 add more mission names 2022-12-20 18:37:18 +01:00
a9ce5be266 fix mission fails 2022-12-20 18:33:09 +01:00
3bd0cc1055 update project data 2022-12-18 10:21:18 +01:00
1d1ea3f5ef update changelog 2022-12-18 10:20:03 +01:00
b12ab287b6 change date in NONA discord log to UTC 2022-12-18 10:15:17 +01:00
9deafa6653 fix incomplete transactions not having a CompletedAt 2022-12-18 10:13:35 +01:00
efbbaa8abf make system and faction bold 2022-12-16 21:48:16 +01:00
b96e40299d make pilot's federation combat bonds system contribution 2022-12-15 22:52:50 +01:00
194add4436 add more English mission names 2022-12-15 22:44:32 +01:00
02286e19a8 fix manual parsing with new time adjustments 2022-12-15 22:44:23 +01:00
b4e6b1b46c bump version in project file 2022-12-14 20:47:17 +01:00
e9b79a8c7a update changelog 2022-12-14 20:23:13 +01:00
86d27fb2a3 improve organic data formatting 2022-12-14 20:18:20 +01:00
271b151a72 fix newlines in mission log 2022-12-14 20:05:57 +01:00
e75e0773fd fiddle a bit more with the margins 2022-12-14 19:35:48 +01:00
ba9b108e5e add a toggle all 2022-12-14 19:28:23 +01:00
93a76bc429 tighten up margins 2022-12-14 19:09:59 +01:00
0cb8641056 add a button to reset time 2022-12-14 19:07:05 +01:00
c2082df6f1 give the splitter a colour 2022-12-14 18:53:03 +01:00
65d12cb052 use datetimepicker for more carefull transaction picking 2022-12-14 18:44:39 +01:00
44410e86c8 fix a bug where mission support wasn't shown 2022-12-14 18:19:46 +01:00
5c7580a3c0 allow resizing of the two fields 2022-12-14 18:17:25 +01:00
f0692c3936 apparently also medium combat zones can have two objectives 2022-12-14 17:40:25 +01:00
a181a3cdd2 fix readme 2022-12-11 12:37:14 +01:00
40d93e7c84 time for a new release 2022-12-11 12:35:27 +01:00
db192748b0 update changelog 2022-12-11 12:31:36 +01:00
a43ade2f3c adjust detection of high combat zones 2022-12-11 12:30:02 +01:00
a6b16fd5b8 commander entry happens when you relog
Use it to discern combat zone relogs.
2022-12-11 12:29:32 +01:00
99373b47c0 add repo README 2022-12-10 11:53:41 +01:00
f5f85586ec update changelog 2022-12-10 11:51:19 +01:00
ba4936ccb0 add more mission names 2022-12-10 10:03:31 +01:00
44774c5cad fix detection of medium ground combat zones 2022-12-10 09:52:48 +01:00
8d3d48d846 refactor to only filter transactions based on dates, not the entries 2022-12-09 17:52:03 +01:00
a3b54b1326 add DateTime property variant for CompletedAt 2022-12-09 17:51:46 +01:00
bf43262a8e add support for DropshipDeploy 2022-12-09 17:36:26 +01:00
ef8e71cd8a add more mission names for thargoid war 2022-12-08 19:06:59 +01:00
bd0d5cf0b6 update webpage 2022-12-07 23:25:45 +01:00
365c34bdb0 update changelog 2022-12-07 23:22:38 +01:00
7fa19c0733 add comment about old Orthrus value 2022-12-07 23:22:28 +01:00
ea07c4dbcb add number of passengers 2022-12-07 23:21:36 +01:00
6f9d3a64ff count all thargoid war missions as system contributions 2022-12-07 23:08:31 +01:00
abdaca2524 add a one line discord log for simple logging 2022-12-07 23:00:38 +01:00
1f673970ee fix formatting of combat zones 2022-12-07 22:43:24 +01:00
2608aeab6f don't bother detecting combat zones if we don't have enough data 2022-12-07 22:41:10 +01:00
b84d028115 add mission massacre wing for scouts 2022-12-07 22:39:14 +01:00
123fa15884 improve detection of combat zones by listening for messages 2022-12-07 16:42:44 +01:00
43ae93658f add receive text entry 2022-12-07 16:06:07 +01:00
8dea9fd094 remove unused includes 2022-12-07 15:46:31 +01:00
8a0d21d039 remove misleading comment 2022-12-07 15:43:07 +01:00
c20bc3d0bf update payouts for Orthrus in U14.1 2022-12-07 15:42:36 +01:00
cb8698dd42 thargoid combat zones are called "AX" combat zones ingame 2022-12-03 20:42:38 +01:00
f5f6d538f0 Orthrus has been confirmed with 50m payout 2022-12-03 20:37:39 +01:00
eaeaa5e0b4 add station state to the journal 2022-12-03 20:34:16 +01:00
3df82af239 update logs 2022-12-03 16:37:43 +01:00
0e92ee8ab4 only thargoid war missions are system contributions 2022-12-03 16:34:54 +01:00
72cb379c95 update nuget package info 2022-12-03 15:13:38 +01:00
84dfd73283 thargoid kills also contribute to the whole system 2022-12-03 15:05:09 +01:00
22d0bedf53 introduce the concept of system contributions 2022-12-03 15:01:46 +01:00
1e73c6b7eb move stuff further in to avoid scroll bars 2022-12-03 14:49:02 +01:00
661a4672d9 add support for thargoid combat zones 2022-12-03 14:47:31 +01:00
67966ca27a add code to detect thargoid combat zones 2022-12-03 14:42:32 +01:00
914aa43d33 lay ground work for supporting thargoid combat zones 2022-12-03 14:33:09 +01:00
8d72808fbf refactor missions a bit 2022-12-03 14:16:45 +01:00
ac3d1cd8b9 add thargoid passenger mission 2022-12-03 13:55:14 +01:00
634ba657b4 didn't hide the expander for objectives on ground combat zones 2022-12-03 11:24:44 +01:00
6b2bef0d30 update main page 2022-11-29 18:28:58 +01:00
d6b86d28aa update screenshot after declutter 2022-11-29 18:17:21 +01:00
bfae0adcae declutter GUI with expanders 2022-11-29 18:15:30 +01:00
454af4ad8f fix profit adjustment window 2022-11-29 18:05:08 +01:00
7f73159bb0 update changelog 2022-11-29 17:53:38 +01:00
0820998d3e fix formatting for combat zones 2022-11-29 17:52:48 +01:00
f14982f37a change "on foot" to "ground" 2022-11-29 17:52:27 +01:00
f0977b774b remove "Amount" from combat zones 2022-11-29 17:46:17 +01:00
04a839417e move combat zone adding to the tree view 2022-11-29 17:42:20 +01:00
93359321d6 remove some no longer used dependencies 2022-11-29 17:28:18 +01:00
6bbc063c25 update changelog 2022-11-29 17:22:58 +01:00
6fe6f5e26f set version to 0.2.0 2022-11-29 17:20:34 +01:00
9f1065c6ea shameless self plug with Salus icon 2022-11-29 17:09:45 +01:00
674757d734 add warning about legacy ED 2022-11-29 16:39:20 +01:00
712c416725 store in the transaction whether it was done in legacy or live 2022-11-29 16:30:46 +01:00
91bca70168 ground combat zones don't have objectives 2022-11-28 20:08:04 +01:00
800ac73331 add GUI for optional objectives in combat zones 2022-11-28 20:06:14 +01:00
d79ee5a153 fix payouts for medium combat zones 2022-11-28 19:49:52 +01:00
f683bc372e handle capshipbond entries 2022-11-28 19:47:41 +01:00
12ba6d4d96 add capshipbond entry 2022-11-28 19:43:51 +01:00
dd1d7ff091 store optional events in combat zone 2022-11-28 19:40:33 +01:00
65fec2cd1e two special warzone NPCs means high conflict zone 2022-11-28 19:28:55 +01:00
bb74d72b13 add properties for IsLive and IsLegacy 2022-11-28 13:32:54 +01:00
d2aadf9882 fix unit test 2022-11-28 11:00:11 +01:00
6b14909335 move elements a bit further in 2022-11-26 17:40:03 +01:00
db67ef21fa make system name and faction name bold 2022-11-26 17:39:31 +01:00
f3134d36d4 fix influence support 2022-11-26 17:32:08 +01:00
1a53a3ba8d add documentation about combat zones 2022-11-26 17:27:18 +01:00
c7e2f352f2 cleanup include 2022-11-26 17:18:11 +01:00
f7c3a1bb41 fix combat zone dialog 2022-11-26 17:15:23 +01:00
2648b1390b its On Foot 2022-11-26 17:12:57 +01:00
aad688026e its On Foot not OnFoot 2022-11-26 17:12:42 +01:00
a451392e93 remove adjust profit window 2022-11-26 17:10:52 +01:00
10351af7f9 also allow changing of profit through tree view 2022-11-26 17:09:01 +01:00
697cbc2bc6 collate combat zones 2022-11-26 16:27:51 +01:00
0cc8a1f29a FSDJump is also an instance change for combat zones 2022-11-26 16:22:35 +01:00
22396c9b22 add functionality to change grade of combat zones in the tree 2022-11-26 16:19:55 +01:00
8d95a42698 don't add faction for combat zone 2022-11-26 01:29:50 +01:00
aa7f0bcd1a collate murders 2022-11-26 00:39:06 +01:00
6e5f8f504f factions for onfoot murders are right there 2022-11-26 00:30:42 +01:00
e01d3a869d if player targeted warzone NPCs assume its medium or higher 2022-11-25 23:54:28 +01:00
1da4549e2c fix completed at for combat zones 2022-11-25 23:06:08 +01:00
0be9791abc reintroduce cleanup function 2022-11-25 18:06:30 +01:00
027f8a892d add function to determine whether entry is relevant 2022-11-25 18:06:19 +01:00
32e5898b02 collate vouchers together 2022-11-25 17:56:43 +01:00
34934c82a6 add new test data 2022-11-25 17:56:35 +01:00
5a8ea2940c include Hellriders bug as BGS oddity 2022-11-25 17:45:13 +01:00
a13a708c22 shorted mission format 2022-11-25 17:45:03 +01:00
fbd5a66156 fix ISO8601 parsing of datetime 2022-11-25 17:36:41 +01:00
0be0896e91 fix handling of incomplete transactions 2022-11-25 17:28:10 +01:00
f8559bbe06 update index to denote we need .NET 7 2022-11-25 17:22:05 +01:00
987d9c5f49 delete upgrade assistant files 2022-11-25 17:19:48 +01:00
24f3897582 update links 2022-11-25 17:18:40 +01:00
afa4e0d536 update index 2022-11-25 17:17:04 +01:00
1d8f03200b update documentation for newest version 2022-11-25 17:16:58 +01:00
955a108f2e add a highly rudimentary combat zone detector 2022-11-25 17:13:17 +01:00
fe28a4d17d remove unused folder 2022-11-25 16:09:41 +01:00
dc9e654351 remove collate function again 2022-11-25 16:04:21 +01:00
c2037f28e2 repair automatic refresh 2022-11-25 16:03:32 +01:00
e6e0233e6d handle incomplete transactions 2022-11-25 15:58:06 +01:00
1a6183ba9d incomplete transactions should not be internal 2022-11-25 15:57:59 +01:00
3a5d0a90ef improve reporting of combat vouchers and thargoid kills 2022-11-25 15:51:01 +01:00
8514331701 add support for thargoid vouchers 2022-11-25 15:48:00 +01:00
e8de768d01 implement thargoid bonds for pilots federation 2022-11-25 15:14:50 +01:00
61f1b10f29 improve log header if no system is known 2022-11-25 14:53:04 +01:00
e0e7cb5792 add thargoid formatter for logs 2022-11-25 14:48:59 +01:00
5f9fff3922 unknown system is better than no system 2022-11-25 14:39:45 +01:00
a49859b079 add thargoid kills to transaction parser 2022-11-25 13:45:02 +01:00
85848a7381 prepare transaction engine for thargoid kills 2022-11-25 12:34:11 +01:00
27cfdce912 remove legacy code for XML loading 2022-11-25 11:11:45 +01:00
091c443440 reintroduce human readable mission names 2022-11-25 10:44:48 +01:00
1d04579bb8 drop the "for $faction" line to save characters 2022-11-25 10:33:41 +01:00
411b3606f9 move EliteBGS GUI app to .NET 7 2022-11-24 19:38:19 +01:00
42f305c7ac rename project 2022-11-24 17:21:12 +01:00
121 changed files with 9209 additions and 967 deletions

View File

@@ -5,7 +5,14 @@ VisualStudioVersion = 17.3.32901.215
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EDPlayerJournal", "EDPlayerJournal\EDPlayerJournal.csproj", "{8148BB04-148E-41E4-A344-8E735E188BEE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EDPlayerJournalTests", "EDPlayerJournalTests\EDPlayerJournalTests.csproj", "{63F80451-B9DC-4B80-8DAD-03C7D587D54A}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EDPlayerJournalTests", "EDPlayerJournalTests\EDPlayerJournalTests.csproj", "{63F80451-B9DC-4B80-8DAD-03C7D587D54A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EliteBGS", "EliteBGS\EliteBGS.csproj", "{14B03115-B9D5-4006-A993-9A5069BB172E}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{1381D5DE-139E-4FEC-BDC4-A3FDADEAEE5C}"
ProjectSection(SolutionItems) = preProject
README.md = README.md
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -21,6 +28,10 @@ Global
{63F80451-B9DC-4B80-8DAD-03C7D587D54A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{63F80451-B9DC-4B80-8DAD-03C7D587D54A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{63F80451-B9DC-4B80-8DAD-03C7D587D54A}.Release|Any CPU.Build.0 = Release|Any CPU
{14B03115-B9D5-4006-A993-9A5069BB172E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{14B03115-B9D5-4006-A993-9A5069BB172E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{14B03115-B9D5-4006-A993-9A5069BB172E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{14B03115-B9D5-4006-A993-9A5069BB172E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@@ -16,6 +16,22 @@ the game:
}
```
## Bounty vouchers show up twice
Sometimes bounty vouchers are redeemed twice. This happens because FDev writes out two
`RedeemVoucher` entries with the same values:
```
{ "timestamp":"2022-11-20T14:30:30Z", "event":"RedeemVoucher", "Type":"bounty", "Amount":3197549,
"Factions":[ { "Faction":"Nova Paresa", "Amount":3197549 } ] }
{ "timestamp":"2022-11-20T14:30:34Z", "event":"RedeemVoucher", "Type":"bounty", "Amount":4785831,
"Factions":[ { "Faction":"", "Amount":723175 }, { "Faction":"Nova Paresa", "Amount":3197549 }, { "Faction":"Prismatic Imperium", "Amount":4062656 } ] }
```
Two separate events (apart by four seconds) containing the same entries twice. This
happens when you turn in one bounty manually, and then click the "redeem all" button
again, which contains the already turned in vouchers.
## Combat zones
Combat zones receive no mention within the player journal whatsoever. There is no event

View File

@@ -3,17 +3,72 @@ using System.Linq;
namespace EDPlayerJournal.BGS;
public class CombatZone : Transaction {
public string Type { get; set; } = "";
public string Grade { get; set; } = "";
public int Amount { get; set; } = 0;
public DateTime Completed { get; set; } = DateTime.UtcNow;
/// <summary>
/// Type, either on foot or ship
/// </summary>
public string Type { get; set; } = CombatZones.ShipCombatZone;
public override string CompletedAt {
/// <summary>
/// Difficulty type, low, medium or high. Null means unknown.
/// </summary>
public string? Grade { get; set; }
/// <summary>
/// Whether spec ops were won.
/// </summary>
public bool? SpecOps { get; set; }
/// <summary>
/// Whether captain was won
/// </summary>
public bool? Captain { get; set; }
/// <summary>
/// Whether correspondent objective was won
/// </summary>
public bool? Correspondent { get; set; }
/// <summary>
/// Whether cap ship objective was won
/// </summary>
public bool? CapitalShip { get; set; }
/// <summary>
/// How many optional objectives were completed?
/// </summary>
public int OptionalObjectivesCompleted {
get {
return Completed.ToString("dd.MM.yyyy HH:mm UTC");
if (IsGround) {
return 0;
}
return new List<bool?>() { SpecOps, Captain, Correspondent, CapitalShip }
.Where(x => x != null && x == true)
.Count()
;
}
}
/// <summary>
/// Returns true if it is an on foot/ground combat zone
/// </summary>
public bool IsGround {
get { return string.Compare(Type, CombatZones.GroundCombatZone) == 0; }
}
/// <summary>
/// Returns true if it is an on foot combat zone
/// </summary>
public bool IsShip {
get { return string.Compare(Type, CombatZones.ShipCombatZone) == 0; }
}
/// <summary>
/// Returns true if it is a thargoid combat zone
/// </summary>
public bool IsThargoid {
get { return string.Compare(Type, CombatZones.AXCombatZone) == 0; }
}
public override int CompareTo(Transaction? obj) {
if (obj == null || obj.GetType() != typeof(CombatZone)) {
return -1;
@@ -36,7 +91,10 @@ public class CombatZone : Transaction {
}
public override string ToString() {
return string.Format("Won {0} x {1} {2} Combat Zone(s) for {3}",
Amount, Grade, Type, Faction);
if (!string.IsNullOrEmpty(Grade)) {
return string.Format("Won {0} {1} Combat Zone", Grade, Type);
} else {
return string.Format("Won {0} Combat Zone", Type);
}
}
}

View File

@@ -2,11 +2,11 @@
namespace EDPlayerJournal.BGS;
public class FactionKillBonds : Transaction {
public int TotalSum {
public ulong TotalSum {
get {
return Entries
return (ulong)Entries
.OfType<FactionKillBondEntry>()
.Sum(x => x.Reward)
.Sum(x => (decimal)x.Reward)
;
}
}

View File

@@ -1,12 +1,16 @@
namespace EDPlayerJournal.BGS;
internal class IncompleteTransaction : Transaction {
using EDPlayerJournal.Entries;
namespace EDPlayerJournal.BGS;
public class IncompleteTransaction : Transaction {
public Transaction? UnderlyingTransaction { get; set; } = null;
public string Reason { get; set; } = "";
public IncompleteTransaction() { }
public IncompleteTransaction(Transaction? underlying, string reason) {
public IncompleteTransaction(Transaction? underlying, string reason, Entry entry) {
UnderlyingTransaction = underlying;
Reason = reason;
Entries.Add(entry);
}
}

View File

@@ -10,14 +10,23 @@ namespace EDPlayerJournal.BGS;
/// </summary>
public class InfluenceSupport : Transaction {
public string Influence { get; set; } = "";
/// <summary>
/// Relevant mission completed entry
/// </summary>
public MissionCompletedEntry? RelevantMission { get; set; }
public override string CompletedAt {
/// <summary>
/// Mission information
/// </summary>
public Mission? Mission { get; set; }
public override DateTime? CompletedAtDateTime {
get {
if (RelevantMission == null) {
return "";
return null;
}
return RelevantMission.Timestamp.ToString("dd.MM.yyyy hh:mm UTC");
return RelevantMission.Timestamp;
}
}
@@ -26,7 +35,7 @@ public class InfluenceSupport : Transaction {
string? missionname;
if (RelevantMission != null && RelevantMission.Mission != null) {
missionname = RelevantMission.Mission.LocalisedName;
missionname = RelevantMission.Mission.FriendlyName;
} else {
missionname = "UNKNOWN MISSION";
}

View File

@@ -1,54 +1,73 @@
using System.Text;
using System.Collections.Generic;
using System.Text;
using EDPlayerJournal.Entries;
namespace EDPlayerJournal.BGS;
public class MissionCompleted : Transaction {
public MissionCompletedEntry? CompletedEntry { get; set; }
public MissionAcceptedEntry? AcceptedEntry { get; set; }
public Mission? Mission { get; set; }
public MissionCompleted() { }
public MissionCompleted(MissionCompletedEntry e) {
Entries.Add(e);
public override DateTime? CompletedAtDateTime {
get {
if (CompletedEntry == null) {
return null;
}
return CompletedEntry.Timestamp;
}
}
public string MissionName {
get {
MissionCompletedEntry? c = Entries[0] as MissionCompletedEntry;
if (c == null || c.Mission == null) {
if (CompletedEntry == null || CompletedEntry.Mission == null) {
return "";
}
if (string.IsNullOrEmpty(c.Mission.LocalisedName)) {
return (c.Mission.Name ?? "");
} else {
return c.Mission.LocalisedName;
}
return CompletedEntry.Mission.FriendlyName;
}
}
public string Influence {
get {
MissionCompletedEntry? e = (Entries[0] as MissionCompletedEntry);
if (e == null || Faction == null || e.Mission == null) {
if (CompletedEntry == null || Faction == null || CompletedEntry.Mission == null) {
return "";
}
return (e.Mission.GetInfluenceForFaction(Faction, SystemAddress) ?? "");
return (CompletedEntry.Mission.GetInfluenceForFaction(Faction, SystemAddress) ?? "");
}
}
/// <summary>
/// Rescue missions contribute to the system.
/// </summary>
public override bool SystemContribution {
get {
if (Mission == null || Mission.Name == null) {
return false;
}
// If the mission starts with the name for thargoid war mission
// names, we assume its a system contribution
if (Mission.Name.Contains("Mission_TW_")) {
return true;
}
return false;
}
}
public override string ToString() {
if (Faction == null || Entries.Count <= 0) {
if (Faction == null || CompletedEntry == null || CompletedEntry.Mission == null) {
return "";
}
StringBuilder builder = new StringBuilder();
var entry = Entries[0] as MissionCompletedEntry;
if (entry == null || entry.Mission == null) {
return "";
}
var influence = entry.Mission.GetInfluenceForFaction(Faction, SystemAddress);
var influence = CompletedEntry.Mission.GetInfluenceForFaction(Faction, SystemAddress);
builder.AppendFormat("{0}", MissionName);
if (influence != "") {

View File

@@ -4,16 +4,13 @@ using EDPlayerJournal.Entries;
namespace EDPlayerJournal.BGS;
public class MissionFailed : Transaction {
public MissionFailedEntry? Failed { get; set; }
public MissionAcceptedEntry? Accepted { get; set; }
public Mission? Mission { get; set; }
public MissionFailed() { }
public MissionFailed(MissionAcceptedEntry accepted) {
if (accepted.Mission == null) {
throw new Exception("Mission cannot be null");
}
Accepted = accepted;
Faction = accepted.Mission.Faction;
public MissionFailed(MissionFailedEntry failed) {
Entries.Add(failed);
Failed = failed;
}
public override int CompareTo(Transaction? other) {
@@ -39,20 +36,15 @@ public class MissionFailed : Transaction {
return -1;
}
// +1 since the other entries are just copies of the one we have in our properties
public int Amount => Entries.Count + 1;
public override string ToString() {
StringBuilder builder = new StringBuilder();
if (Failed == null || Accepted == null) {
if (Failed == null || Mission == null) {
return "";
}
builder.AppendFormat("{0}x Mission failed: \"{1}\"",
Amount,
Failed?.Mission?.LocalisedName != null ?
Failed?.Mission?.LocalisedName : Failed?.Mission?.Name
builder.AppendFormat(" Mission failed: \"{0}\"",
Mission?.FriendlyName
);
return builder.ToString();

View File

@@ -1,664 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using EDPlayerJournal.Entries;
namespace EDPlayerJournal.BGS;
public class Report {
private List<Objective> objectives = new List<Objective>();
public delegate void OnLogDelegate(string log);
public event OnLogDelegate? OnLog;
public List<Objective> Objectives {
get { return objectives; }
set { objectives = value; }
}
public bool AddObjective(Objective objective) {
var found = objectives.Find(x => x.CompareTo(objective) == 0);
bool added = false;
if (found == null) {
objectives.Add(objective);
added = true;
}
return added;
}
public static bool IsRelevant(Entry e) {
return e.Is(Events.CommitCrime) ||
e.Is(Events.Docked) ||
e.Is(Events.FactionKillBond) ||
e.Is(Events.FSDJump) ||
e.Is(Events.Location) ||
e.Is(Events.MarketBuy) ||
e.Is(Events.MarketSell) ||
e.Is(Events.MissionAccepted) ||
e.Is(Events.MissionFailed) ||
e.Is(Events.MultiSellExplorationData) ||
e.Is(Events.RedeemVoucher) ||
e.Is(Events.SearchAndRescue) ||
e.Is(Events.SellExplorationData) ||
e.Is(Events.SellMicroResources) ||
e.Is(Events.SellOrganicData) ||
e.Is(Events.ShipTargeted) ||
e.Is(Events.MissionCompleted)
;
}
public void Scan(PlayerJournal journal, DateTime start, DateTime end) {
/* Log files only get rotated if you restart the game client. This means that there might
* be - say - entries from the 4th of May in the file with a timestamp of 3rd of May. This
* happens if you happen to play a session late into the night.
* At first I tried extracting the first and last line of a file to see the date range, but
* if you have a lot of files this becomes quite slow, and quite the memory hog (as journal
* files have to be read in their entirety to check this). So we assume that you can't play
* three days straight, and keep the code fast.
*/
DateTime actualstart = start.AddDays(-3);
List<Entry> entries = journal.Files
.Where(f => f.NormalisedDateTime >= actualstart && f.NormalisedDateTime <= end)
.SelectMany(e => e.Entries)
.ToList()
;
// Now further sort the list down to entries that are actually within the given datetime
// Note that entry datetimes are not normalised, so we have to sort until end + 1 day
DateTime actualend = end.AddDays(1);
entries = entries
.Where(e => e.Timestamp >= start && e.Timestamp < actualend)
.ToList()
;
Scan(entries);
}
public void Scan(List<Entry> entries) {
if (entries.Count <= 0) {
return;
}
List<Entry> relevant = entries
.Where(x => IsRelevant(x))
.ToList()
;
Dictionary<ulong, MissionAcceptedEntry> acceptedMissions = new Dictionary<ulong, MissionAcceptedEntry>();
Dictionary<string, long> buyCost = new Dictionary<string, long>();
Dictionary<ulong, string> systems = new Dictionary<ulong, string>();
Dictionary<string, string> npcfactions = new Dictionary<string, string>();
Dictionary<string, List<Faction>> system_factions = new Dictionary<string, List<Faction>>();
// A dictionary resolving to a station at which each mission was accepted
Dictionary<ulong, string> acceptedStations = new Dictionary<ulong, string>();
// A dictionary resolving to a system at which each mission was accepted
Dictionary<ulong, ulong> acceptedSystems = new Dictionary<ulong, ulong>();
string? current_system = null;
ulong? current_system_address = null;
string? current_station = null;
string? controlling_faction = null;
objectives.ForEach(x => x.Clear());
foreach (Entry e in relevant) {
List<Transaction> results = new List<Transaction>();
bool collate = false;
if (e.Is(Events.Docked)) {
DockedEntry? docked = e as DockedEntry;
if (docked == null) {
continue;
}
/* gleem the current station from this message
*/
current_station = docked.StationName;
current_system = docked.StarSystem;
controlling_faction = docked.StationFaction;
current_system_address = docked.SystemAddress;
if (current_system_address != null && current_system != null) {
if (!systems.ContainsKey(current_system_address.Value)) {
systems.Add(current_system_address.Value, current_system);
}
}
} else if (e.Is(Events.FSDJump)) {
/* Gleem current system and controlling faction from this message.
*/
FSDJumpEntry? fsd = e as FSDJumpEntry;
if (fsd == null || fsd.StarSystem == null) {
continue;
}
current_system_address = fsd.SystemAddress;
current_system = fsd.StarSystem;
controlling_faction = fsd.SystemFaction;
if (!systems.ContainsKey(fsd.SystemAddress)) {
systems.Add(fsd.SystemAddress, fsd.StarSystem);
}
if (!system_factions.ContainsKey(fsd.StarSystem) &&
fsd.SystemFactions.Count > 0) {
system_factions[fsd.StarSystem] = fsd.SystemFactions;
}
} else if (e.Is(Events.Location)) {
/* Get current system, faction name and station from Location message
*/
LocationEntry? location = e as LocationEntry;
if (location == null || location.StarSystem == null) {
continue;
}
current_system = location.StarSystem;
current_system_address = location.SystemAddress;
if (!systems.ContainsKey(location.SystemAddress)) {
systems.Add(location.SystemAddress, location.StarSystem);
}
if (!string.IsNullOrEmpty(location.SystemFaction)) {
controlling_faction = location.SystemFaction;
}
if (!string.IsNullOrEmpty(location.StationName)) {
current_station = location.StationName;
}
if (!system_factions.ContainsKey(location.StarSystem) &&
location.SystemFactions.Count > 0) {
system_factions[location.StarSystem] = location.SystemFactions;
}
} else if (e.Is(Events.ShipTargeted)) {
ShipTargetedEntry? targeted = e as ShipTargetedEntry;
if (targeted == null) {
continue;
}
if (string.IsNullOrEmpty(targeted.PilotNameLocalised) ||
string.IsNullOrEmpty(targeted.Faction)) {
continue;
}
npcfactions[targeted.PilotNameLocalised] = targeted.Faction;
} else if (e.Is(Events.CommitCrime)) {
CommitCrimeEntry? crime = e as CommitCrimeEntry;
if (crime == null) {
continue;
}
string? faction = crime.Faction;
if (faction == null || !crime.IsMurder) {
/* we don't care about anything but murder for now */
continue;
}
/* use localised victim name if we have it, otherwise use normal name */
string? victim = crime.VictimLocalised;
if (string.IsNullOrEmpty(victim)) {
victim = crime.Victim;
}
if (string.IsNullOrEmpty(victim)) {
continue;
}
if (!npcfactions.ContainsKey(victim)) {
/* The faction in the crime report is the faction that issues the bounty,
* and not the faction of the victim.
*/
OnLog?.Invoke(string.Format(
"No faction found for victim \"{0}\", using faction that issued the bounty instead.",
victim, crime.Faction
));
} else {
faction = npcfactions[victim];
}
results.Add(new FoulMurder(crime) {
System = current_system,
Faction = faction,
});
collate = true;
} else if (e.Is(Events.MissionCompleted)) {
MissionCompletedEntry? completed = e as MissionCompletedEntry;
if (completed == null ||
completed.Mission == null) {
continue;
}
MissionAcceptedEntry? accepted = null;
MissionCompleted? main_mission = null;
ulong accepted_address;
string? accepted_system;
string? target_faction_name = completed.Mission.TargetFaction;
string? source_faction_name = completed.Mission.Faction;
if (!acceptedMissions.TryGetValue(completed.Mission.MissionID, out accepted)) {
OnLog?.Invoke(string.Format(
"Unable to find mission acceptance for mission \"{0}\". " +
"Please extend range to include the mission acceptance.", completed.Mission.LocalisedName
));
continue;
}
if (!acceptedSystems.TryGetValue(completed.Mission.MissionID, out accepted_address)) {
OnLog?.Invoke(string.Format(
"Unable to figure out in which system mission \"{0}\" was accepted.", completed.Mission.LocalisedName
));
continue;
}
if (!systems.TryGetValue(accepted_address, out accepted_system)) {
OnLog?.Invoke(string.Format(
"Unable to figure out in which system mission \"{0}\" was accepted.", completed.Mission.LocalisedName
));
continue;
}
foreach (var other in completed.Mission.Influences) {
string faction = other.Key;
if (string.IsNullOrEmpty(faction)) {
OnLog?.Invoke(string.Format(
"Mission \"{0}\" has empty faction name in influence block, "+
"so this influence support was ignored. " +
"Please check the README on why this happens.", completed.Mission.LocalisedName)
);
continue;
}
/* Now comes the fun part. Sometimes the influence list is empty for a faction.
* This happens if the faction in question
*/
if (other.Value.Count() == 0) {
OnLog?.Invoke(string.Format(
"Mission \"{0}\" gave no influence to \"{1}\", so we assume this is because the " +
"faction is in a conflict and cannot gain influence right now. " +
"If this assessment is wrong, just remove the entry from the objective list.",
completed.Mission.LocalisedName, faction
));
if (string.Compare(target_faction_name, faction, true) == 0) {
/* here we assume that if the faction in question is the target faction,
* that we gave said target faction no influence in the target system, aka
* current system
*/
if (current_system_address == null) {
continue;
}
other.Value.Add(current_system_address.Value, "");
OnLog?.Invoke(string.Format(
"Mission \"{0}\" gave no influence to \"{1}\". Since \"{1}\" is the target faction " +
"of the mission, we assume the influence was gained in \"{2}\". " +
"Please remove the entry if this assumption is wrong.",
completed.Mission.LocalisedName, faction, current_system
));
} else if (string.Compare(source_faction_name, faction, true) == 0) {
/* source faction of the mission is not getting any influence. This could be because
* the source faction is in an election state in its home system and cannot gain any
* influence. It may also very well be that the source and target faction are the same
* since the faction is present in both target and source system. In which case we add
* both and hope for the best.
*/
other.Value.Add(accepted_address, "");
OnLog?.Invoke(string.Format(
"Mission \"{0}\" gave no influence to \"{1}\". Since \"{1}\" is the source faction " +
"of the mission, we assume the influence was gained in \"{2}\". " +
"Please remove the entry if this assumption is wrong.",
completed.Mission.LocalisedName, faction, accepted_system
));
/* check if source/target faction are equal, in which case we also need an entry
* for the target system. As said factions can be present in two systems, and can
* give missions that target each other.
*/
if (string.Compare(source_faction_name, target_faction_name, true) == 0 &&
current_system_address != null) {
other.Value.Add(current_system_address.Value, "");
OnLog?.Invoke(string.Format(
"Mission \"{0}\" gave no influence to \"{1}\". Since \"{1}\" is the source and target faction " +
"of the mission, we assume the influence was also gained in target system \"{2}\". " +
"Please remove the entry if this assumption is wrong.",
completed.Mission.LocalisedName, faction, current_system
));
}
}
}
foreach (var influences in other.Value) {
ulong system_address = influences.Key;
string? system;
string? accepted_station;
if (completed.Mission == null) {
continue;
}
if (!systems.TryGetValue(system_address, out system)) {
OnLog?.Invoke(string.Format(
"Unknown system \"{0}\" unable to assign that mission a target.", system_address
));
continue;
}
if (!acceptedStations.TryGetValue(completed.Mission.MissionID, out accepted_station)) {
OnLog?.Invoke(string.Format(
"Unable to figure out in which station mission \"{0}\" was accepted.", completed.Mission.LocalisedName
));
continue;
}
if (faction.Equals(source_faction_name) && system_address == accepted_address) {
/* This is the influence block for the origin of the mission.
*/
main_mission = new MissionCompleted(completed) {
System = accepted_system,
Faction = source_faction_name,
SystemAddress = accepted_address,
Station = accepted_station,
};
results.Add(main_mission);
} else if (!faction.Equals(source_faction_name) ||
(faction.Equals(source_faction_name) && system_address != accepted_address)) {
/* This block is for secondary factions (first if), or if the secondary faction
* is the same as the mission giver, but in another system (second if).
*/
results.Add(new InfluenceSupport() {
Faction = faction,
Influence = influences.Value,
System = system,
SystemAddress = system_address,
RelevantMission = completed
});
}
}
}
} else if (e.Is(Events.MissionAccepted)) {
MissionAcceptedEntry? accepted = e as MissionAcceptedEntry;
if (accepted == null ||
current_station == null ||
current_system_address == null) {
continue;
}
if (accepted.Mission == null) {
continue;
}
ulong id = accepted.Mission.MissionID;
if (!acceptedMissions.ContainsKey(id)) {
acceptedMissions[id] = accepted;
}
if (!acceptedStations.ContainsKey(id)) {
acceptedStations[id] = current_station;
}
if (!acceptedSystems.ContainsKey(id)) {
acceptedSystems[id] = current_system_address.Value;
}
} else if (e.Is(Events.MissionFailed)) {
MissionFailedEntry? failed = e as MissionFailedEntry;
MissionAcceptedEntry? accepted = null;
ulong accepted_address = 0;
string? accepted_system;
string? accepted_station;
if (failed == null || failed.Mission == null) {
continue;
}
if (!acceptedMissions.TryGetValue(failed.Mission.MissionID, out accepted)) {
OnLog?.Invoke("A mission failed which wasn't accepted in the given time frame. " +
"Please adjust start date to when the mission was accepted to include it in the list.");
continue;
}
if (accepted.Mission == null) {
continue;
}
if (!acceptedSystems.TryGetValue(failed.Mission.MissionID, out accepted_address)) {
OnLog?.Invoke(string.Format(
"Unable to figure out in which system mission \"{0}\" was accepted.", accepted.Mission.Name
));
continue;
}
if (!systems.TryGetValue(accepted_address, out accepted_system)) {
OnLog?.Invoke(string.Format(
"Unable to figure out in which system mission \"{0}\" was accepted.", accepted.Mission.Name
));
continue;
}
if (!acceptedStations.TryGetValue(failed.Mission.MissionID, out accepted_station)) {
OnLog?.Invoke(string.Format(
"Unable to figure out in which station mission \"{0}\" was accepted.", accepted.Mission.Name
));
continue;
}
results.Add(new MissionFailed(accepted) {
Failed = failed,
System = accepted_system,
Station = accepted_station,
Faction = accepted.Mission.Faction,
SystemAddress = accepted_address,
});
/* Mission failed should be collated if they are in the same system/station
*/
collate = true;
} else if (e.Is(Events.SellExplorationData)) {
SellExplorationDataEntry? explo = e as SellExplorationDataEntry;
if (explo == null) {
continue;
}
results.Add(new Cartographics(explo) {
System = current_system,
Station = current_station,
Faction = controlling_faction,
});
/* colate single cartographic selling into one */
collate = true;
} else if (e.Is(Events.SellOrganicData)) {
SellOrganicDataEntry? organic = e as SellOrganicDataEntry;
if (organic == null) {
return;
}
/* organic data sold to Vista Genomics */
results.Add(new OrganicData(organic) {
System = current_system,
Station = current_station,
Faction = controlling_faction,
});
collate = true;
} else if (e.Is(Events.MultiSellExplorationData)) {
MultiSellExplorationDataEntry? explo = e as MultiSellExplorationDataEntry;
if (explo == null) {
continue;
}
/* For multi-sell-exploraton-data only the controlling faction of the station sold to matters.
*/
results.Add(new Cartographics(explo) {
System = current_system,
Station = current_station,
Faction = controlling_faction
});
collate = true;
} else if (e.Is(Events.RedeemVoucher)) {
RedeemVoucherEntry? voucher = e as RedeemVoucherEntry;
List<Faction> current_factions = new List<Faction>();
if (voucher == null || current_system == null) {
continue;
}
if (system_factions.ContainsKey(current_system)) {
current_factions = system_factions[current_system];
} else {
OnLog?.Invoke("There are no current system factions, so turned in vouchers were ignored.");
continue;
}
foreach (string faction in voucher.Factions) {
if (current_factions.Find(x => x.Name == faction) == null) {
OnLog?.Invoke(
string.Format("Vouchers for \"{0}\" were ignored in \"{1}\" since said " +
"faction is not present there.", faction, current_system)
);
continue; /* faction is not present, so it is ignored */
}
/* Same for selling combat vouchers. Only the current controlling faction matters here.
*/
results.Add(new Vouchers(voucher) {
System = current_system,
Station = current_station,
Faction = faction,
ControllingFaction = controlling_faction,
});
}
collate = true;
} else if (e.Is(Events.SellMicroResources)) {
SellMicroResourcesEntry? smr = e as SellMicroResourcesEntry;
if (smr == null) {
continue;
}
results.Add(new SellMicroResources(smr) {
Faction = controlling_faction,
Station = current_station,
System = current_system
});
} else if (e.Is(Events.MarketBuy)) {
MarketBuyEntry? buy = e as MarketBuyEntry;
if (buy == null) {
continue;
}
if (string.IsNullOrEmpty(buy.Type) || buy.BuyPrice == 0) {
continue;
}
buyCost[buy.Type] = buy.BuyPrice;
results.Add(new BuyCargo(buy) {
Faction = controlling_faction,
Station = current_station,
System = current_system,
});
collate = true;
} else if (e.Is(Events.SearchAndRescue)) {
SearchAndRescueEntry? sar = e as SearchAndRescueEntry;
if (sar == null) {
continue;
}
results.Add(new SearchAndRescue(sar) {
Faction = controlling_faction,
Station = current_station,
System = current_system,
});
collate = true;
} else if (e.Is(Events.MarketSell)) {
MarketSellEntry? sell = e as MarketSellEntry;
long profit = 0;
if (sell == null || sell.Type == null) {
continue;
}
if (!buyCost.ContainsKey(sell.Type)) {
OnLog?.Invoke("Could not find buy order for the given commodity. Please adjust profit manually.");
} else {
long avg = buyCost[sell.Type];
profit = (long)sell.TotalSale - (avg * sell.Count);
}
results.Add(new SellCargo(sell) {
Faction = controlling_faction,
Station = current_station,
System = current_system,
Profit = profit
});
}
if (results == null || results.Count <= 0) {
continue;
}
foreach (Transaction entry in results) {
/* Find all objectives that generally match.
*/
var matches = objectives
.Where(x => x.Matches(entry) >= 2)
.OrderBy(x => x.Matches(entry))
;
Objective? objective = null;
if (matches != null && matches.Count() > 0) {
/* Then select the one that matches the most.
*/
objective = matches
.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);
}
Transaction? existing = null;
existing = objective.LogEntries.Find(x => {
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);
}
}
}
}
public void Scan(PlayerJournal journal) {
Scan(journal, DateTime.Now, DateTime.Now);
}
}

View File

@@ -0,0 +1,47 @@
using EDPlayerJournal.Entries;
namespace EDPlayerJournal.BGS;
public class ThargoidKill : Transaction {
/// <summary>
/// Thargoid vessel that was killed
/// </summary>
public ThargoidVessel ThargoidType { get; set; } = ThargoidVessel.Unknown;
/// <summary>
/// Name of the thargoid type killed
/// </summary>
public string? ThargoidName { get; set; }
/// <summary>
/// Total reward received
/// </summary>
public ulong TotalReward {
get { return (ulong)Entries.OfType<FactionKillBondEntry>().Sum(x => (decimal)x.Reward); }
}
/// <summary>
/// Kiling thargoids contributes to the system wide effort of
/// the thargoid war.
/// </summary>
public override bool SystemContribution {
get { return true; }
}
public ThargoidKill() { }
public ThargoidKill(FactionKillBondEntry entry) {
if (!Factions.IsThargoid(entry.VictimFaction)) {
throw new Exception("Not a valid thargoid kill");
}
Entries.Add(entry);
ThargoidType = Thargoid.GetVesselByPayout(entry.Reward);
ThargoidName = Thargoid.GetVesselName(ThargoidType);
}
public override string ToString() {
return string.Format("{0}x {1} killed", Entries.Count, ThargoidName);
}
}

View File

@@ -1,25 +1,52 @@
using EDPlayerJournal.Entries;
using System.ComponentModel.DataAnnotations.Schema;
namespace EDPlayerJournal.BGS;
public class Transaction : IComparable<Transaction> {
public List<Entry> Entries { get; } = new List<Entry>();
public virtual string CompletedAt {
public string CompletedAt {
get {
DateTime? datetime = CompletedAtDateTime;
if (datetime == null) {
return "Unknown";
}
return datetime.Value.ToString("dd.MM.yyyy HH:mm UTC");
}
}
public virtual DateTime? CompletedAtDateTime {
get {
var items = Entries
.OrderBy(x => x.Timestamp)
.ToArray()
;
if (items == null || items.Length == 0) {
return "Unknown";
return null;
}
Entry last = items.Last();
return last.Timestamp.ToString("dd.MM.yyyy HH:mm UTC");
return last.Timestamp;
}
}
/// <summary>
/// Whether the transaction helps the entire system.
/// While all transactions are related to one faction, sometimes their
/// overall effect on the system as a whole is more important, than to
/// their faction. For example, rescuing refugees helps the Thargoid war
/// effort in the system as a whole, not just for the faction.
/// So this is true for transactions that help the system as a whole.
/// </summary>
public virtual bool SystemContribution { get; } = false;
/// <summary>
/// Returns true if this transaction was completed in legacy ED
/// </summary>
public bool IsLegacy { get; set; } = false;
/// <summary>
/// Controlling faction of the station this entry was made/turned into.
/// </summary>

View File

@@ -1,6 +1,5 @@
using EDPlayerJournal.Entries;
using System.Collections.Generic;
using System.Reflection.Metadata.Ecma335;
using EDPlayerJournal;
using EDPlayerJournal.Entries;
namespace EDPlayerJournal.BGS;
@@ -10,10 +9,51 @@ internal class TransactionParserContext {
public string? CurrentStation { get; set; }
public string? ControllingFaction { get; set; }
public bool IsOnFoot { get; set; } = false;
public string? LastRecordedAwardingFaction { get; set; }
public ulong? HighestCombatBond { get; set; }
public bool HaveSeenCapShip { get; set; } = false;
public bool HaveSeenCaptain { get; set; } = false;
public bool HaveSeenSpecOps { get; set; } = false;
public bool HaveSeenCorrespondent { get; set; } = false;
/// <summary>
/// Returns true if the current session is legacy
/// </summary>
public bool IsLegacy { get; set; } = false;
/// <summary>
/// How many on foot kills were done.
/// </summary>
public ulong OnFootKills { get; set; } = 0;
/// <summary>
/// How many ship kills were done.
/// </summary>
public ulong ShipKills { get; set; } = 0;
/// <summary>
/// Thargoid scouts killed
/// </summary>
public ulong ThargoidScoutKills { get; set; } = 0;
/// <summary>
/// Thargoid interceptor kills
/// </summary>
public ulong ThargoidInterceptorKills { get; set; } = 0;
/// <summary>
/// Whether we have seen an AX warzone NPC talk to us with ReceiveText
/// </summary>
public bool HaveSeenAXWarzoneNPC { get; set; } = false;
/// <summary>
/// A list of accepted missions index by their mission ID
/// </summary>
public Dictionary<ulong, MissionAcceptedEntry> AcceptedMissions { get; } = new();
public Dictionary<ulong, Mission> AcceptedMissions { get; } = new();
public Dictionary<ulong, Location> AcceptedMissionLocation { get; } = new();
/// <summary>
/// A way to lookup a system by its system id
@@ -32,6 +72,106 @@ internal class TransactionParserContext {
/// </summary>
public Dictionary<string, long> BuyCost = new();
public void DiscernCombatZone(TransactionList transactions, Entry e) {
string? grade = CombatZones.DifficultyLow;
string cztype;
ulong highest = HighestCombatBond ?? 0;
string? faction = LastRecordedAwardingFaction;
if (HighestCombatBond == null &&
LastRecordedAwardingFaction == null &&
HaveSeenAXWarzoneNPC == false) {
return;
}
if (OnFootKills > 0 || IsOnFoot == true) {
cztype = CombatZones.GroundCombatZone;
// High on foot combat zones have enforcers that bring 80k a pop
if (highest >= 60000) {
grade = CombatZones.DifficultyHigh;
} else if (highest >= 30000) {
// In medium conflict zones, the enforcers are worth 30k
grade = CombatZones.DifficultyMedium;
} else {
grade = CombatZones.DifficultyLow;
}
} else if (ShipKills > 0 && !IsOnFoot) {
// Ship combat zones can be identified by the amount of kills
if (ShipKills > 20) {
grade = CombatZones.DifficultyHigh;
} else if (ShipKills > 10) {
grade = CombatZones.DifficultyMedium;
}
// Cap ship, means a high conflict zone
if (HaveSeenCapShip) {
grade = CombatZones.DifficultyHigh;
} else {
int warzoneNpcs = new List<bool>() { HaveSeenCaptain, HaveSeenCorrespondent, HaveSeenSpecOps }
.Where(x => x == true)
.Count()
;
if (warzoneNpcs >= 1 && grade == CombatZones.DifficultyLow) {
grade = CombatZones.DifficultyMedium;
}
}
cztype = CombatZones.ShipCombatZone;
} else if ((ThargoidScoutKills > 0 && ThargoidInterceptorKills > 0) ||
HaveSeenAXWarzoneNPC == true) {
// Could be a thargoid combat zones if interceptors and scouts are there
cztype = CombatZones.AXCombatZone;
// Still unknown
grade = null;
} else {
transactions.AddIncomplete(new CombatZone(), "Failed to discern combat zone type", e);
return;
}
CombatZone zone = new CombatZone() {
System = CurrentSystem,
Faction = faction,
IsLegacy = IsLegacy,
Grade = grade,
Type = cztype,
// Sad truth is, if HaveSeenXXX is false, we just don't know for certain
CapitalShip = HaveSeenCapShip ? true : null,
SpecOps = HaveSeenSpecOps ? true : null,
Correspondent = HaveSeenCorrespondent ? true : null,
Captain = HaveSeenCaptain ? true : null,
};
zone.Entries.Add(e);
transactions.Add(zone);
}
public void RecordCombatBond(FactionKillBondEntry e) {
if (HighestCombatBond == null || e.Reward > HighestCombatBond) {
HighestCombatBond = e.Reward;
}
LastRecordedAwardingFaction = e.AwardingFaction;
if (IsOnFoot) {
++OnFootKills;
} else {
++ShipKills;
}
}
public void ResetCombatZone() {
HighestCombatBond = null;
HaveSeenCapShip = false;
HaveSeenCaptain = false;
HaveSeenCorrespondent = false;
HaveSeenSpecOps = false;
LastRecordedAwardingFaction = null;
OnFootKills = 0;
ShipKills = 0;
ThargoidInterceptorKills = 0;
ThargoidScoutKills = 0;
HaveSeenAXWarzoneNPC = false;
}
public void BoughtCargo(string? cargo, long? cost) {
if (cargo == null || cost == null) {
return;
@@ -48,16 +188,24 @@ internal class TransactionParserContext {
return SystemFactions[system];
}
public void MissionAccepted(MissionAcceptedEntry accepted) {
public void MissionAccepted(MissionAcceptedEntry? entry) {
if (entry == null) {
return;
}
MissionAccepted(entry.Mission);
}
public void MissionAccepted(Mission? mission) {
if (CurrentSystem == null || CurrentSystemAddress == null) {
throw new Exception("Mission accepted without knowing where.");
}
if (accepted.Mission == null) {
if (mission == null) {
throw new Exception("Mission is null");
}
AcceptedMissions.TryAdd(accepted.Mission.MissionID, accepted);
AcceptedMissions.TryAdd(mission.MissionID, mission);
Location location = new() {
StarSystem = CurrentSystem,
@@ -65,13 +213,13 @@ internal class TransactionParserContext {
Station = (CurrentStation ?? ""),
};
AcceptedMissionLocation.TryAdd(accepted.Mission.MissionID, location);
AcceptedMissionLocation.TryAdd(mission.MissionID, location);
}
}
public class TransactionList : List<Transaction> {
public void AddIncomplete(Transaction underlying, string reason) {
Add(new IncompleteTransaction(underlying, reason));
public void AddIncomplete(Transaction underlying, string reason, Entry entry) {
Add(new IncompleteTransaction(underlying, reason, entry));
}
}
@@ -138,6 +286,12 @@ internal class FSDJumpParser : TransactionParserPart {
throw new InvalidJournalEntryException();
}
// If you FSD jump straight out of the combat zone into a different system
// then the combat zone will be placed in the wrong system otherwise.
// This call needs to be *before* changing the current system.
context.DiscernCombatZone(transactions, e);
context.ResetCombatZone();
context.CurrentSystem = entry.StarSystem;
context.CurrentSystemAddress = entry.SystemAddress;
@@ -197,6 +351,21 @@ internal class ShipTargetedParser : TransactionParserPart {
!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;
}
}
}
@@ -228,20 +397,64 @@ internal class CommitCrimeParser : TransactionParserPart {
victim = "Unknown";
}
if (!context.NPCFaction.ContainsKey(victim)) {
transactions.AddIncomplete(
new FoulMurder(),
"Crime victim was not properly scanned."
string faction;
if (entry.IsCrime(CrimeTypes.OnFootMurder)) {
if (entry.Faction == null) {
transactions.AddIncomplete(
new FoulMurder(),
"On foot murder victim did not have a faction", e
);
return;
}
// On foot murders are different, there the faction is
// the faction the NPC belonged too
faction = entry.Faction;
} else {
if (!context.NPCFaction.ContainsKey(victim)) {
transactions.AddIncomplete(
new FoulMurder(),
"Crime victim was not properly scanned.", e
);
return;
}
faction = context.NPCFaction[victim];
}
transactions.Add(new FoulMurder(entry) {
System = context.CurrentSystem,
IsLegacy = context.IsLegacy,
Faction = faction,
});
}
}
internal class MissionsParser : TransactionParserPart {
public void Parse(Entry entry, TransactionParserContext context, TransactionList transactions) {
MissionsEntry? missions = entry as MissionsEntry;
if (missions == null) {
return;
}
if (context.CurrentSystem == null || context.CurrentSystemAddress == null) {
transactions.AddIncomplete(new MissionCompleted(),
"Could not determine current location on Missions event.",
entry
);
return;
}
string faction = context.NPCFaction[victim];
transactions.Add(new FoulMurder(entry) {
System = context.CurrentSystem,
Faction = faction,
});
foreach (Mission mission in missions.Active) {
try {
context.MissionAccepted(mission);
} catch (Exception exception) {
transactions.AddIncomplete(new MissionCompleted(),
exception.Message,
entry
);
}
}
}
}
@@ -254,7 +467,8 @@ internal class MissionAcceptedParser : TransactionParserPart {
if (context.CurrentSystem == null || context.CurrentSystemAddress == null) {
transactions.AddIncomplete(new MissionCompleted(),
"Could not determine current location on mission acceptance."
"Could not determine current location on mission acceptance.",
e
);
return;
}
@@ -263,7 +477,8 @@ internal class MissionAcceptedParser : TransactionParserPart {
context.MissionAccepted(entry);
} catch (Exception exception) {
transactions.AddIncomplete(new MissionCompleted(),
exception.Message
exception.Message,
e
);
}
}
@@ -276,23 +491,23 @@ internal class MissionCompletedParser : TransactionParserPart {
throw new NotImplementedException();
}
MissionAcceptedEntry? accepted = null;
Mission? mission = null;
Location? accepted_location = null;
string? target_faction_name = entry.Mission.TargetFaction;
string? source_faction_name = entry.Mission.Faction;
// We did not find when the mission was accepted.
if (!context.AcceptedMissions.TryGetValue(entry.Mission.MissionID, out accepted)) {
if (!context.AcceptedMissions.TryGetValue(entry.Mission.MissionID, out mission)) {
transactions.AddIncomplete(new MissionCompleted(),
String.Format("Mission acceptance for mission id {0} was not found",
entry.Mission.MissionID));
entry.Mission.MissionID), e);
return;
}
if (!context.AcceptedMissionLocation.TryGetValue(entry.Mission.MissionID, out accepted_location)) {
transactions.AddIncomplete(new MissionCompleted(),
String.Format("Location for acceptance for mission id {0} was not found",
entry.Mission.MissionID));
entry.Mission.MissionID), e);
return;
}
@@ -340,7 +555,8 @@ internal class MissionCompletedParser : TransactionParserPart {
if (!context.SystemsByID.TryGetValue(system_address, out system)) {
transactions.AddIncomplete(new MissionCompleted(),
string.Format("Unknown system {0}, unable to assign that mission a target", system_address)
string.Format("Unknown system {0}, unable to assign that mission a target", system_address),
e
);
continue;
}
@@ -349,11 +565,14 @@ internal class MissionCompletedParser : TransactionParserPart {
system_address == accepted_location.SystemAddress) {
// Source and target faction are the same, and this is the block
// for the source system. So we make a full mission completed entry.
transactions.Add(new MissionCompleted(entry) {
transactions.Add(new MissionCompleted() {
CompletedEntry = entry,
Mission = mission,
System = accepted_location.StarSystem,
Faction = source_faction_name,
SystemAddress = accepted_location.SystemAddress,
Station = accepted_location.Station,
IsLegacy = context.IsLegacy,
});
} else if (string.Compare(faction, source_faction_name, true) != 0 ||
(string.Compare(faction, source_faction_name) == 0 &&
@@ -362,11 +581,13 @@ internal class MissionCompletedParser : TransactionParserPart {
// differs. Sometimes missions go to different systems but to
// the same faction.
transactions.Add(new InfluenceSupport() {
Mission = mission,
Faction = faction,
Influence = influences.Value,
System = system,
SystemAddress = system_address,
RelevantMission = entry,
IsLegacy = context.IsLegacy,
});
}
}
@@ -376,7 +597,7 @@ internal class MissionCompletedParser : TransactionParserPart {
internal class MissionFailedParser : TransactionParserPart {
public void Parse(Entry e, TransactionParserContext context, TransactionList transactions) {
MissionAcceptedEntry? accepted = null;
Mission? mission = null;
Location? accepted_location = null;
string? accepted_system = null;
@@ -389,34 +610,42 @@ internal class MissionFailedParser : TransactionParserPart {
throw new InvalidJournalEntryException("No mission specified in mission failure");
}
if (!context.AcceptedMissions.TryGetValue(entry.Mission.MissionID, out accepted)) {
if (!context.AcceptedMissions.TryGetValue(entry.Mission.MissionID, out mission)) {
transactions.AddIncomplete(new MissionFailed(),
"Mission acceptance was not found"
"Mission acceptance was not found", e
);
return;
}
if (!context.AcceptedMissionLocation.TryGetValue(entry.Mission.MissionID, out accepted_location)) {
if (!context.AcceptedMissionLocation.TryGetValue(mission.MissionID, out accepted_location)) {
transactions.AddIncomplete(new MissionFailed(),
"Unable to figure out where failed mission was accepted"
"Unable to figure out where failed mission was accepted", e
);
return;
}
if (!context.SystemsByID.TryGetValue(accepted_location.SystemAddress, out accepted_system)) {
transactions.AddIncomplete(new MissionFailed(),
"Unable to figure out in which system failed mission was accepted"
"Unable to figure out in which system failed mission was accepted", e
);
return;
}
transactions.Add(new MissionFailed() {
Accepted = accepted,
Faction = accepted.Mission?.Faction,
Failed = entry,
if (string.IsNullOrEmpty(mission.Faction)) {
transactions.AddIncomplete(new MissionFailed(),
"Could not determine for what faction you failed a mission. This happens if the " +
"mission acceptance is not within the given time frame.",
entry
);
}
transactions.Add(new MissionFailed(entry) {
Faction = mission?.Faction,
Mission = mission,
Station = accepted_location.Station,
System = accepted_location.StarSystem,
SystemAddress = accepted_location.SystemAddress,
IsLegacy = context.IsLegacy,
});
}
}
@@ -432,6 +661,7 @@ internal class SellExplorationDataParser : TransactionParserPart {
System = context.CurrentSystem,
Station = context.CurrentStation,
Faction = context.ControllingFaction,
IsLegacy = context.IsLegacy,
});
}
}
@@ -447,6 +677,7 @@ internal class SellOrganicDataParser : TransactionParserPart {
System = context.CurrentSystem,
Station = context.CurrentStation,
Faction = context.ControllingFaction,
IsLegacy = context.IsLegacy,
});
}
}
@@ -462,6 +693,7 @@ internal class MultiSellExplorationDataParser : TransactionParserPart {
System = context.CurrentSystem,
Station = context.CurrentStation,
Faction = context.ControllingFaction,
IsLegacy = context.IsLegacy,
});
}
}
@@ -475,7 +707,7 @@ internal class RedeemVoucherParser : TransactionParserPart {
if (context.CurrentSystem == null) {
transactions.AddIncomplete(new Vouchers(),
"Could not find out where the vouchers were redeemed"
"Could not find out where the vouchers were redeemed", e
);
return;
}
@@ -483,25 +715,42 @@ internal class RedeemVoucherParser : TransactionParserPart {
List<Faction>? current_factions = context.GetFactions(context.CurrentSystem);
if (current_factions == null) {
transactions.AddIncomplete(new Vouchers(),
"Current system factions are unknown, so vouchers were ineffective");
return;
"Current system factions are unknown, so vouchers were ineffective", e);
}
foreach (string faction in entry.Factions) {
if (current_factions.Find(x => string.Compare(x.Name, faction, true) == 0) == null) {
transactions.AddIncomplete(new Vouchers(),
string.Format("Vouchers for {0} were ignored in {1} since said " +
"faction is not present here", faction, context.CurrentSystem)
);
continue;
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;
}
transactions.Add(new Vouchers(entry) {
System = context.CurrentSystem,
Station = context.CurrentStation,
Faction = faction,
ControllingFaction = context.ControllingFaction,
});
if (current_factions != null && !relevantBond) {
// If we have local factions, and it ain't thargoid bonds see if the bonds were
// useful in the current system
if (current_factions.Find(x => string.Compare(x.Name, faction, true) == 0) != null) {
relevantBond = true;
} else {
transactions.AddIncomplete(new Vouchers(),
string.Format("Vouchers for \"{0}\" had no effect in \"{1}\" since said " +
"faction is not present there", faction, context.CurrentSystem), e
);
}
}
if (relevantBond) {
transactions.Add(new Vouchers(entry) {
System = context.CurrentSystem,
Station = context.CurrentStation,
Faction = relevantFaction,
ControllingFaction = context.ControllingFaction,
IsLegacy = context.IsLegacy,
});
}
}
}
}
@@ -517,6 +766,7 @@ internal class SellMicroResourcesParser : TransactionParserPart {
System = context.CurrentSystem,
Station = context.CurrentStation,
Faction = context.ControllingFaction,
IsLegacy = context.IsLegacy,
});
}
}
@@ -532,6 +782,7 @@ internal class SearchAndRescueParser : TransactionParserPart {
Faction = context.ControllingFaction,
Station = context.CurrentStation,
System = context.CurrentSystem,
IsLegacy = context.IsLegacy,
});
}
}
@@ -549,6 +800,7 @@ internal class MarketBuyParser : TransactionParserPart {
Faction = context.ControllingFaction,
Station = context.CurrentStation,
System = context.CurrentSystem,
IsLegacy = context.IsLegacy,
});
}
}
@@ -576,15 +828,147 @@ internal class MarketSellParser : TransactionParserPart {
Station = context.CurrentStation,
System = context.CurrentSystem,
Profit = profit,
IsLegacy = context.IsLegacy,
});
}
}
internal class FactionKillBondParser : TransactionParserPart {
public void Parse(Entry e, TransactionParserContext context, TransactionList transactions) {
FactionKillBondEntry? entry = e as FactionKillBondEntry;
if (entry == null) {
throw new NotImplementedException();
}
if (Factions.IsThargoid(entry.VictimFaction)) {
// Thargoid bonk
transactions.Add(new ThargoidKill(entry) {
System = context.CurrentSystem,
Faction = Factions.PilotsFederation,
Station = context.CurrentStation,
IsLegacy = context.IsLegacy,
});
ThargoidVessel vessel = Thargoid.GetVesselByPayout(entry.Reward);
if (vessel != ThargoidVessel.Unknown) {
if (vessel == ThargoidVessel.Scout) {
++context.ThargoidScoutKills;
} else {
++context.ThargoidInterceptorKills;
}
}
// We are done
return;
}
context.RecordCombatBond(entry);
}
}
internal class EmbarkDisembarkParser : TransactionParserPart {
public void Parse(Entry e, TransactionParserContext context, TransactionList transactions) {
if (e.Is(Events.Embark)) {
context.IsOnFoot = false;
} else if (e.Is(Events.Disembark)) {
context.IsOnFoot = true;
}
}
}
internal class SupercruiseEntryParser : TransactionParserPart {
public void Parse(Entry entry, TransactionParserContext context, TransactionList transactions) {
// After a super cruise entry we are no longer on foot.
context.IsOnFoot = false;
context.DiscernCombatZone(transactions, entry);
context.ResetCombatZone();
}
}
internal class ShutdownParser : TransactionParserPart {
public void Parse(Entry entry, TransactionParserContext context, TransactionList transactions) {
context.DiscernCombatZone(transactions, entry);
context.ResetCombatZone();
}
}
internal class CapShipBondParser : TransactionParserPart {
public void Parse(Entry entry, TransactionParserContext context, TransactionList transactions) {
if (entry.GetType() != typeof(CapShipBondEntry)) {
return;
}
context.HaveSeenCapShip = true;
}
}
internal class FileHeaderParser : TransactionParserPart {
public void Parse(Entry entry, TransactionParserContext context, TransactionList transactions) {
FileHeaderEntry? fileheader = entry as FileHeaderEntry;
if (fileheader == null) {
return;
}
context.IsLegacy = fileheader.IsLegacy;
}
}
internal class ReceiveTextParser : TransactionParserPart {
public void Parse(Entry entry, TransactionParserContext context, TransactionList transactions) {
ReceiveTextEntry? receivetext = entry as ReceiveTextEntry;
if (receivetext == null) {
return;
}
if (string.Compare(receivetext.Channel, Channels.NPC) != 0) {
return;
}
if (string.Compare(receivetext.NPCCategory, NPCs.AXMilitary) == 0) {
context.HaveSeenAXWarzoneNPC = true;
}
}
}
internal class DiedParser : TransactionParserPart {
public void Parse(Entry entry, TransactionParserContext context, TransactionList transactions) {
// You can't complete a combat zone if you die in it. Others might keep it open
// for you, but still you will not have completed it unless you jump back in.
context.ResetCombatZone();
}
}
internal class DropshipDeployParser : TransactionParserPart {
public void Parse(Entry entry, TransactionParserContext context, TransactionList transactions) {
// On drop ship deploy we are now on foot
context.IsOnFoot = true;
}
}
internal class CommanderParser : TransactionParserPart {
public void Parse(Entry entry, TransactionParserContext context, TransactionList transactions) {
// A commander entry happens when you log out, and log back in again
// for example when switching from Open, to Solo or PG.
context.DiscernCombatZone(transactions, entry);
context.ResetCombatZone();
}
}
public class TransactionParser {
private static Dictionary<string, TransactionParserPart> ParserParts { get; } = new()
{
{ Events.CapShipBond, new CapShipBondParser() },
{ Events.Commander, new CommanderParser() },
{ Events.CommitCrime, new CommitCrimeParser() },
{ Events.Died, new DiedParser() },
{ Events.Disembark, new EmbarkDisembarkParser() },
{ Events.Docked, new DockedParser() },
{ Events.DropshipDeploy, new DropshipDeployParser() },
{ Events.Embark, new EmbarkDisembarkParser() },
{ Events.FactionKillBond, new FactionKillBondParser() },
{ Events.FileHeader, new FileHeaderParser() },
{ Events.FSDJump, new FSDJumpParser() },
{ Events.Location, new LocationParser() },
{ Events.MarketBuy, new MarketBuyParser() },
@@ -592,15 +976,30 @@ public class TransactionParser {
{ Events.MissionAccepted, new MissionAcceptedParser() },
{ Events.MissionCompleted, new MissionCompletedParser() },
{ Events.MissionFailed, new MissionFailedParser() },
{ Events.Missions, new MissionsParser() },
{ Events.MultiSellExplorationData, new MultiSellExplorationDataParser() },
{ Events.ReceiveText, new ReceiveTextParser() },
{ Events.RedeemVoucher, new RedeemVoucherParser() },
{ Events.SearchAndRescue, new SearchAndRescueParser() },
{ Events.SellExplorationData, new SellExplorationDataParser() },
{ Events.SellMicroResources, new SellMicroResourcesParser() },
{ Events.SellOrganicData, new SellOrganicDataParser() },
{ Events.ShipTargeted, new ShipTargetedParser() },
{ Events.Shutdown, new ShutdownParser() },
{ Events.SupercruiseEntry, new SupercruiseEntryParser() },
};
public bool IsRelevant(string entry) {
return ParserParts.ContainsKey(entry);
}
public bool IsRelevant(Entry e) {
if (e.Event == null) {
return false;
}
return IsRelevant(e.Event);
}
public List<Transaction>? Parse(IEnumerable<Entry> entries) {
TransactionList transactions = new();
TransactionParserContext context = new();

View File

@@ -13,6 +13,16 @@ public class Vouchers : Transaction {
Entries.Add(e);
}
public override bool SystemContribution {
get {
if (Faction == Factions.PilotsFederation && Type == "Combat Bond") {
return true;
}
return false;
}
}
public long TotalSum {
get {
if (Faction == null) {
@@ -20,8 +30,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))
;
}
}
@@ -39,9 +49,9 @@ public class Vouchers : Transaction {
.First();
if (v == null) {
return null;
} else if (v == "CombatBond") {
} else if (v == Bonds.CombatBond) {
type = "Combat Bond";
} else if (v == "bounty") {
} else if (v == Bonds.Bounty) {
type = "Bounty";
} else {
type = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(v);

13
EDPlayerJournal/Bonds.cs Normal file
View File

@@ -0,0 +1,13 @@
namespace EDPlayerJournal;
public class Bonds {
/// <summary>
/// Internal string name for combat bonds.
/// </summary>
public static readonly string CombatBond = "CombatBond";
/// <summary>
/// Internal string name for bounties.
/// </summary>
public static readonly string Bounty = "bounty";
}

View File

@@ -0,0 +1,8 @@
namespace EDPlayerJournal;
public class Channels {
/// <summary>
/// Channel NPCs use to talk to the commander.
/// </summary>
public static readonly string NPC = "npc";
}

View File

@@ -0,0 +1,41 @@
namespace EDPlayerJournal;
/// <summary>
/// Static strings related to combat zones
/// </summary>
public class CombatZones {
/// <summary>
/// Type string for ground combat zone
/// </summary>
public static readonly string GroundCombatZone = "Ground";
/// <summary>
/// Type string for ship combat zones
/// </summary>
public static readonly string ShipCombatZone = "Ship";
/// <summary>
/// AX combat zone
/// </summary>
public static readonly string AXCombatZone = "AX";
/// <summary>
/// Difficulty low
/// </summary>
public static readonly string DifficultyLow = "Low";
/// <summary>
/// Difficulty medium
/// </summary>
public static readonly string DifficultyMedium = "Medium";
/// <summary>
/// Difficulty high
/// </summary>
public static readonly string DifficultyHigh = "High";
/// <summary>
/// Very high difficulty, so far AX combat zone only
/// </summary>
public static readonly string DifficultyVeryHigh = "Very High";
}

View File

@@ -3,7 +3,11 @@
namespace EDPlayerJournal;
public class Credits {
public static string FormatCredits(int amount) {
public static string FormatCredits(uint amount) {
return FormatCredits((long)amount);
}
public static string FormatCredits(ulong amount) {
return FormatCredits((long)amount);
}

View File

@@ -10,10 +10,4 @@
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
<ItemGroup>
<None Update="MissionNames.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,126 @@
namespace EDPlayerJournal;
public class EnglishMissionNames {
public static Dictionary<string, string> MissionNames { get; } = new Dictionary<string, string>() {
{"Chain_FindThePirateLord_name", "Assassination (Pirate Lord) (Chain)"},
{"Chain_RegainFooting_name", "Regain Footing (Chain)"},
{"Chain_SalvageJustice_name", "Assassination (Legal) (Chain)"},
{"Mission_Altruism_Bust_name", "Donate (Bust)" },
{"Mission_Altruism_CivilUnrest_name", "Donate (Civil Unrest)" },
{"Mission_Altruism_name", "Donate"},
{"Mission_Altruism_Outbreak_name", "Donate (Outbreak)" },
{"Mission_AltruismCredits_Bust_name", "Donate Credits (Bust)"},
{"Mission_AltruismCredits_CivilUnrest_name", "Donate Credits (Civil Unrest)" },
{"Mission_AltruismCredits_Famine_name", "Donate Credits (Famine)"},
{"Mission_AltruismCredits_name", "Donate Credits"},
{"Mission_AltruismCredits_Outbreak_name", "Donate Credits (Outbreak)" },
{"Mission_Assassinate_Illegal_BLOPS_name", "Assassination (Illegal)"},
{"Mission_Assassinate_Legal_Bust_name", "Assassination (Bust, Legal)" },
{"MISSION_assassinate_legal_CivilUnrest_name", "Assassination (Civil Unrest, Legal)" },
{"Mission_Assassinate_Legal_Communism_name", "Assassination (Communism, Legal)" },
{"Mission_Assassinate_Legal_Corporate_name", "Assassination (Corporate, Legal)"},
{"Mission_Assassinate_Legal_War_name", "Assassination (War, Legal)" },
{"Mission_Assassinate_name", "Assassination"},
{"Mission_Assassinate_Planetary_Expansion_name", "Assassination (Planetary Scan, Expansion)" },
{"Mission_Assassinate_Planetary_name", "Assassination (Planetary Scan)"},
{"Mission_Collect_Bust_name", "Provide (Bust)"},
{"Mission_Collect_CivilLiberty_name", "Provide (Civil Liberty)"},
{"Mission_Collect_CivilUnrest_name", "Provide (Civil Unrest)"},
{"Mission_Collect_Famine_name", "Provide (Famine)"},
{"Mission_Collect_Industrial_name", "Provide (Industrial)"},
{"Mission_Collect_name", "Provide"},
{"Mission_Collect_Outbreak_name", "Provide (Outbreak)" },
{"Mission_Collect_RankEmp_name", "Provide (Imperial Navy)"},
{"Mission_Collect_Retreat_name", "Provide (Retreat)"},
{"Mission_Courier_CivilUnrest_name", "Courier (Divil Unrest)" },
{"Mission_Courier_Democracy_name", "Courier (Democracy)"},
{"Mission_Courier_Elections_name", "Courier (Elections)"},
{"Mission_Courier_Expansion_name", "Courier (Expansion)"},
{"Mission_Courier_Famine_name", "Courier (Famine)"},
{"Mission_Courier_Lockdown_name", "Courier (Lockdown)"},
{"Mission_Courier_name", "Courier"},
{"Mission_Courier_RankEmp_name", "Courier (Imperial Navy)"},
{"Mission_Courier_War_name", "Courier (War)" },
{"Mission_Delivery_Agriculture_name", "Delivery (Agriculture)"},
{"Mission_Delivery_Boom_name", "Delivery (Boom)"},
{"Mission_Delivery_CivilUnrest_name", "Delivery (Civil Unrest)"},
{"Mission_Delivery_Democracy_name", "Delivery (Democracy)"},
{"Mission_Delivery_Investment_name", "Delivery (Investment)"},
{"Mission_Delivery_name", "Delivery"},
{"Mission_Delivery_RankEmp_name", "Delivery (Imperial Navy)"},
{"Mission_Delivery_Retreat_name", "Delivery (Retreat)"},
{"Mission_DeliveryWing_name", "Delivery (Wing)"},
{"Mission_DeliveryWing_War_name", "Delivery (Wing) (War)"},
{"Mission_Hack_BLOPS_Boom_name", "Hack Surface Installation (Boom)"},
{"Mission_Hack_BLOPS_Elections_name", "Hack Surface Installation (Elections)"},
{"Mission_Hack_BLOPS_Expansion_name", "Hack Surface Installation (Expansion)"},
{"MISSION_Hack_BLOPS_name", "Hack Surface Installation"},
{"Mission_HackMegaship_name", "Hack Megaship"},
{"Mission_LongDistanceExpedition_Explorer_Boom_name", "Long Distance Expedition (Boom)"},
{"Mission_LongDistanceExpedition_name", "Long Distance Expedition"},
{"Mission_Massacre_Conflict_CivilWar_name", "Massacre (Civil War)"},
{"Mission_Massacre_name", "Massacre"},
{"Mission_Massacre_RankEmp_name", "Massacre (Imperial Navy)"},
{"Mission_MassacreWing_Legal_Bust_name", "Massacre (Wing) (Bust)"},
{"Mission_MassacreWing_name", "Massacre (Wing)"},
{"Mission_Mining_name", "Mining" },
{"Mission_OnFoot_Assassination_MB_name", "On Foot Assassination"},
{"Mission_OnFoot_AssassinationIllegal_MB_name", "On Foot Assassination (Illegal)"},
{"Mission_OnFoot_AssassinationIllegal_NCD_MB_name", "On Foot Assassination (Illegal)" },
{"Mission_OnFoot_Collect_Contact_MB_name", "On Foot Collect"},
{"Mission_OnFoot_Collect_MB_name", "On Foot Collection"},
{"Mission_OnFoot_Delivery_Contact_MB_name", "On Foot Delivery (Contact)"},
{"Mission_OnFoot_Hack_Upload_Covert_MB_name", "On Foot Hack (Covert Upload)"},
{"Mission_OnFoot_Hack_Upload_MB_name", "On Foot Hack (Upload)"},
{"Mission_OnFoot_Heist_MB_name", "On Foot Heist" },
{"Mission_OnFoot_Heist_POI_MB_name", "On Foot Heist (POI)"},
{"Mission_OnFoot_Massacre_MB_name", "On Foot Massacre" },
{"Mission_OnFoot_MassacreIllegal_MB_name", "On Foot Massacre (Illegal)" },
{"Mission_OnFoot_Onslaught_MB_name", "On Foot Onslaught"},
{"Mission_OnFoot_Onslaught_Offline_MB_name", "On Foot Onslaught (Offline)"},
{"Mission_OnFoot_ProductionHeist_Covert_MB_name", "On Foot Production Heist (Covert)"},
{"Mission_OnFoot_ProductionHeist_MB_name", "On Foot Production Heist"},
{"Mission_OnFoot_Reboot_MB_name", "On Foot Reboot"},
{"Mission_OnFoot_RebootRestore_MB_name", "On Foot Reboot/Restore"},
{"Mission_OnFoot_Sabotage_Production_Covert_MB_name", "On Foot Sabotage Production (Covert)"},
{"Mission_OnFoot_Salvage_MB_name", "On Foot Salvage"},
{"Mission_OnFoot_SalvageIllegal_MB_name", "On Foot Salvage (Illegal)"},
{"Mission_OnFoot_Smuggle_Contact_MB_name", "On Foot Smuggling" },
{"Mission_PassengerBulk_AIDWORKER_ARRIVING", "Seeking Transport (Aid Workers)"},
{"Mission_PassengerBulk_name", "Seeking Transport" },
{"Mission_PassengerVIP", "Passenger (VIP)"},
{"Mission_PassengerVIP_Criminal_BOOM_name", "Passenger Criminal (VIP) (Boom)"},
{"Mission_PassengerVIP_name", "Passenger (VIP)"},
{"Mission_PassengerVIP_Scientist_FAMINE_name", "Passenger Scientist (VIP) (Famine)"},
{"Mission_PassengerVIP_Tourist_BOOM_name", "Passenger Tourist (VIP) (Boom)"},
{"Mission_Rescue_Planet_name", "Planet Rescue"},
{"Mission_Rescue_Planet_Expansion_name", "Planet Rescue (Expansion)" },
{"MISSION_Salvage_CivilUnrest_name", "Salvage (Civil Unrest)"},
{"MISSION_Salvage_Expansion_name", "Salvage (Expansion)"},
{"MISSION_Salvage_Illegal_name", "Salvage (Illegal)"},
{"Mission_Salvage_name", "Salvage"},
{"Mission_Salvage_RankEmp_name", "Salvage (Imperial Navy)"},
{"MISSION_Salvage_Refinery_name", "Salvage (Refinery)"},
{"MISSION_Salvage_Retreat_name", "Salvage (Retreat)"},
{"MISSION_Scan_name", "Scan"},
{"Mission_Sightseeing_Criminal_FAMINE_name", "Sightseeing (Criminal) (Famine)"},
{"Mission_Sightseeing_name", "Sightseeing"},
{"Mission_Smuggle_Anarchy_name", "Smuggling (Anarchy)" },
{"Mission_TW_Massacre_Basilisk_Plural_name", "Kill Basilisk" },
{"Mission_TW_Massacre_Basilisk_Singular_name", "Kill Basilisk" },
{"Mission_TW_Massacre_Cyclops_Plural_name", "Kill Cyclops" },
{"Mission_TW_Massacre_Cyclops_Singular_name", "Kill Cyclops" },
{"Mission_TW_Massacre_Scout_Plural_name", "Kill Scouts (Wing)" },
{"Mission_TW_PassengerEvacuation_Burning_name", "Passenger Evacuation (Significant Damage)" },
{"Mission_TW_PassengerEvacuation_UnderAttack_name", "Passenger Evacuation (Thargoid Invasion)" },
{"Mission_TW_Rescue_UnderAttack_name", "Rescue (Thargoid Attack)" },
};
public static string? Translate(string name) {
if (MissionNames.ContainsKey(name)) {
return MissionNames[name];
}
return null;
}
}

View File

@@ -0,0 +1,24 @@
namespace EDPlayerJournal.Entries;
public class CapShipBondEntry : Entry {
/// <summary>
/// Reward gained
/// </summary>
public ulong Reward { get; set; } = 0;
/// <summary>
/// Victim faction, i.e. to whom the cap ship belongs
/// </summary>
public string? VictimFaction { get; set; }
/// <summary>
/// Awarding faction.
/// </summary>
public string? AwardingFaction { get; set; }
protected override void Initialise() {
Reward = JSON.Value<ulong?>("Reward") ?? 0;
VictimFaction = JSON.Value<string?>("VictimFaction");
AwardingFaction = JSON.Value<string?>("AwardingFaction");
}
}

View File

@@ -19,4 +19,12 @@ public class CommitCrimeEntry : Entry {
public bool IsMurder {
get { return CrimeType?.CompareTo(CrimeTypes.Murder) == 0 || CrimeType?.CompareTo(CrimeTypes.OnFootMurder) == 0; }
}
public bool IsCrime(string crimetype) {
if (CrimeType == null) {
return false;
}
return string.Compare(CrimeType, crimetype) == 0;
}
}

View File

@@ -0,0 +1,66 @@
namespace EDPlayerJournal.Entries;
public class DisembarkEntry : Entry {
/// <summary>
/// Disembarked into an SRV?
/// </summary>
public bool SRV { get; set; } = false;
/// <summary>
/// Taxi?
/// </summary>
public bool Taxi { get; set; } = false;
/// <summary>
/// Multicrew or not.
/// </summary>
public bool Multicrew { get; set; } = false;
/// <summary>
/// Player's ship ID
/// </summary>
public ulong? ID { get; set; }
/// <summary>
/// Star system
/// </summary>
public string? StarSystem { get; set; }
/// <summary>
/// System address
/// </summary>
public ulong? SystemAddress { get; set; }
/// <summary>
/// Body, name e.g. HIP 6182 B 2 a
/// </summary>
public string? Body { get; set; }
/// <summary>
/// Body ID
/// </summary>
public ulong? BodyID { get; set; }
/// <summary>
/// Disembarked on a station?
/// </summary>
public bool OnStation { get; set; } = false;
/// <summary>
/// Disembarked on a planet?
/// </summary>
public bool OnPlanet { get; set; } = false;
protected override void Initialise() {
SRV = JSON.Value<bool?>("SRV") ?? false;
Taxi = JSON.Value<bool?>("Taxi") ?? false;
Multicrew = JSON.Value<bool?>("Multicrew") ?? false;
ID = JSON.Value<ulong?>("ID");
StarSystem = JSON.Value<string?>("StarSystem");
SystemAddress = JSON.Value<ulong?>("SystemAddress");
Body = JSON.Value<string?>("Body");
BodyID = JSON.Value<ulong?>("BodyID");
OnStation = JSON.Value<bool?>("OnStation") ?? false;
OnPlanet = JSON.Value<bool?>("OnPlanet") ?? false;
}
}

View File

@@ -2,15 +2,36 @@
namespace EDPlayerJournal.Entries;
public class DockedEntry : Entry {
/// <summary>
/// Name of the station
/// </summary>
public string? StationName { get; set; }
/// <summary>
/// Star system of the station
/// </summary>
public string? StarSystem { get; set; }
/// <summary>
/// System address
/// </summary>
public ulong? SystemAddress { get; set; }
/// <summary>
/// Faction owning the station.
/// </summary>
public string? StationFaction { get; set; }
/// <summary>
/// State of the station, new in Update 14
/// </summary>
public string? StationState { get; set; }
protected override void Initialise() {
StationName = JSON.Value<string>("StationName");
StarSystem = JSON.Value<string>("StarSystem");
SystemAddress = JSON.Value<ulong?>("SystemAddress");
StationState = JSON.Value<string>("StationState");
JObject? faction = JSON.Value<JObject>("StationFaction");
if (faction != null) {
StationFaction = faction.Value<string>("Name") ?? "";

View File

@@ -0,0 +1,42 @@
namespace EDPlayerJournal.Entries;
public class DropshipDeployEntry : Entry {
/// <summary>
/// Star system this drop happened in.
/// </summary>
public string? StarSystem { get; set; }
/// <summary>
/// System address
/// </summary>
public ulong? SystemAddress { get; set; }
/// <summary>
/// Planetary body
/// </summary>
public string? Body { get; set; }
/// <summary>
/// Body ID
/// </summary>
public ulong? BodyID { get; set; }
/// <summary>
/// Whether it happened on station.
/// </summary>
public bool? OnStation { get; set; }
/// <summary>
/// Whether it happened on a planet.
/// </summary>
public bool? OnPlanet { get; set; }
protected override void Initialise() {
StarSystem = JSON.Value<string?>("StarSystem");
SystemAddress = JSON.Value<ulong?>("SystemAddress");
Body = JSON.Value<string?>("Body");
BodyID = JSON.Value<ulong?>("BodyID");
OnStation = JSON.Value<bool?>("OnStation");
OnPlanet = JSON.Value<bool?>("OnPlanet");
}
}

View File

@@ -0,0 +1,66 @@
namespace EDPlayerJournal.Entries;
public class EmbarkEntry : Entry {
/// <summary>
/// Disembarked into an SRV?
/// </summary>
public bool SRV { get; set; } = false;
/// <summary>
/// Taxi?
/// </summary>
public bool Taxi { get; set; } = false;
/// <summary>
/// Multicrew or not.
/// </summary>
public bool Multicrew { get; set; } = false;
/// <summary>
/// Player's ship ID
/// </summary>
public ulong? ID { get; set; }
/// <summary>
/// Star system
/// </summary>
public string? StarSystem { get; set; }
/// <summary>
/// System address
/// </summary>
public ulong? SystemAddress { get; set; }
/// <summary>
/// Body, name e.g. HIP 6182 B 2 a
/// </summary>
public string? Body { get; set; }
/// <summary>
/// Body ID
/// </summary>
public ulong? BodyID { get; set; }
/// <summary>
/// Disembarked on a station?
/// </summary>
public bool OnStation { get; set; } = false;
/// <summary>
/// Disembarked on a planet?
/// </summary>
public bool OnPlanet { get; set; } = false;
protected override void Initialise() {
SRV = JSON.Value<bool?>("SRV") ?? false;
Taxi = JSON.Value<bool?>("Taxi") ?? false;
Multicrew = JSON.Value<bool?>("Multicrew") ?? false;
ID = JSON.Value<ulong?>("ID");
StarSystem = JSON.Value<string?>("StarSystem");
SystemAddress = JSON.Value<ulong?>("SystemAddress");
Body = JSON.Value<string?>("Body");
BodyID = JSON.Value<ulong?>("BodyID");
OnStation = JSON.Value<bool?>("OnStation") ?? false;
OnPlanet = JSON.Value<bool?>("OnPlanet") ?? false;
}
}

View File

@@ -13,12 +13,16 @@ namespace EDPlayerJournal.Entries;
public class Entry {
private static readonly Dictionary<string, Type> classes = new Dictionary<string, Type> {
{ Events.Bounty, typeof(BountyEntry) },
{ Events.CapShipBond, typeof(CapShipBondEntry) },
{ Events.Commander, typeof(CommanderEntry) },
{ Events.CommitCrime, typeof(CommitCrimeEntry) },
{ Events.Died, typeof(DiedEntry) },
{ Events.Disembark, typeof(DisembarkEntry) },
{ Events.Docked, typeof(DockedEntry) },
{ Events.FileHeader, typeof(FileHeaderEntry) },
{ Events.DropshipDeploy, typeof(DropshipDeployEntry) },
{ Events.Embark, typeof(EmbarkEntry) },
{ Events.FactionKillBond, typeof(FactionKillBondEntry) },
{ Events.FileHeader, typeof(FileHeaderEntry) },
{ Events.FSDJump, typeof(FSDJumpEntry) },
{ Events.HullDamage, typeof(HullDamageEntry) },
{ Events.LoadGame, typeof(LoadGameEntry) },
@@ -32,6 +36,7 @@ public class Entry {
{ Events.MissionRedirected, typeof(MissionRedirectedEntry) },
{ Events.Missions, typeof(MissionsEntry) },
{ Events.MultiSellExplorationData, typeof(MultiSellExplorationDataEntry) },
{ Events.ReceiveText, typeof(ReceiveTextEntry) },
{ Events.RedeemVoucher, typeof(RedeemVoucherEntry) },
{ Events.SearchAndRescue, typeof(SearchAndRescueEntry) },
{ Events.SellExplorationData, typeof(SellExplorationDataEntry) },
@@ -39,6 +44,8 @@ public class Entry {
{ Events.SellOrganicData, typeof(SellOrganicDataEntry) },
{ Events.ShieldState, typeof(ShieldStateEntry) },
{ Events.ShipTargeted, typeof(ShipTargetedEntry) },
{ Events.SupercruiseEntry, typeof(SupercruiseEntryEntry) },
{ Events.SupercruiseExit, typeof(SupercruiseExitEntry) },
{ Events.UnderAttack, typeof(UnderAttackEntry) },
};
@@ -98,7 +105,7 @@ public class Entry {
this.datetime = json.GetValue("timestamp")?.ToString();
if (!string.IsNullOrEmpty(this.datetime)) {
this.timestamp = DateTime.Parse(this.datetime);
this.timestamp = DateTime.Parse(this.datetime, null, System.Globalization.DateTimeStyles.RoundtripKind);
}
}

View File

@@ -2,10 +2,14 @@
public class Events {
public static readonly string Bounty = "Bounty";
public static readonly string CapShipBond = "CapShipBond";
public static readonly string Commander = "Commander";
public static readonly string CommitCrime = "CommitCrime";
public static readonly string Died = "Died";
public static readonly string Disembark = "Disembark";
public static readonly string Docked = "Docked";
public static readonly string DropshipDeploy = "DropshipDeploy";
public static readonly string Embark = "Embark";
public static readonly string FactionKillBond = "FactionKillBond";
public static readonly string FighterDestroyed = "FighterDestroyed";
public static readonly string FileHeader = "Fileheader";
@@ -22,6 +26,7 @@ public class Events {
public static readonly string MissionRedirected = "MissionRedirected";
public static readonly string Missions = "Missions";
public static readonly string MultiSellExplorationData = "MultiSellExplorationData";
public static readonly string ReceiveText = "ReceiveText";
public static readonly string RedeemVoucher = "RedeemVoucher";
public static readonly string SearchAndRescue = "SearchAndRescue";
public static readonly string SellExplorationData = "SellExplorationData";
@@ -29,5 +34,8 @@ public class Events {
public static readonly string SellOrganicData = "SellOrganicData";
public static readonly string ShieldState = "ShieldState";
public static readonly string ShipTargeted = "ShipTargeted";
public static readonly string Shutdown = "Shutdown";
public static readonly string SupercruiseEntry = "SupercruiseEntry";
public static readonly string SupercruiseExit = "SupercruiseExit";
public static readonly string UnderAttack = "UnderAttack";
}

View File

@@ -1,13 +1,32 @@
namespace EDPlayerJournal.Entries;
public class FactionKillBondEntry : Entry {
public int Reward { get; set; }
/// <summary>
/// Reward given
/// </summary>
public ulong Reward { get; set; } = 0;
/// <summary>
/// Faction that awarded the kill bond
/// </summary>
public string? AwardingFaction { get; set; }
/// <summary>
/// Localised string of the awarding faction if available
/// </summary>
public string? AwardingFactionLocalised { get; set; }
/// <summary>
/// Victim faction, internal name
/// </summary>
public string? VictimFaction { get; set; }
/// <summary>
/// Localised name of the victim faction
/// </summary>
public string? VictimFactionLocalised { get; set; }
protected override void Initialise() {
Reward = JSON.Value<int?>("Reward") ?? 0;
Reward = JSON.Value<ulong?>("Reward") ?? 0;
AwardingFaction = JSON.Value<string>("AwardingFaction");
AwardingFactionLocalised = JSON.Value<string>("AwardingFaction_Localised");
VictimFaction = JSON.Value<string>("VictimFaction");
VictimFactionLocalised = JSON.Value<string>("VictimFaction_Localised");
}
}

View File

@@ -26,6 +26,22 @@ public class FileHeaderEntry : Entry {
/// </summary>
public string? Build { get; set; }
/// <summary>
/// Returns true if the version is legacy (3.X)
/// <summary>
public bool IsLegacy {
get {
return GameVersion.StartsWith("3.");
}
}
/// <summary>
/// Returns true if the version is live (4.x)
/// </summary>
public bool IsLive {
get { return !IsLegacy; }
}
protected override void Initialise() {
Part = JSON.Value<ulong?>("part") ?? 1;
Language = JSON.Value<string?>("language") ?? string.Empty;

View File

@@ -0,0 +1,77 @@
namespace EDPlayerJournal.Entries;
public class ReceiveTextEntry : Entry {
/// <summary>
/// From whom this message is
/// </summary>
public string? From { get; set; }
/// <summary>
/// The message, if it is just an NPC text, it will be a message ID
/// </summary>
public string? Message { get; set; }
/// <summary>
/// Message localised
/// </summary>
public string? MessageLocalised { get; set; }
/// <summary>
/// On what channel this was received.
/// </summary>
public string? Channel { get; set; }
public bool HasNPCCategory {
get {
if (From == null) {
return false;
}
if (From.Contains(';') && From.StartsWith("$")) {
return true;
}
return false;
}
}
/// <summary>
/// Returns the NPC's category, if it has one.
/// </summary>
public string? NPCCategory {
get {
if (!HasNPCCategory || From == null) {
return null;
}
string[] parts = From.Split(";", StringSplitOptions.TrimEntries);
if (parts.Length < 2) {
return null;
}
return string.Format("{0};", parts[0]);
}
}
/// <summary>
/// Returns the NPC's category, if it has one.
/// </summary>
public string? NPCName {
get {
if (!HasNPCCategory || From == null) {
return null;
}
string[] parts = From.Split(";", StringSplitOptions.TrimEntries);
if (parts.Length < 2) {
return null;
}
return parts[1];
}
}
protected override void Initialise() {
From = JSON.Value<string>("From");
Message = JSON.Value<string>("Message");
MessageLocalised = JSON.Value<string>("Message_localised");
Channel = JSON.Value<string>("Channel");
}
}

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

@@ -8,11 +8,17 @@ public class BioData {
public string? SpeciesLocalised { get; set; }
public long Value { get; set; } = 0;
public long Bonus { get; set; } = 0;
public long TotalValue => Value + Bonus;
public long TotalValue {
get {
return Value + Bonus;
}
}
}
public class SellOrganicDataEntry : Entry {
public long MarketID { get; set; }
public List<BioData> BioData => new List<BioData>();
public List<BioData> BioData { get; } = new();
protected override void Initialise() {
MarketID = JSON.Value<long?>("MarketID") ?? 0;

View File

@@ -0,0 +1,30 @@
namespace EDPlayerJournal.Entries;
public class SupercruiseEntryEntry : Entry {
/// <summary>
/// Taxi?
/// </summary>
public bool Taxi { get; set; } = false;
/// <summary>
/// Multicrew or not.
/// </summary>
public bool Multicrew { get; set; } = false;
/// <summary>
/// Star system
/// </summary>
public string? StarSystem { get; set; }
/// <summary>
/// System address
/// </summary>
public ulong? SystemAddress { get; set; }
protected override void Initialise() {
Taxi = JSON.Value<bool?>("Taxi") ?? false;
Multicrew = JSON.Value<bool?>("Multicrew") ?? false;
StarSystem = JSON.Value<string?>("StarSystem");
SystemAddress = JSON.Value<ulong?>("SystemAddress");
}
}

View File

@@ -0,0 +1,48 @@
namespace EDPlayerJournal.Entries;
public class SupercruiseExitEntry : Entry {
/// <summary>
/// Taxi?
/// </summary>
public bool Taxi { get; set; } = false;
/// <summary>
/// Multicrew or not.
/// </summary>
public bool Multicrew { get; set; } = false;
/// <summary>
/// Star system
/// </summary>
public string? StarSystem { get; set; }
/// <summary>
/// System address
/// </summary>
public ulong? SystemAddress { get; set; }
/// <summary>
/// Body, name e.g. HIP 6182 B 2 a
/// </summary>
public string? Body { get; set; }
/// <summary>
/// Body ID
/// </summary>
public ulong? BodyID { get; set; }
/// <summary>
/// Body type (star, planet etc.)
/// </summary>
public string? BodyType { get; set; }
protected override void Initialise() {
Taxi = JSON.Value<bool?>("Taxi") ?? false;
Multicrew = JSON.Value<bool?>("Multicrew") ?? false;
StarSystem = JSON.Value<string?>("StarSystem");
SystemAddress = JSON.Value<ulong?>("SystemAddress");
Body = JSON.Value<string?>("Body");
BodyType = JSON.Value<string?>("BodyType");
BodyID = JSON.Value<ulong?>("BodyID");
}
}

View File

@@ -5,7 +5,8 @@ using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
namespace EDPlayerJournal;
namespace EDPlayerJournal;
public class FactionState {
public string? State { get; set; }
public long? Trend { get; set; }
@@ -28,6 +29,84 @@ public class FactionState {
}
}
public class Factions {
/// <summary>
/// Internal name for the Pilots Federation faction
/// </summary>
public static string PilotsFederationInternal = "$faction_PilotsFederation;";
/// <summary>
/// Name used for Pilots Federation in vouchers
/// </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 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 string? Name { get; set; }
public string? FactionState { get; set; }

View File

@@ -1,63 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
namespace EDPlayerJournal;
public class HumanReadableMissionName {
private static Dictionary<string, string>? humanreadable = null;
private static void LoadMissions() {
try {
string dir = AppDomain.CurrentDomain.BaseDirectory;
string file = Path.Combine(dir, "MissionNames.xml");
XmlDocument document = new XmlDocument();
using (FileStream stream = new FileStream(file, FileMode.Open)) {
document.Load(stream);
XmlNode? missions = document.DocumentElement;
if (missions == null ||
missions.Name != "Missions" ||
missions.ChildNodes == null) {
throw new ApplicationException("Invalid XML");
}
humanreadable = new Dictionary<string, string>();
foreach (XmlNode mission in missions.ChildNodes) {
if (mission.Attributes == null) {
continue;
}
string? mission_key = mission.Attributes["Name"]?.Value;
string? mission_name = mission.InnerText;
if (mission_key == null || mission_name == null) {
continue;
}
humanreadable.Add(mission_key, mission_name);
}
}
} catch (Exception) {
humanreadable = null;
}
}
public static string? MakeHumanReadableName(string name) {
LoadMissions();
if (humanreadable == null || name == null) {
return null;
}
if (humanreadable.ContainsKey(name)) {
return humanreadable[name];
}
return null;
}
}

View File

@@ -109,6 +109,11 @@ public class MissionFactionEffects {
}
public class Mission : IComparable<Mission> {
/// <summary>
/// Passenger type for refugees
/// </summary>
public static readonly string PassengerTypeRefugee = "Refugee";
public ulong MissionID { get; set; } = 0;
/// <summary>
@@ -250,6 +255,67 @@ public class Mission : IComparable<Mission> {
/// </summary>
public List<MissionFactionEffects> FactionEffects { get; set; } = new List<MissionFactionEffects>();
/// <summary>
/// Returns true if the name is an on foot mission.
/// </summary>
public bool IsOnFoot {
get {
if (string.IsNullOrEmpty(Name)) {
return false;
}
return Name.Contains("OnFoot");
}
}
public bool IsPassengerMission {
get {
if (PassengerCount == null || PassengerCount == 0) {
return false;
}
return true;
}
}
public bool IsRescueMission {
get {
if (!IsPassengerMission) {
return false;
}
if (string.Compare(PassengerType, PassengerTypeRefugee) == 0) {
return true;
}
return false;
}
}
/// <summary>
/// Returns a friendly human-readable name for the mission. If a localised name is available
/// it will use that, baring that it will check EnglishMissionNames for a translation, and
/// if that ain't available either, it will just use the internal Name.
/// </summary>
public string FriendlyName {
get {
if (!string.IsNullOrEmpty(LocalisedName)) {
return LocalisedName;
}
if (string.IsNullOrEmpty(Name)) {
return "Unknown Mission";
}
string? translate = EnglishMissionNames.Translate(Name);
if (!string.IsNullOrEmpty(translate)) {
return translate;
}
return Name;
}
}
public int CompareTo(Mission? other) {
if (other == null) {
return 1;

View File

@@ -1,84 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<Missions>
<Mission Name="Chain_FindThePirateLord_name">Assassination (Pirate Lord) (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_AltruismCredits_Bust_name">Donate Credits (Bust)</Mission>
<Mission Name="Mission_AltruismCredits_Famine_name">Donate Credits (Famine)</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_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_CivilLiberty_name">Provide (Civil Liberty)</Mission>
<Mission Name="Mission_Collect_CivilUnrest_name">Provide (Civil Unrest)</Mission>
<Mission Name="Mission_Collect_Famine_name">Provide (Famine)</Mission>
<Mission Name="Mission_Collect_Industrial_name">Provide (Industrial)</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_Elections_name">Courier (Elections)</Mission>
<Mission Name="Mission_Courier_Expansion_name">Courier (Expansion)</Mission>
<Mission Name="Mission_Courier_Famine_name">Courier (Famine)</Mission>
<Mission Name="Mission_Courier_Lockdown_name">Courier (Lockdown)</Mission>
<Mission Name="Mission_Courier_name">Courier</Mission>
<Mission Name="Mission_Courier_RankEmp_name">Courier (Imperial Navy)</Mission>
<Mission Name="Mission_Delivery_Agriculture_name">Delivery (Agriculture)</Mission>
<Mission Name="Mission_Delivery_Boom_name">Delivery (Boom)</Mission>
<Mission Name="Mission_Delivery_Democracy_name">Delivery (Democracy)</Mission>
<Mission Name="Mission_Delivery_Investment_name">Delivery (Investment)</Mission>
<Mission Name="Mission_Delivery_name">Delivery</Mission>
<Mission Name="Mission_Delivery_RankEmp_name">Delivery (Imperial Navy)</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_Elections_name">Hack Surface Installation (Elections)</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_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_Massacre_Conflict_CivilWar_name">Massacre (Civil War)</Mission>
<Mission Name="Mission_Massacre_name">Massacre</Mission>
<Mission Name="Mission_Massacre_RankEmp_name">Massacre (Imperial Navy)</Mission>
<Mission Name="Mission_MassacreWing_Legal_Bust_name">Massacre (Wing) (Bust)</Mission>
<Mission Name="Mission_MassacreWing_name">Massacre (Wing)</Mission>
<Mission Name="Mission_OnFoot_Assassination_MB_name">On Foot Assassination</Mission>
<Mission Name="Mission_OnFoot_AssassinationIllegal_MB_name">On Foot Assassination (Illegal)</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_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_Onslaught_MB_name">On Foot Onslaught</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_MB_name">On Foot Production Heist</Mission>
<Mission Name="Mission_OnFoot_Reboot_MB_name">On Foot Reboot</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_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_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_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_Salvage_CivilUnrest_name">Salvage (Civil Unrest)</Mission>
<Mission Name="MISSION_Salvage_Expansion_name">Salvage (Expansion)</Mission>
<Mission Name="MISSION_Salvage_Illegal_name">Salvage (Illegal)</Mission>
<Mission Name="Mission_Salvage_name">Salvage</Mission>
<Mission Name="Mission_Salvage_RankEmp_name">Salvage (Imperial Navy)</Mission>
<Mission Name="MISSION_Salvage_Refinery_name">Salvage (Refinery)</Mission>
<Mission Name="MISSION_Salvage_Retreat_name">Salvage (Retreat)</Mission>
<Mission Name="MISSION_Scan_name">Scan</Mission>
<Mission Name="Mission_Sightseeing_Criminal_FAMINE_name">Sightseeing (Criminal) (Famine)</Mission>
<Mission Name="Mission_Sightseeing_name">Sightseeing</Mission>
</Missions>

122
EDPlayerJournal/NPC.cs Normal file
View File

@@ -0,0 +1,122 @@
namespace EDPlayerJournal;
public class NPCs {
/// <summary>
/// Internal name of Spec Ops Wing Alpha
/// </summary>
public static string SpecOpsAInternal = "$LUASC_Scenario_Warzone_NPC_SpecOps_A;";
/// <summary>
/// Internal name of Spec Ops Wing Beta
/// </summary>
public static string SpecOpsBInternal = "$LUASC_Scenario_Warzone_NPC_SpecOps_B;";
/// <summary>
/// Internal name of Spec Ops Wing Gamma
/// </summary>
public static string SpecOpsGInternal = "$LUASC_Scenario_Warzone_NPC_SpecOps_G;";
/// <summary>
/// Internal name of Spec Ops Wing Delta
/// </summary>
public static string SpecOpsDInternal = "$LUASC_Scenario_Warzone_NPC_SpecOps_D;";
/// <summary>
/// Empire captain
/// </summary>
public static string EmpireCaptain = "$LUASC_Scenario_Warzone_NPC_WarzoneGeneral_Emp;";
/// <summary>
/// Federation captain
/// </summary>
public static string FederationCaptain = "$LUASC_Scenario_Warzone_NPC_WarzoneGeneral_Fed;";
/// <summary>
/// Federation captain
/// </summary>
public static string IndependentCaptain = "$LUASC_Scenario_Warzone_NPC_WarzoneGeneral_Ind;";
/// <summary>
/// Warzone correspondant
/// </summary>
public static string WarzoneCorrespondent = "$LUASC_Scenario_Warzone_NPC_WarzoneCorrespondent;";
/// <summary>
/// AX Military NPC
/// </summary>
public static string AXMilitary = "$Name_AX_Military;";
/// <summary>
/// Returns true if the pilotname is either a captain, specops, or correspondent
/// </summary>
/// <param name="pilotname"></param>
/// <returns></returns>
public static bool IsWarzoneNPC(string? pilotname) {
if (IsWarzoneCaptain(pilotname) ||
IsWarzoneCorrespondent(pilotname) ||
IsSpecOps(pilotname)) {
return true;
}
return false;
}
/// <summary>
/// Returns true if the given pilot name is a warzone correspondent
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static bool IsWarzoneCorrespondent(string? pilotname) {
if (pilotname == null) {
return false;
}
if (string.Compare(pilotname, WarzoneCorrespondent) == 0) {
return true;
}
return false;
}
/// <summary>
/// Returns true if the given pilot name is a spec ops wing.
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static bool IsSpecOps(string? pilotname) {
if (pilotname == null) {
return false;
}
if (string.Compare(pilotname, SpecOpsAInternal) == 0 ||
string.Compare(pilotname, SpecOpsBInternal) == 0 ||
string.Compare(pilotname, SpecOpsGInternal) == 0 ||
string.Compare(pilotname, SpecOpsDInternal) == 0) {
return true;
}
return false;
}
/// <summary>
/// Returns true if the given pilot name is a warzone captain
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static bool IsWarzoneCaptain(string? pilotname) {
if (pilotname == null) {
return false;
}
if (string.Compare(pilotname, EmpireCaptain) == 0 ||
string.Compare(pilotname, FederationCaptain) == 0 ||
string.Compare(pilotname, IndependentCaptain) == 0) {
return true;
}
return false;
}
}
public class NPC {
}

View File

@@ -0,0 +1,61 @@
namespace EDPlayerJournal;
public enum ThargoidVessel {
Unknown = 0,
Scout = 1,
Orthrus = 2,
Cyclops = 3,
Basilisk = 4,
Medusa = 5,
Hydra = 6,
}
public class Thargoid {
public static string ThargoidFaction = Factions.Thargoid;
public static Dictionary<ulong, ThargoidVessel> VesselPayout { get; } = new() {
// Up to date values ever since 14.02
{ 65000, ThargoidVessel.Scout },
{ 75000, ThargoidVessel.Scout },
{ 6500000, ThargoidVessel.Cyclops },
{ 20000000, ThargoidVessel.Basilisk },
{ 25000000, ThargoidVessel.Orthrus },
{ 34000000, ThargoidVessel.Medusa },
{ 50000000, ThargoidVessel.Hydra },
// These are the old values pre Update 14.02
{ 80000, ThargoidVessel.Scout },
{ 8000000, ThargoidVessel.Cyclops },
{ 24000000, ThargoidVessel.Basilisk },
// In Update 14.1 the payout for Orthrus has been rebalanced.
{ 30000000, ThargoidVessel.Orthrus },
{ 40000000, ThargoidVessel.Medusa },
// This used to be the old payout value for Orthrus, it now conflicts
// with Post Update 14.02 Hydra values
//{ 50000000, ThargoidVessel.Orthrus },
{ 60000000, ThargoidVessel.Hydra },
};
public static Dictionary<ThargoidVessel, string?> VesselNames { get; } = new() {
{ ThargoidVessel.Unknown, null },
{ ThargoidVessel.Scout, "Thargoid Scout" },
{ ThargoidVessel.Orthrus, "Orthrus" },
{ ThargoidVessel.Cyclops, "Cyclops" },
{ ThargoidVessel.Basilisk, "Basilisk" },
{ ThargoidVessel.Medusa, "Medusa" },
{ ThargoidVessel.Hydra, "Hydra" },
};
public static ThargoidVessel GetVesselByPayout(ulong payout) {
if (VesselPayout.ContainsKey(payout)) {
return VesselPayout[payout];
}
return ThargoidVessel.Unknown;
}
public static string? GetVesselName(ThargoidVessel v) {
if (VesselNames.ContainsKey(v)) {
return VesselNames[v];
}
return null;
}
}

View File

@@ -0,0 +1,28 @@
using EDPlayerJournal;
using EDPlayerJournal.Entries;
using EDPlayerJournal.BGS;
namespace EDPlayerJournalTests;
[TestClass]
public class CombatZoneTest {
[TestMethod]
public void DropshipDeployTest() {
TransactionParser parser = new();
List<Entry>? entries = Helper.LoadTestData("dropship-deploy.txt");
Assert.IsNotNull(entries);
List<Transaction>? transactions = parser.Parse(entries);
Assert.IsNotNull(transactions);
Vouchers? vouchers = transactions[0] as Vouchers;
Assert.IsNotNull(vouchers);
CombatZone? combatzone = transactions[1] as CombatZone;
Assert.IsNotNull(combatzone);
Assert.AreEqual(combatzone.Type, CombatZones.GroundCombatZone);
Assert.AreEqual(combatzone.Grade, CombatZones.DifficultyHigh);
}
}

View File

@@ -0,0 +1,2 @@
{ "timestamp":"2022-11-20T14:30:30Z", "event":"RedeemVoucher", "Type":"bounty", "Amount":3197549, "Factions":[ { "Faction":"Nova Paresa", "Amount":3197549 } ] }
{ "timestamp":"2022-11-20T14:30:34Z", "event":"RedeemVoucher", "Type":"bounty", "Amount":4785831, "Factions":[ { "Faction":"", "Amount":723175 }, { "Faction":"Nova Paresa", "Amount":3197549 }, { "Faction":"Prismatic Imperium", "Amount":4062656 } ] }

View File

@@ -26,6 +26,12 @@
<None Update="double-support.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="dropship-deploy.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="legacy-transaction.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="mission-failed.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
@@ -44,6 +50,12 @@
<None Update="SellOrganicData.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="ThargoidBonds.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="ThargoidKills.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@@ -21,6 +21,8 @@ public class FileHeaderTest {
Assert.AreEqual(header.Language, "English/UK");
Assert.AreEqual(header.Odyssey, true);
Assert.AreEqual(header.GameVersion, "4.0.0.1450");
Assert.AreEqual(header.IsLegacy, false);
Assert.AreEqual(header.IsLive, true);
// Someone at FDev messed up string building there.
Assert.AreEqual(header.Build, "r286858/r0 ");
}
@@ -44,6 +46,8 @@ public class FileHeaderTest {
Assert.AreEqual(header.Language, """English\UK""");
Assert.AreEqual(header.Odyssey, false);
Assert.AreEqual(header.GameVersion, "3.5.3.400 EDH");
Assert.AreEqual(header.IsLegacy, true);
Assert.AreEqual(header.IsLive, false);
// ~73k commits in two years. Not bad.
Assert.AreEqual(header.Build, "r213094/r0 ");
}

View File

@@ -0,0 +1,25 @@
using EDPlayerJournal.Entries;
namespace EDPlayerJournalTests;
public class Helper {
public static List<Entry>? LoadTestData(string filename) {
string path = Path.GetFullPath("./" + filename);
string[] lines = File.ReadAllLines(path);
List<Entry> entries = new();
foreach (string line in lines) {
line.Trim();
if (string.IsNullOrEmpty(line)) {
continue;
}
Entry? entry = Entry.Parse(line);
if (entry != null) {
entries.Add(entry);
}
}
return entries;
}
}

View File

@@ -6,31 +6,34 @@ namespace EDPlayerJournalTests;
[TestClass]
public class TestTransactionParser {
private List<Entry>? LoadTestData(string filename) {
string path = Path.GetFullPath("./" + filename);
string[] lines = File.ReadAllLines(path);
List<Entry> entries = new();
[TestMethod]
public void Legacy() {
TransactionParser parser = new();
foreach (string line in lines) {
line.Trim();
if (string.IsNullOrEmpty(line)) {
continue;
}
// File header, followed by two legacy transactions, followed by another
// file header with an Odyssey transaction
List<Entry>? entries = Helper.LoadTestData("legacy-transaction.txt");
Assert.IsNotNull(entries, "could not load test data");
Entry? entry = Entry.Parse(line);
if (entry != null) {
entries.Add(entry);
}
if (entries == null) {
return;
}
return entries;
List<Transaction>? transactions = parser.Parse(entries);
Assert.IsNotNull(transactions, "could not parse entries");
Assert.AreEqual(transactions.Count, 3);
Assert.AreEqual(transactions[0].IsLegacy, true);
Assert.AreEqual(transactions[1].IsLegacy, true);
Assert.AreEqual(transactions[2].IsLegacy, false);
}
[TestMethod]
public void DoubleFiveINF() {
TransactionParser parser = new();
List<Entry>? entries = LoadTestData("double-five-inf.txt");
List<Entry>? entries = Helper.LoadTestData("double-five-inf.txt");
Assert.IsNotNull(entries, "could not load test data");
if (entries == null) {
@@ -46,7 +49,7 @@ public class TestTransactionParser {
public void DoubleSupport() {
TransactionParser parser = new();
List<Entry>? entries = LoadTestData("double-support.txt");
List<Entry>? entries = Helper.LoadTestData("double-support.txt");
Assert.IsNotNull(entries, "could not load test data");
if (entries == null) {
@@ -62,7 +65,7 @@ public class TestTransactionParser {
public void MissionFailed() {
TransactionParser parser = new();
List<Entry>? entries = LoadTestData("mission-failed.txt");
List<Entry>? entries = Helper.LoadTestData("mission-failed.txt");
Assert.IsNotNull(entries, "could not load test data");
if (entries == null) {
@@ -78,7 +81,7 @@ public class TestTransactionParser {
public void MissionNoINF() {
TransactionParser parser = new();
List<Entry>? entries = LoadTestData("mission-noinfforsourceortarget.txt");
List<Entry>? entries = Helper.LoadTestData("mission-noinfforsourceortarget.txt");
Assert.IsNotNull(entries, "could not load test data");
if (entries == null) {
@@ -94,7 +97,7 @@ public class TestTransactionParser {
public void Murder() {
TransactionParser parser = new();
List<Entry>? entries = LoadTestData("murder.txt");
List<Entry>? entries = Helper.LoadTestData("murder.txt");
Assert.IsNotNull(entries, "could not load test data");
if (entries == null) {
@@ -118,7 +121,7 @@ public class TestTransactionParser {
public void NoFactionNameNoInfluence() {
TransactionParser parser = new();
List<Entry>? entries = LoadTestData("nofactionname-andnoinfluence.txt");
List<Entry>? entries = Helper.LoadTestData("nofactionname-andnoinfluence.txt");
Assert.IsNotNull(entries, "could not load test data");
if (entries == null) {
@@ -134,7 +137,7 @@ public class TestTransactionParser {
public void SellOrganicData() {
TransactionParser parser = new();
List<Entry>? entries = LoadTestData("SellOrganicData.txt");
List<Entry>? entries = Helper.LoadTestData("SellOrganicData.txt");
Assert.IsNotNull(entries, "could not load test data");
if (entries == null) {

View File

@@ -0,0 +1,3 @@
{ "timestamp":"2022-11-25T10:10:43Z", "event":"FSDJump", "Taxi":false, "Multicrew":false, "StarSystem":"Nyalayan", "SystemAddress":1458309042898, "StarPos":[29.71875,-172.71875,-6.46875], "SystemAllegiance":"Independent", "SystemEconomy":"$economy_Agri;", "SystemEconomy_Localised":"Agriculture", "SystemSecondEconomy":"$economy_Refinery;", "SystemSecondEconomy_Localised":"Refinery", "SystemGovernment":"$government_Theocracy;", "SystemGovernment_Localised":"Theocracy", "SystemSecurity":"$SYSTEM_SECURITY_medium;", "SystemSecurity_Localised":"Medium Security", "Population":1920608781, "Body":"Nyalayan A", "BodyID":1, "BodyType":"Star", "JumpDist":7.769, "FuelUsed":0.142448, "FuelLevel":15.857553, "Factions":[ { "Name":"Nyalayan Imperial Society", "FactionState":"Election", "Government":"Patronage", "Influence":0.165138, "Allegiance":"Empire", "Happiness":"$Faction_HappinessBand2;", "Happiness_Localised":"Happy", "MyReputation":17.496799, "ActiveStates":[ { "State":"Election" } ] }, { "Name":"Reret Emperor's Grace", "FactionState":"War", "Government":"Patronage", "Influence":0.257900, "Allegiance":"Empire", "Happiness":"$Faction_HappinessBand2;", "Happiness_Localised":"Happy", "MyReputation":100.000000, "ActiveStates":[ { "State":"Expansion" }, { "State":"War" } ] }, { "Name":"Nyalayan Silver Transport Org", "FactionState":"None", "Government":"Corporate", "Influence":0.076453, "Allegiance":"Empire", "Happiness":"$Faction_HappinessBand2;", "Happiness_Localised":"Happy", "MyReputation":81.875000 }, { "Name":"Nyalayan Power & Co", "FactionState":"None", "Government":"Corporate", "Influence":0.060143, "Allegiance":"Independent", "Happiness":"$Faction_HappinessBand2;", "Happiness_Localised":"Happy", "MyReputation":23.173201 }, { "Name":"Amanogawa Enlight", "FactionState":"War", "Government":"Theocracy", "Influence":0.257900, "Allegiance":"Independent", "Happiness":"$Faction_HappinessBand2;", "Happiness_Localised":"Happy", "MyReputation":-1.210600, "ActiveStates":[ { "State":"Expansion" }, { "State":"War" } ] }, { "Name":"Nyalayan Crimson Dragons", "FactionState":"None", "Government":"Anarchy", "Influence":0.017329, "Allegiance":"Independent", "Happiness":"$Faction_HappinessBand2;", "Happiness_Localised":"Happy", "MyReputation":-13.530000 }, { "Name":"Traditional Nyalayan Front", "FactionState":"Election", "Government":"Dictatorship", "Influence":0.165138, "Allegiance":"Independent", "Happiness":"$Faction_HappinessBand2;", "Happiness_Localised":"Happy", "MyReputation":64.699997, "ActiveStates":[ { "State":"Election" } ] } ], "SystemFaction":{ "Name":"Amanogawa Enlight", "FactionState":"War" }, "Conflicts":[ { "WarType":"election", "Status":"active", "Faction1":{ "Name":"Nyalayan Imperial Society", "Stake":"Pilcher Port", "WonDays":2 }, "Faction2":{ "Name":"Traditional Nyalayan Front", "Stake":"Lamar Falls", "WonDays":0 } }, { "WarType":"war", "Status":"active", "Faction1":{ "Name":"Reret Emperor's Grace", "Stake":"", "WonDays":1 }, "Faction2":{ "Name":"Amanogawa Enlight", "Stake":"Sutter Ring", "WonDays":2 } } ] }
{ "timestamp":"2022-11-25T10:13:32Z", "event":"Docked", "StationName":"Pilcher Port", "StationType":"Orbis", "Taxi":false, "Multicrew":false, "StarSystem":"Nyalayan", "SystemAddress":1458309042898, "MarketID":3222853120, "StationFaction":{ "Name":"Nyalayan Imperial Society", "FactionState":"Election" }, "StationGovernment":"$government_Patronage;", "StationGovernment_Localised":"Patronage", "StationAllegiance":"Empire", "StationServices":[ "dock", "autodock", "commodities", "contacts", "exploration", "missions", "outfitting", "crewlounge", "rearm", "refuel", "repair", "shipyard", "tuning", "engineer", "missionsgenerated", "flightcontroller", "stationoperations", "powerplay", "searchrescue", "stationMenu", "shop", "livery", "socialspace", "bartender", "vistagenomics", "pioneersupplies", "apexinterstellar", "frontlinesolutions" ], "StationEconomy":"$economy_Refinery;", "StationEconomy_Localised":"Refinery", "StationEconomies":[ { "Name":"$economy_Refinery;", "Name_Localised":"Refinery", "Proportion":1.000000 } ], "DistFromStarLS":76.465557, "LandingPads":{ "Small":8, "Medium":11, "Large":6 } }
{ "timestamp":"2022-11-25T10:13:53Z", "event":"RedeemVoucher", "Type":"CombatBond", "Amount":24240000, "Faction":"PilotsFederation" }

View File

@@ -0,0 +1,54 @@
using EDPlayerJournal;
using EDPlayerJournal.BGS;
using EDPlayerJournal.Entries;
namespace EDPlayerJournalTests;
[TestClass]
public class ThargoidKills {
[TestMethod]
public void ThargoidBonks() {
TransactionParser parser = new();
List<Entry>? entries = Helper.LoadTestData("ThargoidKills.txt");
Assert.IsNotNull(entries, "could not load test data");
if (entries == null) {
return;
}
List<ThargoidKill>? transactions = parser.Parse(entries)?.OfType<ThargoidKill>().ToList();
Assert.IsNotNull(transactions, "could not parse entries");
Assert.AreEqual(transactions.Count, 3);
Assert.IsInstanceOfType(transactions[0], typeof(ThargoidKill), "result is not of type ThargoidKill");
Assert.AreEqual(transactions[0].ThargoidType, EDPlayerJournal.ThargoidVessel.Scout);
Assert.IsInstanceOfType(transactions[1], typeof(ThargoidKill), "result is not of type ThargoidKill");
Assert.AreEqual(transactions[1].ThargoidType, EDPlayerJournal.ThargoidVessel.Basilisk);
Assert.IsInstanceOfType(transactions[2], typeof(ThargoidKill), "result is not of type ThargoidKill");
Assert.AreEqual(transactions[2].ThargoidType, EDPlayerJournal.ThargoidVessel.Scout);
}
[TestMethod]
public void ThargoidBonds() {
TransactionParser parser = new();
List<Entry>? entries = Helper.LoadTestData("ThargoidBonds.txt");
Assert.IsNotNull(entries, "could not load test data");
if (entries == null) {
return;
}
List<Vouchers>? transactions = parser.Parse(entries)?.OfType<Vouchers>().ToList();
Assert.IsNotNull(transactions, "could not parse entries");
Assert.AreEqual(transactions.Count, 1);
Assert.AreEqual(Factions.IsPilotsFederation(transactions[0].Faction), true);
Assert.AreEqual(transactions[0].TotalSum, 24240000L);
Assert.AreEqual(transactions[0].Type, "Combat Bond");
}
}

View File

@@ -0,0 +1,3 @@
{ "timestamp":"2022-11-25T09:50:45Z", "event":"FactionKillBond", "Reward":80000, "AwardingFaction":"$faction_PilotsFederation;", "AwardingFaction_Localised":"Pilots' Federation", "VictimFaction":"$faction_Thargoid;", "VictimFaction_Localised":"Thargoids" }
{ "timestamp":"2022-11-25T09:52:28Z", "event":"FactionKillBond", "Reward":24000000, "AwardingFaction":"$faction_PilotsFederation;", "AwardingFaction_Localised":"Pilots' Federation", "VictimFaction":"$faction_Thargoid;", "VictimFaction_Localised":"Thargoids" }
{ "timestamp":"2022-11-25T09:47:19Z", "event":"FactionKillBond", "Reward":80000, "AwardingFaction":"$faction_PilotsFederation;", "AwardingFaction_Localised":"Pilots' Federation", "VictimFaction":"$faction_Thargoid;", "VictimFaction_Localised":"Thargoids" }

View File

@@ -0,0 +1,6 @@
{ "timestamp":"2022-11-25T10:10:43Z", "event":"FSDJump", "Taxi":false, "Multicrew":false, "StarSystem":"Nyalayan", "SystemAddress":1458309042898, "StarPos":[29.71875,-172.71875,-6.46875], "SystemAllegiance":"Independent", "SystemEconomy":"$economy_Agri;", "SystemEconomy_Localised":"Agriculture", "SystemSecondEconomy":"$economy_Refinery;", "SystemSecondEconomy_Localised":"Refinery", "SystemGovernment":"$government_Theocracy;", "SystemGovernment_Localised":"Theocracy", "SystemSecurity":"$SYSTEM_SECURITY_medium;", "SystemSecurity_Localised":"Medium Security", "Population":1920608781, "Body":"Nyalayan A", "BodyID":1, "BodyType":"Star", "JumpDist":7.769, "FuelUsed":0.142448, "FuelLevel":15.857553, "Factions":[ { "Name":"Nyalayan Imperial Society", "FactionState":"Election", "Government":"Patronage", "Influence":0.165138, "Allegiance":"Empire", "Happiness":"$Faction_HappinessBand2;", "Happiness_Localised":"Happy", "MyReputation":17.496799, "ActiveStates":[ { "State":"Election" } ] }, { "Name":"Reret Emperor's Grace", "FactionState":"War", "Government":"Patronage", "Influence":0.257900, "Allegiance":"Empire", "Happiness":"$Faction_HappinessBand2;", "Happiness_Localised":"Happy", "MyReputation":100.000000, "ActiveStates":[ { "State":"Expansion" }, { "State":"War" } ] }, { "Name":"Nyalayan Silver Transport Org", "FactionState":"None", "Government":"Corporate", "Influence":0.076453, "Allegiance":"Empire", "Happiness":"$Faction_HappinessBand2;", "Happiness_Localised":"Happy", "MyReputation":81.875000 }, { "Name":"Nyalayan Power & Co", "FactionState":"None", "Government":"Corporate", "Influence":0.060143, "Allegiance":"Independent", "Happiness":"$Faction_HappinessBand2;", "Happiness_Localised":"Happy", "MyReputation":23.173201 }, { "Name":"Amanogawa Enlight", "FactionState":"War", "Government":"Theocracy", "Influence":0.257900, "Allegiance":"Independent", "Happiness":"$Faction_HappinessBand2;", "Happiness_Localised":"Happy", "MyReputation":-1.210600, "ActiveStates":[ { "State":"Expansion" }, { "State":"War" } ] }, { "Name":"Nyalayan Crimson Dragons", "FactionState":"None", "Government":"Anarchy", "Influence":0.017329, "Allegiance":"Independent", "Happiness":"$Faction_HappinessBand2;", "Happiness_Localised":"Happy", "MyReputation":-13.530000 }, { "Name":"Traditional Nyalayan Front", "FactionState":"Election", "Government":"Dictatorship", "Influence":0.165138, "Allegiance":"Independent", "Happiness":"$Faction_HappinessBand2;", "Happiness_Localised":"Happy", "MyReputation":64.699997, "ActiveStates":[ { "State":"Election" } ] } ], "SystemFaction":{ "Name":"Amanogawa Enlight", "FactionState":"War" }, "Conflicts":[ { "WarType":"election", "Status":"active", "Faction1":{ "Name":"Nyalayan Imperial Society", "Stake":"Pilcher Port", "WonDays":2 }, "Faction2":{ "Name":"Traditional Nyalayan Front", "Stake":"Lamar Falls", "WonDays":0 } }, { "WarType":"war", "Status":"active", "Faction1":{ "Name":"Reret Emperor's Grace", "Stake":"", "WonDays":1 }, "Faction2":{ "Name":"Amanogawa Enlight", "Stake":"Sutter Ring", "WonDays":2 } } ] }
{ "timestamp":"2022-11-25T09:50:45Z", "event":"FactionKillBond", "Reward":80000, "AwardingFaction":"$faction_PilotsFederation;", "AwardingFaction_Localised":"Pilots' Federation", "VictimFaction":"$faction_Thargoid;", "VictimFaction_Localised":"Thargoids" }
{ "timestamp":"2022-11-25T09:52:28Z", "event":"FactionKillBond", "Reward":24000000, "AwardingFaction":"$faction_PilotsFederation;", "AwardingFaction_Localised":"Pilots' Federation", "VictimFaction":"$faction_Thargoid;", "VictimFaction_Localised":"Thargoids" }
{ "timestamp":"2022-11-25T09:47:19Z", "event":"FactionKillBond", "Reward":80000, "AwardingFaction":"$faction_PilotsFederation;", "AwardingFaction_Localised":"Pilots' Federation", "VictimFaction":"$faction_Thargoid;", "VictimFaction_Localised":"Thargoids" }
{ "timestamp":"2022-11-25T10:13:32Z", "event":"Docked", "StationName":"Pilcher Port", "StationType":"Orbis", "Taxi":false, "Multicrew":false, "StarSystem":"Nyalayan", "SystemAddress":1458309042898, "MarketID":3222853120, "StationFaction":{ "Name":"Nyalayan Imperial Society", "FactionState":"Election" }, "StationGovernment":"$government_Patronage;", "StationGovernment_Localised":"Patronage", "StationAllegiance":"Empire", "StationServices":[ "dock", "autodock", "commodities", "contacts", "exploration", "missions", "outfitting", "crewlounge", "rearm", "refuel", "repair", "shipyard", "tuning", "engineer", "missionsgenerated", "flightcontroller", "stationoperations", "powerplay", "searchrescue", "stationMenu", "shop", "livery", "socialspace", "bartender", "vistagenomics", "pioneersupplies", "apexinterstellar", "frontlinesolutions" ], "StationEconomy":"$economy_Refinery;", "StationEconomy_Localised":"Refinery", "StationEconomies":[ { "Name":"$economy_Refinery;", "Name_Localised":"Refinery", "Proportion":1.000000 } ], "DistFromStarLS":76.465557, "LandingPads":{ "Small":8, "Medium":11, "Large":6 } }
{ "timestamp":"2022-11-25T10:13:53Z", "event":"RedeemVoucher", "Type":"CombatBond", "Amount":24240000, "Faction":"PilotsFederation" }

View File

@@ -0,0 +1,63 @@
{"timestamp":"2022-12-09T14:23:52Z","event":"Fileheader","part":1,"language":"English/UK","Odyssey":true,"gameversion":"4.0.0.1476","build":"r289925/r0 "}
{"timestamp":"2022-12-09T14:33:01Z","event":"Location","DistFromStarLS":774.492896,"Docked":false,"OnFoot":true,"StarSystem":"Kazahua","SystemAddress":2871050905001,"StarPos":[93.28125,-180.25,14.6875],"SystemAllegiance":"Empire","SystemEconomy":"$economy_Industrial;","SystemEconomy_Localised":"Industrial","SystemSecondEconomy":"$economy_Colony;","SystemSecondEconomy_Localised":"Colony","SystemGovernment":"$government_Patronage;","SystemGovernment_Localised":"Patronage","SystemSecurity":"$SYSTEM_SECURITY_low;","SystemSecurity_Localised":"Low Security","Population":17949,"Body":"Kazahua 4 a","BodyID":5,"BodyType":"Planet","Factions":[{"Name":"Kazahua Co","FactionState":"None","Government":"Corporate","Influence":0.049098,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Kazahua Crimson Ring","FactionState":"None","Government":"Anarchy","Influence":0.01002,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"HIP 10611 Shared","FactionState":"None","Government":"Cooperative","Influence":0.091182,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":2.97},{"Name":"Traditional Yao Tzu Liberty Party","FactionState":"None","Government":"Dictatorship","Influence":0.058116,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-10.56},{"Name":"Sapii allied","FactionState":"War","Government":"Cooperative","Influence":0.395792,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-6.0,"ActiveStates":[{"State":"War"}]},{"Name":"Nova Paresa","FactionState":"War","Government":"Patronage","Influence":0.395792,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","SquadronFaction":true,"MyReputation":63.045399,"ActiveStates":[{"State":"War"}]}],"SystemFaction":{"Name":"Nova Paresa","FactionState":"War"},"Conflicts":[{"WarType":"war","Status":"active","Faction1":{"Name":"Sapii allied","Stake":"Barmin Installation","WonDays":0},"Faction2":{"Name":"Nova Paresa","Stake":"Rabinowitz Colony","WonDays":0}}]}
{"timestamp":"2022-12-09T14:33:05Z","event":"ReceiveText","From":"Barmin Installation","Message":"$STATION_NoFireZone_entered;","Message_Localised":"No fire zone entered.","Channel":"npc"}
{"timestamp":"2022-12-09T14:36:52Z","event":"ReceiveText","From":"$ShipName_Police_Independent;","From_Localised":"System Authority Vessel","Message":"$Police_EndPatrol02;","Message_Localised":"Requesting docking clearance, Control.","Channel":"npc"}
{"timestamp":"2022-12-09T14:39:54Z","event":"ReceiveText","From":"$ShipName_Police_Independent;","From_Localised":"System Authority Vessel","Message":"$Police_StartPatrol01;","Message_Localised":"Patrol craft checking in. Pre-flight checks complete, I'm heading out.","Channel":"npc"}
{"timestamp":"2022-12-09T14:42:02Z","event":"ReceiveText","From":"$ShipName_Police_Independent;","From_Localised":"System Authority Vessel","Message":"$Police_EndPatrol04;","Message_Localised":"Negative, Tower, I'm bingo on fuel, RTB.","Channel":"npc"}
{"timestamp":"2022-12-09T14:42:05Z","event":"ReceiveText","From":"$ShipName_Police_Independent;","From_Localised":"System Authority Vessel","Message":"$Police_EndPatrol02;","Message_Localised":"Requesting docking clearance, Control.","Channel":"npc"}
{"timestamp":"2022-12-09T14:45:23Z","event":"ReceiveText","From":"$ShipName_Police_Independent;","From_Localised":"System Authority Vessel","Message":"$Police_StartPatrol01;","Message_Localised":"Patrol craft checking in. Pre-flight checks complete, I'm heading out.","Channel":"npc"}
{"timestamp":"2022-12-09T14:45:51Z","event":"ReceiveText","From":"$ShipName_Police_Independent;","From_Localised":"System Authority Vessel","Message":"$Police_StartPatrol04;","Message_Localised":"I'm away, heading to patrol route alpha now.","Channel":"npc"}
{"timestamp":"2022-12-09T14:46:22Z","event":"RedeemVoucher","Type":"CombatBond","Amount":17406041,"Faction":"Nova Paresa"}
{"timestamp":"2022-12-09T14:49:17Z","event":"ReceiveText","From":"$ShipName_Police_Independent;","From_Localised":"System Authority Vessel","Message":"$Police_EndPatrol02;","Message_Localised":"Requesting docking clearance, Control.","Channel":"npc"}
{"timestamp":"2022-12-09T14:49:43Z","event":"ReceiveText","From":"$ShipName_Police_Independent;","From_Localised":"System Authority Vessel","Message":"$Police_EndPatrol05;","Message_Localised":"Patrol completed, Command, I'm heading home.","Channel":"npc"}
{"timestamp":"2022-12-09T14:52:32Z","event":"ReceiveText","From":"$ShipName_Police_Independent;","From_Localised":"System Authority Vessel","Message":"$Police_StartPatrol01;","Message_Localised":"Patrol craft checking in. Pre-flight checks complete, I'm heading out.","Channel":"npc"}
{"timestamp":"2022-12-09T14:52:34Z","event":"Embark","SRV":false,"Taxi":true,"Multicrew":false,"StarSystem":"Kazahua","SystemAddress":2871050905001,"Body":"Kazahua 4 a","BodyID":5,"OnStation":false,"OnPlanet":true}
{"timestamp":"2022-12-09T14:53:29Z","event":"SupercruiseEntry","Taxi":true,"Multicrew":false,"StarSystem":"Kazahua","SystemAddress":2871050905001}
{"timestamp":"2022-12-09T14:58:16Z","event":"DropshipDeploy","StarSystem":"Kazahua","SystemAddress":2871050905001,"Body":"Kazahua 2","BodyID":2,"OnStation":false,"OnPlanet":true}
{"timestamp":"2022-12-09T14:59:38Z","event":"FactionKillBond","Reward":65358,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:00:02Z","event":"FactionKillBond","Reward":52500,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:00:12Z","event":"FactionKillBond","Reward":39642,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:00:33Z","event":"FactionKillBond","Reward":52500,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:00:45Z","event":"FactionKillBond","Reward":65358,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:01:07Z","event":"FactionKillBond","Reward":87362,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:01:11Z","event":"ReceiveText","From":"$ShipName_Military_Independent;","From_Localised":"System Defence Force","Message":"$Military_Passthrough06;","Message_Localised":"On patrol. Scanning for hostiles.","Channel":"npc"}
{"timestamp":"2022-12-09T15:02:12Z","event":"FactionKillBond","Reward":65358,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:02:21Z","event":"FactionKillBond","Reward":52500,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:02:24Z","event":"FactionKillBond","Reward":65358,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:02:32Z","event":"FactionKillBond","Reward":65358,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:02:42Z","event":"FactionKillBond","Reward":87362,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:02:45Z","event":"FactionKillBond","Reward":65358,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:02:50Z","event":"ReceiveText","From":"$ShipName_Military_Independent;","From_Localised":"System Defence Force","Message":"$Military_Passthrough09;","Message_Localised":"This is a routine patrol. There's nothing to worry about.","Channel":"npc"}
{"timestamp":"2022-12-09T15:04:03Z","event":"FactionKillBond","Reward":39642,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:04:03Z","event":"ReceiveText","From":"$ShipName_Military_Independent;","From_Localised":"System Defence Force","Message":"$Military_Passthrough06;","Message_Localised":"On patrol. Scanning for hostiles.","Channel":"npc"}
{"timestamp":"2022-12-09T15:04:09Z","event":"FactionKillBond","Reward":52500,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:04:13Z","event":"FactionKillBond","Reward":87362,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:04:25Z","event":"FactionKillBond","Reward":87362,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:05:06Z","event":"ReceiveText","From":"$ShipName_Military_Independent;","From_Localised":"System Defence Force","Message":"$Military_Passthrough06;","Message_Localised":"On patrol. Scanning for hostiles.","Channel":"npc"}
{"timestamp":"2022-12-09T15:05:10Z","event":"ReceiveText","From":"$ShipName_Military_Independent;","From_Localised":"System Defence Force","Message":"$Military_Passthrough10;","Message_Localised":"System sweep in operation.","Channel":"npc"}
{"timestamp":"2022-12-09T15:05:19Z","event":"ReceiveText","From":"$ShipName_Military_Independent;","From_Localised":"System Defence Force","Message":"$Military_Passthrough06;","Message_Localised":"On patrol. Scanning for hostiles.","Channel":"npc"}
{"timestamp":"2022-12-09T15:05:22Z","event":"FactionKillBond","Reward":65358,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:05:35Z","event":"FactionKillBond","Reward":87362,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:05:44Z","event":"FactionKillBond","Reward":65358,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:06:11Z","event":"FactionKillBond","Reward":65358,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:06:22Z","event":"ReceiveText","From":"$ShipName_Military_Independent;","From_Localised":"System Defence Force","Message":"$Military_Passthrough08;","Message_Localised":"Patrol waypoint reached. Scanning.","Channel":"npc"}
{"timestamp":"2022-12-09T15:06:27Z","event":"FactionKillBond","Reward":52500,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:06:27Z","event":"FactionKillBond","Reward":39642,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:06:39Z","event":"FactionKillBond","Reward":52500,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:06:44Z","event":"ReceiveText","From":"$ShipName_Military_Independent;","From_Localised":"System Defence Force","Message":"$Military_Passthrough09;","Message_Localised":"This is a routine patrol. There's nothing to worry about.","Channel":"npc"}
{"timestamp":"2022-12-09T15:06:50Z","event":"FactionKillBond","Reward":65358,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:07:03Z","event":"FactionKillBond","Reward":65358,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:07:11Z","event":"FactionKillBond","Reward":39642,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:07:15Z","event":"FactionKillBond","Reward":52500,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:07:26Z","event":"FactionKillBond","Reward":87362,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:08:20Z","event":"FactionKillBond","Reward":52500,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:08:26Z","event":"FactionKillBond","Reward":65358,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:08:29Z","event":"ReceiveText","From":"$ShipName_Military_Independent;","From_Localised":"System Defence Force","Message":"$Military_Passthrough07;","Message_Localised":"No need to worry, the navy is here.","Channel":"npc"}
{"timestamp":"2022-12-09T15:08:33Z","event":"FactionKillBond","Reward":87362,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:08:47Z","event":"FactionKillBond","Reward":87362,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:08:48Z","event":"FactionKillBond","Reward":87362,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:09:00Z","event":"FactionKillBond","Reward":39642,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:09:00Z","event":"FactionKillBond","Reward":39642,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:09:08Z","event":"FactionKillBond","Reward":39642,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:09:20Z","event":"FactionKillBond","Reward":78777,"AwardingFaction":"Nova Paresa","VictimFaction":"Sapii allied"}
{"timestamp":"2022-12-09T15:09:46Z","event":"Shutdown"}

View File

@@ -0,0 +1,7 @@
{ "timestamp":"2022-02-06T16:36:53Z", "event":"Fileheader", "part":1, "language":"English/UK", "gameversion":"3.8.0.1102", "build":"r280672/r0 " }
{ "timestamp":"2022-02-06T18:10:26Z", "event":"FSDJump", "Taxi":false, "Multicrew":false, "StarSystem":"Akualanu", "SystemAddress":5069805856169, "StarPos":[63.78125,-128.50000,3.00000], "SystemAllegiance":"Empire", "SystemEconomy":"$economy_Tourism;", "SystemEconomy_Localised":"Tourism", "SystemSecondEconomy":"$economy_HighTech;", "SystemSecondEconomy_Localised":"High Tech", "SystemGovernment":"$government_Patronage;", "SystemGovernment_Localised":"Patronage", "SystemSecurity":"$SYSTEM_SECURITY_low;", "SystemSecurity_Localised":"Low Security", "Population":787019, "Body":"Akualanu A", "BodyID":1, "BodyType":"Star", "Powers":[ "A. Lavigny-Duval" ], "PowerplayState":"Exploited", "JumpDist":40.001, "FuelUsed":4.849240, "FuelLevel":22.573641, "Factions":[ { "Name":"Akualanu United & Co", "FactionState":"War", "Government":"Corporate", "Influence":0.158000, "Allegiance":"Empire", "Happiness":"$Faction_HappinessBand3;", "Happiness_Localised":"Discontented", "MyReputation":100.000000, "RecoveringStates":[ { "State":"InfrastructureFailure", "Trend":0 } ], "ActiveStates":[ { "State":"Lockdown" }, { "State":"Famine" }, { "State":"War" } ] }, { "Name":"Alacagui Holdings", "FactionState":"War", "Government":"Corporate", "Influence":0.086000, "Allegiance":"Empire", "Happiness":"$Faction_HappinessBand2;", "Happiness_Localised":"Happy", "MyReputation":55.000000, "RecoveringStates":[ { "State":"PirateAttack", "Trend":0 } ], "ActiveStates":[ { "State":"War" } ] }, { "Name":"Left Party of Akualanu", "FactionState":"War", "Government":"Communism", "Influence":0.086000, "Allegiance":"Independent", "Happiness":"$Faction_HappinessBand3;", "Happiness_Localised":"Discontented", "MyReputation":95.899399, "RecoveringStates":[ { "State":"InfrastructureFailure", "Trend":0 } ], "ActiveStates":[ { "State":"Lockdown" }, { "State":"Famine" }, { "State":"War" } ] }, { "Name":"Cartel of Akualanu", "FactionState":"Famine", "Government":"Anarchy", "Influence":0.028000, "Allegiance":"Independent", "Happiness":"$Faction_HappinessBand2;", "Happiness_Localised":"Happy", "MyReputation":29.040001, "RecoveringStates":[ { "State":"InfrastructureFailure", "Trend":0 } ], "ActiveStates":[ { "State":"Famine" } ] }, { "Name":"Revolutionary Akualanu Liberals", "FactionState":"Bust", "Government":"Democracy", "Influence":0.085000, "Allegiance":"Independent", "Happiness":"$Faction_HappinessBand3;", "Happiness_Localised":"Discontented", "MyReputation":43.093700, "PendingStates":[ { "State":"Lockdown", "Trend":0 } ], "ActiveStates":[ { "State":"InfrastructureFailure" }, { "State":"Bust" } ] }, { "Name":"Conservatives of Cockaigne", "FactionState":"War", "Government":"Dictatorship", "Influence":0.138000, "Allegiance":"Empire", "Happiness":"$Faction_HappinessBand3;", "Happiness_Localised":"Discontented", "MyReputation":70.000000, "ActiveStates":[ { "State":"CivilUnrest" }, { "State":"InfrastructureFailure" }, { "State":"War" } ] }, { "Name":"Nova Paresa", "FactionState":"Investment", "Government":"Patronage", "Influence":0.419000, "Allegiance":"Empire", "Happiness":"$Faction_HappinessBand1;", "Happiness_Localised":"Elated", "SquadronFaction":true, "MyReputation":100.000000, "ActiveStates":[ { "State":"Investment" }, { "State":"CivilLiberty" } ] } ], "SystemFaction":{ "Name":"Nova Paresa", "FactionState":"Investment" }, "Conflicts":[ { "WarType":"war", "Status":"active", "Faction1":{ "Name":"Akualanu United & Co", "Stake":"Konig Institution", "WonDays":0 }, "Faction2":{ "Name":"Conservatives of Cockaigne", "Stake":"", "WonDays":1 } }, { "WarType":"war", "Status":"active", "Faction1":{ "Name":"Alacagui Holdings", "Stake":"Ware Cultivation Facility", "WonDays":2 }, "Faction2":{ "Name":"Left Party of Akualanu", "Stake":"", "WonDays":2 } } ] }
{ "timestamp":"2022-02-06T18:13:30Z", "event":"Docked", "StationName":"Hughes Vista", "StationType":"Coriolis", "Taxi":false, "Multicrew":false, "StarSystem":"Akualanu", "SystemAddress":5069805856169, "MarketID":3222969088, "StationFaction":{ "Name":"Nova Paresa", "FactionState":"Investment" }, "StationGovernment":"$government_Patronage;", "StationGovernment_Localised":"Patronage", "StationAllegiance":"Empire", "StationServices":[ "dock", "autodock", "commodities", "contacts", "exploration", "missions", "outfitting", "crewlounge", "rearm", "refuel", "repair", "shipyard", "tuning", "engineer", "missionsgenerated", "facilitator", "flightcontroller", "stationoperations", "powerplay", "searchrescue", "stationMenu", "shop", "livery", "socialspace", "bartender", "vistagenomics", "pioneersupplies", "apexinterstellar", "frontlinesolutions" ], "StationEconomy":"$economy_Tourism;", "StationEconomy_Localised":"Tourism", "StationEconomies":[ { "Name":"$economy_Tourism;", "Name_Localised":"Tourism", "Proportion":1.000000 } ], "DistFromStarLS":78.917615, "LandingPads":{ "Small":13, "Medium":16, "Large":8 } }
{ "timestamp":"2022-11-25T09:52:28Z", "event":"FactionKillBond", "Reward":24000000, "AwardingFaction":"$faction_PilotsFederation;", "AwardingFaction_Localised":"Pilots' Federation", "VictimFaction":"$faction_Thargoid;", "VictimFaction_Localised":"Thargoids" }
{ "timestamp":"2022-11-21T15:56:08Z", "event":"MarketSell", "MarketID":3222176256, "Type":"silver", "Count":224, "SellPrice":40996, "TotalSale":9183104, "AvgPricePaid":34311 }
{ "timestamp":"2022-02-06T16:36:53Z", "event":"Fileheader", "part":1, "language":"English/UK", "Odyssey":true, "gameversion":"4.0.0.1102", "build":"r280672/r0 " }
{ "timestamp":"2022-02-06T18:17:44Z", "event":"SellOrganicData", "MarketID":3222969088, "BioData":[ { "Genus":"$Codex_Ent_Stratum_Genus_Name;", "Genus_Localised":"Stratum", "Species":"$Codex_Ent_Stratum_07_Name;", "Species_Localised":"Stratum Tectonicas", "Value":806300, "Bonus":0 }, { "Genus":"$Codex_Ent_Aleoids_Genus_Name;", "Genus_Localised":"Aleoida", "Species":"$Codex_Ent_Aleoids_05_Name;", "Species_Localised":"Aleoida Gravis", "Value":596500, "Bonus":0 } ] }

63
EliteBGS/.gitattributes vendored Normal file
View File

@@ -0,0 +1,63 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain

364
EliteBGS/.gitignore vendored Normal file
View File

@@ -0,0 +1,364 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Oo]ut/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
/site

6
EliteBGS/App.config Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>

9
EliteBGS/App.xaml Normal file
View File

@@ -0,0 +1,9 @@
<Application x:Class="EliteBGSApplication"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:EliteBGS"
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>

10
EliteBGS/App.xaml.cs Normal file
View File

@@ -0,0 +1,10 @@
using System.Windows;
namespace EliteBGS {
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class EliteBGSApplication : Application
{
}
}

View File

@@ -0,0 +1,118 @@
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using EliteBGS.LogGenerator;
namespace EliteBGS;
public class DiscordLogGenerator {
protected List<LogFormatter> formatters = new List<LogFormatter>() {
new MissionFormat(),
new FailedMissionFormat(),
new MurderFormat(),
new VoucherFormat(),
new ThargoidFormatter(),
new CombatZoneFormat(),
new KillBondsFormat(),
new CartographicsFormat(),
new MicroResourcesFormat(),
new MarketBuyFormat(),
new CargoSoldFormatter(),
new VistaGenomicsFormat(),
new SearchAndRescueFormat(),
};
protected virtual string GenerateHeader() {
return "";
}
protected virtual string GenerateFooter() {
return "\n";
}
protected virtual string GenerateObjectiveHeader(Objective objective) {
StringBuilder log = new StringBuilder();
string location;
if (!string.IsNullOrEmpty(objective.System) && !string.IsNullOrEmpty(objective.Faction)) {
location = string.Format("{0}, {1}", objective.System, objective.Faction);
} else if (!string.IsNullOrEmpty(objective.System)) {
location = objective.System;
} else {
location = "Unknown Location";
}
int legacycount = objective.Transactions
.Where(x => x.IsLegacy)
.Count()
;
log.AppendFormat("**Date:** {0}\n", DateTime.Now.ToString("dd/MM/yyyy"));
log.AppendFormat("**Target:** {0}\n", location);
if (legacycount > 0) {
log.AppendFormat("**Warning:** Some actions were performed on ED Legacy\n");
}
log.AppendLine("```");
return log.ToString();
}
protected virtual string GenerateObjectiveFooter(Objective objective) {
return "```\n";
}
/// <summary>
/// Is called to do final adjustments to the log body of a given objective.
/// </summary>
/// <param name="objective">Objective in question.</param>
/// <param name="log">Final log as generated.</param>
/// <returns>The transformed log.</returns>
protected virtual string TransformFinalLogForObjective(Objective objective, string log) {
return log;
}
public virtual string GenerateDiscordLog(Report report) {
StringBuilder log = new StringBuilder();
if (report == null) {
return "";
}
var objectives = report.Objectives
.Where(x => x.IsEnabled && x.Transactions.Count() > 0)
;
if (objectives == null || objectives.Count() <= 0) {
return "";
}
log.AppendFormat("{0}", GenerateHeader());
foreach (Objective objective in objectives) {
StringBuilder objlog = new StringBuilder();
log.AppendFormat("{0}", GenerateObjectiveHeader(objective));
foreach (LogFormatter formatter in formatters) {
string text = formatter.GenerateLog(objective);
text = text.Trim();
if (!string.IsNullOrEmpty(text)) {
objlog.AppendFormat("{0}\n\n", text);
}
}
string finallog = objlog.ToString().Trim();
finallog = TransformFinalLogForObjective(objective, finallog);
log.AppendFormat("{0}\n", finallog);
log.AppendFormat("{0}", GenerateObjectiveFooter(objective));
}
log.AppendFormat("{0}", GenerateFooter());
return log.ToString().Trim();
}
}

86
EliteBGS/EliteBGS.csproj Normal file
View File

@@ -0,0 +1,86 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0-windows</TargetFramework>
<OutputType>WinExe</OutputType>
<Version>0.2.6</Version>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<UseWindowsForms>true</UseWindowsForms>
<UseWPF>true</UseWPF>
<ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>
</PropertyGroup>
<PropertyGroup>
<StartupObject>EliteBGSApplication</StartupObject>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>Salus.ico</ApplicationIcon>
<Title>BGS reporting and logging tool for Elite:Dangerous</Title>
<Authors>nola</Authors>
<Copyright>Copyright 2019 by Florian Stinglmayr</Copyright>
<RepositoryUrl>https://git.aror.org/florian/EDBGS</RepositoryUrl>
<PackageTags>ED;Elite Dangerous;BGS</PackageTags>
<PackageProjectUrl>https://bgs.n0la.org</PackageProjectUrl>
<PackageReadmeFile>README.md</PackageReadmeFile>
</PropertyGroup>
<ItemGroup>
<Resource Include="main-page.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Resource>
<None Update="README.md">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<Pack>True</Pack>
<PackagePath>\</PackagePath>
</None>
<None Update="docs\CHANGELOG.md">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Resource Include="docs\main-page.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Resource>
</ItemGroup>
<ItemGroup>
<Content Include="LICENCE.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<Resource Include="Salus.ico" />
</ItemGroup>
<ItemGroup>
<Resource Include="logo_v4.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Resource>
</ItemGroup>
<ItemGroup>
<Resource Include="Resources\EliteBGS.ico" />
</ItemGroup>
<ItemGroup>
<Resource Include="EliteBGS.ico" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Extended.Wpf.Toolkit" Version="4.5.0" />
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="Microsoft.Windows.Compatibility" Version="7.0.0" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
<PackageReference Include="Ookii.Dialogs.Wpf" Version="5.0.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\EDPlayerJournal\EDPlayerJournal.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Update="Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Resources.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
</Project>

BIN
EliteBGS/EliteBGS.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

25
EliteBGS/EliteBGS.sln Normal file
View File

@@ -0,0 +1,25 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.31205.134
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EliteBGS", "EliteBGS.csproj", "{73BFB315-C808-40E7-8D69-B651F875880C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{73BFB315-C808-40E7-8D69-B651F875880C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{73BFB315-C808-40E7-8D69-B651F875880C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{73BFB315-C808-40E7-8D69-B651F875880C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{73BFB315-C808-40E7-8D69-B651F875880C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {40F4B1BD-FC53-485B-9AEE-3357B375CED2}
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,7 @@
namespace EliteBGS;
public class GenericDiscordLog : DiscordLogGenerator {
public override string ToString() {
return "Generic Log";
}
}

674
EliteBGS/LICENCE.txt Normal file
View File

@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

View File

@@ -0,0 +1,40 @@
<Window x:Class="EliteBGS.LoadEntriesWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:EliteBGS"
mc:Ignorable="d"
Title="Load Entries" Height="450" Width="600">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Label Content="Use this text field to manually load JSON events into the application." Grid.Row="0" Grid.Column="1"/>
<TextBox x:Name="Lines" AcceptsReturn="True" AcceptsTab="True" TextWrapping="Wrap" Grid.Row="1" Height="Auto" Grid.Column="0" Grid.ColumnSpan="3" VerticalScrollBarVisibility="Visible" />
<Grid Grid.Column="1" Grid.Row="2">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Button x:Name="Load" Content="Load Entries" Grid.Row="0" Margin="5,5,5,5" Height="Auto" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" Click="Load_Click" />
<Button x:Name="LoadFile" Content="Load File" Grid.Row="0" Margin="5,5,5,5" Height="Auto" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center" Click="LoadFile_Click" />
<Button x:Name="DeleteUnimportant" Content="Remove Unimportant" Grid.Row="0" Margin="5,5,5,5" Height="Auto" Grid.Column="3" HorizontalAlignment="Center" VerticalAlignment="Center" Click="DeleteUnimportant_Click" />
<Button x:Name="Clear" Content="Clear" Grid.Row="0" Height="Auto" Margin="5,5,5,5" Grid.Column="4" Click="Clear_Click" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</Grid>
</Window>

View File

@@ -0,0 +1,118 @@
using System;
using System.Linq;
using System.Collections.Generic;
using System.IO;
using System.Windows;
using Microsoft.Win32;
using EDPlayerJournal.Entries;
using EliteBGS.Util;
using EDPlayerJournal.BGS;
namespace EliteBGS;
/// <summary>
/// Interaction logic for LoadEntriesWindow.xaml
/// </summary>
public partial class LoadEntriesWindow : Window {
public delegate void EntriesLoadedDelegate(List<Entry> entries);
public event EntriesLoadedDelegate EntriesLoaded;
Config config = new Config();
public LoadEntriesWindow() {
InitializeComponent();
}
private void Load_Click(object sender, RoutedEventArgs e) {
string lines = Lines.Text.Trim();
if (lines.Length <= 0) {
return;
}
try {
List<Entry> entries = new List<Entry>();
foreach (string line in lines.Split('\n')) {
if (string.IsNullOrEmpty(line)) {
continue;
}
Entry entry = Entry.Parse(line);
entries.Add(entry);
}
if (entries.Count > 0) {
EntriesLoaded?.Invoke(entries);
}
} catch (Exception exception) {
MessageBox.Show(string.Format("There was an error while parsing the JSON: {0}",
exception.ToString()));
}
}
private void Clear_Click(object sender, RoutedEventArgs e) {
Lines.Clear();
}
private void LoadFile_Click(object sender, RoutedEventArgs e) {
OpenFileDialog dialog = new OpenFileDialog();
dialog.DefaultExt = ".log";
dialog.Filter = "Log files (*.log)|*.log|All files (*.*)|*";
var location = config.Global.DefaultJournalLocation;
if (Directory.Exists(location)) {
dialog.InitialDirectory = location;
}
bool result = dialog.ShowDialog(this) ?? false;
if (!result) {
return;
}
try {
using (FileStream stream = File.OpenRead(dialog.FileName)) {
using (StreamReader reader = new StreamReader(stream)) {
Lines.Text = reader.ReadToEnd();
}
}
} catch (Exception) {
}
}
private void DeleteUnimportant_Click(object sender, RoutedEventArgs e) {
string lines = Lines.Text.Trim();
if (lines.Length <= 0) {
return;
}
TransactionParser parser = new();
try {
List<Entry> entries = new List<Entry>();
foreach (string line in lines.Split('\n')) {
if (string.IsNullOrEmpty(line)) {
continue;
}
Entry entry = Entry.Parse(line);
if (parser.IsRelevant(entry)) {
entries.Add(entry);
}
}
if (entries.Count <= 0) {
return;
}
string[] text = entries
.ConvertAll(x => x.JSON.ToString(Newtonsoft.Json.Formatting.None))
.ToArray()
;
Lines.Text = string.Join("\n", text).Trim();
} catch (Exception exception) {
MessageBox.Show(string.Format("There was an error while parsing the JSON: {0}",
exception.ToString()));
}
}
}

View File

@@ -0,0 +1,56 @@
using System.Linq;
using System.Text;
using EDPlayerJournal;
using EDPlayerJournal.BGS;
namespace EliteBGS.LogGenerator;
public class CargoSoldFormatter : LogFormatter {
public string GenerateLog(Objective objective) {
StringBuilder builder = new StringBuilder();
SellCargo[] sold = objective.EnabledOfType<SellCargo>().ToArray();
if (sold == null || sold.Length <= 0) {
return "";
}
// This groups everything together by cargo sold, and then by market sold to.
// Dictionary<string Cargo, Dictionary<string Market, { Market, Amount, Profit }> >
var entries = sold.GroupBy(x => x.Cargo,
(key, cargos) => new {
Cargo = key,
Markets = cargos.GroupBy(y => y.Market,
(market, markets) => new {
Market = market,
Amount = markets.Sum(x => x.Amount),
Profit = markets.Sum(x => x.Profit)
})
}
)
;
foreach (var cargo in entries) {
foreach (var market in cargo.Markets) {
builder.AppendFormat("Sold {0} {1} to the {2}",
market.Amount,
cargo.Cargo,
market.Market
);
if (market.Profit != 0) {
builder.AppendFormat(" ({0} {1})",
Credits.FormatCredits(market.Profit),
market.Profit < 0 ? "loss" : "profit"
);
}
builder.Append("\n");
}
}
builder.AppendFormat("\n");
return builder.ToString();
}
}

View File

@@ -0,0 +1,22 @@
using System.Linq;
using EDPlayerJournal;
using EDPlayerJournal.BGS;
namespace EliteBGS.LogGenerator;
public class CartographicsFormat : LogFormatter {
public string GenerateLog(Objective objective) {
var total = objective.EnabledOfType<Cartographics>();
var pages = total.Count();
long sum = total.Sum(x => x.TotalSum);
if (pages <= 0 || sum <= 0) {
return "";
}
return string.Format("Sold {0} page(s) worth of universal cartographics\n" +
"(Total value: {1})\n\n",
pages, Credits.FormatCredits(sum)
);
}
}

View File

@@ -0,0 +1,46 @@
using EDPlayerJournal;
using EDPlayerJournal.BGS;
using System.Linq;
using System.Text;
namespace EliteBGS.LogGenerator;
class CombatZoneFormat : LogFormatter {
public string GenerateLog(Objective objective) {
var logs = objective
.EnabledOfType<CombatZone>()
.GroupBy(x => new { x.Type, x.Grade })
.ToDictionary(x => x.Key, x => x.ToList())
;
StringBuilder builder = new StringBuilder();
if (logs == null || logs.Count() <= 0) {
return "";
}
foreach (var log in logs) {
int optionals = log.Value
.Sum(x => x.OptionalObjectivesCompleted)
;
if (!string.IsNullOrEmpty(log.Key.Grade)) {
builder.AppendFormat("Won {0}x {1} {2} Combat Zone(s)",
log.Value.Count,
log.Key.Grade,
log.Key.Type
);
} else {
builder.AppendFormat("Won {0}x {1} Combat Zone(s)",
log.Value.Count,
log.Key.Type
);
}
if (optionals > 0) {
builder.AppendFormat(" (with {0} optional objectives)", optionals);
}
builder.Append("\n");
}
return builder.ToString().Trim();
}
}

View File

@@ -0,0 +1,34 @@
using System.Linq;
using System.Text;
using EDPlayerJournal.Entries;
using EDPlayerJournal.BGS;
namespace EliteBGS.LogGenerator;
public class FailedMissionFormat : LogFormatter {
public string GenerateLog(Objective objective) {
var missions = objective.EnabledOfType<MissionFailed>();
if (missions.Count <= 0) {
return "";
}
StringBuilder builder = new StringBuilder();
var grouping = missions
.GroupBy(x => x.Mission.IsOnFoot)
;
foreach (var group in grouping) {
int amount = group.Count();
if (group.Key) {
builder.AppendFormat("Failed {0} On Foot Mission(s)\n", amount);
} else {
builder.AppendFormat("Failed {0} Ship Mission(s)\n", amount);
}
}
return builder.ToString().Trim();
}
}

View File

@@ -0,0 +1,28 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EDPlayerJournal.BGS;
namespace EliteBGS.LogGenerator;
/// <summary>
/// Creates a generic log block, that is simply all LogEntries of type "Type"
/// per line
/// </summary>
/// <typeparam name="Type">LogEntry subtype to work on</typeparam>
public class GenericFormat<Type> : LogFormatter where Type : Transaction {
public string GenerateLog(Objective objective) {
IEnumerable<Type> logs = objective.EnabledOfType<Type>();
StringBuilder builder = new StringBuilder();
if (logs == null || logs.Count() <= 0) {
return "";
}
foreach (Type log in logs) {
builder.AppendLine(log.ToString());
}
return builder.ToString();
}
}

View File

@@ -0,0 +1,6 @@
using EDPlayerJournal.BGS;
namespace EliteBGS.LogGenerator;
public class KillBondsFormat : GenericFormat<FactionKillBonds> {
}

View File

@@ -0,0 +1,5 @@
namespace EliteBGS.LogGenerator;
public interface LogFormatter {
string GenerateLog(Objective objective);
}

View File

@@ -0,0 +1,6 @@
using EDPlayerJournal.BGS;
namespace EliteBGS.LogGenerator;
public class MarketBuyFormat : GenericFormat<BuyCargo> {
}

View File

@@ -0,0 +1,19 @@
using System.Linq;
using EDPlayerJournal;
using EDPlayerJournal.BGS;
namespace EliteBGS.LogGenerator;
public class MicroResourcesFormat : LogFormatter {
public string GenerateLog(Objective objective) {
var total = objective.EnabledOfType<SellMicroResources>();
long sum = total.Sum(x => x.TotalSum);
if (total == null || total.Count() <= 0 || sum <= 0) {
return "";
}
return string.Format("Sold {0} worth of Micro Resources\n",
Credits.FormatCredits(sum));
}
}

View File

@@ -0,0 +1,79 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EDPlayerJournal.BGS;
namespace EliteBGS.LogGenerator;
public class MissionFormat : LogFormatter {
public string GenerateLog(Objective objective) {
Dictionary<string, Dictionary<string, int>> collated = new();
Dictionary<string, ulong> passengers = new();
StringBuilder output = new StringBuilder();
int total_influence = 0;
var missions = objective.EnabledOfType<MissionCompleted>();
var support = objective.EnabledOfType<InfluenceSupport>();
if ((missions == null || missions.Count == 0) &&
(support == null || support.Count == 0)) {
return "";
}
foreach (MissionCompleted m in missions) {
if (!collated.ContainsKey(m.MissionName)) {
collated[m.MissionName] = new Dictionary<string, int>();
}
if (!collated[m.MissionName].ContainsKey(m.Influence)) {
collated[m.MissionName][m.Influence] = 0;
}
++collated[m.MissionName][m.Influence];
total_influence += m.Influence.Length;
if (m.AcceptedEntry != null &&
m.AcceptedEntry.Mission != null &&
m.AcceptedEntry.Mission.IsPassengerMission) {
if (!passengers.ContainsKey(m.MissionName)) {
passengers[m.MissionName] = 0;
}
passengers[m.MissionName] += (m.AcceptedEntry.Mission.PassengerCount ?? 0);
}
}
foreach (var mission in collated) {
output.AppendFormat("{0}: ", mission.Key);
output.Append("(");
foreach (var influence in mission.Value.OrderBy(x => x.Key.Length)) {
output.AppendFormat("Inf{0} x{1}, ", influence.Key, influence.Value);
}
output.Remove(output.Length - 2, 2); // remove last ", "
output.Append(")");
if (passengers.ContainsKey(mission.Key)) {
output.AppendFormat(" ({0} Passengers)", passengers[mission.Key]);
}
output.Append("\n");
}
output.Append("\n");
foreach (InfluenceSupport inf in support) {
output.Append(inf.ToString());
output.Append("\n");
total_influence += inf.Influence.Length;
}
if (support.Count() > 0) {
output.Append("\n");
}
if (total_influence > 0) {
output.AppendFormat("Total Influence: {0}", total_influence);
}
return output.ToString().Trim();
}
}

View File

@@ -0,0 +1,48 @@
using EDPlayerJournal.BGS;
using System.Collections.Generic;
using System.Text;
using System;
using System.Linq;
using EDPlayerJournal;
namespace EliteBGS.LogGenerator;
public class MurderFormat : LogFormatter {
public string GenerateLog(Objective objective) {
var logs = objective
.EnabledOfType<FoulMurder>()
.GroupBy(x => x.CrimeType)
.ToDictionary(x => x.Key, x => x.ToList())
;
StringBuilder builder = new StringBuilder();
if (logs == null || logs.Count() <= 0) {
return "";
}
foreach (var log in logs) {
string type;
if (string.Compare(log.Key, CrimeTypes.Murder) == 0) {
if (log.Value.Count > 1) {
type = "ships";
} else {
type = "ship";
}
} else {
if (log.Value.Count > 1) {
type = "people";
} else {
type = "person";
}
}
builder.AppendFormat("Murdered {0} {1} (Bounties: {2}, Fines: {3})",
log.Value.Count, type,
log.Value.Sum(x => x.Bounties),
log.Value.Sum(x => x.Fines)
);
}
return builder.ToString();
}
}

View File

@@ -0,0 +1,6 @@
using EDPlayerJournal.BGS;
namespace EliteBGS.LogGenerator;
public class SearchAndRescueFormat : GenericFormat<SearchAndRescue> {
}

View File

@@ -0,0 +1,32 @@
using EDPlayerJournal;
using EDPlayerJournal.BGS;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EliteBGS.LogGenerator;
public class ThargoidFormatter : LogFormatter {
public string GenerateLog(Objective objective) {
List<ThargoidKill> kills = objective.EnabledOfType<ThargoidKill>().ToList();
if (kills.Count == 0 ) {
return "";
}
Dictionary<ThargoidVessel, List<ThargoidKill>> sorted = kills
.GroupBy(x => x.ThargoidType)
.ToDictionary(x => x.Key, x => x.ToList())
;
StringBuilder builder = new StringBuilder();
foreach (var k in sorted) {
string name = Thargoid.GetVesselName(k.Key);
builder.AppendFormat("{0}x {1}(s) killed\n", k.Value.Count, name);
}
return builder.ToString();
}
}

View File

@@ -0,0 +1,6 @@
using EDPlayerJournal.BGS;
namespace EliteBGS.LogGenerator;
class VistaGenomicsFormat : GenericFormat<OrganicData> {
}

View File

@@ -0,0 +1,28 @@
using System.Linq;
using System.Text;
using EDPlayerJournal;
using EDPlayerJournal.BGS;
namespace EliteBGS.LogGenerator;
public class VoucherFormat : LogFormatter {
public string GenerateLog(Objective objective) {
StringBuilder builder = new StringBuilder();
var missions = objective
.EnabledOfType<Vouchers>()
.GroupBy(x => x.Type)
.ToDictionary(x => x.Key, x => x.ToList())
;
if (missions == null || missions.Count() <= 0) {
return "";
}
foreach (var m in missions) {
ulong total = (ulong)m.Value.Sum(x => (decimal)x.TotalSum);
builder.AppendFormat("Handed in {0} vouchers: {1}\n", m.Key, Credits.FormatCredits(total));
}
return builder.ToString().Trim();
}
}

206
EliteBGS/MainWindow.xaml Normal file
View File

@@ -0,0 +1,206 @@
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:abc="http://wpfcontrols.com/"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns:local="clr-namespace:EliteBGS"
xmlns:Util="clr-namespace:EliteBGS.Util" d:DataContext="{d:DesignInstance Type=Util:AppConfig}" x:Name="window" x:Class="EliteBGS.MainWindow"
mc:Ignorable="d"
Title="Elite: Dangerous BGS Helper" Height="520" Width="950" Icon="Salus.ico" Closing="window_Closing">
<Window.Resources>
<Style x:Key="StretchingTreeViewStyle" TargetType="TreeViewItem" BasedOn="{StaticResource {x:Type TreeViewItem}}">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
<local:MinusFortyFiveConverter x:Key="MinusFortyFiveConverter" />
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TabControl>
<TabItem Header="Current Objectives">
<Grid Background="#FFE5E5E5">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition/>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ToolBar VerticalAlignment="Top" Grid.Row="0" Width="Auto" Margin="0,0,0,0" Height="Auto" Grid.ColumnSpan="3" HorizontalAlignment="Left">
<Button x:Name="ParseJournal" Content="Parse Journal" VerticalAlignment="Center" Click="ParseJournal_Click" HorizontalAlignment="Center"/>
<Separator Margin="1" VerticalAlignment="Center" MinWidth="1" HorizontalAlignment="Center" MinHeight="22"/>
<Label Content="From (UTC):" VerticalAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Center"/>
<xctk:DateTimePicker x:Name="startdate" Height="26.2857142857143" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<Label Content="To (UTC):" Height="26.2857142857143" VerticalAlignment="Top"/>
<xctk:DateTimePicker x:Name="enddate" Height="26.2857142857143" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<Separator Margin="1" VerticalAlignment="Center" MinWidth="1" HorizontalAlignment="Center" MinHeight="22"/>
<Button x:Name="ResetTime" Content="Reset Time" Click="ResetTime_Click" />
<Separator Margin="1" VerticalAlignment="Center" MinWidth="1" HorizontalAlignment="Center" MinHeight="22"/>
<Button x:Name="ManuallyParse" Content="Manually Parse" Click="ManuallyParse_Click" />
</ToolBar>
<ToolBar Grid.Row="1" HorizontalAlignment="Left" Height="36" VerticalAlignment="Top" Width="Auto" Grid.ColumnSpan="3">
<Button x:Name="GenerateDiscord" Content="Generate Discord Report" VerticalAlignment="Stretch" Margin="0,0,0,0" VerticalContentAlignment="Center" Click="GenerateDiscord_Click" Height="26"/>
<Separator />
<ComboBox x:Name="LogType" VerticalAlignment="Stretch" Margin="0,3,0,3" Width="140" SelectionChanged="LogType_SelectionChanged" />
</ToolBar>
<TreeView CheckBox.Checked="TreeView_CheckBox_Updated"
CheckBox.Unchecked="TreeView_CheckBox_Updated"
x:Name="entries" Margin="0,0,0,0"
Grid.ColumnSpan="3" Grid.Row="2"
KeyUp="entries_KeyUp"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Objective}" ItemsSource="{Binding UITransactions}" ItemContainerStyle="{StaticResource StretchingTreeViewStyle}">
<Grid
HorizontalAlignment="Stretch"
Width="{Binding ActualWidth, ElementName=entries, Converter={StaticResource MinusFortyFiveConverter}}"
>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Horizontal" VerticalAlignment="Center" Margin="0,2,0,2">
<CheckBox Focusable="False" IsChecked="{Binding IsEnabled}" VerticalAlignment="Center"/>
<TextBlock Text="System: " Visibility="{Binding HasSystem}" Margin="2,0,0,0"/>
<TextBlock Text="{Binding System}" FontWeight="DemiBold" Visibility="{Binding HasSystem}"/>
<TextBlock Text="Faction: " Visibility="{Binding HasFaction}" Margin="2,0,0,0"/>
<TextBlock Text="{Binding Faction}" FontWeight="DemiBold" Visibility="{Binding HasFaction}"/>
</StackPanel>
<Separator Visibility="Hidden" Grid.Column="1" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" />
<StackPanel Grid.Column="2" HorizontalAlignment="Right" VerticalAlignment="Center" Orientation="Horizontal">
<ToggleButton x:Name="ToggleAll" Content="Toggle All" Click="ToggleAll_Click" IsChecked="True" IsThreeState="False"/>
<Separator Margin="2,0,2,0" />
<Button x:Name="AddCombatZone" Content="Add Combat Zone" Click="AddCombatZone_Click" />
</StackPanel>
</Grid>
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate>
<!-- This will stretch out the width of the item-->
<Grid Initialized="Transaction_Initialized"
HorizontalAlignment="Stretch"
Width="{Binding ActualWidth, ElementName=entries, Converter={StaticResource MinusFortyFiveConverter}}"
Margin="0,2,0,2"
>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Center">
<CheckBox Focusable="False" IsChecked="{Binding IsEnabled}" VerticalAlignment="Center"/>
<TextBlock Text="{Binding CompletedAt}" Margin="2,0,2,0" HorizontalAlignment="Right" TextAlignment="Center"/>
<TextBlock Text="{Binding Name}" FontWeight="DemiBold" TextAlignment="Center"/>
</StackPanel>
<StackPanel Grid.Column="2" Orientation="Horizontal" HorizontalAlignment="Right" x:Name="CombatZone" Visibility="{Binding IsCombatZone}">
<Expander Header="Optional Objectives" Visibility="{Binding IsShipCombatZone}">
<StackPanel Orientation="Vertical">
<ToggleButton x:Name="CapitalShip" Margin="2,0,2,0" Content="Capital Ship" IsChecked="{Binding HasCapitalShip, Mode=TwoWay}" IsThreeState="False"/>
<ToggleButton x:Name="Captain" Margin="2,0,2,0" Content="Captain" IsChecked="{Binding HasCaptain, Mode=TwoWay}" IsThreeState="False"/>
<ToggleButton x:Name="Correspondent" Margin="2,0,2,0" Content="Correspondent" IsChecked="{Binding HasCorrespondent, Mode=TwoWay}" IsThreeState="False"/>
<ToggleButton x:Name="SpecOps" Margin="2,0,2,0" Content="Spec Ops" IsChecked="{Binding HasSpecOps, Mode=TwoWay}" IsThreeState="False"/>
</StackPanel>
</Expander>
<Expander Header="Difficulty">
<StackPanel Orientation="Vertical">
<Button x:Name="Low" Content="Low" Click="Low_Click"/>
<Button x:Name="Med" Content="Med" Click="Med_Click"/>
<Button x:Name="High" Content="High" Click="High_Click"/>
<Button x:Name="VeryHigh" Content="Very High" Click="VeryHigh_Click" />
</StackPanel>
</Expander>
<Expander Header="Type">
<StackPanel Orientation="Vertical">
<Button Content="Ground" x:Name="Ground" Click="Ground_Click"/>
<Button Content="Ship" x:Name="Ship" Click="Ship_Click"/>
<Button Content="AX" x:Name="Thargoid" Click="Thargoid_Click"/>
</StackPanel>
</Expander>
</StackPanel>
<StackPanel Grid.Column="2" Orientation="Horizontal" HorizontalAlignment="Right" x:Name="SellCargo" Visibility="{Binding IsSellCargo}">
<TextBlock Text="Adjust Profit: " TextAlignment="Center" />
<TextBox x:Name="Profit" MinWidth="80" HorizontalContentAlignment="Right" Text="{Binding Profit, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" LostFocus="Profit_LostFocus" KeyUp="Profit_KeyUp"/>
</StackPanel>
</Grid>
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
<GridSplitter Background="LightSkyBlue" Grid.Row="3" Height="5" HorizontalAlignment="Stretch" VerticalAlignment="Top" Grid.ColumnSpan="3" ResizeBehavior="PreviousAndNext"/>
<TextBox x:Name="DiscordLog" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="4" Height="Auto" TextWrapping="Wrap" FontFamily="Consolas" FontSize="14" Grid.ColumnSpan="3" AcceptsReturn="True" AcceptsTab="True"/>
</Grid>
</TabItem>
<TabItem Header="Settings" HorizontalAlignment="Left" Height="20" VerticalAlignment="Top" Width="53.7142857142857">
<Grid Background="#FFE5E5E5">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<GroupBox Header="Location of Player Journal" Height="Auto" Grid.Row="0" VerticalAlignment="Top" Width="Auto" Grid.ColumnSpan="3" Margin="0,0,0,0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Label Content="Location on disk for the player journal. There is usually no need to change this setting." Grid.Row="0" Grid.ColumnSpan="2" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top" RenderTransformOrigin="-0.08,0.496"/>
<TextBox x:Name="journallocation" IsReadOnly="true" Text="" Grid.Row="1" Grid.Column="0" Margin="5,0,5,10" TextWrapping="Wrap" />
<Button x:Name="browsejournallocation" Content="Browse" Grid.Row="1" Grid.Column="1" Margin="0,0,0,0" Width="Auto" VerticalAlignment="Top" HorizontalAlignment="Left" Click="browsejournallocation_Click"/>
</Grid>
</GroupBox>
</Grid>
</TabItem>
<TabItem Header="Event Log" HorizontalAlignment="Left" Height="20" VerticalAlignment="Top">
<Grid Background="#FFE5E5E5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBox IsReadOnly="True" Grid.Row="1" x:Name="log" Height="Auto" Margin="5" TextWrapping="Wrap" FontFamily="Courier New" Background="{x:Null}"/>
<RichTextBox IsReadOnly="True" HorizontalAlignment="Left" Height="Auto" Margin="5" Width="Auto" VerticalContentAlignment="Stretch" VerticalAlignment="Top" Background="{x:Null}" BorderBrush="{x:Null}" SelectionBrush="{x:Null}">
<FlowDocument>
<Paragraph>
<Run Text="This tool does not recognise every option and/or configuration that E:D outputs through its JSON files."/>
</Paragraph>
<Paragraph>
<Run Text="Within this log you will find error messages that are of interest to the author (CMDR Hekateh). If something appears here please send it to me via Discord."/>
</Paragraph>
</FlowDocument>
</RichTextBox>
</Grid>
</TabItem>
</TabControl>
</Grid>
</Window>

415
EliteBGS/MainWindow.xaml.cs Normal file
View File

@@ -0,0 +1,415 @@
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using Ookii.Dialogs.Wpf;
using EDPlayerJournal;
using EDPlayerJournal.BGS;
using EDPlayerJournal.Entries;
using EliteBGS.BGS;
using EliteBGS.Util;
using System.Globalization;
using System.Windows.Forms;
using System.Windows.Controls.Primitives;
namespace EliteBGS;
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window {
private PlayerJournal journal;
private Report report;
public Config Config { get; set; } = new Config();
private LoadEntriesWindow loadentries = null;
private static readonly List<DiscordLogGenerator> logtypes = new List<DiscordLogGenerator>() {
new NonaDiscordLog(),
new GenericDiscordLog(),
new OneLineDiscordLog(),
};
public MainWindow() {
InitializeComponent();
try {
Config.LoadGlobal();
} catch (Exception) {
/* ignored */
}
foreach (DiscordLogGenerator type in logtypes) {
LogType.Items.Add(type);
}
string lastused = Config.Global.LastUsedDiscordTemplate;
int lastindex = logtypes.FindIndex(x => x.ToString() == lastused);
if (lastindex > -1) {
LogType.SelectedIndex = lastindex;
} else {
LogType.SelectedIndex = 0;
}
journal = new PlayerJournal(Config.Global.JournalLocation);
// Set both to now
InitialiseTime();
journallocation.Text = Config.Global.JournalLocation;
}
private void InitialiseTime() {
DateTime today = DateTime.Today;
DateTime tomorrow = today.AddDays(1);
startdate.CultureInfo = enddate.CultureInfo = CultureInfo.InvariantCulture;
startdate.Value = today;
enddate.Value = tomorrow;
}
private void TreeView_CheckBox_Updated(object sender, RoutedEventArgs args) {
GenerateLog();
}
private void Report_OnLog(string message) {
StringBuilder builder = new StringBuilder();
builder.Append(DateTime.Now.ToString());
builder.Append(": ");
builder.Append(message);
builder.Append("\n");
log.AppendText(builder.ToString());
}
private void Log(string message) {
Report_OnLog(message);
}
private void HandleEntries(List<Entry> entries, DateTime start, DateTime end) {
try {
TransactionParser parser = new TransactionParser();
List<Transaction> transactions = parser.Parse(entries);
// Filter the transactions down to the given time frame
transactions = transactions
.Where(t => t.CompletedAtDateTime >= start && t.CompletedAtDateTime <= end)
.ToList()
;
List<IncompleteTransaction> incompletes = transactions.OfType<IncompleteTransaction>().ToList();
// Log incomplete and remove them from the results.
foreach (var incomplete in incompletes) {
Log(incomplete.Reason);
}
transactions.RemoveAll(x => incompletes.Contains(x));
report = new Report(transactions);
this.entries.ItemsSource = report.Objectives;
} catch (Exception exception) {
Log("Something went terribly wrong while parsing the E:D player journal.");
Log("Please send this to CMDR Hekateh:");
Log(exception.ToString());
}
}
private void HandleEntries(List<Entry> entries) {
HandleEntries(entries, startdate.Value ?? DateTime.Now, enddate.Value ?? DateTime.Now);
}
private void Loadentries_EntriesLoaded(List<Entry> lines) {
HandleEntries(lines);
}
private void ParseJournal_Click(object sender, RoutedEventArgs e) {
try {
TransactionParser parser = new TransactionParser();
DateTime start = startdate.Value ?? DateTime.Now;
DateTime end = enddate.Value ?? DateTime.Now;
journal.Open(); // Load all files
// Log files only get rotated if you restart the game client. This means that there might
// be - say - entries from the 4th of May in the file with a timestamp of 3rd of May. This
// happens if you happen to play a session late into the night.
// At first I tried extracting the first and last line of a file to see the date range, but
// if you have a lot of files this becomes quite slow, and quite the memory hog (as journal
// files have to be read in their entirety to check this). So we assume that you can't play
// three days straight, and keep the code fast.
DateTime actualstart = start.AddDays(-3);
DateTime actualend = end.AddDays(1);
List<Entry> entries = journal.Files
.Where(f => f.NormalisedDateTime >= actualstart && f.NormalisedDateTime <= actualend)
.SelectMany(e => e.Entries)
.ToList()
;
HandleEntries(entries, start, end);
GenerateLog();
} catch (Exception exception) {
Log("Something went terribly wrong while parsing the E:D player journal.");
Log("Please send this to CMDR Hekateh:");
Log(exception.ToString());
}
}
private void GenerateLog() {
try {
DiscordLogGenerator discord = LogType.SelectedItem as DiscordLogGenerator;
string report = discord.GenerateDiscordLog(this.report);
DiscordLog.Text = report;
} catch (Exception exception) {
Log("Something went terribly wrong while generating the Discord log.");
Log("Please send this to CMDR Hekateh:");
Log(exception.ToString());
}
}
private void GenerateDiscord_Click(object sender, RoutedEventArgs e) {
GenerateLog();
}
private void RemoveCurrentObjective() {
if (entries.SelectedItem == null) {
return;
}
object obj = entries.SelectedItem;
bool removed = false;
if (obj.GetType() == typeof(Objective)) {
removed = report.Objectives.Remove(obj as Objective);
} else if (obj.GetType() == typeof(UITransaction) ||
obj.GetType().IsSubclassOf(typeof(UITransaction))) {
foreach (Objective parent in report.Objectives) {
if (parent.UITransactions.Remove(obj as UITransaction)) {
removed = true;
}
}
}
if (removed) {
RefreshView();
}
}
private void entries_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) {
if (e.Key == Key.Delete) {
RemoveCurrentObjective();
}
}
private void browsejournallocation_Click(object sender, RoutedEventArgs e) {
var dialog = new VistaFolderBrowserDialog();
if ((bool)!dialog.ShowDialog()) {
return;
}
Config.Global.JournalLocation = dialog.SelectedPath;
journallocation.Text = Config.Global.JournalLocation;
journal = new PlayerJournal(Config.Global.JournalLocation);
}
private Objective GetObjectiveFromControl(object sender) {
System.Windows.Controls.Control control = sender as System.Windows.Controls.Control;
if (control == null || control.DataContext == null) {
return null;
}
return control.DataContext as Objective;
}
private void AddCombatZone_Click(object sender, RoutedEventArgs e) {
Objective objective = GetObjectiveFromControl(sender);
if (objective == null) {
return;
}
CombatZone zone = new CombatZone {
Faction = objective.Faction,
System = objective.System,
Grade = "Low",
Type = "Ship",
};
UITransaction uitransaction = new UITransaction(zone);
objective.UITransactions.Add(uitransaction);
RefreshView();
}
private void RefreshView() {
entries.Items.Refresh();
GenerateLog();
}
private void LogType_SelectionChanged(object sender, SelectionChangedEventArgs e) {
if (LogType.SelectedItem == null) {
return;
}
string template = LogType.SelectedItem.ToString();
Config.Global.LastUsedDiscordTemplate = template;
GenerateLog();
}
private void ManuallyParse_Click(object sender, RoutedEventArgs e) {
if (loadentries != null) {
loadentries.Show();
return;
}
loadentries = new LoadEntriesWindow();
loadentries.Closed += Loadentries_Closed;
loadentries.EntriesLoaded += Loadentries_EntriesLoaded;
loadentries.Show();
}
private void Loadentries_Closed(object sender, EventArgs e) {
loadentries = null;
}
private void window_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
loadentries?.Close();
loadentries = null;
}
private void Transaction_Initialized(object sender, EventArgs e) {
}
private TransactionType GetTransaction<TransactionType>(object sender) where TransactionType : Transaction {
System.Windows.Controls.Control button = sender as System.Windows.Controls.Control;
if (button == null || button.DataContext == null) {
return null;
}
UITransaction transaction = button.DataContext as UITransaction;
if (transaction == null) {
return null;
}
return transaction.Transaction as TransactionType;
}
private void Low_Click(object sender, RoutedEventArgs e) {
CombatZone transaction = GetTransaction<CombatZone>(sender);
if (transaction == null) {
return;
}
transaction.Grade = CombatZones.DifficultyLow;
RefreshView();
}
private void Med_Click(object sender, RoutedEventArgs e) {
CombatZone transaction = GetTransaction<CombatZone>(sender);
if (transaction == null) {
return;
}
transaction.Grade = CombatZones.DifficultyMedium;
RefreshView();
}
private void High_Click(object sender, RoutedEventArgs e) {
CombatZone transaction = GetTransaction<CombatZone>(sender);
if (transaction == null) {
return;
}
transaction.Grade = CombatZones.DifficultyHigh;
RefreshView();
}
private void VeryHigh_Click(object sender, RoutedEventArgs e) {
CombatZone transaction = GetTransaction<CombatZone>(sender);
if (transaction == null) {
return;
}
transaction.Grade = CombatZones.DifficultyVeryHigh;
RefreshView();
}
private void Ground_Click(object sender, RoutedEventArgs e) {
CombatZone transaction = GetTransaction<CombatZone>(sender);
if (transaction == null) {
return;
}
transaction.Type = CombatZones.GroundCombatZone;
RefreshView();
}
private void Ship_Click(object sender, RoutedEventArgs e) {
CombatZone transaction = GetTransaction<CombatZone>(sender);
if (transaction == null) {
return;
}
transaction.Type = CombatZones.ShipCombatZone;
RefreshView();
}
private void Thargoid_Click(object sender, RoutedEventArgs e) {
CombatZone transaction = GetTransaction<CombatZone>(sender);
if (transaction == null) {
return;
}
transaction.Type = CombatZones.AXCombatZone;
RefreshView();
}
private void Profit_LostFocus(object sender, RoutedEventArgs e) {
RefreshView();
}
private void Profit_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) {
if (e.Key == Key.Enter) {
RefreshView();
}
}
private DateTime ResetTimeToZero(DateTime d) {
DateTime obj = d;
obj = obj.AddHours(d.Hour * -1);
obj = obj.AddMinutes(d.Minute * -1);
obj = obj.AddSeconds(d.Second * -1);
return obj;
}
private void ResetTime_Click(object sender, RoutedEventArgs e) {
DateTime? d = startdate.Value;
if (d != null) {
startdate.Value = ResetTimeToZero(d.Value);
}
d = enddate.Value;
if (d != null) {
enddate.Value = ResetTimeToZero(d.Value);
}
}
private void ToggleAll_Click(object sender, RoutedEventArgs e) {
ToggleButton button = sender as ToggleButton;
Objective objective = GetObjectiveFromControl(sender);
if (objective == null) {
return;
}
objective.UITransactions
.ForEach(x => x.IsEnabled = (button.IsChecked ?? true))
;
}
}

View File

@@ -0,0 +1,19 @@
using System.Globalization;
using System.Windows.Data;
using System;
namespace EliteBGS;
public class MinusFortyFiveConverter : IValueConverter {
/// <inheritdoc/>
public object Convert(
object value, Type targetType, object parameter, CultureInfo culture) {
return (double)value - 65;
}
/// <inheritdoc/>
public object ConvertBack(
object value, Type targetType, object parameter, CultureInfo culture) {
throw new NotSupportedException("Cannot convert back");
}
}

View File

@@ -0,0 +1,79 @@
using System;
using System.Text;
using System.Globalization;
using EDPlayerJournal;
using System.Linq;
namespace EliteBGS.BGS;
public class NonaDiscordLog : DiscordLogGenerator {
private string FormatDate() {
CultureInfo cultureInfo = CultureInfo.InvariantCulture;
StringBuilder date = new StringBuilder();
DateTime today = DateTime.UtcNow;
string suffix;
if (today.Day == 1 || today.Day == 21 || today.Day == 31) {
suffix = "st";
} else if (today.Day == 2 || today.Day == 22) {
suffix = "nd";
// Shakaka wins the price for finding this "bug"!
} else if (today.Day == 3 || today.Day == 23) {
suffix = "rd";
} else {
suffix = "th";
}
date.AppendFormat("{0} {1}{2}, {3}",
cultureInfo.DateTimeFormat.GetMonthName(today.Month),
today.Day, suffix,
today.Year + EliteDangerous.YearOffset
);
return date.ToString();
}
protected override string GenerateObjectiveHeader(Objective objective) {
StringBuilder log = new StringBuilder();
string location;
if (!string.IsNullOrEmpty(objective.System) && !string.IsNullOrEmpty(objective.Faction)) {
location = string.Format("{0}, {1}", objective.System, objective.Faction);
} else if (!string.IsNullOrEmpty(objective.System)) {
location = objective.System;
} else {
location = "Unknown Location";
}
int legacycount = objective.Transactions
.Where(x => x.IsLegacy)
.Count()
;
log.AppendFormat(":globe_with_meridians: `Target:` {0}\n", location);
if (legacycount > 0) {
log.Append(":rotating_light: `Warning`: Some actions were done in E:D Legacy\n");
}
log.Append(":clipboard: `Conducted:`\n");
log.Append("```\n");
return log.ToString();
}
protected override string GenerateObjectiveFooter(Objective objective) {
return "```\n";
}
protected override string GenerateHeader() {
return string.Format(":clock2: `Date:` {0}\n", FormatDate());
}
protected override string GenerateFooter() {
return "\n";
}
public override string ToString() {
return "Nova Navy Log";
}
}

282
EliteBGS/Objective.cs Normal file
View File

@@ -0,0 +1,282 @@
using System.Collections.Generic;
using System;
using System.Text;
using Newtonsoft.Json;
using EDPlayerJournal.BGS;
using System.Linq;
using System.Windows;
using EDPlayerJournal;
using System.ComponentModel;
namespace EliteBGS;
public class UITransaction : INotifyPropertyChanged {
private bool isenabled = true;
public event PropertyChangedEventHandler PropertyChanged;
public bool IsEnabled {
get { return isenabled; }
set {
isenabled = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IsEnabled"));
}
}
public bool IsExpanded { get; set; } = true;
public Visibility IsCombatZone {
get {
return (Transaction != null && Transaction.GetType() == typeof(CombatZone)) ? Visibility.Visible : Visibility.Hidden;
}
}
public Visibility IsSellCargo {
get {
return (Transaction != null && Transaction.GetType() == typeof(SellCargo)) ? Visibility.Visible : Visibility.Hidden;
}
}
public Visibility IsGroundCombatZone {
get {
CombatZone combat = Transaction as CombatZone;
if (combat == null) {
return Visibility.Hidden;
}
if (string.Compare(combat.Type, CombatZones.GroundCombatZone) == 0) {
return Visibility.Visible;
}
return Visibility.Hidden;
}
}
public Visibility IsShipCombatZone {
get {
CombatZone combat = Transaction as CombatZone;
if (combat == null) {
return Visibility.Hidden;
}
if (string.Compare(combat.Type, CombatZones.ShipCombatZone) == 0) {
return Visibility.Visible;
}
return Visibility.Hidden;
}
}
public Visibility IsAXCombatZone {
get {
CombatZone combat = Transaction as CombatZone;
if (combat == null) {
return Visibility.Hidden;
}
if (string.Compare(combat.Type, CombatZones.AXCombatZone) == 0) {
return Visibility.Visible;
}
return Visibility.Hidden;
}
}
public bool HasSpecOps {
get {
CombatZone combat = Transaction as CombatZone;
if (combat == null) {
return false;
}
return combat.SpecOps ?? false;
}
set {
CombatZone combat = Transaction as CombatZone;
if (combat == null) {
return;
}
combat.SpecOps = value;
}
}
public bool HasCapitalShip {
get {
CombatZone combat = Transaction as CombatZone;
if (combat == null) {
return false;
}
return combat.CapitalShip ?? false;
}
set {
CombatZone combat = Transaction as CombatZone;
if (combat == null) {
return;
}
combat.CapitalShip = value;
}
}
public bool HasCaptain {
get {
CombatZone combat = Transaction as CombatZone;
if (combat == null) {
return false;
}
return combat.Captain ?? false;
}
set {
CombatZone combat = Transaction as CombatZone;
if (combat == null) {
return;
}
combat.Captain = value;
}
}
public bool HasCorrespondent {
get {
CombatZone combat = Transaction as CombatZone;
if (combat == null) {
return false;
}
return combat.Correspondent ?? false;
}
set {
CombatZone combat = Transaction as CombatZone;
if (combat == null) {
return;
}
combat.Correspondent = value;
}
}
/// <summary>
/// Profit from selling, used in the XAML ui for binding
/// </summary>
public string Profit {
get {
SellCargo cargo = Transaction as SellCargo;
if (cargo == null) {
return "";
}
return cargo.Profit.ToString();
}
set {
SellCargo cargo = Transaction as SellCargo;
if (cargo == null) {
return;
}
try {
long profit_as_number = Convert.ToInt64(value);
cargo.Profit = profit_as_number;
} catch (FormatException) {
}
}
}
public Transaction Transaction { get; set; }
public UITransaction() { }
public UITransaction(Transaction transaction) {
Transaction = transaction;
}
public string Name {
get { return ToString(); }
}
public string CompletedAt {
get { return Transaction.CompletedAt; }
}
public override string ToString() {
return Transaction.ToString();
}
}
public class Objective : IComparable<Objective> {
public bool IsEnabled { get; set; }
public List<UITransaction> UITransactions { get; } = new List<UITransaction>();
public List<Transaction> Transactions {
get { return UITransactions.Select(x => x.Transaction).ToList<Transaction>(); }
}
public Visibility HasSystem {
get { return string.IsNullOrEmpty(System) ? Visibility.Hidden : Visibility.Visible; }
}
public Visibility HasFaction {
get { return string.IsNullOrEmpty(Faction) ? Visibility.Hidden : Visibility.Visible; }
}
public string Name {
get { return this.ToString(); }
}
public bool IsExpanded { get; set; }
public void Clear() {
if (Transactions == null) {
return;
}
Transactions.Clear();
}
public bool Matches(string system, string faction) {
return string.Compare(system, System) == 0 &&
string.Compare(faction, Faction) == 0;
}
public bool Matches(string system) {
return string.Compare(system, System) == 0;
}
public int CompareTo(Objective other) {
return (other.System == System &&
other.Faction == Faction) ? 0 : -1;
}
public bool IsValid {
get { return !string.IsNullOrEmpty(System) && !string.IsNullOrEmpty(Faction); }
}
public string System { get; set; }
public string Faction { get; set; }
public override string ToString() {
StringBuilder str = new StringBuilder();
if (!string.IsNullOrEmpty(System)) {
str.AppendFormat("System: {0}", System);
} else {
str.AppendFormat("System: Unknown");
}
if (!string.IsNullOrEmpty(Faction)) {
if (str.Length > 0) {
str.Append(", ");
}
str.AppendFormat("Faction: {0}", Faction);
}
return str.ToString();
}
public List<Type> EnabledOfType<Type>() where Type : Transaction {
return UITransactions
.Where(x => x.IsEnabled)
.Select(x => x.Transaction)
.OfType<Type>()
.ToList()
;
}
}

View File

@@ -0,0 +1,32 @@
namespace EliteBGS;
public class OneLineDiscordLog : DiscordLogGenerator {
protected override string GenerateObjectiveHeader(Objective objective) {
if (!string.IsNullOrEmpty(objective.Faction)) {
return string.Format("**{0}** for **{1}**: ", objective.System, objective.Faction);
} else {
return string.Format("**{0}**: ", objective.System);
}
}
protected override string GenerateObjectiveFooter(Objective objective) {
return "";
}
protected override string GenerateFooter() {
return "";
}
protected override string GenerateHeader() {
return "";
}
protected override string TransformFinalLogForObjective(Objective objective, string log) {
string[] lines = log.Split("\n", System.StringSplitOptions.RemoveEmptyEntries);
return string.Join(", ", lines);
}
public override string ToString() {
return "One Line Report";
}
}

View File

@@ -0,0 +1,55 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("EliteBGS")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("EliteBGS")]
[assembly: AssemblyCopyright("Copyright © 2021 by Florian Stinglmayr")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
//In order to begin building localizable applications, set
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
//inside a <PropertyGroup>. For example, if you are using US english
//in your source files, set the <UICulture> to en-US. Then uncomment
//the NeutralResourceLanguage attribute below. Update the "en-US" in
//the line below to match the UICulture setting in the project file.
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.1.1.0")]
[assembly: AssemblyFileVersion("0.1.1.0")]

View File

@@ -0,0 +1,73 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace EliteBGS.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("EliteBGS.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>
internal static System.Drawing.Icon EliteBGS {
get {
object obj = ResourceManager.GetObject("EliteBGS", resourceCulture);
return ((System.Drawing.Icon)(obj));
}
}
}
}

View File

@@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="EliteBGS" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\EliteBGS.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

26
EliteBGS/Properties/Settings.Designer.cs generated Normal file
View File

@@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace EliteBGS.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

236
EliteBGS/README.md Normal file
View File

@@ -0,0 +1,236 @@
# EDBGS
This tool is meant to help people contributing to the BGS effort to create BGS reports.
The tool allows you to configure BGS objectives, and will then parse your player journal
for tasks you completed relating to that BGS objective. Once the JSON player journal has
been parsed, you may then generate a BGS report you can copy/paste into Discord.
Source code is available at [https://codeberg.org/nola/edbgs](https://codeberg.org/nola/edbgs).
Binary downloads can be found here: [https://bgs.n0la.org/](https://bgs.n0la.org/).
## How To
Press "Parse Journal", which will check your Elite Dangerous player journal for completed
transactions. Currently the tool recognises the following transactions:
* Buying of cargo from stations (new in Update 10)
* Completed missions
* Failed missions
* Murders
* Search and Rescue contributions
* Selling cartography data
* Selling of cargo to stations
* Selling of micro resources (Odyssey only)
* Selling of organic data (Odyssey only)
* Vouchers, including bounty vouchers, combat bonds, and settlement vouchers (aka intel packages)
* Thargoid kills
* Contributions to Thargoid war effort
Vouchers help the faction that is listed for them. If said faction is not present in the
current system, then there is no BGS impact. So the tool looks for all system factions, and
makes sure that your vouchers actually have a BGS impact, otherwise it won't list them.
Selling cargo attempts to discern the profit and/or loss, which is helpful to gauge BGS
impact. But the player journal does not tell the amount of profit in the sell message.
So the tool looks for a buy a message related to the same commodity, and calculates loss
and/or profit from that. If the buy of the commodity is not within the time and date range,
or some other shenanigans happen that the tool does not yet support, the profit/loss could
be wrong. You can use the "Adjust Trade Profit" button to manually adjust the trade profit,
or you could simply edit the discord log manually.
Please note that cartography data, and micro resources only help the controlling faction
of a station. The tool is clever enough to exclude these if the station you turn them in at, is not
controlled by the faction you specified in the objective.
Some missions may show up having zero influence for the given faction. This happens if you do
missions for a faction which is currently in an election state. You do not gain influence for
the faction so the influence reads as zero. But you contribute towards the election, so the
missions are selected anyway.
There is no entry in the journal if you win a combat zone. So you have to add those manually. Select
an objective for which you wish to log a combat zone. The faction in the objective, must be the
faction you fought for in the combat zone. Then click "Add Combat Zone Win". Select type,
either "On Foot" for Odyssey, or "Ship" for regular ones. Then select the grade (low, medium or
high), and how many you won. Then press "Accept". Select "Cancel" to abort. You can of course remove
the combat zone entries by selecting them, and pressing "DEL".
If you deliberately fail a mission (to log negative INF towards a faction), the tool cannot detect
it, if the day you accepted the mission is outside of the given date range. It needs the journal
entry where you accept the mission to connect the mission to a faction, system and station. The tool
will warn you if this happens, with a message in the error log in the fourth tab.
When committing murder, the journal entry contains the faction information of the faction that gave
you the bounty. And not the faction of the victim. The tool will look for an event in which you
scanned your victim, and gleem the victim's faction from that. If you did not scan your victim, then
sadly the tool cannot connect the victim's faction to the victim.
![Main Window with entries](main-page.png)
The window will then list all the journal entries it has found, and group them by objectives. You
can select which objectives you wish to report, by using the checkmarks.
You can exclude a specific entry within an objective by deselecting the checkbox next to them.
This way said entry will not appear in the final log. You can also remove individual entries
(if you think the tool detected something you thought was wrong), by selecting the entry,
and pressing the "DEL" key.
Once you are satisfied with the result, the discord report should be displayed below, ready to be
copy and pasted. Before you copy/paste it into the discord of your squadron, you should check the log.
You can of course edit it, if something is wrong or the tool itself missed something. If you want to
regenerate it, just click "Generate Log".
## Known Issues and Bugs
### Settlement Vouchers
Settlement vouchers (aka Intel Packages) help every faction aligned with the given superpower.
So if you turn in an Imperial intel package on an imperial station, all factions aligned with
the Empire will gain a bit of INF boost. The tool currently cannot handle that. All intel packages
are displayed instead.
### Bugged bounty vouchers
Sometimes bounty vouchers are not properly recognised. This is a bug in the player journal, where
the faction information is not properly written out in the journal:
```
{
"timestamp":"2021-10-07T14:57:50Z", "event":"RedeemVoucher",
"Type":"bounty", "Amount":20750,
"Factions":[ { "Faction":"", "Amount":500 }, { "Faction":"", "Amount":20250 }]
}
```
Since the tool does not know for which faction these bounties were redeemed for, it cannot assign
it to an objective.
### Combat Zones
The player journal currently does not make an entry when you win or lose a combat zone. This is a
an ommission from FDev:
* [https://issues.frontierstore.net/issue-detail/43509](https://issues.frontierstore.net/issue-detail/43509)
Please upvote the issue to get it fixed. Until then, you have to add combat zone wins manually.
### On-Foot NPC givers
Up until update 13 missions accepted from NPCs in Odyssey concourses do not get a player journal entry.
This has been fixed in update 13. Any on foot missions from NPCs accepted before update 13, do not have
an entry in the player journal.
### Failed vs. Abandoned Missions
The tool also currently cannot differentiate between missions you have abandoned in the transaction
tab before it was completed, and those that you have failed - either delibaretly or by time-out. So
it will find and add them all, and you simply can remove those that you have abandoned manually.
### Influence given to empty/non-existent faction
Sometimes the log will state that it gave positive or negative influence to a faction, but the
faction name is empty:
```
"FactionEffects": [
{
"Faction": "",
"Effects": [
{
"Effect": "$MISSIONUTIL_Interaction_Summary_EP_down;",
"Effect_Localised": "The economic status of $#MinorFaction; has declined in the $#System; system.",
"Trend": "DownBad"
}
],
"Influence": [
{
"SystemAddress": 251012319587,
"Trend": "DownBad",
"Influence": "+"
}
],
"ReputationTrend": "DownBad",
"Reputation": "+"
}
]
```
This happens for example if you do a scan/heist mission from a surface POI, but no one owns said
surface POI. Randomly generated surface POIs sometimes have no owner, and said non-existant owner
then gets the negative influence.
### Mission Completed but no one gains influence
Sometimes missions are completed but no one gains any influence:
```
{
"timestamp": "2022-02-25T21:30:45Z",
"event": "MissionCompleted",
"Faction": "Social LHS 6103 Confederation",
"Name": "Mission_Courier_Elections_name",
"MissionID": 850025233,
"TargetFaction": "Delphin Blue Federal PLC",
"DestinationSystem": "Delphin",
"DestinationStation": "Aristotle Orbital",
"Reward": 122300,
"FactionEffects": [
{
"Faction": "Social LHS 6103 Confederation",
"Effects": [
{
"Effect": "$MISSIONUTIL_Interaction_Summary_EP_up;",
"Effect_Localised": "The economic status of $#MinorFaction; has improved in the $#System; system.",
"Trend": "UpGood"
}
],
"Influence": [],
"ReputationTrend": "UpGood",
"Reputation": "+"
},
{
"Faction": "Delphin Blue Federal PLC",
"Effects": [],
"Influence": [],
"ReputationTrend": "UpGood",
"Reputation": "+"
}
]
}
```
Here the is known that at the time of completion the Confederation was in an Election and could not
have gained any influence regardless. It is unclear whether this also holds true for Delphin Blue
Federal PLC. So to be save, the tool assumes that if no influence was gained for the source faction,
it still has to make an entry for the source system. The same applies for the target faction: if no
influence is gained for the target faction, still add an entry for the target faction in the missions
target system.
Since it is not possible to differentiate between missions that give no influence no matter what, and
no influence gained because of an election, we have to assume it *gave* influence and let the user
decide whether it was because of an election, or not.
Future tool versions should probably take faction states into account in such matters.
## Nothing's Perfect
The tool itself is still a work in progress, and it might miss something. If you think the tool
missed a task you have done, please contact `Hekateh` on the Elite Dangerous community discord.
It would be helpful if you included the JSON player journal. This player journal can be found here:
```
%userprofile%\saved Games\Frontier Developments\Elite Dangerous\
```
## Build Dependencies
The project also requires:
* `Ookii.Dialogs.WPF`
* `Newtonsoft.Json`
* `Extended.Wpf.Toolkit`
## About
This tool was made by CMDR Hekateh (Discord: `nola#2457`).
Long live the Empire.

40
EliteBGS/Report.cs Normal file
View File

@@ -0,0 +1,40 @@
using System.Collections.Generic;
using EDPlayerJournal.BGS;
namespace EliteBGS;
public class Report {
public List<Objective> Objectives { get; set; } = new List<Objective>();
public Report() { }
public Report(List<Transaction> transactions) {
Populate(transactions);
}
private void Populate(List<Transaction> transactions) {
if (transactions == null || transactions.Count == 0) {
return;
}
foreach (Transaction t in transactions) {
Objective o;
if (t.SystemContribution) {
o = Objectives.Find(x => x.Matches(t.System));
} else {
o = Objectives.Find(x => x.Matches(t.System, t.Faction));
}
if (o == null) {
if (t.SystemContribution) {
o = new Objective() { System = t.System };
} else {
o = new Objective() { Faction = t.Faction, System = t.System };
}
Objectives.Add(o);
}
o.UITransactions.Add(new UITransaction(t));
}
}
}

93
EliteBGS/Resources.Designer.cs generated Normal file
View File

@@ -0,0 +1,93 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace EliteBGS {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
public class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("EliteBGS.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>
public static System.Drawing.Icon EliteBGS {
get {
object obj = ResourceManager.GetObject("EliteBGS", resourceCulture);
return ((System.Drawing.Icon)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
public static System.Drawing.Bitmap logo_v5 {
get {
object obj = ResourceManager.GetObject("logo_v5", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>
public static System.Drawing.Icon Salus {
get {
object obj = ResourceManager.GetObject("Salus", resourceCulture);
return ((System.Drawing.Icon)(obj));
}
}
}
}

130
EliteBGS/Resources.resx Normal file
View File

@@ -0,0 +1,130 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="EliteBGS" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>EliteBGS.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="logo_v5" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>logo_v5.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Salus" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Salus.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
EliteBGS/Salus.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,109 @@
{"timestamp":"2022-02-11T14:03:05Z","event":"Location","Docked":true,"StationName":"Wyeth Platform","StationType":"Outpost","MarketID":3228303360,"StationFaction":{"Name":"Flotta Stellare"},"StationGovernment":"$government_Democracy;","StationGovernment_Localised":"Democracy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","refuel","repair","tuning","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Refinery;","StationEconomy_Localised":"Refinery","StationEconomies":[{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":1.0}],"StarSystem":"Dewikum","SystemAddress":9467315955081,"StarPos":[19.375,-0.28125,-68.9375],"SystemAllegiance":"Independent","SystemEconomy":"$economy_Refinery;","SystemEconomy_Localised":"Refinery","SystemSecondEconomy":"$economy_Extraction;","SystemSecondEconomy_Localised":"Extraction","SystemGovernment":"$government_Democracy;","SystemGovernment_Localised":"Democracy","SystemSecurity":"$SYSTEM_SECURITY_low;","SystemSecurity_Localised":"Low Security","Population":83688,"Body":"Wyeth Platform","BodyID":48,"BodyType":"Station","Powers":["Zachary Hudson"],"PowerplayState":"Exploited","Factions":[{"Name":"LHS 1857 Jet Galactic Systems","FactionState":"War","Government":"Corporate","Influence":0.113095,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"ActiveStates":[{"State":"War"}]},{"Name":"Social LHS 6103 Confederation","FactionState":"None","Government":"Confederacy","Influence":0.18254,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":57.18,"PendingStates":[{"State":"Boom","Trend":0}]},{"Name":"Susanoo Jet Fortune Corporation","FactionState":"None","Government":"Corporate","Influence":0.061508,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Dewikum League","FactionState":"War","Government":"Confederacy","Influence":0.113095,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":28.57,"ActiveStates":[{"State":"War"}]},{"Name":"Dewikum Blue Ring","FactionState":"Bust","Government":"Anarchy","Influence":0.012897,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"RecoveringStates":[{"State":"Outbreak","Trend":0}],"ActiveStates":[{"State":"Bust"}]},{"Name":"Silver Dynamic Limited","FactionState":"None","Government":"Corporate","Influence":0.054563,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Flotta Stellare","FactionState":"None","Government":"Democracy","Influence":0.462302,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-15.0,"PendingStates":[{"State":"Expansion","Trend":0}]}],"SystemFaction":{"Name":"Flotta Stellare"},"Conflicts":[{"WarType":"war","Status":"active","Faction1":{"Name":"LHS 1857 Jet Galactic Systems","Stake":"Barnett Dredging Complex","WonDays":0},"Faction2":{"Name":"Dewikum League","Stake":"Singh Nutrition Site","WonDays":0}}]}
{"timestamp":"2022-02-11T14:03:06Z","event":"Docked","StationName":"Wyeth Platform","StationType":"Outpost","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3228303360,"StationFaction":{"Name":"Flotta Stellare"},"StationGovernment":"$government_Democracy;","StationGovernment_Localised":"Democracy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","refuel","repair","tuning","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Refinery;","StationEconomy_Localised":"Refinery","StationEconomies":[{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":1.0}],"DistFromStarLS":222534.506189}
{"timestamp":"2022-02-11T14:03:40Z","event":"MissionAccepted","Faction":"Social LHS 6103 Confederation","Name":"MISSION_Salvage_Refinery","LocalisedName":"Black Box Salvage Contract for Refinery","Commodity":"$USSCargoBlackBox_Name;","Commodity_Localised":"Black Box","Count":3,"DestinationSystem":"Breksta","DestinationStation":"Popper Dock","Expiry":"2022-02-15T19:22:16Z","Wing":false,"Influence":"++","Reputation":"++","Reward":1444937,"MissionID":845707326}
{"timestamp":"2022-02-11T14:06:01Z","event":"Docked","StationName":"J9F-G0M","StationType":"FleetCarrier","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"DistFromStarLS":222534.47697}
{"timestamp":"2022-02-11T14:09:10Z","event":"Docked","StationName":"Wyeth Platform","StationType":"Outpost","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3228303360,"StationFaction":{"Name":"Flotta Stellare"},"StationGovernment":"$government_Democracy;","StationGovernment_Localised":"Democracy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","refuel","repair","tuning","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Refinery;","StationEconomy_Localised":"Refinery","StationEconomies":[{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":1.0}],"DistFromStarLS":222534.447441}
{"timestamp":"2022-02-11T14:10:12Z","event":"ShipTargeted","TargetLocked":true,"Ship":"eagle","ScanStage":0}
{"timestamp":"2022-02-11T14:10:13Z","event":"ShipTargeted","TargetLocked":false}
{"timestamp":"2022-02-11T14:10:27Z","event":"Docked","StationName":"Wyeth Platform","StationType":"Outpost","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3228303360,"StationFaction":{"Name":"Flotta Stellare"},"StationGovernment":"$government_Democracy;","StationGovernment_Localised":"Democracy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","refuel","repair","tuning","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Refinery;","StationEconomy_Localised":"Refinery","StationEconomies":[{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":1.0}],"DistFromStarLS":222534.434948}
{"timestamp":"2022-02-11T14:13:13Z","event":"Docked","StationName":"J9F-G0M","StationType":"FleetCarrier","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"DistFromStarLS":222534.40825}
{"timestamp":"2022-02-11T14:24:32Z","event":"Docked","StationName":"J9F-G0M","StationType":"FleetCarrier","StarSystem":"Matucae","SystemAddress":3343405517163,"MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"DistFromStarLS":99.450287}
{"timestamp":"2022-02-11T14:43:35Z","event":"Docked","StationName":"Dumont Survey","StationType":"Outpost","StarSystem":"Matucae","SystemAddress":3343405517163,"MarketID":3224413952,"StationFaction":{"Name":"Peraesii Empire Consulate","FactionState":"Expansion"},"StationGovernment":"$government_Patronage;","StationGovernment_Localised":"Patronage","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","rearm","refuel","repair","tuning","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Extraction;","StationEconomy_Localised":"Extraction","StationEconomies":[{"Name":"$economy_Extraction;","Name_Localised":"Extraction","Proportion":0.87},{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":0.13}],"DistFromStarLS":99.362961}
{"timestamp":"2022-02-11T14:44:03Z","event":"MissionAccepted","Faction":"Peraesii Empire Consulate","Name":"MISSION_Salvage_Expansion","LocalisedName":"Rare Artwork Salvage for Expansion Effort","Commodity":"$USSCargoRareArtwork_Name;","Commodity_Localised":"Rare Artwork","Count":4,"DestinationSystem":"HIP 10694","DestinationStation":"Bayer Orbital","Expiry":"2022-02-17T10:17:47Z","Wing":false,"Influence":"++","Reputation":"++","Reward":1662874,"MissionID":845715730}
{"timestamp":"2022-02-11T14:44:10Z","event":"MissionAccepted","Faction":"Peraesii Empire Consulate","Name":"Mission_Assassinate","LocalisedName":"Assassinate Known Pirate: Graham Ethan Dean II","TargetType":"$MissionUtil_FactionTag_PirateLord;","TargetType_Localised":"Known Pirate","TargetFaction":"HIP 11263 Silver Mafia","DestinationSystem":"HIP 11263","DestinationStation":"Froud Station","Target":"Graham Ethan Dean II","Expiry":"2022-02-12T14:43:53Z","Wing":true,"Influence":"++","Reputation":"++","Reward":4653914,"MissionID":845715773}
{"timestamp":"2022-02-11T14:44:14Z","event":"MissionAccepted","Faction":"Peraesii Empire Consulate","Name":"MISSION_Salvage_Expansion","LocalisedName":"Rare Artwork Salvage for Expansion Effort","Commodity":"$USSCargoRareArtwork_Name;","Commodity_Localised":"Rare Artwork","Count":4,"DestinationSystem":"Blodyaks","DestinationStation":"Leonard Port","Expiry":"2022-02-14T05:17:39Z","Wing":false,"Influence":"++","Reputation":"++","Reward":829065,"MissionID":845715789}
{"timestamp":"2022-02-12T18:23:13Z","event":"Location","Docked":true,"StationName":"J9F-G0M","StationType":"FleetCarrier","MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"StarSystem":"Dewikum","SystemAddress":9467315955081,"StarPos":[19.375,-0.28125,-68.9375],"SystemAllegiance":"Independent","SystemEconomy":"$economy_Refinery;","SystemEconomy_Localised":"Refinery","SystemSecondEconomy":"$economy_Extraction;","SystemSecondEconomy_Localised":"Extraction","SystemGovernment":"$government_Democracy;","SystemGovernment_Localised":"Democracy","SystemSecurity":"$SYSTEM_SECURITY_low;","SystemSecurity_Localised":"Low Security","Population":83688,"Body":"Dewikum B 1","BodyID":19,"BodyType":"Planet","Powers":["Zachary Hudson"],"PowerplayState":"Exploited","Factions":[{"Name":"LHS 1857 Jet Galactic Systems","FactionState":"War","Government":"Corporate","Influence":0.112983,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"ActiveStates":[{"State":"War"}]},{"Name":"Social LHS 6103 Confederation","FactionState":"Boom","Government":"Confederacy","Influence":0.194252,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":53.220001,"ActiveStates":[{"State":"Boom"}]},{"Name":"Susanoo Jet Fortune Corporation","FactionState":"None","Government":"Corporate","Influence":0.068385,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Dewikum League","FactionState":"War","Government":"Confederacy","Influence":0.112983,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":28.57,"ActiveStates":[{"State":"War"}]},{"Name":"Dewikum Blue Ring","FactionState":"Bust","Government":"Anarchy","Influence":0.013875,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"RecoveringStates":[{"State":"Outbreak","Trend":0}],"ActiveStates":[{"State":"Bust"}]},{"Name":"Silver Dynamic Limited","FactionState":"None","Government":"Corporate","Influence":0.060456,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Flotta Stellare","FactionState":"None","Government":"Democracy","Influence":0.437066,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-15.0,"PendingStates":[{"State":"Expansion","Trend":0}]}],"SystemFaction":{"Name":"Flotta Stellare"},"Conflicts":[{"WarType":"war","Status":"active","Faction1":{"Name":"LHS 1857 Jet Galactic Systems","Stake":"Barnett Dredging Complex","WonDays":0},"Faction2":{"Name":"Dewikum League","Stake":"Singh Nutrition Site","WonDays":0}}]}
{"timestamp":"2022-02-12T18:23:14Z","event":"Docked","StationName":"J9F-G0M","StationType":"FleetCarrier","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"DistFromStarLS":222517.703693}
{"timestamp":"2022-02-12T18:25:43Z","event":"ShipTargeted","TargetLocked":true,"Ship":"eagle","ScanStage":1,"PilotName":"$ShipName_Police_Independent;","PilotName_Localised":"System Authority Vessel","PilotRank":"Master"}
{"timestamp":"2022-02-12T18:25:43Z","event":"ShipTargeted","TargetLocked":false}
{"timestamp":"2022-02-12T18:26:32Z","event":"Docked","StationName":"J9F-G0M","StationType":"FleetCarrier","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"DistFromStarLS":222517.672751}
{"timestamp":"2022-02-12T18:33:41Z","event":"Docked","StationName":"Wyeth Platform","StationType":"Outpost","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3228303360,"StationFaction":{"Name":"Flotta Stellare"},"StationGovernment":"$government_Democracy;","StationGovernment_Localised":"Democracy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","refuel","repair","tuning","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Refinery;","StationEconomy_Localised":"Refinery","StationEconomies":[{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":1.0}],"DistFromStarLS":222517.599345}
{"timestamp":"2022-02-12T18:36:13Z","event":"MissionAccepted","Faction":"Social LHS 6103 Confederation","Name":"Mission_Delivery_Boom","LocalisedName":"Boom time delivery of 147 units of Aluminium","Commodity":"$Aluminium_Name;","Commodity_Localised":"Aluminium","Count":147,"TargetFaction":"Silver Dynamic Limited","DestinationSystem":"BD+08 1303","DestinationStation":"Wescott Terminal","Expiry":"2022-02-13T18:34:42Z","Wing":false,"Influence":"++","Reputation":"++","Reward":634054,"MissionID":846168214}
{"timestamp":"2022-02-12T18:36:18Z","event":"MissionAccepted","Faction":"Social LHS 6103 Confederation","Name":"Mission_Delivery_Boom","LocalisedName":"Boom time delivery of 147 units of Tritium","Commodity":"$Tritium_Name;","Commodity_Localised":"Tritium","Count":147,"TargetFaction":"Traditional Nihursaga Dominion","DestinationSystem":"Nihursaga","DestinationStation":"Hardwick Hub","Expiry":"2022-02-13T18:34:42Z","Wing":false,"Influence":"++","Reputation":"++","Reward":5304324,"MissionID":846168240}
{"timestamp":"2022-02-12T19:21:10Z","event":"Docked","StationName":"Wyeth Platform","StationType":"Outpost","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3228303360,"StationFaction":{"Name":"Flotta Stellare"},"StationGovernment":"$government_Democracy;","StationGovernment_Localised":"Democracy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","refuel","repair","tuning","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Refinery;","StationEconomy_Localised":"Refinery","StationEconomies":[{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":1.0}],"DistFromStarLS":222517.162798}
{"timestamp":"2022-02-12T19:26:10Z","event":"MissionCompleted","Faction":"Social LHS 6103 Confederation","Name":"MISSION_Salvage_Illegal_name","MissionID":845534002,"Commodity":"$USSCargoBlackBox_Name;","Commodity_Localised":"Black Box","Count":3,"NewDestinationSystem":"Dewikum","DestinationSystem":"Julanggarri","Reward":116651,"FactionEffects":[{"Faction":"Social LHS 6103 Confederation","Effects":[{"Effect":"$MISSIONUTIL_Interaction_Summary_EP_up;","Effect_Localised":"The economic status of $#MinorFaction; has improved in the $#System; system.","Trend":"UpGood"}],"Influence":[{"SystemAddress":9467315955081,"Trend":"UpGood","Influence":"+++++"}],"ReputationTrend":"UpGood","Reputation":"++"},{"Faction":"Flotta Stellare","Effects":[],"Influence":[{"SystemAddress":9467315955089,"Trend":"DownBad","Influence":"+"}],"ReputationTrend":"DownBad","Reputation":"+"}]}
{"timestamp":"2022-02-12T19:26:14Z","event":"MissionCompleted","Faction":"Social LHS 6103 Confederation","Name":"MISSION_Salvage_Refinery_name","MissionID":845707326,"Commodity":"$USSCargoBlackBox_Name;","Commodity_Localised":"Black Box","Count":3,"NewDestinationSystem":"Dewikum","DestinationSystem":"Breksta","NewDestinationStation":"Wyeth Platform","DestinationStation":"Popper Dock","Reward":1444937,"FactionEffects":[{"Faction":"Social LHS 6103 Confederation","Effects":[{"Effect":"$MISSIONUTIL_Interaction_Summary_EP_up;","Effect_Localised":"The economic status of $#MinorFaction; has improved in the $#System; system.","Trend":"UpGood"}],"Influence":[{"SystemAddress":9467315955081,"Trend":"UpGood","Influence":"+++"}],"ReputationTrend":"UpGood","Reputation":"++"},{"Faction":"","Effects":[],"Influence":[{"SystemAddress":147933104483,"Trend":"DownBad","Influence":"+"}],"ReputationTrend":"DownBad","Reputation":"+"}]}
{"timestamp":"2022-02-12T19:27:51Z","event":"MissionAccepted","Faction":"Social LHS 6103 Confederation","Name":"Chain_SalvageJustice","LocalisedName":"Assassinate Known Pirate: Zuriel Z'ev","TargetType":"$MissionUtil_FactionTag_PirateLord;","TargetType_Localised":"Known Pirate","TargetFaction":"Wong Sher Jet Ring","DestinationSystem":"Wong Sher","DestinationStation":"Zudov City","Target":"Zuriel Z'ev","Expiry":"2022-02-13T19:27:00Z","Wing":false,"Influence":"++","Reputation":"++","Reward":3129026,"MissionID":846188327}
{"timestamp":"2022-02-12T19:27:58Z","event":"MissionAccepted","Faction":"Social LHS 6103 Confederation","Name":"Mission_Assassinate","LocalisedName":"Assassinate Known Pirate: Helders","TargetType":"$MissionUtil_FactionTag_PirateLord;","TargetType_Localised":"Known Pirate","TargetFaction":"Wong Sher Jet Ring","DestinationSystem":"Wong Sher","DestinationStation":"Zudov City","Target":"Helders","Expiry":"2022-02-13T19:26:02Z","Wing":true,"Influence":"++","Reputation":"++","Reward":3578406,"MissionID":846188378}
{"timestamp":"2022-02-12T19:29:44Z","event":"FSDJump","StarSystem":"Nihursaga","SystemAddress":2999791389027,"StarPos":[24.0625,9.3125,-62.875],"SystemAllegiance":"Federation","SystemEconomy":"$economy_Industrial;","SystemEconomy_Localised":"Industrial","SystemSecondEconomy":"$economy_None;","SystemSecondEconomy_Localised":"None","SystemGovernment":"$government_Confederacy;","SystemGovernment_Localised":"Confederacy","SystemSecurity":"$SYSTEM_SECURITY_medium;","SystemSecurity_Localised":"Medium Security","Population":2785745,"Body":"Nihursaga A","BodyID":3,"BodyType":"Star","Powers":["Zachary Hudson"],"PowerplayState":"Exploited","JumpDist":12.279,"FuelUsed":1.19087,"FuelLevel":30.80913,"Factions":[{"Name":"Labour of LTT 12033","FactionState":"None","Government":"Democracy","Influence":0.187375,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"LP 421-7 Systems","FactionState":"None","Government":"Corporate","Influence":0.134269,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Nihursaga Coalition","FactionState":"None","Government":"Confederacy","Influence":0.278557,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Nihursaga United Exchange","FactionState":"None","Government":"Corporate","Influence":0.103206,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Traditional Nihursaga Dominion","FactionState":"None","Government":"Dictatorship","Influence":0.089178,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"RecoveringStates":[{"State":"PublicHoliday","Trend":0}]},{"Name":"Zandu Progressive Party","FactionState":"None","Government":"Democracy","Influence":0.128257,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Nihursaga Crimson Boys","FactionState":"None","Government":"Anarchy","Influence":0.079158,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0}],"SystemFaction":{"Name":"Nihursaga Coalition"}}
{"timestamp":"2022-02-12T19:45:36Z","event":"Docked","StationName":"Hardwick Hub","StationType":"Coriolis","StarSystem":"Nihursaga","SystemAddress":2999791389027,"MarketID":3228194304,"StationFaction":{"Name":"Nihursaga Coalition"},"StationGovernment":"$government_Confederacy;","StationGovernment_Localised":"Confederacy","StationAllegiance":"Federation","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","shipyard","tuning","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","shop","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Industrial;","StationEconomy_Localised":"Industrial","StationEconomies":[{"Name":"$economy_Industrial;","Name_Localised":"Industrial","Proportion":1.0}],"DistFromStarLS":231829.462342}
{"timestamp":"2022-02-12T19:47:21Z","event":"MissionCompleted","Faction":"Social LHS 6103 Confederation","Name":"Mission_Delivery_Boom_name","MissionID":846168240,"Commodity":"$Tritium_Name;","Commodity_Localised":"Tritium","Count":147,"TargetFaction":"Traditional Nihursaga Dominion","DestinationSystem":"Nihursaga","DestinationStation":"Hardwick Hub","Reward":2898324,"FactionEffects":[{"Faction":"Traditional Nihursaga Dominion","Effects":[{"Effect":"$MISSIONUTIL_Interaction_Summary_EP_up;","Effect_Localised":"The economic status of $#MinorFaction; has improved in the $#System; system.","Trend":"UpGood"}],"Influence":[{"SystemAddress":2999791389027,"Trend":"UpGood","Influence":"+++++"}],"ReputationTrend":"UpGood","Reputation":"++"},{"Faction":"Social LHS 6103 Confederation","Effects":[{"Effect":"$MISSIONUTIL_Interaction_Summary_EP_up;","Effect_Localised":"The economic status of $#MinorFaction; has improved in the $#System; system.","Trend":"UpGood"}],"Influence":[{"SystemAddress":9467315955081,"Trend":"UpGood","Influence":"+++++"}],"ReputationTrend":"UpGood","Reputation":"++"}]}
{"timestamp":"2022-02-12T19:49:52Z","event":"FSDJump","StarSystem":"BD+08 1303","SystemAddress":1774715485,"StarPos":[25.53125,-1.875,-62.84375],"SystemAllegiance":"Independent","SystemEconomy":"$economy_Industrial;","SystemEconomy_Localised":"Industrial","SystemSecondEconomy":"$economy_Refinery;","SystemSecondEconomy_Localised":"Refinery","SystemGovernment":"$government_Democracy;","SystemGovernment_Localised":"Democracy","SystemSecurity":"$SYSTEM_SECURITY_high;","SystemSecurity_Localised":"High Security","Population":20853922,"Body":"BD+08 1303 A","BodyID":1,"BodyType":"Star","JumpDist":11.284,"FuelUsed":0.591609,"FuelLevel":31.40839,"Factions":[{"Name":"Green Party of BD+08 1303","FactionState":"Boom","Government":"Democracy","Influence":0.093186,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"ActiveStates":[{"State":"Boom"}]},{"Name":"Allied BD+08 1303 Bureau","FactionState":"None","Government":"Dictatorship","Influence":0.059118,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"BD+08 1303 Jet Legal Industries","FactionState":"None","Government":"Corporate","Influence":0.142285,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Silver Dynamic Limited","FactionState":"None","Government":"Corporate","Influence":0.078156,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"RecoveringStates":[{"State":"PublicHoliday","Trend":0}]},{"Name":"BD+08 1303 Drug Empire","FactionState":"Bust","Government":"Anarchy","Influence":0.01002,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-17.16,"ActiveStates":[{"State":"Bust"}]},{"Name":"United BD+08 1303 First","FactionState":"None","Government":"Dictatorship","Influence":0.074148,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Flotta Stellare","FactionState":"None","Government":"Democracy","Influence":0.543086,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-18.959999,"PendingStates":[{"State":"Expansion","Trend":0}]}],"SystemFaction":{"Name":"Flotta Stellare"}}
{"timestamp":"2022-02-12T19:58:10Z","event":"Location","Docked":false,"StarSystem":"BD+08 1303","SystemAddress":1774715485,"StarPos":[25.53125,-1.875,-62.84375],"SystemAllegiance":"Independent","SystemEconomy":"$economy_Industrial;","SystemEconomy_Localised":"Industrial","SystemSecondEconomy":"$economy_Refinery;","SystemSecondEconomy_Localised":"Refinery","SystemGovernment":"$government_Democracy;","SystemGovernment_Localised":"Democracy","SystemSecurity":"$SYSTEM_SECURITY_high;","SystemSecurity_Localised":"High Security","Population":20853922,"Body":"BD+08 1303 AB 10","BodyID":29,"BodyType":"Planet","Factions":[{"Name":"Green Party of BD+08 1303","FactionState":"Boom","Government":"Democracy","Influence":0.093186,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"ActiveStates":[{"State":"Boom"}]},{"Name":"Allied BD+08 1303 Bureau","FactionState":"None","Government":"Dictatorship","Influence":0.059118,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"BD+08 1303 Jet Legal Industries","FactionState":"None","Government":"Corporate","Influence":0.142285,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Silver Dynamic Limited","FactionState":"None","Government":"Corporate","Influence":0.078156,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"RecoveringStates":[{"State":"PublicHoliday","Trend":0}]},{"Name":"BD+08 1303 Drug Empire","FactionState":"Bust","Government":"Anarchy","Influence":0.01002,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-17.16,"ActiveStates":[{"State":"Bust"}]},{"Name":"United BD+08 1303 First","FactionState":"None","Government":"Dictatorship","Influence":0.074148,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Flotta Stellare","FactionState":"None","Government":"Democracy","Influence":0.543086,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-18.959999,"PendingStates":[{"State":"Expansion","Trend":0}]}],"SystemFaction":{"Name":"Flotta Stellare"}}
{"timestamp":"2022-02-12T20:01:09Z","event":"ShipTargeted","TargetLocked":true,"Ship":"independant_trader","Ship_Localised":"Keelback","ScanStage":0}
{"timestamp":"2022-02-12T20:01:14Z","event":"ShipTargeted","TargetLocked":true,"Ship":"independant_trader","Ship_Localised":"Keelback","ScanStage":1,"PilotName":"$npc_name_decorate:#name=Tim Longworth;","PilotName_Localised":"Tim Longworth","PilotRank":"Harmless"}
{"timestamp":"2022-02-12T20:01:16Z","event":"ShipTargeted","TargetLocked":true,"Ship":"independant_trader","Ship_Localised":"Keelback","ScanStage":2,"PilotName":"$npc_name_decorate:#name=Tim Longworth;","PilotName_Localised":"Tim Longworth","PilotRank":"Harmless","ShieldHealth":100.0,"HullHealth":100.0}
{"timestamp":"2022-02-12T20:01:18Z","event":"ShipTargeted","TargetLocked":true,"Ship":"independant_trader","Ship_Localised":"Keelback","ScanStage":3,"PilotName":"$npc_name_decorate:#name=Tim Longworth;","PilotName_Localised":"Tim Longworth","PilotRank":"Harmless","ShieldHealth":100.0,"HullHealth":100.0,"Faction":"Allied BD+08 1303 Bureau","LegalStatus":"Clean"}
{"timestamp":"2022-02-12T20:02:01Z","event":"ShipTargeted","TargetLocked":false}
{"timestamp":"2022-02-12T20:02:45Z","event":"Docked","StationName":"Wescott Terminal","StationType":"Outpost","StarSystem":"BD+08 1303","SystemAddress":1774715485,"MarketID":3227868416,"StationFaction":{"Name":"BD+08 1303 Jet Legal Industries"},"StationGovernment":"$government_Corporate;","StationGovernment_Localised":"Corporate","StationAllegiance":"Federation","StationServices":["dock","autodock","commodities","contacts","exploration","missions","repair","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Industrial;","StationEconomy_Localised":"Industrial","StationEconomies":[{"Name":"$economy_Industrial;","Name_Localised":"Industrial","Proportion":0.67},{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":0.33}],"DistFromStarLS":6466.914589}
{"timestamp":"2022-02-12T20:10:52Z","event":"MissionCompleted","Faction":"Social LHS 6103 Confederation","Name":"Mission_Delivery_Boom_name","MissionID":846168214,"Commodity":"$Aluminium_Name;","Commodity_Localised":"Aluminium","Count":147,"TargetFaction":"Silver Dynamic Limited","DestinationSystem":"BD+08 1303","DestinationStation":"Wescott Terminal","Reward":114751,"FactionEffects":[{"Faction":"Social LHS 6103 Confederation","Effects":[{"Effect":"$MISSIONUTIL_Interaction_Summary_EP_up;","Effect_Localised":"The economic status of $#MinorFaction; has improved in the $#System; system.","Trend":"UpGood"}],"Influence":[{"SystemAddress":9467315955081,"Trend":"UpGood","Influence":"+++++"}],"ReputationTrend":"UpGood","Reputation":"++"},{"Faction":"Silver Dynamic Limited","Effects":[{"Effect":"$MISSIONUTIL_Interaction_Summary_EP_up;","Effect_Localised":"The economic status of $#MinorFaction; has improved in the $#System; system.","Trend":"UpGood"}],"Influence":[{"SystemAddress":1774715485,"Trend":"UpGood","Influence":"++++"}],"ReputationTrend":"UpGood","Reputation":"++"}]}
{"timestamp":"2022-02-12T20:20:54Z","event":"FSDJump","StarSystem":"Wong Sher","SystemAddress":6680989405898,"StarPos":[16.46875,4.0625,-60.5],"SystemAllegiance":"Independent","SystemEconomy":"$economy_Refinery;","SystemEconomy_Localised":"Refinery","SystemSecondEconomy":"$economy_Extraction;","SystemSecondEconomy_Localised":"Extraction","SystemGovernment":"$government_Democracy;","SystemGovernment_Localised":"Democracy","SystemSecurity":"$SYSTEM_SECURITY_medium;","SystemSecurity_Localised":"Medium Security","Population":132659,"Body":"Wong Sher","BodyID":0,"BodyType":"Star","Powers":["Zachary Hudson"],"PowerplayState":"Exploited","JumpDist":11.085,"FuelUsed":0.304729,"FuelLevel":31.103661,"Factions":[{"Name":"Wong Sher Public Co","FactionState":"None","Government":"Corporate","Influence":0.076389,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Wong Sher Confederacy","FactionState":"None","Government":"Confederacy","Influence":0.047619,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Wong Sher Jet Ring","FactionState":"None","Government":"Anarchy","Influence":0.009921,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-5.94},{"Name":"Wong Sher Nobles","FactionState":"None","Government":"Feudal","Influence":0.049603,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Wong Sher Federal Incorporated","FactionState":"None","Government":"Corporate","Influence":0.043651,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Civitas Dei","FactionState":"Expansion","Government":"Dictatorship","Influence":0.089286,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"ActiveStates":[{"State":"Expansion"}]},{"Name":"Flotta Stellare","FactionState":"Boom","Government":"Democracy","Influence":0.683532,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-18.959999,"PendingStates":[{"State":"Expansion","Trend":0}],"ActiveStates":[{"State":"Boom"}]}],"SystemFaction":{"Name":"Flotta Stellare","FactionState":"Boom"}}
{"timestamp":"2022-02-12T20:23:49Z","event":"Docked","StationName":"J9F-G0M","StationType":"FleetCarrier","StarSystem":"Wong Sher","SystemAddress":6680989405898,"MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"DistFromStarLS":0.0}
{"timestamp":"2022-02-12T20:25:06Z","event":"Docked","StationName":"J9F-G0M","StationType":"FleetCarrier","StarSystem":"Wong Sher","SystemAddress":6680989405898,"MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"DistFromStarLS":0.0}
{"timestamp":"2022-02-12T20:40:59Z","event":"ShipTargeted","TargetLocked":true,"Ship":"asp","Ship_Localised":"Asp Explorer","ScanStage":0}
{"timestamp":"2022-02-12T20:40:59Z","event":"ShipTargeted","TargetLocked":true,"Ship":"ferdelance","Ship_Localised":"Fer-de-Lance","ScanStage":0}
{"timestamp":"2022-02-12T20:41:04Z","event":"ShipTargeted","TargetLocked":true,"Ship":"ferdelance","Ship_Localised":"Fer-de-Lance","ScanStage":1,"PilotName":"$npc_name_decorate:#name=Helders;","PilotName_Localised":"Helders","PilotRank":"Dangerous"}
{"timestamp":"2022-02-12T20:41:06Z","event":"ShipTargeted","TargetLocked":true,"Ship":"ferdelance","Ship_Localised":"Fer-de-Lance","ScanStage":2,"PilotName":"$npc_name_decorate:#name=Helders;","PilotName_Localised":"Helders","PilotRank":"Dangerous","ShieldHealth":100.0,"HullHealth":100.0}
{"timestamp":"2022-02-12T20:41:18Z","event":"ShipTargeted","TargetLocked":true,"Ship":"ferdelance","Ship_Localised":"Fer-de-Lance","ScanStage":3,"PilotName":"$npc_name_decorate:#name=Helders;","PilotName_Localised":"Helders","PilotRank":"Dangerous","ShieldHealth":78.305588,"HullHealth":100.0,"Faction":"Wong Sher Jet Ring","LegalStatus":"Wanted","Bounty":166260}
{"timestamp":"2022-02-12T20:41:34Z","event":"ShipTargeted","TargetLocked":true,"Ship":"anaconda","ScanStage":0}
{"timestamp":"2022-02-12T20:41:34Z","event":"ShipTargeted","TargetLocked":true,"Ship":"anaconda","ScanStage":1,"PilotName":"$npc_name_decorate:#name=Zuriel Z'ev;","PilotName_Localised":"Zuriel Z'ev","PilotRank":"Master"}
{"timestamp":"2022-02-12T20:41:37Z","event":"ShipTargeted","TargetLocked":true,"Ship":"anaconda","ScanStage":2,"PilotName":"$npc_name_decorate:#name=Zuriel Z'ev;","PilotName_Localised":"Zuriel Z'ev","PilotRank":"Master","ShieldHealth":68.543312,"HullHealth":100.0}
{"timestamp":"2022-02-12T20:41:42Z","event":"ShipTargeted","TargetLocked":true,"Ship":"anaconda","ScanStage":3,"PilotName":"$npc_name_decorate:#name=Zuriel Z'ev;","PilotName_Localised":"Zuriel Z'ev","PilotRank":"Master","ShieldHealth":28.554476,"HullHealth":100.0,"Faction":"Wong Sher Jet Ring","LegalStatus":"Wanted","Bounty":122639}
{"timestamp":"2022-02-12T20:42:14Z","event":"ShipTargeted","TargetLocked":false}
{"timestamp":"2022-02-12T20:42:17Z","event":"ShipTargeted","TargetLocked":true,"Ship":"ferdelance","Ship_Localised":"Fer-de-Lance","ScanStage":3,"PilotName":"$npc_name_decorate:#name=Helders;","PilotName_Localised":"Helders","PilotRank":"Dangerous","ShieldHealth":67.207306,"HullHealth":100.0,"Faction":"Wong Sher Jet Ring","LegalStatus":"Wanted","Bounty":166260}
{"timestamp":"2022-02-12T20:44:30Z","event":"ShipTargeted","TargetLocked":false}
{"timestamp":"2022-02-12T20:48:35Z","event":"Docked","StationName":"J9F-G0M","StationType":"FleetCarrier","StarSystem":"Wong Sher","SystemAddress":6680989405898,"MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"DistFromStarLS":0.0}
{"timestamp":"2022-02-12T20:49:33Z","event":"Docked","StationName":"J9F-G0M","StationType":"FleetCarrier","StarSystem":"Wong Sher","SystemAddress":6680989405898,"MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"DistFromStarLS":0.0}
{"timestamp":"2022-02-12T21:03:22Z","event":"Docked","StationName":"J9F-G0M","StationType":"FleetCarrier","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"DistFromStarLS":222516.223544}
{"timestamp":"2022-02-12T21:08:27Z","event":"ShipTargeted","TargetLocked":true,"Ship":"independant_trader","Ship_Localised":"Keelback","ScanStage":0}
{"timestamp":"2022-02-12T21:08:31Z","event":"ShipTargeted","TargetLocked":true,"Ship":"independant_trader","Ship_Localised":"Keelback","ScanStage":1,"PilotName":"$npc_name_decorate:#name=Finius Butterworth;","PilotName_Localised":"Finius Butterworth","PilotRank":"Harmless"}
{"timestamp":"2022-02-12T21:08:33Z","event":"ShipTargeted","TargetLocked":true,"Ship":"independant_trader","Ship_Localised":"Keelback","ScanStage":2,"PilotName":"$npc_name_decorate:#name=Finius Butterworth;","PilotName_Localised":"Finius Butterworth","PilotRank":"Harmless","ShieldHealth":100.0,"HullHealth":100.0}
{"timestamp":"2022-02-12T21:08:34Z","event":"ShipTargeted","TargetLocked":false}
{"timestamp":"2022-02-12T21:08:46Z","event":"Docked","StationName":"Wyeth Platform","StationType":"Outpost","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3228303360,"StationFaction":{"Name":"Flotta Stellare","FactionState":"Boom"},"StationGovernment":"$government_Democracy;","StationGovernment_Localised":"Democracy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","refuel","repair","tuning","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Refinery;","StationEconomy_Localised":"Refinery","StationEconomies":[{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":1.0}],"DistFromStarLS":222516.184822}
{"timestamp":"2022-02-12T21:09:30Z","event":"MissionCompleted","Faction":"Social LHS 6103 Confederation","Name":"Mission_Assassinate_name","MissionID":846188378,"TargetType":"$MissionUtil_FactionTag_PirateLord;","TargetType_Localised":"Known Pirate","TargetFaction":"Wong Sher Jet Ring","NewDestinationSystem":"Dewikum","DestinationSystem":"Wong Sher","NewDestinationStation":"Wyeth Platform","DestinationStation":"Zudov City","Target":"Helders","Reward":1172406,"FactionEffects":[{"Faction":"Social LHS 6103 Confederation","Effects":[{"Effect":"$MISSIONUTIL_Interaction_Summary_EP_up;","Effect_Localised":"The economic status of $#MinorFaction; has improved in the $#System; system.","Trend":"UpGood"}],"Influence":[{"SystemAddress":9467315955081,"Trend":"UpGood","Influence":"+++++"}],"ReputationTrend":"UpGood","Reputation":"++"},{"Faction":"","Effects":[{"Effect":"$MISSIONUTIL_Interaction_Summary_EP_down;","Effect_Localised":"The economic status of $#MinorFaction; has declined in the $#System; system.","Trend":"DownBad"}],"Influence":[{"SystemAddress":6680989405898,"Trend":"DownBad","Influence":"+"}],"ReputationTrend":"DownBad","Reputation":"+"}]}
{"timestamp":"2022-02-12T21:09:35Z","event":"MissionCompleted","Faction":"Social LHS 6103 Confederation","Name":"Chain_SalvageJustice_name","MissionID":846188327,"TargetType":"$MissionUtil_FactionTag_PirateLord;","TargetType_Localised":"Known Pirate","TargetFaction":"Wong Sher Jet Ring","NewDestinationSystem":"Dewikum","DestinationSystem":"Wong Sher","NewDestinationStation":"Wyeth Platform","DestinationStation":"Zudov City","Target":"Zuriel Z'ev","Reward":1371028,"FactionEffects":[{"Faction":"Social LHS 6103 Confederation","Effects":[{"Effect":"$MISSIONUTIL_Interaction_Summary_EP_up;","Effect_Localised":"The economic status of $#MinorFaction; has improved in the $#System; system.","Trend":"UpGood"}],"Influence":[{"SystemAddress":9467315955081,"Trend":"UpGood","Influence":"+++++"}],"ReputationTrend":"UpGood","Reputation":"++"},{"Faction":"","Effects":[{"Effect":"$MISSIONUTIL_Interaction_Summary_EP_down;","Effect_Localised":"The economic status of $#MinorFaction; has declined in the $#System; system.","Trend":"DownBad"}],"Influence":[{"SystemAddress":6680989405898,"Trend":"DownBad","Influence":"+"}],"ReputationTrend":"DownBad","Reputation":"+"}]}
{"timestamp":"2022-02-12T21:13:27Z","event":"MissionAccepted","Faction":"Social LHS 6103 Confederation","Name":"Mission_Delivery_Boom","LocalisedName":"Boom time delivery of 147 units of Titanium","Commodity":"$Titanium_Name;","Commodity_Localised":"Titanium","Count":147,"TargetFaction":"Flotta Stellare","DestinationSystem":"BD+08 1303","DestinationStation":"Chomsky Ring","Expiry":"2022-02-13T21:09:16Z","Wing":false,"Influence":"++","Reputation":"++","Reward":652891,"MissionID":846229992}
{"timestamp":"2022-02-12T21:15:43Z","event":"Docked","StationName":"J9F-G0M","StationType":"FleetCarrier","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"DistFromStarLS":222516.111284}
{"timestamp":"2022-02-12T21:18:43Z","event":"Docked","StationName":"Wyeth Platform","StationType":"Outpost","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3228303360,"StationFaction":{"Name":"Flotta Stellare","FactionState":"Boom"},"StationGovernment":"$government_Democracy;","StationGovernment_Localised":"Democracy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","refuel","repair","tuning","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Refinery;","StationEconomy_Localised":"Refinery","StationEconomies":[{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":1.0}],"DistFromStarLS":222516.094689}
{"timestamp":"2022-02-12T21:21:45Z","event":"MissionAccepted","Faction":"Susanoo Jet Fortune Corporation","Name":"Mission_AltruismCredits","LocalisedName":"Donate 1,000,000 Cr to the cause","Donation":"1000000","Expiry":"2022-02-13T00:24:24Z","Wing":false,"Influence":"++","Reputation":"++","MissionID":846233387}
{"timestamp":"2022-02-12T21:21:46Z","event":"MissionAccepted","Faction":"Susanoo Jet Fortune Corporation","Name":"Mission_AltruismCredits","LocalisedName":"Donate 300,000 Cr to the cause","Donation":"300000","Expiry":"2022-02-13T00:31:52Z","Wing":false,"Influence":"++","Reputation":"+","MissionID":846233396}
{"timestamp":"2022-02-12T21:21:48Z","event":"MissionCompleted","Faction":"Susanoo Jet Fortune Corporation","Name":"Mission_AltruismCredits_name","MissionID":846233387,"Donation":"1000000","Donated":1000000,"FactionEffects":[{"Faction":"Susanoo Jet Fortune Corporation","Effects":[{"Effect":"$MISSIONUTIL_Interaction_Summary_EP_up;","Effect_Localised":"The economic status of $#MinorFaction; has improved in the $#System; system.","Trend":"UpGood"}],"Influence":[{"SystemAddress":9467315955081,"Trend":"UpGood","Influence":"+++"}],"ReputationTrend":"UpGood","Reputation":"++"}]}
{"timestamp":"2022-02-12T21:21:50Z","event":"MissionCompleted","Faction":"Susanoo Jet Fortune Corporation","Name":"Mission_AltruismCredits_name","MissionID":846233396,"Donation":"300000","Donated":300000,"FactionEffects":[{"Faction":"Susanoo Jet Fortune Corporation","Effects":[{"Effect":"$MISSIONUTIL_Interaction_Summary_EP_up;","Effect_Localised":"The economic status of $#MinorFaction; has improved in the $#System; system.","Trend":"UpGood"}],"Influence":[{"SystemAddress":9467315955081,"Trend":"UpGood","Influence":"++"}],"ReputationTrend":"UpGood","Reputation":"+"}]}
{"timestamp":"2022-02-12T21:22:01Z","event":"MissionAccepted","Faction":"Flotta Stellare","Name":"Mission_AltruismCredits","LocalisedName":"Donate 300,000 Cr to the cause","Donation":"300000","Expiry":"2022-02-13T00:46:56Z","Wing":false,"Influence":"++","Reputation":"+","MissionID":846233486}
{"timestamp":"2022-02-12T21:22:03Z","event":"MissionAccepted","Faction":"Flotta Stellare","Name":"Mission_AltruismCredits","LocalisedName":"Donate 750,000 Cr to the cause","Donation":"750000","Expiry":"2022-02-13T00:29:34Z","Wing":false,"Influence":"++","Reputation":"++","MissionID":846233498}
{"timestamp":"2022-02-12T21:25:08Z","event":"Docked","StationName":"J9F-G0M","StationType":"FleetCarrier","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"DistFromStarLS":222516.025813}
{"timestamp":"2022-02-12T21:28:07Z","event":"Docked","StationName":"Wyeth Platform","StationType":"Outpost","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3228303360,"StationFaction":{"Name":"Flotta Stellare","FactionState":"Boom"},"StationGovernment":"$government_Democracy;","StationGovernment_Localised":"Democracy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","refuel","repair","tuning","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Refinery;","StationEconomy_Localised":"Refinery","StationEconomies":[{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":1.0}],"DistFromStarLS":222516.009596}
{"timestamp":"2022-02-12T21:30:18Z","event":"Location","Docked":true,"StationName":"Wyeth Platform","StationType":"Outpost","MarketID":3228303360,"StationFaction":{"Name":"Flotta Stellare","FactionState":"Boom"},"StationGovernment":"$government_Democracy;","StationGovernment_Localised":"Democracy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","refuel","repair","tuning","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Refinery;","StationEconomy_Localised":"Refinery","StationEconomies":[{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":1.0}],"StarSystem":"Dewikum","SystemAddress":9467315955081,"StarPos":[19.375,-0.28125,-68.9375],"SystemAllegiance":"Independent","SystemEconomy":"$economy_Refinery;","SystemEconomy_Localised":"Refinery","SystemSecondEconomy":"$economy_Extraction;","SystemSecondEconomy_Localised":"Extraction","SystemGovernment":"$government_Democracy;","SystemGovernment_Localised":"Democracy","SystemSecurity":"$SYSTEM_SECURITY_low;","SystemSecurity_Localised":"Low Security","Population":83688,"Body":"Wyeth Platform","BodyID":48,"BodyType":"Station","Powers":["Zachary Hudson"],"PowerplayState":"Exploited","Factions":[{"Name":"LHS 1857 Jet Galactic Systems","FactionState":"War","Government":"Corporate","Influence":0.112983,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"ActiveStates":[{"State":"War"}]},{"Name":"Social LHS 6103 Confederation","FactionState":"Boom","Government":"Confederacy","Influence":0.194252,"Allegiance":"Independent","Happiness":"","MyReputation":86.220001,"ActiveStates":[{"State":"Boom"}]},{"Name":"Susanoo Jet Fortune Corporation","FactionState":"None","Government":"Corporate","Influence":0.068385,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":10.2},{"Name":"Dewikum League","FactionState":"War","Government":"Confederacy","Influence":0.112983,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":28.57,"ActiveStates":[{"State":"War"}]},{"Name":"Dewikum Blue Ring","FactionState":"Bust","Government":"Anarchy","Influence":0.013875,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"RecoveringStates":[{"State":"Outbreak","Trend":0}],"ActiveStates":[{"State":"Bust"}]},{"Name":"Silver Dynamic Limited","FactionState":"None","Government":"Corporate","Influence":0.060456,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":8.91},{"Name":"Flotta Stellare","FactionState":"Boom","Government":"Democracy","Influence":0.437066,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-18.959999,"PendingStates":[{"State":"Expansion","Trend":0}]}],"SystemFaction":{"Name":"Flotta Stellare","FactionState":"Boom"},"Conflicts":[{"WarType":"war","Status":"active","Faction1":{"Name":"LHS 1857 Jet Galactic Systems","Stake":"Barnett Dredging Complex","WonDays":0},"Faction2":{"Name":"Dewikum League","Stake":"Singh Nutrition Site","WonDays":0}}]}
{"timestamp":"2022-02-12T21:30:19Z","event":"Docked","StationName":"Wyeth Platform","StationType":"Outpost","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3228303360,"StationFaction":{"Name":"Flotta Stellare","FactionState":"Boom"},"StationGovernment":"$government_Democracy;","StationGovernment_Localised":"Democracy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","refuel","repair","tuning","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Refinery;","StationEconomy_Localised":"Refinery","StationEconomies":[{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":1.0}],"DistFromStarLS":222515.989632}
{"timestamp":"2022-02-12T21:33:06Z","event":"Docked","StationName":"J9F-G0M","StationType":"FleetCarrier","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"DistFromStarLS":222515.953689}
{"timestamp":"2022-02-12T21:35:46Z","event":"Docked","StationName":"Wyeth Platform","StationType":"Outpost","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3228303360,"StationFaction":{"Name":"Flotta Stellare","FactionState":"Boom"},"StationGovernment":"$government_Democracy;","StationGovernment_Localised":"Democracy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","refuel","repair","tuning","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Refinery;","StationEconomy_Localised":"Refinery","StationEconomies":[{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":1.0}],"DistFromStarLS":222515.940341}
{"timestamp":"2022-02-12T21:38:29Z","event":"Docked","StationName":"J9F-G0M","StationType":"FleetCarrier","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"DistFromStarLS":222515.904959}
{"timestamp":"2022-02-12T21:40:45Z","event":"Docked","StationName":"Wyeth Platform","StationType":"Outpost","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3228303360,"StationFaction":{"Name":"Flotta Stellare","FactionState":"Boom"},"StationGovernment":"$government_Democracy;","StationGovernment_Localised":"Democracy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","refuel","repair","tuning","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Refinery;","StationEconomy_Localised":"Refinery","StationEconomies":[{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":1.0}],"DistFromStarLS":222515.895224}
{"timestamp":"2022-02-12T21:44:16Z","event":"Docked","StationName":"J9F-G0M","StationType":"FleetCarrier","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"DistFromStarLS":222515.852821}
{"timestamp":"2022-02-12T21:47:02Z","event":"Docked","StationName":"Wyeth Platform","StationType":"Outpost","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3228303360,"StationFaction":{"Name":"Flotta Stellare","FactionState":"Boom"},"StationGovernment":"$government_Democracy;","StationGovernment_Localised":"Democracy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","refuel","repair","tuning","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Refinery;","StationEconomy_Localised":"Refinery","StationEconomies":[{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":1.0}],"DistFromStarLS":222515.838361}
{"timestamp":"2022-02-12T21:49:35Z","event":"Docked","StationName":"J9F-G0M","StationType":"FleetCarrier","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"DistFromStarLS":222515.804817}
{"timestamp":"2022-02-12T21:52:09Z","event":"Docked","StationName":"Wyeth Platform","StationType":"Outpost","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3228303360,"StationFaction":{"Name":"Flotta Stellare","FactionState":"Boom"},"StationGovernment":"$government_Democracy;","StationGovernment_Localised":"Democracy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","refuel","repair","tuning","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Refinery;","StationEconomy_Localised":"Refinery","StationEconomies":[{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":1.0}],"DistFromStarLS":222515.791989}
{"timestamp":"2022-02-12T21:53:05Z","event":"MissionAccepted","Faction":"Social LHS 6103 Confederation","Name":"Mission_Delivery_Boom","LocalisedName":"Boom time delivery of 147 units of Hydrogen Fuel","Commodity":"$HydrogenFuel_Name;","Commodity_Localised":"Hydrogen Fuel","Count":147,"TargetFaction":"Flotta Stellare","DestinationSystem":"Cosi","DestinationStation":"Arrhenius Hub","Expiry":"2022-02-13T21:41:05Z","Wing":false,"Influence":"++","Reputation":"++","Reward":677020,"MissionID":846245533}
{"timestamp":"2022-02-13T10:03:47Z","event":"Location","Docked":true,"StationName":"Wyeth Platform","StationType":"Outpost","MarketID":3228303360,"StationFaction":{"Name":"Flotta Stellare"},"StationGovernment":"$government_Democracy;","StationGovernment_Localised":"Democracy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","refuel","repair","tuning","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Refinery;","StationEconomy_Localised":"Refinery","StationEconomies":[{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":1.0}],"StarSystem":"Dewikum","SystemAddress":9467315955081,"StarPos":[19.375,-0.28125,-68.9375],"SystemAllegiance":"Independent","SystemEconomy":"$economy_Refinery;","SystemEconomy_Localised":"Refinery","SystemSecondEconomy":"$economy_Extraction;","SystemSecondEconomy_Localised":"Extraction","SystemGovernment":"$government_Democracy;","SystemGovernment_Localised":"Democracy","SystemSecurity":"$SYSTEM_SECURITY_low;","SystemSecurity_Localised":"Low Security","Population":83688,"Body":"Wyeth Platform","BodyID":48,"BodyType":"Station","Powers":["Zachary Hudson"],"PowerplayState":"Exploited","Factions":[{"Name":"LHS 1857 Jet Galactic Systems","FactionState":"War","Government":"Corporate","Influence":0.112983,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"ActiveStates":[{"State":"War"}]},{"Name":"Social LHS 6103 Confederation","FactionState":"Boom","Government":"Confederacy","Influence":0.194252,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":86.220001,"ActiveStates":[{"State":"Boom"}]},{"Name":"Susanoo Jet Fortune Corporation","FactionState":"None","Government":"Corporate","Influence":0.068385,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":10.2},{"Name":"Dewikum League","FactionState":"War","Government":"Confederacy","Influence":0.112983,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":28.57,"ActiveStates":[{"State":"War"}]},{"Name":"Dewikum Blue Ring","FactionState":"Bust","Government":"Anarchy","Influence":0.013875,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"RecoveringStates":[{"State":"Outbreak","Trend":0}],"ActiveStates":[{"State":"Bust"}]},{"Name":"Silver Dynamic Limited","FactionState":"None","Government":"Corporate","Influence":0.060456,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":8.91},{"Name":"Flotta Stellare","FactionState":"None","Government":"Democracy","Influence":0.437066,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-18.959999,"PendingStates":[{"State":"Expansion","Trend":0}]}],"SystemFaction":{"Name":"Flotta Stellare"},"Conflicts":[{"WarType":"war","Status":"active","Faction1":{"Name":"LHS 1857 Jet Galactic Systems","Stake":"Barnett Dredging Complex","WonDays":0},"Faction2":{"Name":"Dewikum League","Stake":"Singh Nutrition Site","WonDays":0}}]}
{"timestamp":"2022-02-13T10:03:48Z","event":"Docked","StationName":"Wyeth Platform","StationType":"Outpost","StarSystem":"Dewikum","SystemAddress":9467315955081,"MarketID":3228303360,"StationFaction":{"Name":"Flotta Stellare"},"StationGovernment":"$government_Democracy;","StationGovernment_Localised":"Democracy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","refuel","repair","tuning","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Refinery;","StationEconomy_Localised":"Refinery","StationEconomies":[{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":1.0}],"DistFromStarLS":222509.791427}
{"timestamp":"2022-02-13T10:05:13Z","event":"MissionFailed","Name":"Mission_AltruismCredits_name","MissionID":846233498}
{"timestamp":"2022-02-13T10:05:15Z","event":"MissionFailed","Name":"Mission_AltruismCredits_name","MissionID":846233486}
{"timestamp":"2022-02-13T10:07:59Z","event":"FSDJump","StarSystem":"BD+08 1303","SystemAddress":1774715485,"StarPos":[25.53125,-1.875,-62.84375],"SystemAllegiance":"Independent","SystemEconomy":"$economy_Industrial;","SystemEconomy_Localised":"Industrial","SystemSecondEconomy":"$economy_Refinery;","SystemSecondEconomy_Localised":"Refinery","SystemGovernment":"$government_Democracy;","SystemGovernment_Localised":"Democracy","SystemSecurity":"$SYSTEM_SECURITY_high;","SystemSecurity_Localised":"High Security","Population":20853922,"Body":"BD+08 1303 A","BodyID":1,"BodyType":"Star","JumpDist":8.808,"FuelUsed":0.52764,"FuelLevel":31.472361,"Factions":[{"Name":"Green Party of BD+08 1303","FactionState":"Boom","Government":"Democracy","Influence":0.093186,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"ActiveStates":[{"State":"Boom"}]},{"Name":"Allied BD+08 1303 Bureau","FactionState":"None","Government":"Dictatorship","Influence":0.059118,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"BD+08 1303 Jet Legal Industries","FactionState":"None","Government":"Corporate","Influence":0.142285,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Silver Dynamic Limited","FactionState":"None","Government":"Corporate","Influence":0.078156,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":8.91,"RecoveringStates":[{"State":"PublicHoliday","Trend":0}]},{"Name":"BD+08 1303 Drug Empire","FactionState":"Bust","Government":"Anarchy","Influence":0.01002,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-17.16,"ActiveStates":[{"State":"Bust"}]},{"Name":"United BD+08 1303 First","FactionState":"None","Government":"Dictatorship","Influence":0.074148,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Flotta Stellare","FactionState":"None","Government":"Democracy","Influence":0.543086,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-25.360001,"PendingStates":[{"State":"Expansion","Trend":0}]}],"SystemFaction":{"Name":"Flotta Stellare"}}
{"timestamp":"2022-02-13T10:14:54Z","event":"Docked","StationName":"Chomsky Ring","StationType":"Coriolis","StarSystem":"BD+08 1303","SystemAddress":1774715485,"MarketID":3227868160,"StationFaction":{"Name":"Flotta Stellare"},"StationGovernment":"$government_Democracy;","StationGovernment_Localised":"Democracy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","shipyard","tuning","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","shop","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Industrial;","StationEconomy_Localised":"Industrial","StationEconomies":[{"Name":"$economy_Industrial;","Name_Localised":"Industrial","Proportion":0.8},{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":0.2}],"DistFromStarLS":5034.539377}
{"timestamp":"2022-02-13T10:16:08Z","event":"MissionCompleted","Faction":"Social LHS 6103 Confederation","Name":"Mission_Delivery_Boom_name","MissionID":846229992,"Commodity":"$Titanium_Name;","Commodity_Localised":"Titanium","Count":147,"TargetFaction":"Flotta Stellare","DestinationSystem":"BD+08 1303","DestinationStation":"Chomsky Ring","Reward":250613,"FactionEffects":[{"Faction":"Social LHS 6103 Confederation","Effects":[{"Effect":"$MISSIONUTIL_Interaction_Summary_EP_up;","Effect_Localised":"The economic status of $#MinorFaction; has improved in the $#System; system.","Trend":"UpGood"}],"Influence":[{"SystemAddress":9467315955081,"Trend":"UpGood","Influence":"+++++"}],"ReputationTrend":"UpGood","Reputation":"++"},{"Faction":"Flotta Stellare","Effects":[{"Effect":"$MISSIONUTIL_Interaction_Summary_EP_up;","Effect_Localised":"The economic status of $#MinorFaction; has improved in the $#System; system.","Trend":"UpGood"}],"Influence":[{"SystemAddress":1774715485,"Trend":"UpGood","Influence":"+++"}],"ReputationTrend":"UpGood","Reputation":"++"}]}
{"timestamp":"2022-02-13T10:18:09Z","event":"FSDJump","StarSystem":"Cosi","SystemAddress":6406111498946,"StarPos":[24.75,-14.6875,-70.75],"SystemAllegiance":"Independent","SystemEconomy":"$economy_Agri;","SystemEconomy_Localised":"Agriculture","SystemSecondEconomy":"$economy_Refinery;","SystemSecondEconomy_Localised":"Refinery","SystemGovernment":"$government_Democracy;","SystemGovernment_Localised":"Democracy","SystemSecurity":"$SYSTEM_SECURITY_high;","SystemSecurity_Localised":"High Security","Population":4405808790,"Body":"Cosi A","BodyID":1,"BodyType":"Star","JumpDist":15.076,"FuelUsed":1.203176,"FuelLevel":30.796824,"Factions":[{"Name":"Revolutionary Party of Cosi","FactionState":"CivilWar","Government":"Democracy","Influence":0.142292,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"ActiveStates":[{"State":"CivilWar"}]},{"Name":"Cosi Holdings","FactionState":"None","Government":"Corporate","Influence":0.036561,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Cosi Flag","FactionState":"None","Government":"Dictatorship","Influence":0.018775,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Cosi Silver Raiders","FactionState":"CivilWar","Government":"Anarchy","Influence":0.142292,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"ActiveStates":[{"State":"CivilWar"}]},{"Name":"Cosi PLC","FactionState":"None","Government":"Corporate","Influence":0.048419,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Star Tigers","FactionState":"None","Government":"Corporate","Influence":0.063241,"Allegiance":"Federation","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"RecoveringStates":[{"State":"PublicHoliday","Trend":0}]},{"Name":"Flotta Stellare","FactionState":"None","Government":"Democracy","Influence":0.548419,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-19.42,"PendingStates":[{"State":"Expansion","Trend":0}],"RecoveringStates":[{"State":"InfrastructureFailure","Trend":0}]}],"SystemFaction":{"Name":"Flotta Stellare"},"Conflicts":[{"WarType":"civilwar","Status":"active","Faction1":{"Name":"Revolutionary Party of Cosi","Stake":"Solovyov Orbital","WonDays":3},"Faction2":{"Name":"Cosi Silver Raiders","Stake":"Obama Concourse","WonDays":1}}]}
{"timestamp":"2022-02-13T10:23:35Z","event":"ShipTargeted","TargetLocked":true,"Ship":"viper","Ship_Localised":"Viper Mk III","ScanStage":1,"PilotName":"$ShipName_Police_Independent;","PilotName_Localised":"System Authority Vessel","PilotRank":"Competent"}
{"timestamp":"2022-02-13T10:23:35Z","event":"ShipTargeted","TargetLocked":true,"Ship":"type9","Ship_Localised":"Type-9 Heavy","ScanStage":0}
{"timestamp":"2022-02-13T10:23:36Z","event":"ShipTargeted","TargetLocked":true,"Ship":"type9","Ship_Localised":"Type-9 Heavy","ScanStage":1,"PilotName":"$npc_name_decorate:#name=Peter Lux;","PilotName_Localised":"Peter Lux","PilotRank":"Novice"}
{"timestamp":"2022-02-13T10:23:38Z","event":"ShipTargeted","TargetLocked":true,"Ship":"type9","Ship_Localised":"Type-9 Heavy","ScanStage":2,"PilotName":"$npc_name_decorate:#name=Peter Lux;","PilotName_Localised":"Peter Lux","PilotRank":"Novice","ShieldHealth":94.356415,"HullHealth":100.0}
{"timestamp":"2022-02-13T10:23:40Z","event":"ShipTargeted","TargetLocked":true,"Ship":"type9","Ship_Localised":"Type-9 Heavy","ScanStage":3,"PilotName":"$npc_name_decorate:#name=Peter Lux;","PilotName_Localised":"Peter Lux","PilotRank":"Novice","ShieldHealth":96.783104,"HullHealth":100.0,"Faction":"Flotta Stellare","LegalStatus":"Clean"}
{"timestamp":"2022-02-13T10:24:05Z","event":"Docked","StationName":"Arrhenius Hub","StationType":"Orbis","StarSystem":"Cosi","SystemAddress":6406111498946,"MarketID":3228247808,"StationFaction":{"Name":"Flotta Stellare"},"StationGovernment":"$government_Democracy;","StationGovernment_Localised":"Democracy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","shipyard","tuning","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","shop","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Agri;","StationEconomy_Localised":"Agriculture","StationEconomies":[{"Name":"$economy_Agri;","Name_Localised":"Agriculture","Proportion":1.0}],"DistFromStarLS":277.189393}
{"timestamp":"2022-02-13T10:24:34Z","event":"MissionCompleted","Faction":"Social LHS 6103 Confederation","Name":"Mission_Delivery_Boom_name","MissionID":846245533,"Commodity":"$HydrogenFuel_Name;","Commodity_Localised":"Hydrogen Fuel","Count":147,"TargetFaction":"Flotta Stellare","DestinationSystem":"Cosi","DestinationStation":"Arrhenius Hub","Reward":81097,"FactionEffects":[{"Faction":"Social LHS 6103 Confederation","Effects":[{"Effect":"$MISSIONUTIL_Interaction_Summary_EP_up;","Effect_Localised":"The economic status of $#MinorFaction; has improved in the $#System; system.","Trend":"UpGood"}],"Influence":[{"SystemAddress":9467315955081,"Trend":"UpGood","Influence":"++++"}],"ReputationTrend":"UpGood","Reputation":"++"},{"Faction":"Flotta Stellare","Effects":[{"Effect":"$MISSIONUTIL_Interaction_Summary_EP_up;","Effect_Localised":"The economic status of $#MinorFaction; has improved in the $#System; system.","Trend":"UpGood"}],"Influence":[{"SystemAddress":6406111498946,"Trend":"UpGood","Influence":"++"}],"ReputationTrend":"UpGood","Reputation":"++"}]}
{"timestamp":"2022-02-13T10:25:48Z","event":"ShipTargeted","TargetLocked":false}
{"timestamp":"2022-02-13T10:31:20Z","event":"Docked","StationName":"J9F-G0M","StationType":"FleetCarrier","StarSystem":"Cosi","SystemAddress":6406111498946,"MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"DistFromStarLS":0.0}
{"timestamp":"2022-02-13T10:33:37Z","event":"Docked","StationName":"J9F-G0M","StationType":"FleetCarrier","StarSystem":"Cosi","SystemAddress":6406111498946,"MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"DistFromStarLS":0.0}
{"timestamp":"2022-02-13T10:49:22Z","event":"Docked","StationName":"J9F-G0M","StationType":"FleetCarrier","StarSystem":"Paresa","SystemAddress":2832765653722,"MarketID":3707502336,"StationFaction":{"Name":"FleetCarrier"},"StationGovernment":"$government_Carrier;","StationGovernment_Localised":"Private Ownership ","StationServices":["dock","autodock","commodities","contacts","crewlounge","rearm","refuel","repair","engineer","flightcontroller","stationoperations","stationMenu","carriermanagement","carrierfuel"],"StationEconomy":"$economy_Carrier;","StationEconomy_Localised":"Private Enterprise","StationEconomies":[{"Name":"$economy_Carrier;","Name_Localised":"Private Enterprise","Proportion":1.0}],"DistFromStarLS":260.945541}
{"timestamp":"2022-02-13T10:51:41Z","event":"Docked","StationName":"Dyson City","StationType":"Coriolis","StarSystem":"Paresa","SystemAddress":2832765653722,"MarketID":3222169600,"StationFaction":{"Name":"Nova Paresa"},"StationGovernment":"$government_Patronage;","StationGovernment_Localised":"Patronage","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","shipyard","tuning","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","shop","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Agri;","StationEconomy_Localised":"Agriculture","StationEconomies":[{"Name":"$economy_Agri;","Name_Localised":"Agriculture","Proportion":1.0}],"DistFromStarLS":260.87121}
{"timestamp":"2022-02-13T10:52:28Z","event":"MissionAccepted","Faction":"Nova Paresa","Name":"Mission_Assassinate","LocalisedName":"Assassinate Known Pirate: Zac Barnard","TargetType":"$MissionUtil_FactionTag_PirateLord;","TargetType_Localised":"Known Pirate","TargetFaction":"Madngela Blue Rats","DestinationSystem":"Madngela","DestinationStation":"Merril Terminal","Target":"Zac Barnard","Expiry":"2022-02-14T10:52:01Z","Wing":true,"Influence":"++","Reputation":"++","Reward":4510749,"MissionID":846447335}
{"timestamp":"2022-02-13T10:55:10Z","event":"FSDJump","StarSystem":"No Cha","SystemAddress":671759148465,"StarPos":[72.15625,-191.625,23.59375],"SystemAllegiance":"Independent","SystemEconomy":"$economy_Extraction;","SystemEconomy_Localised":"Extraction","SystemSecondEconomy":"$economy_Industrial;","SystemSecondEconomy_Localised":"Industrial","SystemGovernment":"$government_Anarchy;","SystemGovernment_Localised":"Anarchy","SystemSecurity":"$GAlAXY_MAP_INFO_state_anarchy;","SystemSecurity_Localised":"Anarchy","Population":6649195,"Body":"No Cha","BodyID":0,"BodyType":"Star","JumpDist":16.279,"FuelUsed":1.665399,"FuelLevel":14.3346,"Factions":[{"Name":"United No Cha Justice Party","FactionState":"CivilWar","Government":"Dictatorship","Influence":0.089,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-5.19,"ActiveStates":[{"State":"CivilWar"}]},{"Name":"No Cha Limited","FactionState":"None","Government":"Corporate","Influence":0.033,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-75.0},{"Name":"No Cha Party","FactionState":"None","Government":"Dictatorship","Influence":0.037,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-71.699997},{"Name":"Temurt Drug Empire","FactionState":"None","Government":"Anarchy","Influence":0.408,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-73.349998,"RecoveringStates":[{"State":"Terrorism","Trend":0}]},{"Name":"Crew of No Cha","FactionState":"None","Government":"Anarchy","Influence":0.043,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-2.97},{"Name":"Social No Cha Free","FactionState":"CivilWar","Government":"Democracy","Influence":0.089,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand3;","Happiness_Localised":"Discontented","MyReputation":0.0,"ActiveStates":[{"State":"Terrorism"},{"State":"CivilWar"}]},{"Name":"Distant World Co.","FactionState":"Boom","Government":"Corporate","Influence":0.301,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-30.0,"ActiveStates":[{"State":"Boom"}]}],"SystemFaction":{"Name":"Temurt Drug Empire"},"Conflicts":[{"WarType":"civilwar","Status":"active","Faction1":{"Name":"United No Cha Justice Party","Stake":"Plumb Botanical Farm","WonDays":0},"Faction2":{"Name":"Social No Cha Free","Stake":"Roe Orbital","WonDays":0}}]}
{"timestamp":"2022-02-13T11:00:22Z","event":"FSDJump","StarSystem":"Ogoni","SystemAddress":2557887746770,"StarPos":[63.0,-193.75,14.0],"SystemAllegiance":"Empire","SystemEconomy":"$economy_HighTech;","SystemEconomy_Localised":"High Tech","SystemSecondEconomy":"$economy_Extraction;","SystemSecondEconomy_Localised":"Extraction","SystemGovernment":"$government_Patronage;","SystemGovernment_Localised":"Patronage","SystemSecurity":"$SYSTEM_SECURITY_low;","SystemSecurity_Localised":"Low Security","Population":72360,"Body":"Ogoni","BodyID":0,"BodyType":"Star","JumpDist":13.431,"FuelUsed":1.034921,"FuelLevel":13.52183,"Factions":[{"Name":"Jet Universal Partners","FactionState":"None","Government":"Corporate","Influence":0.166833,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":76.239998},{"Name":"Peraesii Empire Consulate","FactionState":"Expansion","Government":"Patronage","Influence":0.084915,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":70.300003,"ActiveStates":[{"State":"Expansion"}]},{"Name":"Marquis du Ogoni","FactionState":"None","Government":"Feudal","Influence":0.258741,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-35.0},{"Name":"Ogoni Dragons","FactionState":"Bust","Government":"Anarchy","Influence":0.00999,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-69.959999,"RecoveringStates":[{"State":"Outbreak","Trend":0}],"ActiveStates":[{"State":"Bust"}]},{"Name":"Nova Paresa","FactionState":"None","Government":"Patronage","Influence":0.47952,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","SquadronFaction":true,"MyReputation":100.0}],"SystemFaction":{"Name":"Nova Paresa"}}

View File

@@ -0,0 +1,83 @@
{"timestamp":"2022-02-17T16:52:32Z","event":"Location","Docked":true,"StationName":"Henry O'Hare's Hangar","StationType":"Coriolis","MarketID":128043008,"StationFaction":{"Name":"Summerland Patron's Party","FactionState":"War"},"StationGovernment":"$government_Patronage;","StationGovernment_Localised":"Patronage","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","shipyard","tuning","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","shop","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Service;","StationEconomy_Localised":"Service","StationEconomies":[{"Name":"$economy_Service;","Name_Localised":"Service","Proportion":1.0}],"StarSystem":"Summerland","SystemAddress":972566792555,"StarPos":[28.9375,-121.09375,3.53125],"SystemAllegiance":"Empire","SystemEconomy":"$economy_Service;","SystemEconomy_Localised":"Service","SystemSecondEconomy":"$economy_Refinery;","SystemSecondEconomy_Localised":"Refinery","SystemGovernment":"$government_Patronage;","SystemGovernment_Localised":"Patronage","SystemSecurity":"$SYSTEM_SECURITY_medium;","SystemSecurity_Localised":"Medium Security","Population":25079107,"Body":"Henry O'Hare's Hangar","BodyID":61,"BodyType":"Station","Factions":[{"Name":"Summerland Patron's Party","FactionState":"War","Government":"Patronage","Influence":0.589,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":17.5,"RecoveringStates":[{"State":"PublicHoliday","Trend":0}],"ActiveStates":[{"State":"Boom"},{"State":"War"}]},{"Name":"Summerland Crimson Allied Int","FactionState":"CivilWar","Government":"Corporate","Influence":0.171,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-7.5,"RecoveringStates":[{"State":"Boom","Trend":0}],"ActiveStates":[{"State":"CivilWar"}]},{"Name":"Raiders of Summerland","FactionState":"None","Government":"Anarchy","Influence":0.031,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Summerland Patron's Principles","FactionState":"CivilWar","Government":"Patronage","Influence":0.171,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand1;","Happiness_Localised":"Elated","MyReputation":17.5,"ActiveStates":[{"State":"CivilLiberty"},{"State":"Boom"},{"State":"PublicHoliday"},{"State":"CivilWar"}]},{"Name":"Darkwater Inc","FactionState":"War","Government":"Anarchy","Influence":0.038,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-100.0,"ActiveStates":[{"State":"War"}]}],"SystemFaction":{"Name":"Summerland Patron's Party","FactionState":"War"},"Conflicts":[{"WarType":"war","Status":"active","Faction1":{"Name":"Summerland Patron's Party","Stake":"","WonDays":0},"Faction2":{"Name":"Darkwater Inc","Stake":"","WonDays":0}},{"WarType":"civilwar","Status":"active","Faction1":{"Name":"Summerland Crimson Allied Int","Stake":"Vercors Arena","WonDays":2},"Faction2":{"Name":"Summerland Patron's Principles","Stake":"Spartacus Fortification Division","WonDays":1}}]}
{"timestamp":"2022-02-17T21:08:38Z","event":"FSDJump","StarSystem":"ICZ PC-V b2-2","SystemAddress":5070342596017,"StarPos":[99.84375,-180.96875,21.40625],"SystemAllegiance":"","SystemEconomy":"$economy_None;","SystemEconomy_Localised":"None","SystemSecondEconomy":"$economy_None;","SystemSecondEconomy_Localised":"None","SystemGovernment":"$government_None;","SystemGovernment_Localised":"None","SystemSecurity":"$GAlAXY_MAP_INFO_state_anarchy;","SystemSecurity_Localised":"Anarchy","Population":0,"Body":"ICZ PC-V b2-2 A","BodyID":1,"BodyType":"Star","JumpDist":18.521,"FuelUsed":3.535622,"FuelLevel":28.464378}
{"timestamp":"2022-02-17T21:09:22Z","event":"FSDJump","StarSystem":"Kazahua","SystemAddress":2871050905001,"StarPos":[93.28125,-180.25,14.6875],"SystemAllegiance":"Empire","SystemEconomy":"$economy_Industrial;","SystemEconomy_Localised":"Industrial","SystemSecondEconomy":"$economy_Colony;","SystemSecondEconomy_Localised":"Colony","SystemGovernment":"$government_Patronage;","SystemGovernment_Localised":"Patronage","SystemSecurity":"$SYSTEM_SECURITY_low;","SystemSecurity_Localised":"Low Security","Population":17949,"Body":"Kazahua","BodyID":0,"BodyType":"Star","JumpDist":9.419,"FuelUsed":0.665858,"FuelLevel":27.798521,"Factions":[{"Name":"Peraesii Empire Consulate","FactionState":"None","Government":"Patronage","Influence":0.082578,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":100.0,"PendingStates":[{"State":"Expansion","Trend":0}]},{"Name":"Kazahua Co","FactionState":"None","Government":"Corporate","Influence":0.037261,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Kazahua Crimson Ring","FactionState":"None","Government":"Anarchy","Influence":0.060423,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"HIP 10611 Shared","FactionState":"None","Government":"Cooperative","Influence":0.23565,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-3.3},{"Name":"Traditional Yao Tzu Liberty Party","FactionState":"None","Government":"Dictatorship","Influence":0.134945,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-11.55},{"Name":"Sapii allied","FactionState":"None","Government":"Cooperative","Influence":0.121853,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Nova Paresa","FactionState":"None","Government":"Patronage","Influence":0.327291,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","SquadronFaction":true,"MyReputation":100.0}],"SystemFaction":{"Name":"Nova Paresa"}}
{"timestamp":"2022-02-17T21:12:25Z","event":"Docked","StationName":"Rabinowitz Colony","StationType":"Outpost","StarSystem":"Kazahua","SystemAddress":2871050905001,"MarketID":3223011840,"StationFaction":{"Name":"Nova Paresa"},"StationGovernment":"$government_Patronage;","StationGovernment_Localised":"Patronage","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Extraction;","StationEconomy_Localised":"Extraction","StationEconomies":[{"Name":"$economy_Extraction;","Name_Localised":"Extraction","Proportion":1.0}],"DistFromStarLS":336.711693}
{"timestamp":"2022-02-17T21:13:25Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_Collect","LocalisedName":"Source and return 45 units of Performance Enhancers","Commodity":"$PerformanceEnhancers_Name;","Commodity_Localised":"Performance Enhancers","Count":45,"DestinationSystem":"Kazahua","DestinationStation":"Rabinowitz Colony","Expiry":"2022-02-18T21:12:35Z","Wing":false,"Influence":"++","Reputation":"++","Reward":737283,"MissionID":847892168}
{"timestamp":"2022-02-17T21:14:00Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_Collect","LocalisedName":"Source and return 27 units of Synthetic Meat","Commodity":"$SyntheticMeat_Name;","Commodity_Localised":"Synthetic Meat","Count":27,"DestinationSystem":"Kazahua","DestinationStation":"Rabinowitz Colony","Expiry":"2022-02-18T21:12:35Z","Wing":false,"Influence":"+","Reputation":"+","Reward":91209,"MissionID":847892283}
{"timestamp":"2022-02-17T21:15:20Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_Delivery","LocalisedName":"Deliver 36 units of Uraninite","Commodity":"$Uraninite_Name;","Commodity_Localised":"Uraninite","Count":36,"TargetFaction":"Decimus Imperium Lex","DestinationSystem":"Kelish","DestinationStation":"Delaunay Orbital","Expiry":"2022-02-18T21:12:34Z","Wing":false,"Influence":"++","Reputation":"++","Reward":223299,"MissionID":847892616}
{"timestamp":"2022-02-17T21:16:44Z","event":"FSDJump","StarSystem":"Kelish","SystemAddress":2871319405993,"StarPos":[95.09375,-164.375,13.34375],"SystemAllegiance":"Independent","SystemEconomy":"$economy_HighTech;","SystemEconomy_Localised":"High Tech","SystemSecondEconomy":"$economy_Refinery;","SystemSecondEconomy_Localised":"Refinery","SystemGovernment":"$government_Cooperative;","SystemGovernment_Localised":"Cooperative","SystemSecurity":"$SYSTEM_SECURITY_high;","SystemSecurity_Localised":"High Security","Population":31349315,"Body":"Kelish A","BodyID":1,"BodyType":"Star","JumpDist":16.035,"FuelUsed":2.826729,"FuelLevel":29.173271,"Factions":[{"Name":"Peraesii Empire Consulate","FactionState":"None","Government":"Patronage","Influence":0.052052,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":100.0,"PendingStates":[{"State":"Expansion","Trend":0}]},{"Name":"Kelish Citizens' Forum","FactionState":"None","Government":"Patronage","Influence":0.114114,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-9.65679,"PendingStates":[{"State":"Election","Trend":0}]},{"Name":"Kelish Limited","FactionState":"None","Government":"Corporate","Influence":0.041041,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Kelish Posse","FactionState":"None","Government":"Anarchy","Influence":0.01001,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-15.84},{"Name":"Kelish Empire Consulate","FactionState":"None","Government":"Patronage","Influence":0.038038,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Decimus Imperium Lex","FactionState":"None","Government":"Feudal","Influence":0.114114,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":23.1,"PendingStates":[{"State":"Election","Trend":0}]},{"Name":"The Order of Mobius","FactionState":"Boom","Government":"Cooperative","Influence":0.630631,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":100.0,"RecoveringStates":[{"State":"Expansion","Trend":0}],"ActiveStates":[{"State":"Boom"}]}],"SystemFaction":{"Name":"The Order of Mobius","FactionState":"Boom"},"Conflicts":[{"WarType":"election","Status":"pending","Faction1":{"Name":"Kelish Citizens' Forum","Stake":"Bowell Enterprise","WonDays":0},"Faction2":{"Name":"Decimus Imperium Lex","Stake":"Delaunay Orbital","WonDays":0}}]}
{"timestamp":"2022-02-17T21:21:09Z","event":"Docked","StationName":"Delaunay Orbital","StationType":"Outpost","StarSystem":"Kelish","SystemAddress":2871319405993,"MarketID":3224635392,"StationFaction":{"Name":"Decimus Imperium Lex"},"StationGovernment":"$government_Feudal;","StationGovernment_Localised":"Feudal","StationAllegiance":"Empire","StationServices":["dock","autodock","contacts","exploration","missions","refuel","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_HighTech;","StationEconomy_Localised":"High Tech","StationEconomies":[{"Name":"$economy_HighTech;","Name_Localised":"High Tech","Proportion":0.51},{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":0.49}],"DistFromStarLS":70.858032}
{"timestamp":"2022-02-17T21:25:26Z","event":"Docked","StationName":"Tikhonravov Orbital","StationType":"Outpost","StarSystem":"Kelish","SystemAddress":2871319405993,"MarketID":3224635136,"StationFaction":{"Name":"The Order of Mobius","FactionState":"Boom"},"StationGovernment":"$government_Cooperative;","StationGovernment_Localised":"Cooperative","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","refuel","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_HighTech;","StationEconomy_Localised":"High Tech","StationEconomies":[{"Name":"$economy_HighTech;","Name_Localised":"High Tech","Proportion":0.67},{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":0.33}],"DistFromStarLS":70.88156}
{"timestamp":"2022-02-17T21:27:22Z","event":"FSDJump","StarSystem":"Kazahua","SystemAddress":2871050905001,"StarPos":[93.28125,-180.25,14.6875],"SystemAllegiance":"Empire","SystemEconomy":"$economy_Industrial;","SystemEconomy_Localised":"Industrial","SystemSecondEconomy":"$economy_Colony;","SystemSecondEconomy_Localised":"Colony","SystemGovernment":"$government_Patronage;","SystemGovernment_Localised":"Patronage","SystemSecurity":"$SYSTEM_SECURITY_low;","SystemSecurity_Localised":"Low Security","Population":17949,"Body":"Kazahua","BodyID":0,"BodyType":"Star","JumpDist":16.035,"FuelUsed":3.825501,"FuelLevel":28.1745,"Factions":[{"Name":"Peraesii Empire Consulate","FactionState":"None","Government":"Patronage","Influence":0.082578,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":100.0,"PendingStates":[{"State":"Expansion","Trend":0}]},{"Name":"Kazahua Co","FactionState":"None","Government":"Corporate","Influence":0.037261,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Kazahua Crimson Ring","FactionState":"None","Government":"Anarchy","Influence":0.060423,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"HIP 10611 Shared","FactionState":"None","Government":"Cooperative","Influence":0.23565,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-3.3},{"Name":"Traditional Yao Tzu Liberty Party","FactionState":"None","Government":"Dictatorship","Influence":0.134945,"Allegiance":"Empire","Happiness":"","MyReputation":-1.65},{"Name":"Sapii allied","FactionState":"None","Government":"Cooperative","Influence":0.121853,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Nova Paresa","FactionState":"None","Government":"Patronage","Influence":0.327291,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","SquadronFaction":true,"MyReputation":100.0}],"SystemFaction":{"Name":"Nova Paresa"}}
{"timestamp":"2022-02-17T21:30:27Z","event":"Docked","StationName":"Rabinowitz Colony","StationType":"Outpost","StarSystem":"Kazahua","SystemAddress":2871050905001,"MarketID":3223011840,"StationFaction":{"Name":"Nova Paresa"},"StationGovernment":"$government_Patronage;","StationGovernment_Localised":"Patronage","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Extraction;","StationEconomy_Localised":"Extraction","StationEconomies":[{"Name":"$economy_Extraction;","Name_Localised":"Extraction","Proportion":1.0}],"DistFromStarLS":336.716824}
{"timestamp":"2022-02-17T21:31:16Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_AltruismCredits","LocalisedName":"Donate 300,000 Cr to the cause","Donation":"300000","Expiry":"2022-02-18T00:36:39Z","Wing":false,"Influence":"++","Reputation":"+","MissionID":847896711}
{"timestamp":"2022-02-17T21:31:22Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_AltruismCredits","LocalisedName":"Donate 200,000 Cr to the cause","Donation":"200000","Expiry":"2022-02-18T01:04:30Z","Wing":false,"Influence":"+","Reputation":"+","MissionID":847896737}
{"timestamp":"2022-02-17T21:33:06Z","event":"FSDJump","StarSystem":"Haoko","SystemAddress":7269365851569,"StarPos":[100.5625,-181.78125,31.4375],"SystemAllegiance":"Independent","SystemEconomy":"$economy_Extraction;","SystemEconomy_Localised":"Extraction","SystemSecondEconomy":"$economy_None;","SystemSecondEconomy_Localised":"None","SystemGovernment":"$government_Confederacy;","SystemGovernment_Localised":"Confederacy","SystemSecurity":"$SYSTEM_SECURITY_low;","SystemSecurity_Localised":"Low Security","Population":2923,"Body":"Haoko A","BodyID":2,"BodyType":"Star","JumpDist":18.328,"FuelUsed":4.202615,"FuelLevel":27.797386,"Factions":[{"Name":"Peraesii Empire Consulate","FactionState":"None","Government":"Patronage","Influence":0.145161,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":100.0,"PendingStates":[{"State":"Expansion","Trend":0}]},{"Name":"Haoko Interstellar","FactionState":"None","Government":"Corporate","Influence":0.034274,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Gefjong Interstellar","FactionState":"None","Government":"Corporate","Influence":0.035282,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Uniting Haoko","FactionState":"None","Government":"Cooperative","Influence":0.037298,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Aristocrats of Haoko","FactionState":"None","Government":"Feudal","Influence":0.080645,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Browncoat Uprising","FactionState":"None","Government":"Confederacy","Influence":0.476815,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":1.32,"PendingStates":[{"State":"Expansion","Trend":0}]},{"Name":"Di Yomi Praetorian Confederacy","FactionState":"None","Government":"Confederacy","Influence":0.190524,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0}],"SystemFaction":{"Name":"Browncoat Uprising"}}
{"timestamp":"2022-02-17T21:34:07Z","event":"FSDJump","StarSystem":"Rukarwadja","SystemAddress":672296084921,"StarPos":[100.90625,-184.125,39.625],"SystemAllegiance":"Empire","SystemEconomy":"$economy_Agri;","SystemEconomy_Localised":"Agriculture","SystemSecondEconomy":"$economy_Tourism;","SystemSecondEconomy_Localised":"Tourism","SystemGovernment":"$government_Corporate;","SystemGovernment_Localised":"Corporate","SystemSecurity":"$SYSTEM_SECURITY_medium;","SystemSecurity_Localised":"Medium Security","Population":9529639756,"Body":"Rukarwadja","BodyID":0,"BodyType":"Star","JumpDist":8.523,"FuelUsed":0.634794,"FuelLevel":27.162592,"Factions":[{"Name":"Rukarwadja Emperor's Grace","FactionState":"CivilWar","Government":"Patronage","Influence":0.14881,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"ActiveStates":[{"State":"CivilWar"}]},{"Name":"Rukarwadja Holdings","FactionState":"None","Government":"Corporate","Influence":0.450397,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Raiders of Rukarwadja","FactionState":"None","Government":"Anarchy","Influence":0.026786,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Traditional Yao Tzu Liberty Party","FactionState":"None","Government":"Dictatorship","Influence":0.042659,"Allegiance":"Empire","Happiness":"","MyReputation":41.849998},{"Name":"Rukarwadja General Partners","FactionState":"CivilWar","Government":"Corporate","Influence":0.14881,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"ActiveStates":[{"State":"CivilWar"}]},{"Name":"New Rukarwadja Free","FactionState":"None","Government":"Democracy","Influence":0.059524,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Di Yomi Praetorian Confederacy","FactionState":"None","Government":"Confederacy","Influence":0.123016,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0}],"SystemFaction":{"Name":"Rukarwadja Holdings"},"Conflicts":[{"WarType":"civilwar","Status":"active","Faction1":{"Name":"Rukarwadja Emperor's Grace","Stake":"Regent's Villas","WonDays":0},"Faction2":{"Name":"Rukarwadja General Partners","Stake":"Purandare's Works","WonDays":0}}]}
{"timestamp":"2022-02-17T21:37:34Z","event":"Docked","StationName":"Wallerstein Port","StationType":"Orbis","StarSystem":"Rukarwadja","SystemAddress":672296084921,"MarketID":3224498944,"StationFaction":{"Name":"Rukarwadja Holdings"},"StationGovernment":"$government_Corporate;","StationGovernment_Localised":"Corporate","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","shipyard","tuning","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","shop","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Agri;","StationEconomy_Localised":"Agriculture","StationEconomies":[{"Name":"$economy_Agri;","Name_Localised":"Agriculture","Proportion":1.0}],"DistFromStarLS":81.740698}
{"timestamp":"2022-02-17T21:38:17Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"MISSION_Scan","LocalisedName":"Planetary Scan Job","DestinationSystem":"Arugua","DestinationStation":"Noon Base","Expiry":"2022-02-24T01:14:27Z","Wing":false,"Influence":"++","Reputation":"++","Reward":2423488,"MissionID":847898503}
{"timestamp":"2022-02-17T21:38:18Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"MISSION_Scan","LocalisedName":"Planetary Scan Job","DestinationSystem":"Arugua","DestinationStation":"Giclas Hub","Expiry":"2022-02-23T16:33:57Z","Wing":false,"Influence":"++","Reputation":"++","Reward":2416030,"MissionID":847898508}
{"timestamp":"2022-02-17T21:38:20Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"MISSION_Scan","LocalisedName":"Planetary Scan Job","DestinationSystem":"Sangenses","DestinationStation":"Paola Plant","Expiry":"2022-02-24T06:36:03Z","Wing":false,"Influence":"++","Reputation":"++","Reward":2546050,"MissionID":847898515}
{"timestamp":"2022-02-17T21:39:16Z","event":"Docked","StationName":"Wallerstein Port","StationType":"Orbis","StarSystem":"Rukarwadja","SystemAddress":672296084921,"MarketID":3224498944,"StationFaction":{"Name":"Rukarwadja Holdings"},"StationGovernment":"$government_Corporate;","StationGovernment_Localised":"Corporate","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","shipyard","tuning","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","shop","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Agri;","StationEconomy_Localised":"Agriculture","StationEconomies":[{"Name":"$economy_Agri;","Name_Localised":"Agriculture","Proportion":1.0}],"DistFromStarLS":81.742134}
{"timestamp":"2022-02-17T21:39:55Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_Sightseeing","LocalisedName":"Stuart Shelton Seeks Sightseeing Adventure","Commodity":"$DomesticAppliances_Name;","Commodity_Localised":"Domestic Appliances","Count":1,"DestinationSystem":"Vequess$MISSIONUTIL_MULTIPLE_FINAL_SEPARATOR;Kikapu","Expiry":"2022-02-18T14:54:00Z","Wing":false,"Influence":"+","Reputation":"+","Reward":5814370,"PassengerCount":7,"PassengerVIPs":true,"PassengerWanted":false,"PassengerType":"Tourist","MissionID":847898915}
{"timestamp":"2022-02-17T21:40:03Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_Sightseeing","LocalisedName":"Larissa Tucker Seeks Sightseeing Adventure","Commodity":"$ConsumerTechnology_Name;","Commodity_Localised":"Consumer Technology","Count":1,"DestinationSystem":"Guanangu$MISSIONUTIL_MULTIPLE_INNER_SEPARATOR;Col 285 Sector JM-A b15-7$MISSIONUTIL_MULTIPLE_FINAL_SEPARATOR;Kholhou","Expiry":"2022-02-18T08:03:56Z","Wing":false,"Influence":"+","Reputation":"+","Reward":5460445,"PassengerCount":5,"PassengerVIPs":true,"PassengerWanted":false,"PassengerType":"Tourist","MissionID":847898932}
{"timestamp":"2022-02-17T21:40:19Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_Sightseeing","LocalisedName":"Arthur Ward Seeks Sightseeing Adventure","Commodity":"$DomesticAppliances_Name;","Commodity_Localised":"Domestic Appliances","Count":2,"DestinationSystem":"Daibo$MISSIONUTIL_MULTIPLE_INNER_SEPARATOR;Zearla$MISSIONUTIL_MULTIPLE_FINAL_SEPARATOR;Azaleach","Expiry":"2022-02-18T13:20:42Z","Wing":false,"Influence":"+","Reputation":"+","Reward":7336247,"PassengerCount":7,"PassengerVIPs":true,"PassengerWanted":false,"PassengerType":"Tourist","MissionID":847898991}
{"timestamp":"2022-02-17T21:40:32Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_Sightseeing","LocalisedName":"Mckinley Walsh Seeks Sightseeing Adventure","Commodity":"$ConsumerTechnology_Name;","Commodity_Localised":"Consumer Technology","Count":2,"DestinationSystem":"Cartoi$MISSIONUTIL_MULTIPLE_INNER_SEPARATOR;Hofada$MISSIONUTIL_MULTIPLE_FINAL_SEPARATOR;Lalande 46867","Expiry":"2022-02-18T13:25:40Z","Wing":false,"Influence":"+","Reputation":"+","Reward":3814750,"PassengerCount":3,"PassengerVIPs":true,"PassengerWanted":false,"PassengerType":"Tourist","MissionID":847899046}
{"timestamp":"2022-02-17T21:40:57Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_LongDistanceExpedition","LocalisedName":"Javier Colon Wants To Visit Choose Your Own Adventure and Collect Data","DestinationSystem":"Rukarwadja","Expiry":"2022-03-17T21:37:51Z","Wing":false,"Influence":"+","Reputation":"+","Reward":33571088,"PassengerCount":5,"PassengerVIPs":true,"PassengerWanted":false,"PassengerType":"Explorer","MissionID":847899182}
{"timestamp":"2022-02-17T21:43:32Z","event":"Location","Docked":true,"StationName":"Wallerstein Port","StationType":"Orbis","MarketID":3224498944,"StationFaction":{"Name":"Rukarwadja Holdings"},"StationGovernment":"$government_Corporate;","StationGovernment_Localised":"Corporate","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","shipyard","tuning","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","shop","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Agri;","StationEconomy_Localised":"Agriculture","StationEconomies":[{"Name":"$economy_Agri;","Name_Localised":"Agriculture","Proportion":1.0}],"StarSystem":"Rukarwadja","SystemAddress":672296084921,"StarPos":[100.90625,-184.125,39.625],"SystemAllegiance":"Empire","SystemEconomy":"$economy_Agri;","SystemEconomy_Localised":"Agriculture","SystemSecondEconomy":"$economy_Tourism;","SystemSecondEconomy_Localised":"Tourism","SystemGovernment":"$government_Corporate;","SystemGovernment_Localised":"Corporate","SystemSecurity":"$SYSTEM_SECURITY_medium;","SystemSecurity_Localised":"Medium Security","Population":9529639756,"Body":"Wallerstein Port","BodyID":31,"BodyType":"Station","Factions":[{"Name":"Rukarwadja Emperor's Grace","FactionState":"CivilWar","Government":"Patronage","Influence":0.14881,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"ActiveStates":[{"State":"CivilWar"}]},{"Name":"Rukarwadja Holdings","FactionState":"None","Government":"Corporate","Influence":0.450397,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":2.5466},{"Name":"Raiders of Rukarwadja","FactionState":"None","Government":"Anarchy","Influence":0.026786,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Traditional Yao Tzu Liberty Party","FactionState":"None","Government":"Dictatorship","Influence":0.042659,"Allegiance":"Empire","Happiness":"","MyReputation":-34.049999},{"Name":"Rukarwadja General Partners","FactionState":"CivilWar","Government":"Corporate","Influence":0.14881,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"ActiveStates":[{"State":"CivilWar"}]},{"Name":"New Rukarwadja Free","FactionState":"None","Government":"Democracy","Influence":0.059524,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Di Yomi Praetorian Confederacy","FactionState":"None","Government":"Confederacy","Influence":0.123016,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0}],"SystemFaction":{"Name":"Rukarwadja Holdings"},"Conflicts":[{"WarType":"civilwar","Status":"active","Faction1":{"Name":"Rukarwadja Emperor's Grace","Stake":"Regent's Villas","WonDays":0},"Faction2":{"Name":"Rukarwadja General Partners","Stake":"Purandare's Works","WonDays":0}}]}
{"timestamp":"2022-02-17T21:43:32Z","event":"Docked","StationName":"Wallerstein Port","StationType":"Orbis","StarSystem":"Rukarwadja","SystemAddress":672296084921,"MarketID":3224498944,"StationFaction":{"Name":"Rukarwadja Holdings"},"StationGovernment":"$government_Corporate;","StationGovernment_Localised":"Corporate","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","shipyard","tuning","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","shop","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Agri;","StationEconomy_Localised":"Agriculture","StationEconomies":[{"Name":"$economy_Agri;","Name_Localised":"Agriculture","Proportion":1.0}],"DistFromStarLS":81.745724}
{"timestamp":"2022-02-17T21:46:43Z","event":"Docked","StationName":"Wallerstein Port","StationType":"Orbis","StarSystem":"Rukarwadja","SystemAddress":672296084921,"MarketID":3224498944,"StationFaction":{"Name":"Rukarwadja Holdings"},"StationGovernment":"$government_Corporate;","StationGovernment_Localised":"Corporate","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","shipyard","tuning","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","shop","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Agri;","StationEconomy_Localised":"Agriculture","StationEconomies":[{"Name":"$economy_Agri;","Name_Localised":"Agriculture","Proportion":1.0}],"DistFromStarLS":81.748373}
{"timestamp":"2022-02-17T21:48:35Z","event":"FSDJump","StarSystem":"ICZ SI-T b3-4","SystemAddress":9468120671673,"StarPos":[88.875,-175.65625,37.1875],"SystemAllegiance":"","SystemEconomy":"$economy_None;","SystemEconomy_Localised":"None","SystemSecondEconomy":"$economy_None;","SystemSecondEconomy_Localised":"None","SystemGovernment":"$government_None;","SystemGovernment_Localised":"None","SystemSecurity":"$GAlAXY_MAP_INFO_state_anarchy;","SystemSecurity_Localised":"Anarchy","Population":0,"Body":"ICZ SI-T b3-4 A","BodyID":1,"BodyType":"Star","JumpDist":14.913,"FuelUsed":2.079593,"FuelLevel":29.920406}
{"timestamp":"2022-02-17T21:49:34Z","event":"FSDJump","StarSystem":"Yao Tzu","SystemAddress":7269097416113,"StarPos":[82.78125,-174.6875,28.3125],"SystemAllegiance":"Empire","SystemEconomy":"$economy_Industrial;","SystemEconomy_Localised":"Industrial","SystemSecondEconomy":"$economy_None;","SystemSecondEconomy_Localised":"None","SystemGovernment":"$government_Patronage;","SystemGovernment_Localised":"Patronage","SystemSecurity":"$SYSTEM_SECURITY_medium;","SystemSecurity_Localised":"Medium Security","Population":4049046,"Body":"Yao Tzu A","BodyID":2,"BodyType":"Star","JumpDist":10.809,"FuelUsed":0.93791,"FuelLevel":28.982496,"Factions":[{"Name":"Peraesii Empire Consulate","FactionState":"None","Government":"Patronage","Influence":0.193,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":100.0,"PendingStates":[{"State":"Expansion","Trend":0}]},{"Name":"Yao Tzu Exchange","FactionState":"None","Government":"Corporate","Influence":0.064,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Yao Tzu Blue Partnership","FactionState":"None","Government":"Anarchy","Influence":0.028,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Traditional Yao Tzu Liberty Party","FactionState":"None","Government":"Dictatorship","Influence":0.059,"Allegiance":"Empire","Happiness":"","MyReputation":-34.049999},{"Name":"Citizen Party of Yao Tzu","FactionState":"None","Government":"Communism","Influence":0.027,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Browncoat Uprising","FactionState":"None","Government":"Confederacy","Influence":0.076,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":1.32,"PendingStates":[{"State":"Expansion","Trend":0}]},{"Name":"Empire Consulate Ltd","FactionState":"None","Government":"Patronage","Influence":0.553,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-2.475}],"SystemFaction":{"Name":"Empire Consulate Ltd"}}
{"timestamp":"2022-02-17T21:53:17Z","event":"Docked","StationName":"Orbik Port","StationType":"Coriolis","StarSystem":"Yao Tzu","SystemAddress":7269097416113,"MarketID":3222901760,"StationFaction":{"Name":"Empire Consulate Ltd"},"StationGovernment":"$government_Patronage;","StationGovernment_Localised":"Patronage","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","shipyard","tuning","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","shop","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Industrial;","StationEconomy_Localised":"Industrial","StationEconomies":[{"Name":"$economy_Industrial;","Name_Localised":"Industrial","Proportion":1.0}],"DistFromStarLS":733.354712}
{"timestamp":"2022-02-17T21:54:14Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_Collect_Industrial","LocalisedName":"Industry needs 42 units of Performance Enhancers","Commodity":"$PerformanceEnhancers_Name;","Commodity_Localised":"Performance Enhancers","Count":42,"DestinationSystem":"Yao Tzu","DestinationStation":"Orbik Port","Expiry":"2022-02-18T21:53:27Z","Wing":false,"Influence":"++","Reputation":"++","Reward":692556,"MissionID":847902618}
{"timestamp":"2022-02-17T21:54:36Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"MISSION_Salvage_Illegal","LocalisedName":"Illegal Black Box Salvage Operation","Commodity":"$USSCargoBlackBox_Name;","Commodity_Localised":"Black Box","Count":1,"DestinationSystem":"HIP 7211","Expiry":"2022-02-22T08:56:09Z","Wing":false,"Influence":"++","Reputation":"++","Reward":261503,"MissionID":847902705}
{"timestamp":"2022-02-17T21:56:32Z","event":"FSDJump","StarSystem":"HIP 7211","SystemAddress":1281804437867,"StarPos":[79.65625,-167.9375,25.875],"SystemAllegiance":"Empire","SystemEconomy":"$economy_Extraction;","SystemEconomy_Localised":"Extraction","SystemSecondEconomy":"$economy_Colony;","SystemSecondEconomy_Localised":"Colony","SystemGovernment":"$government_Patronage;","SystemGovernment_Localised":"Patronage","SystemSecurity":"$SYSTEM_SECURITY_medium;","SystemSecurity_Localised":"Medium Security","Population":788783,"Body":"HIP 7211 A","BodyID":1,"BodyType":"Star","JumpDist":7.827,"FuelUsed":0.43976,"FuelLevel":28.542736,"Factions":[{"Name":"HIP 7211 Empire Pact","FactionState":"None","Government":"Patronage","Influence":0.167335,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Peraesii Empire Consulate","FactionState":"None","Government":"Patronage","Influence":0.467936,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":100.0,"PendingStates":[{"State":"Expansion","Trend":0}]},{"Name":"HIP 7211 Jet Netcoms Group","FactionState":"None","Government":"Corporate","Influence":0.037074,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"HIP 7211 Purple Bridge & Co","FactionState":"None","Government":"Corporate","Influence":0.131263,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"HIP 7211 Gold Dragons","FactionState":"None","Government":"Anarchy","Influence":0.032064,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"People's HIP 7211 Independents","FactionState":"None","Government":"Democracy","Influence":0.103206,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Empire Consulate Ltd","FactionState":"None","Government":"Patronage","Influence":0.061122,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-2.475}],"SystemFaction":{"Name":"Peraesii Empire Consulate"}}
{"timestamp":"2022-02-17T22:05:11Z","event":"MissionFailed","Name":"MISSION_Scan_name","MissionID":847898515}
{"timestamp":"2022-02-17T22:05:15Z","event":"MissionFailed","Name":"MISSION_Scan_name","MissionID":847898508}
{"timestamp":"2022-02-17T22:05:18Z","event":"MissionFailed","Name":"MISSION_Scan_name","MissionID":847898503}
{"timestamp":"2022-02-17T22:05:23Z","event":"MissionFailed","Name":"Mission_LongDistanceExpedition_name","MissionID":847899182}
{"timestamp":"2022-02-17T22:05:27Z","event":"MissionFailed","Name":"Mission_Sightseeing_name","MissionID":847899046}
{"timestamp":"2022-02-17T22:05:30Z","event":"MissionFailed","Name":"Mission_Sightseeing_name","MissionID":847898991}
{"timestamp":"2022-02-17T22:05:33Z","event":"MissionFailed","Name":"Mission_Sightseeing_name","MissionID":847898932}
{"timestamp":"2022-02-17T22:05:41Z","event":"MissionFailed","Name":"Mission_Sightseeing_name","MissionID":847898915}
{"timestamp":"2022-02-17T22:23:06Z","event":"FSDJump","StarSystem":"Kelish","SystemAddress":2871319405993,"StarPos":[95.09375,-164.375,13.34375],"SystemAllegiance":"Independent","SystemEconomy":"$economy_HighTech;","SystemEconomy_Localised":"High Tech","SystemSecondEconomy":"$economy_Refinery;","SystemSecondEconomy_Localised":"Refinery","SystemGovernment":"$government_Cooperative;","SystemGovernment_Localised":"Cooperative","SystemSecurity":"$SYSTEM_SECURITY_high;","SystemSecurity_Localised":"High Security","Population":31349315,"Body":"Kelish A","BodyID":1,"BodyType":"Star","JumpDist":20.2,"FuelUsed":4.51866,"FuelLevel":22.764078,"Factions":[{"Name":"Peraesii Empire Consulate","FactionState":"None","Government":"Patronage","Influence":0.052052,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":100.0,"PendingStates":[{"State":"Expansion","Trend":0}]},{"Name":"Kelish Citizens' Forum","FactionState":"None","Government":"Patronage","Influence":0.114114,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-9.65679,"PendingStates":[{"State":"Election","Trend":0}]},{"Name":"Kelish Limited","FactionState":"None","Government":"Corporate","Influence":0.041041,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Kelish Posse","FactionState":"None","Government":"Anarchy","Influence":0.01001,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-15.84},{"Name":"Kelish Empire Consulate","FactionState":"None","Government":"Patronage","Influence":0.038038,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Decimus Imperium Lex","FactionState":"None","Government":"Feudal","Influence":0.114114,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":33.0,"PendingStates":[{"State":"Election","Trend":0}]},{"Name":"The Order of Mobius","FactionState":"Boom","Government":"Cooperative","Influence":0.630631,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":100.0,"RecoveringStates":[{"State":"Expansion","Trend":0}],"ActiveStates":[{"State":"Boom"}]}],"SystemFaction":{"Name":"The Order of Mobius","FactionState":"Boom"},"Conflicts":[{"WarType":"election","Status":"pending","Faction1":{"Name":"Kelish Citizens' Forum","Stake":"Bowell Enterprise","WonDays":0},"Faction2":{"Name":"Decimus Imperium Lex","Stake":"Delaunay Orbital","WonDays":0}}]}
{"timestamp":"2022-02-17T22:26:10Z","event":"Docked","StationName":"Tikhonravov Orbital","StationType":"Outpost","StarSystem":"Kelish","SystemAddress":2871319405993,"MarketID":3224635136,"StationFaction":{"Name":"The Order of Mobius","FactionState":"Boom"},"StationGovernment":"$government_Cooperative;","StationGovernment_Localised":"Cooperative","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","refuel","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_HighTech;","StationEconomy_Localised":"High Tech","StationEconomies":[{"Name":"$economy_HighTech;","Name_Localised":"High Tech","Proportion":0.67},{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":0.33}],"DistFromStarLS":70.905454}
{"timestamp":"2022-02-17T22:34:30Z","event":"FSDJump","StarSystem":"ICZ JR-W c1-10","SystemAddress":2832765686490,"StarPos":[88.0,-169.1875,23.3125],"SystemAllegiance":"","SystemEconomy":"$economy_None;","SystemEconomy_Localised":"None","SystemSecondEconomy":"$economy_None;","SystemSecondEconomy_Localised":"None","SystemGovernment":"$government_None;","SystemGovernment_Localised":"None","SystemSecurity":"$GAlAXY_MAP_INFO_state_anarchy;","SystemSecurity_Localised":"Anarchy","Population":0,"Body":"ICZ JR-W c1-10 A","BodyID":1,"BodyType":"Star","JumpDist":13.148,"FuelUsed":2.352166,"FuelLevel":29.647835}
{"timestamp":"2022-02-17T22:35:33Z","event":"FSDJump","StarSystem":"Yao Tzu","SystemAddress":7269097416113,"StarPos":[82.78125,-174.6875,28.3125],"SystemAllegiance":"Empire","SystemEconomy":"$economy_Industrial;","SystemEconomy_Localised":"Industrial","SystemSecondEconomy":"$economy_None;","SystemSecondEconomy_Localised":"None","SystemGovernment":"$government_Patronage;","SystemGovernment_Localised":"Patronage","SystemSecurity":"$SYSTEM_SECURITY_medium;","SystemSecurity_Localised":"Medium Security","Population":4049046,"Body":"Yao Tzu A","BodyID":2,"BodyType":"Star","JumpDist":9.082,"FuelUsed":0.943402,"FuelLevel":28.704433,"Factions":[{"Name":"Peraesii Empire Consulate","FactionState":"None","Government":"Patronage","Influence":0.193,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":100.0,"PendingStates":[{"State":"Expansion","Trend":0}]},{"Name":"Yao Tzu Exchange","FactionState":"None","Government":"Corporate","Influence":0.064,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Yao Tzu Blue Partnership","FactionState":"None","Government":"Anarchy","Influence":0.028,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Traditional Yao Tzu Liberty Party","FactionState":"None","Government":"Dictatorship","Influence":0.059,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-34.049999},{"Name":"Citizen Party of Yao Tzu","FactionState":"None","Government":"Communism","Influence":0.027,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Browncoat Uprising","FactionState":"None","Government":"Confederacy","Influence":0.076,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":1.32,"PendingStates":[{"State":"Expansion","Trend":0}]},{"Name":"Empire Consulate Ltd","FactionState":"None","Government":"Patronage","Influence":0.553,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-2.475}],"SystemFaction":{"Name":"Empire Consulate Ltd"}}
{"timestamp":"2022-02-17T22:38:37Z","event":"Docked","StationName":"Orbik Port","StationType":"Coriolis","StarSystem":"Yao Tzu","SystemAddress":7269097416113,"MarketID":3222901760,"StationFaction":{"Name":"Empire Consulate Ltd"},"StationGovernment":"$government_Patronage;","StationGovernment_Localised":"Patronage","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","shipyard","tuning","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","shop","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Industrial;","StationEconomy_Localised":"Industrial","StationEconomies":[{"Name":"$economy_Industrial;","Name_Localised":"Industrial","Proportion":1.0}],"DistFromStarLS":733.354712}
{"timestamp":"2022-02-17T22:39:10Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_AltruismCredits","LocalisedName":"Donate 200,000 Cr to the cause","Donation":"200000","Expiry":"2022-02-18T02:27:41Z","Wing":false,"Influence":"+","Reputation":"+","MissionID":847913657}
{"timestamp":"2022-02-17T22:39:17Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_AltruismCredits","LocalisedName":"Donate 200,000 Cr to the cause","Donation":"200000","Expiry":"2022-02-18T02:11:10Z","Wing":false,"Influence":"+","Reputation":"+","MissionID":847913676}
{"timestamp":"2022-02-17T22:39:22Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_AltruismCredits","LocalisedName":"Donate 200,000 Cr to the cause","Donation":"200000","Expiry":"2022-02-18T02:14:45Z","Wing":false,"Influence":"+","Reputation":"+","MissionID":847913693}
{"timestamp":"2022-02-17T22:39:28Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_AltruismCredits","LocalisedName":"Donate 1,000,000 Cr to the cause","Donation":"1000000","Expiry":"2022-02-18T02:29:10Z","Wing":false,"Influence":"++","Reputation":"++","MissionID":847913716}
{"timestamp":"2022-02-17T22:39:32Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_AltruismCredits","LocalisedName":"Donate 1,000,000 Cr to the cause","Donation":"1000000","Expiry":"2022-02-18T02:04:27Z","Wing":false,"Influence":"++","Reputation":"++","MissionID":847913728}
{"timestamp":"2022-02-17T22:42:50Z","event":"FSDJump","StarSystem":"Fengthi","SystemAddress":2871050905009,"StarPos":[80.28125,-178.53125,30.15625],"SystemAllegiance":"Independent","SystemEconomy":"$economy_Extraction;","SystemEconomy_Localised":"Extraction","SystemSecondEconomy":"$economy_Refinery;","SystemSecondEconomy_Localised":"Refinery","SystemGovernment":"$government_Anarchy;","SystemGovernment_Localised":"Anarchy","SystemSecurity":"$GAlAXY_MAP_INFO_state_anarchy;","SystemSecurity_Localised":"Anarchy","Population":94445,"Body":"Fengthi","BodyID":0,"BodyType":"Star","JumpDist":4.942,"FuelUsed":0.145158,"FuelLevel":31.854841,"Factions":[{"Name":"Peraesii Empire Consulate","FactionState":"None","Government":"Patronage","Influence":0.269,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":85.150002,"PendingStates":[{"State":"Expansion","Trend":0}]},{"Name":"Fengthi Holdings","FactionState":"None","Government":"Corporate","Influence":0.098,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":7.425},{"Name":"Fengthi allied","FactionState":"None","Government":"Cooperative","Influence":0.041,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":2.64},{"Name":"Temurt Drug Empire","FactionState":"Bust","Government":"Anarchy","Influence":0.418,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":22.2589,"RecoveringStates":[{"State":"PirateAttack","Trend":0}],"ActiveStates":[{"State":"Bust"}]},{"Name":"Fengthi Nobles","FactionState":"None","Government":"Feudal","Influence":0.065,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Traditional Yao Tzu Liberty Party","FactionState":"None","Government":"Dictatorship","Influence":0.087,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":35.450001},{"Name":"Fengthi Blue Camorra","FactionState":"None","Government":"Anarchy","Influence":0.022,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0}],"SystemFaction":{"Name":"Temurt Drug Empire","FactionState":"Bust"}}
{"timestamp":"2022-02-17T22:46:43Z","event":"Docked","StationName":"Gurevich Vision","StationType":"Outpost","StarSystem":"Fengthi","SystemAddress":2871050905009,"MarketID":3222901504,"StationFaction":{"Name":"Temurt Drug Empire","FactionState":"Bust"},"StationGovernment":"$government_Anarchy;","StationGovernment_Localised":"Anarchy","StationServices":["dock","autodock","blackmarket","commodities","contacts","exploration","missions","outfitting","crewlounge","refuel","repair","tuning","engineer","missionsgenerated","facilitator","flightcontroller","stationoperations","powerplay","stationMenu","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Extraction;","StationEconomy_Localised":"Extraction","StationEconomies":[{"Name":"$economy_Extraction;","Name_Localised":"Extraction","Proportion":0.83},{"Name":"$economy_Refinery;","Name_Localised":"Refinery","Proportion":0.17}],"DistFromStarLS":1256.729721}
{"timestamp":"2022-02-17T22:49:57Z","event":"FSDJump","StarSystem":"ICZ SI-T b3-2","SystemAddress":5070074160569,"StarPos":[93.34375,-180.75,42.46875],"SystemAllegiance":"","SystemEconomy":"$economy_None;","SystemEconomy_Localised":"None","SystemSecondEconomy":"$economy_None;","SystemSecondEconomy_Localised":"None","SystemGovernment":"$government_None;","SystemGovernment_Localised":"None","SystemSecurity":"$GAlAXY_MAP_INFO_state_anarchy;","SystemSecurity_Localised":"Anarchy","Population":0,"Body":"ICZ SI-T b3-2 A","BodyID":2,"BodyType":"Star","JumpDist":18.087,"FuelUsed":3.484218,"FuelLevel":28.370623}
{"timestamp":"2022-02-17T22:50:49Z","event":"FSDJump","StarSystem":"Rukarwadja","SystemAddress":672296084921,"StarPos":[100.90625,-184.125,39.625],"SystemAllegiance":"Empire","SystemEconomy":"$economy_Agri;","SystemEconomy_Localised":"Agriculture","SystemSecondEconomy":"$economy_Tourism;","SystemSecondEconomy_Localised":"Tourism","SystemGovernment":"$government_Corporate;","SystemGovernment_Localised":"Corporate","SystemSecurity":"$SYSTEM_SECURITY_medium;","SystemSecurity_Localised":"Medium Security","Population":9529639756,"Body":"Rukarwadja","BodyID":0,"BodyType":"Star","JumpDist":8.756,"FuelUsed":0.581701,"FuelLevel":27.788921,"Factions":[{"Name":"Rukarwadja Emperor's Grace","FactionState":"CivilWar","Government":"Patronage","Influence":0.14881,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"ActiveStates":[{"State":"CivilWar"}]},{"Name":"Rukarwadja Holdings","FactionState":"None","Government":"Corporate","Influence":0.450397,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":2.5466},{"Name":"Raiders of Rukarwadja","FactionState":"None","Government":"Anarchy","Influence":0.026786,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Traditional Yao Tzu Liberty Party","FactionState":"None","Government":"Dictatorship","Influence":0.042659,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":51.450001},{"Name":"Rukarwadja General Partners","FactionState":"CivilWar","Government":"Corporate","Influence":0.14881,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"ActiveStates":[{"State":"CivilWar"}]},{"Name":"New Rukarwadja Free","FactionState":"None","Government":"Democracy","Influence":0.059524,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Di Yomi Praetorian Confederacy","FactionState":"None","Government":"Confederacy","Influence":0.123016,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0}],"SystemFaction":{"Name":"Rukarwadja Holdings"},"Conflicts":[{"WarType":"civilwar","Status":"active","Faction1":{"Name":"Rukarwadja Emperor's Grace","Stake":"Regent's Villas","WonDays":0},"Faction2":{"Name":"Rukarwadja General Partners","Stake":"Purandare's Works","WonDays":0}}]}
{"timestamp":"2022-02-17T22:53:56Z","event":"Docked","StationName":"Wallerstein Port","StationType":"Orbis","StarSystem":"Rukarwadja","SystemAddress":672296084921,"MarketID":3224498944,"StationFaction":{"Name":"Rukarwadja Holdings"},"StationGovernment":"$government_Corporate;","StationGovernment_Localised":"Corporate","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","shipyard","tuning","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","shop","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Agri;","StationEconomy_Localised":"Agriculture","StationEconomies":[{"Name":"$economy_Agri;","Name_Localised":"Agriculture","Proportion":1.0}],"DistFromStarLS":81.79269}
{"timestamp":"2022-02-17T22:55:09Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"MISSION_Scan","LocalisedName":"Planetary Scan Job","DestinationSystem":"Sangenses","DestinationStation":"Paulo da Gama Barracks","Expiry":"2022-02-21T21:55:28Z","Wing":false,"Influence":"++","Reputation":"++","Reward":710530,"MissionID":847917114}
{"timestamp":"2022-02-17T22:55:12Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"MISSION_Scan","LocalisedName":"Planetary Scan Job","DestinationSystem":"HIP 7040","DestinationStation":"Leckie Barracks","Expiry":"2022-02-22T17:35:13Z","Wing":false,"Influence":"++","Reputation":"++","Reward":712933,"MissionID":847917127}
{"timestamp":"2022-02-17T22:55:14Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"MISSION_Scan","LocalisedName":"Planetary Scan Job","DestinationSystem":"HIP 7040","DestinationStation":"Ponce de Leon Enterprise","Expiry":"2022-02-21T03:38:43Z","Wing":false,"Influence":"++","Reputation":"++","Reward":715312,"MissionID":847917140}
{"timestamp":"2022-02-17T22:55:16Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"MISSION_Scan","LocalisedName":"Planetary Scan Job","DestinationSystem":"HIP 7040","DestinationStation":"Ponce de Leon Enterprise","Expiry":"2022-02-24T22:54:13Z","Wing":false,"Influence":"++","Reputation":"++","Reward":2410156,"MissionID":847917145}
{"timestamp":"2022-02-17T22:55:45Z","event":"Docked","StationName":"Wallerstein Port","StationType":"Orbis","StarSystem":"Rukarwadja","SystemAddress":672296084921,"MarketID":3224498944,"StationFaction":{"Name":"Rukarwadja Holdings"},"StationGovernment":"$government_Corporate;","StationGovernment_Localised":"Corporate","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","shipyard","tuning","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","shop","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Agri;","StationEconomy_Localised":"Agriculture","StationEconomies":[{"Name":"$economy_Agri;","Name_Localised":"Agriculture","Proportion":1.0}],"DistFromStarLS":81.793432}
{"timestamp":"2022-02-17T22:56:20Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_Sightseeing","LocalisedName":"Madilyn Collins Seeks Sightseeing Adventure","Commodity":"$DomesticAppliances_Name;","Commodity_Localised":"Domestic Appliances","Count":3,"DestinationSystem":"HIP 11263$MISSIONUTIL_MULTIPLE_FINAL_SEPARATOR;Tchernobog","Expiry":"2022-02-18T16:00:11Z","Wing":false,"Influence":"+","Reputation":"+","Reward":2634160,"PassengerCount":5,"PassengerVIPs":true,"PassengerWanted":true,"PassengerType":"Tourist","MissionID":847917343}
{"timestamp":"2022-02-17T22:56:27Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_Sightseeing","LocalisedName":"Jess Fleming Seeks Sightseeing Adventure","Commodity":"$Clothing_Name;","Commodity_Localised":"Clothing","Count":1,"DestinationSystem":"HIP 11263$MISSIONUTIL_MULTIPLE_FINAL_SEPARATOR;NLTT 21088","Expiry":"2022-02-18T10:25:57Z","Wing":false,"Influence":"+","Reputation":"+","Reward":4375900,"PassengerCount":7,"PassengerVIPs":true,"PassengerWanted":true,"PassengerType":"Tourist","MissionID":847917375}
{"timestamp":"2022-02-17T22:56:47Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_Sightseeing","LocalisedName":"Isaac Middleton Seeks Sightseeing Adventure","Commodity":"$Clothing_Name;","Commodity_Localised":"Clothing","Count":3,"DestinationSystem":"Carthage$MISSIONUTIL_MULTIPLE_FINAL_SEPARATOR;HIP 42455","Expiry":"2022-02-18T16:07:05Z","Wing":false,"Influence":"++","Reputation":"++","Reward":3854800,"PassengerCount":4,"PassengerVIPs":true,"PassengerWanted":false,"PassengerType":"Tourist","MissionID":847917444}
{"timestamp":"2022-02-17T22:56:53Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_Sightseeing","LocalisedName":"Gil Petersen-Reilly Seeks Sightseeing Adventure","Commodity":"$ConsumerTechnology_Name;","Commodity_Localised":"Consumer Technology","Count":2,"DestinationSystem":"HIP 112002","Expiry":"2022-02-18T10:19:44Z","Wing":false,"Influence":"+","Reputation":"+","Reward":2166000,"PassengerCount":6,"PassengerVIPs":true,"PassengerWanted":false,"PassengerType":"Tourist","MissionID":847917465}
{"timestamp":"2022-02-17T22:57:03Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_Sightseeing","LocalisedName":"Aislin Finch Seeks Sightseeing Adventure","Commodity":"$DomesticAppliances_Name;","Commodity_Localised":"Domestic Appliances","Count":2,"DestinationSystem":"Ch'eng$MISSIONUTIL_MULTIPLE_FINAL_SEPARATOR;Mu Koji","Expiry":"2022-02-18T14:42:04Z","Wing":false,"Influence":"+","Reputation":"+","Reward":1862400,"PassengerCount":2,"PassengerVIPs":true,"PassengerWanted":true,"PassengerType":"Tourist","MissionID":847917494}
{"timestamp":"2022-02-17T22:57:11Z","event":"MissionAccepted","Faction":"Traditional Yao Tzu Liberty Party","Name":"Mission_Sightseeing","LocalisedName":"Anushka Clay Seeks Sightseeing Adventure","Commodity":"$ConsumerTechnology_Name;","Commodity_Localised":"Consumer Technology","Count":2,"DestinationSystem":"Guttors$MISSIONUTIL_MULTIPLE_INNER_SEPARATOR;Caleta$MISSIONUTIL_MULTIPLE_FINAL_SEPARATOR;Ither","Expiry":"2022-02-18T09:18:21Z","Wing":false,"Influence":"+","Reputation":"+","Reward":6830000,"PassengerCount":8,"PassengerVIPs":true,"PassengerWanted":false,"PassengerType":"Tourist","MissionID":847917524}
{"timestamp":"2022-02-17T23:00:46Z","event":"Docked","StationName":"Wallerstein Port","StationType":"Orbis","StarSystem":"Rukarwadja","SystemAddress":672296084921,"MarketID":3224498944,"StationFaction":{"Name":"Rukarwadja Holdings"},"StationGovernment":"$government_Corporate;","StationGovernment_Localised":"Corporate","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","shipyard","tuning","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","shop","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Agri;","StationEconomy_Localised":"Agriculture","StationEconomies":[{"Name":"$economy_Agri;","Name_Localised":"Agriculture","Proportion":1.0}],"DistFromStarLS":81.795326}
{"timestamp":"2022-02-17T23:01:02Z","event":"MissionFailed","Name":"Mission_Sightseeing_name","MissionID":847917494}
{"timestamp":"2022-02-17T23:01:07Z","event":"MissionFailed","Name":"Mission_Sightseeing_name","MissionID":847917465}
{"timestamp":"2022-02-17T23:01:11Z","event":"MissionFailed","Name":"Mission_Sightseeing_name","MissionID":847917375}
{"timestamp":"2022-02-17T23:01:15Z","event":"MissionFailed","Name":"Mission_Sightseeing_name","MissionID":847917343}
{"timestamp":"2022-02-17T23:01:19Z","event":"MissionFailed","Name":"Mission_Sightseeing_name","MissionID":847917444}
{"timestamp":"2022-02-17T23:01:23Z","event":"MissionFailed","Name":"Mission_Sightseeing_name","MissionID":847917524}
{"timestamp":"2022-02-17T23:02:33Z","event":"Docked","StationName":"Wallerstein Port","StationType":"Orbis","StarSystem":"Rukarwadja","SystemAddress":672296084921,"MarketID":3224498944,"StationFaction":{"Name":"Rukarwadja Holdings"},"StationGovernment":"$government_Corporate;","StationGovernment_Localised":"Corporate","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","shipyard","tuning","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","shop","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Agri;","StationEconomy_Localised":"Agriculture","StationEconomies":[{"Name":"$economy_Agri;","Name_Localised":"Agriculture","Proportion":1.0}],"DistFromStarLS":81.795937}
{"timestamp":"2022-02-17T23:10:05Z","event":"Location","Docked":true,"StationName":"Wallerstein Port","StationType":"Orbis","MarketID":3224498944,"StationFaction":{"Name":"Rukarwadja Holdings"},"StationGovernment":"$government_Corporate;","StationGovernment_Localised":"Corporate","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","shipyard","tuning","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","shop","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Agri;","StationEconomy_Localised":"Agriculture","StationEconomies":[{"Name":"$economy_Agri;","Name_Localised":"Agriculture","Proportion":1.0}],"StarSystem":"Rukarwadja","SystemAddress":672296084921,"StarPos":[100.90625,-184.125,39.625],"SystemAllegiance":"Empire","SystemEconomy":"$economy_Agri;","SystemEconomy_Localised":"Agriculture","SystemSecondEconomy":"$economy_Tourism;","SystemSecondEconomy_Localised":"Tourism","SystemGovernment":"$government_Corporate;","SystemGovernment_Localised":"Corporate","SystemSecurity":"$SYSTEM_SECURITY_medium;","SystemSecurity_Localised":"Medium Security","Population":9529639756,"Body":"Wallerstein Port","BodyID":31,"BodyType":"Station","Factions":[{"Name":"Rukarwadja Emperor's Grace","FactionState":"CivilWar","Government":"Patronage","Influence":0.14881,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"ActiveStates":[{"State":"CivilWar"}]},{"Name":"Rukarwadja Holdings","FactionState":"None","Government":"Corporate","Influence":0.450397,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":2.5466},{"Name":"Raiders of Rukarwadja","FactionState":"None","Government":"Anarchy","Influence":0.026786,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Traditional Yao Tzu Liberty Party","FactionState":"None","Government":"Dictatorship","Influence":0.042659,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":-27.75},{"Name":"Rukarwadja General Partners","FactionState":"CivilWar","Government":"Corporate","Influence":0.14881,"Allegiance":"Empire","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0,"ActiveStates":[{"State":"CivilWar"}]},{"Name":"New Rukarwadja Free","FactionState":"None","Government":"Democracy","Influence":0.059524,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0},{"Name":"Di Yomi Praetorian Confederacy","FactionState":"None","Government":"Confederacy","Influence":0.123016,"Allegiance":"Independent","Happiness":"$Faction_HappinessBand2;","Happiness_Localised":"Happy","MyReputation":0.0}],"SystemFaction":{"Name":"Rukarwadja Holdings"},"Conflicts":[{"WarType":"civilwar","Status":"active","Faction1":{"Name":"Rukarwadja Emperor's Grace","Stake":"Regent's Villas","WonDays":0},"Faction2":{"Name":"Rukarwadja General Partners","Stake":"Purandare's Works","WonDays":0}}]}
{"timestamp":"2022-02-17T23:10:05Z","event":"Docked","StationName":"Wallerstein Port","StationType":"Orbis","StarSystem":"Rukarwadja","SystemAddress":672296084921,"MarketID":3224498944,"StationFaction":{"Name":"Rukarwadja Holdings"},"StationGovernment":"$government_Corporate;","StationGovernment_Localised":"Corporate","StationAllegiance":"Empire","StationServices":["dock","autodock","commodities","contacts","exploration","missions","outfitting","crewlounge","rearm","refuel","repair","shipyard","tuning","engineer","missionsgenerated","flightcontroller","stationoperations","powerplay","searchrescue","stationMenu","shop","socialspace","bartender","vistagenomics","pioneersupplies","apexinterstellar","frontlinesolutions"],"StationEconomy":"$economy_Agri;","StationEconomy_Localised":"Agriculture","StationEconomies":[{"Name":"$economy_Agri;","Name_Localised":"Agriculture","Proportion":1.0}],"DistFromStarLS":81.798201}
{"timestamp":"2022-02-17T23:10:14Z","event":"MissionFailed","Name":"MISSION_Scan_name","MissionID":847917140}
{"timestamp":"2022-02-17T23:10:17Z","event":"MissionFailed","Name":"MISSION_Scan_name","MissionID":847917127}
{"timestamp":"2022-02-17T23:10:21Z","event":"MissionFailed","Name":"MISSION_Scan_name","MissionID":847917114}
{"timestamp":"2022-02-17T23:10:24Z","event":"MissionFailed","Name":"MISSION_Scan_name","MissionID":847917145}

Some files were not shown because too many files have changed in this diff Show More