detect trade profit, and allow adjusting it

This commit is contained in:
Florian Stinglmayr 2022-01-12 17:29:58 +01:00
parent 3f1af39ff1
commit 411a0262c1
11 changed files with 131 additions and 5 deletions

24
AdjustProfitWindow.xaml Normal file
View File

@ -0,0 +1,24 @@
<Window x:Class="EliteBGS.AdjustProfitWindow"
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="Adjust Trade Profit" Height="130" Width="450">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Label Content="Use this dialog to adjust trade profits" Grid.Row="0" Grid.ColumnSpan="2" />
<TextBox x:Name="Profit" Grid.Row="1" Grid.ColumnSpan="2" Margin="10,10,10,10"/>
<Button x:Name="Cancel" Content="Cancel" Width="60" Grid.Row="2" Grid.Column="0" HorizontalAlignment="Right" Margin="5,0,5,0" IsCancel="true" Click="Cancel_Click"/>
<Button x:Name="Accept" Content="Accept" Width="60" Grid.Row="2" Grid.Column="1" HorizontalAlignment="Right" Margin="5,0,5,0" IsDefault="true" Click="Accept_Click" />
</Grid>
</Window>

View File

@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace EliteBGS {
/// <summary>
/// Interaction logic for AdjustProfitWindow.xaml
/// </summary>
public partial class AdjustProfitWindow : Window {
public AdjustProfitWindow() {
InitializeComponent();
}
private void Cancel_Click(object sender, RoutedEventArgs e) {
DialogResult = false;
Close();
}
private void Accept_Click(object sender, RoutedEventArgs e) {
DialogResult = true;
Close();
}
}
}

View File

@ -7,6 +7,8 @@ namespace EliteBGS.BGS {
public class LogEntry : IComparable<LogEntry> {
private List<Entry> entries = new List<Entry>();
public bool IsExpanded { get; set; }
/// <summary>
/// Controlling faction of the station this entry was made/turned into.
/// </summary>

View File

@ -39,6 +39,7 @@ namespace EliteBGS.BGS {
e.Is(Events.SellMicroResources) ||
e.Is(Events.RedeemVoucher) ||
e.Is(Events.FactionKillBond) ||
e.Is(Events.MarketBuy) ||
e.Is(Events.MarketSell)
;
}
@ -55,6 +56,8 @@ namespace EliteBGS.BGS {
Dictionary<int, MissionAcceptedEntry> acceptedMissions = new Dictionary<int, MissionAcceptedEntry>();
Dictionary<string, int> buyCost = new Dictionary<string, int>();
string current_system = null;
string current_station = null;
string controlling_faction = null;
@ -91,9 +94,9 @@ namespace EliteBGS.BGS {
}
} else if (e.Is(Events.MissionCompleted)) {
var completed = e as MissionCompletedEntry;
entry = new MissionCompleted(completed) {
System = current_system,
Station = current_station
entry = new MissionCompleted(completed) {
System = current_system,
Station = current_station
};
if (completed.HumanReadableNameWasGenerated) {
/* If the human readable name was generated, we send a log message. Because the
@ -149,11 +152,28 @@ namespace EliteBGS.BGS {
};
entry.Entries.Add(e);
} else if (e.Is(Events.MarketBuy)) {
MarketBuyEntry buy = e as MarketBuyEntry;
if (string.IsNullOrEmpty(buy.Type) || buy.BuyPrice == 0) {
continue;
}
buyCost[buy.Type] = buy.BuyPrice;
} else if (e.Is(Events.MarketSell)) {
MarketSellEntry sell = e as MarketSellEntry;
int profit = 0;
if (!buyCost.ContainsKey(sell.Type)) {
OnLog?.Invoke("Could not find buy order for the given commodity. Please adjust profit manually.");
} else {
int avg = buyCost[sell.Type];
profit = sell.TotalSale - (avg * sell.Count);
}
entry = new SellCargo() {
Faction = controlling_faction,
Station = current_station,
System = current_system
System = current_system,
Profit = profit
};
entry.Entries.Add(e);

View File

@ -4,6 +4,7 @@ using EDJournal;
namespace EliteBGS.BGS {
public class SellCargo : LogEntry {
public int Profit { get; set; }
public override string ToString() {
StringBuilder builder = new StringBuilder();
var sold = Entries.OfType<MarketSellEntry>().ToArray();
@ -13,11 +14,18 @@ namespace EliteBGS.BGS {
}
foreach (MarketSellEntry sell in sold) {
builder.AppendFormat("Sold {0} {1} to the {2}\n",
builder.AppendFormat("Sold {0} {1} to the {2}",
sell.Count,
sell.Type,
sell.BlackMarket ? "Black Market" : "Commodity Market"
);
if (Profit != 0) {
builder.AppendFormat(" ({0} {1})",
Credits.FormatCredits(Profit),
Profit < 0 ? "loss" : "profit"
);
}
}
return builder.ToString().Trim();

View File

@ -77,6 +77,9 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="AdjustProfitWindow.xaml.cs">
<DependentUpon>AdjustProfitWindow.xaml</DependentUpon>
</Compile>
<Compile Include="BGS\DiscordLogGenerator.cs" />
<Compile Include="BGS\GenericDiscordLog.cs" />
<Compile Include="BGS\MissionFailed.cs" />
@ -102,6 +105,10 @@
<Compile Include="CombatZoneDialog.xaml.cs">
<DependentUpon>CombatZoneDialog.xaml</DependentUpon>
</Compile>
<Page Include="AdjustProfitWindow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>

View File

@ -39,6 +39,8 @@
<Button x:Name="AddFilter" Content="Add Objective" VerticalAlignment="Stretch" Click="AddFilter_Click" Margin="0,0,0,0.286" RenderTransformOrigin="0.5,0.505"/>
<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 Height="26.2857142857143" Margin="0" VerticalAlignment="Top"/>
<Button x:Name="AdjustProfit" Content="Adjust Trade Profit" Margin="0" VerticalAlignment="Stretch" Click="AdjustProfit_Click" />
</ToolBar>
<ToolBar VerticalAlignment="Top" Grid.Row="1" 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"/>

View File

@ -277,5 +277,25 @@ namespace EliteBGS {
objective.LogEntries.Add(zone);
RefreshObjectives();
}
private void AdjustProfit_Click(object sender, RoutedEventArgs e) {
if (entries.SelectedItem == null || entries.SelectedItem.GetType() != typeof(SellCargo)) {
return;
}
SellCargo sell = entries.SelectedItem as SellCargo;
AdjustProfitWindow adjust = new AdjustProfitWindow() { Owner = this };
adjust.Profit.Text = sell.Profit.ToString();
if (!(adjust.ShowDialog() ?? false)) {
return;
}
if (int.TryParse(adjust.Profit.Text, out int newprofit)) {
sell.Profit = newprofit;
RefreshObjectives();
}
}
}
}

View File

@ -24,11 +24,20 @@ will check your Elite Dangerous player journal for completed missions. Currently
recognises the following completed tasks:
* Completed missions
* Failed missions
* Vouchers, including bounty vouchers, combat bonds, and settlement vouchers (aka intel packages)
* Selling of micro resources (Odyssey only)
* Selling cartography data
* Selling of cargo to stations
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.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 30 KiB