Compare commits

...

5 Commits

6 changed files with 79 additions and 92 deletions

View File

@ -3,20 +3,40 @@ using System.Linq;
namespace EDPlayerJournal.BGS; namespace EDPlayerJournal.BGS;
public class CombatZone : Transaction { public class CombatZone : Transaction {
/// <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>
/// 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> /// <summary>
/// Type, either on foot or ship /// Type, either on foot or ship
/// </summary> /// </summary>
public string Type { get; set; } = "Ship"; public string Type { get; set; } = ShipCombatZone;
/// <summary> /// <summary>
/// Difficulty type, low, medium or high. /// Difficulty type, low, medium or high.
/// </summary> /// </summary>
public string Grade { get; set; } = "Low"; public string Grade { get; set; } = DifficultyLow;
/// <summary>
/// How many?
/// </summary>
public int Amount { get; set; } = 1;
/// <summary> /// <summary>
/// Whether spec ops were won. /// Whether spec ops were won.
@ -57,14 +77,14 @@ public class CombatZone : Transaction {
/// Returns true if it is an on foot/ground combat zone /// Returns true if it is an on foot/ground combat zone
/// </summary> /// </summary>
public bool IsGround { public bool IsGround {
get { return string.Compare(Type, "On Foot") == 0; } get { return string.Compare(Type, GroundCombatZone) == 0; }
} }
/// <summary> /// <summary>
/// Returns true if it is an on foot combat zone /// Returns true if it is an on foot combat zone
/// </summary> /// </summary>
public bool IsShip { public bool IsShip {
get { return string.Compare(Type, "Ship") == 0; } get { return string.Compare(Type, ShipCombatZone) == 0; }
} }
public override int CompareTo(Transaction? obj) { public override int CompareTo(Transaction? obj) {
@ -89,6 +109,6 @@ public class CombatZone : Transaction {
} }
public override string ToString() { public override string ToString() {
return string.Format("Won {0} x {1} {2} Combat Zone(s)", Amount, Grade, Type); return string.Format("Won {0} {1} Combat Zone", Grade, Type);
} }
} }

View File

@ -57,7 +57,7 @@ internal class TransactionParserContext {
public Dictionary<string, long> BuyCost = new(); public Dictionary<string, long> BuyCost = new();
public void DiscernCombatZone(TransactionList transactions, Entry e) { public void DiscernCombatZone(TransactionList transactions, Entry e) {
string grade = "Low"; string grade = CombatZone.DifficultyLow;
string cztype; string cztype;
ulong? highest = HighestCombatBond; ulong? highest = HighestCombatBond;
@ -66,40 +66,40 @@ internal class TransactionParserContext {
} }
if (OnFootKills > 0) { if (OnFootKills > 0) {
cztype = "On Foot"; cztype = CombatZone.GroundCombatZone;
// High on foot combat zones have enforcers that bring 80k a pop // High on foot combat zones have enforcers that bring 80k a pop
if (highest >= 80000) { if (highest >= 80000) {
grade = "High"; grade = CombatZone.DifficultyHigh;
} else if (highest >= 40000) { } else if (highest >= 40000) {
grade = "Medium"; grade = CombatZone.DifficultyMedium;
} else { } else {
grade = "Low"; grade = CombatZone.DifficultyLow;
} }
} else if (ShipKills > 0) { } else if (ShipKills > 0) {
// Ship combat zones can be identified by the amount of kills // Ship combat zones can be identified by the amount of kills
if (ShipKills > 20) { if (ShipKills > 20) {
grade = "High"; grade = CombatZone.DifficultyHigh;
} else if (ShipKills > 10) { } else if (ShipKills > 10) {
grade = "Medium"; grade = CombatZone.DifficultyMedium;
} }
// Cap ship, means a high conflict zone // Cap ship, means a high conflict zone
if (HaveSeenCapShip) { if (HaveSeenCapShip) {
grade = "High"; grade = CombatZone.DifficultyHigh;
} else { } else {
int warzoneNpcs = new List<bool>() { HaveSeenCaptain, HaveSeenCorrespondent, HaveSeenSpecOps } int warzoneNpcs = new List<bool>() { HaveSeenCaptain, HaveSeenCorrespondent, HaveSeenSpecOps }
.Where(x => x == true) .Where(x => x == true)
.Count() .Count()
; ;
if (warzoneNpcs >= 2 && grade != "High") { if (warzoneNpcs >= 2 && grade != CombatZone.DifficultyHigh) {
// Only large combat zones have two NPCs // Only large combat zones have two NPCs
grade = "High"; grade = CombatZone.DifficultyHigh;
} else if (warzoneNpcs >= 1 && grade == "Low") { } else if (warzoneNpcs >= 1 && grade == CombatZone.DifficultyLow) {
grade = "Medium"; grade = CombatZone.DifficultyMedium;
} }
} }
cztype = "Ship"; cztype = CombatZone.ShipCombatZone;
} else { } else {
transactions.AddIncomplete(new CombatZone(), "Failed to discern combat zone type"); transactions.AddIncomplete(new CombatZone(), "Failed to discern combat zone type");
return; return;
@ -116,7 +116,6 @@ internal class TransactionParserContext {
SpecOps = HaveSeenSpecOps ? true : null, SpecOps = HaveSeenSpecOps ? true : null,
Correspondent = HaveSeenCorrespondent ? true : null, Correspondent = HaveSeenCorrespondent ? true : null,
Captain = HaveSeenCaptain ? true : null, Captain = HaveSeenCaptain ? true : null,
Amount = 1,
}; };
zone.Entries.Add(e); zone.Entries.Add(e);
transactions.Add(zone); transactions.Add(zone);

View File

@ -14,14 +14,6 @@
<PropertyGroup> <PropertyGroup>
<ApplicationIcon>Salus.ico</ApplicationIcon> <ApplicationIcon>Salus.ico</ApplicationIcon>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<Reference Include="EDJournal, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\edjournal\bin\Debug\EDJournal.dll</HintPath>
</Reference>
<Reference Include="System.Design" />
<Reference Include="System.Security" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<Resource Include="main-page.png"> <Resource Include="main-page.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
@ -59,10 +51,6 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" /> <PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="System.Data.DataSetExtensions" Version="4.5.0" />
<PackageReference Include="Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers" Version="0.4.355802">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.Windows.Compatibility" Version="7.0.0" /> <PackageReference Include="Microsoft.Windows.Compatibility" Version="7.0.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -22,7 +22,7 @@ class CombatZoneFormat : LogFormatter {
int optionals = log.Value int optionals = log.Value
.Sum(x => x.OptionalObjectivesCompleted) .Sum(x => x.OptionalObjectivesCompleted)
; ;
builder.AppendFormat("Won {0}x {1} {2} Combat Zones", builder.AppendFormat("Won {0}x {1} {2} Combat Zone(s)",
log.Value.Count, log.Value.Count,
log.Key.Grade, log.Key.Grade,
log.Key.Type log.Key.Type

View File

@ -43,8 +43,6 @@
<DatePicker x:Name="startdate" Height="26.2857142857143" VerticalAlignment="Center" HorizontalAlignment="Center"/> <DatePicker x:Name="startdate" Height="26.2857142857143" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<Label Content="To:" Height="26.2857142857143" VerticalAlignment="Top"/> <Label Content="To:" Height="26.2857142857143" VerticalAlignment="Top"/>
<DatePicker x:Name="enddate" Height="26.2857142857143" VerticalAlignment="Center" HorizontalAlignment="Center"/> <DatePicker x:Name="enddate" Height="26.2857142857143" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<Separator Height="26.2857142857143" Margin="0" VerticalAlignment="Top"/>
<Button x:Name="AddCombatZone" Content="Add Combat Zone Win" VerticalAlignment="Stretch" Margin="0,0,0,0.286" RenderTransformOrigin="0.5,0.505" Click="AddCombatZone_Click"/>
<Separator Margin="1" VerticalAlignment="Center" MinWidth="1" HorizontalAlignment="Center" MinHeight="22"/> <Separator Margin="1" VerticalAlignment="Center" MinWidth="1" HorizontalAlignment="Center" MinHeight="22"/>
<Button x:Name="ManuallyParse" Content="Manually Parse JSON" Click="ManuallyParse_Click" /> <Button x:Name="ManuallyParse" Content="Manually Parse JSON" Click="ManuallyParse_Click" />
</ToolBar> </ToolBar>
@ -58,19 +56,34 @@
> >
<TreeView.ItemTemplate> <TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Objective}" ItemsSource="{Binding UITransactions}" ItemContainerStyle="{StaticResource StretchingTreeViewStyle}"> <HierarchicalDataTemplate DataType="{x:Type local:Objective}" ItemsSource="{Binding UITransactions}" ItemContainerStyle="{StaticResource StretchingTreeViewStyle}">
<StackPanel Orientation="Horizontal"> <Grid
<CheckBox Focusable="False" IsChecked="{Binding IsEnabled}" VerticalAlignment="Center"/> HorizontalAlignment="Stretch"
<TextBlock Text="System: " Visibility="{Binding HasSystem}" Margin="5,0,0,0"/> Width="{Binding ActualWidth, ElementName=entries, Converter={StaticResource MinusFortyFiveConverter}}"
<TextBlock Text="{Binding System}" FontWeight="DemiBold" Visibility="{Binding HasSystem}"/> >
<TextBlock Text="Faction: " Visibility="{Binding HasFaction}" Margin="5,0,0,0"/> <Grid.ColumnDefinitions>
<TextBlock Text="{Binding Faction}" FontWeight="DemiBold" Visibility="{Binding HasFaction}"/> <ColumnDefinition Width="Auto"/>
</StackPanel> <ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Horizontal">
<CheckBox Focusable="False" IsChecked="{Binding IsEnabled}" VerticalAlignment="Center"/>
<TextBlock Text="System: " Visibility="{Binding HasSystem}" Margin="5,0,0,0"/>
<TextBlock Text="{Binding System}" FontWeight="DemiBold" Visibility="{Binding HasSystem}"/>
<TextBlock Text="Faction: " Visibility="{Binding HasFaction}" Margin="5,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">
<Button x:Name="AddCombatZone" Content="Add Combat Zone" Click="AddCombatZone_Click" />
</StackPanel>
</Grid>
<HierarchicalDataTemplate.ItemTemplate> <HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate> <HierarchicalDataTemplate>
<!-- This will stretch out the width of the item--> <!-- This will stretch out the width of the item-->
<Grid Initialized="Transaction_Initialized" <Grid Initialized="Transaction_Initialized"
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
Width="{Binding ActualWidth, ElementName=entries, Converter={StaticResource MinusFortyFiveConverter}}" Width="{Binding ActualWidth, ElementName=entries, Converter={StaticResource MinusFortyFiveConverter}}"
Margin="0,5,0,5"
> >
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
@ -95,7 +108,7 @@
<Separator Margin="2,0,2,0" VerticalAlignment="Top"/> <Separator Margin="2,0,2,0" VerticalAlignment="Top"/>
<Button Content="High" x:Name="High" Click="High_Click"/> <Button Content="High" x:Name="High" Click="High_Click"/>
<Separator Margin="2,0,2,0" VerticalAlignment="Top"/> <Separator Margin="2,0,2,0" VerticalAlignment="Top"/>
<Button Content="On Foot" x:Name="OnFoot" Click="OnFoot_Click"/> <Button Content="Ground" x:Name="Ground" Click="Ground_Click"/>
<Separator Margin="2,0,2,0" VerticalAlignment="Top"/> <Separator Margin="2,0,2,0" VerticalAlignment="Top"/>
<Button Content="Ship" x:Name="Ship" Click="Ship_Click"/> <Button Content="Ship" x:Name="Ship" Click="Ship_Click"/>
</StackPanel> </StackPanel>

View File

@ -202,55 +202,22 @@ public partial class MainWindow : Window {
journal = new PlayerJournal(Config.Global.JournalLocation); journal = new PlayerJournal(Config.Global.JournalLocation);
} }
/// <summary>
/// Gets the currently selected objective, even if a log entry in said objective
/// is selected instead. If nothing is selected, returns null.
/// </summary>
/// <returns></returns>
private Objective GetSelectedObjective() {
var obj = entries.SelectedItem;
if (obj == null) {
return null;
}
if (obj.GetType() == typeof(Objective)) {
return obj as Objective;
}
// Some form of entry perhaps?
if (obj.GetType().IsSubclassOf(typeof(Transaction))) {
Transaction entry = obj as Transaction;
Objective objective = entries.Items
.OfType<Objective>()
.First(x => x.Transactions.Contains(entry))
;
return objective;
}
return null;
}
private void AddCombatZone_Click(object sender, RoutedEventArgs e) { private void AddCombatZone_Click(object sender, RoutedEventArgs e) {
Objective objective = GetSelectedObjective(); System.Windows.Controls.Control control = sender as System.Windows.Controls.Control;
if (control == null || control.DataContext == null) {
if (objective == null) {
return; return;
} }
CombatZoneDialog dialog = new CombatZoneDialog() { Owner = this }; Objective objective = control.DataContext as Objective;
if (objective == null) {
if (!(dialog.ShowDialog() ?? false)) {
return; return;
} }
CombatZone zone = new CombatZone { CombatZone zone = new CombatZone {
Faction = objective.Faction, Faction = objective.Faction,
System = objective.System, System = objective.System,
Grade = dialog.Grade, Grade = "Low",
Type = dialog.Type, Type = "Ship",
Amount = dialog.Amount
}; };
UITransaction uitransaction = new UITransaction(zone); UITransaction uitransaction = new UITransaction(zone);
@ -318,7 +285,7 @@ public partial class MainWindow : Window {
return; return;
} }
transaction.Grade = "Low"; transaction.Grade = CombatZone.DifficultyLow;
RefreshView(); RefreshView();
} }
@ -328,7 +295,7 @@ public partial class MainWindow : Window {
return; return;
} }
transaction.Grade = "Medium"; transaction.Grade = CombatZone.DifficultyMedium;
RefreshView(); RefreshView();
} }
@ -338,17 +305,17 @@ public partial class MainWindow : Window {
return; return;
} }
transaction.Grade = "High"; transaction.Grade = CombatZone.DifficultyHigh;
RefreshView(); RefreshView();
} }
private void OnFoot_Click(object sender, RoutedEventArgs e) { private void Ground_Click(object sender, RoutedEventArgs e) {
CombatZone transaction = GetTransaction<CombatZone>(sender); CombatZone transaction = GetTransaction<CombatZone>(sender);
if (transaction == null) { if (transaction == null) {
return; return;
} }
transaction.Type = "On Foot"; transaction.Type = CombatZone.GroundCombatZone;
RefreshView(); RefreshView();
} }
@ -358,7 +325,7 @@ public partial class MainWindow : Window {
return; return;
} }
transaction.Type = "Ship"; transaction.Type = CombatZone.ShipCombatZone;
RefreshView(); RefreshView();
} }