diff --git a/ARKBreedingStats/ARKBreedingStats.csproj b/ARKBreedingStats/ARKBreedingStats.csproj
index 49706bfd9..f03597590 100644
--- a/ARKBreedingStats/ARKBreedingStats.csproj
+++ b/ARKBreedingStats/ARKBreedingStats.csproj
@@ -87,6 +87,10 @@
+
+ Form1.cs
+ Form
+
@@ -997,7 +1001,7 @@
- 48.0.3
+ 49.0.2
3.3.4
diff --git a/ARKBreedingStats/ARKOverlay.cs b/ARKBreedingStats/ARKOverlay.cs
index 210aeac7b..aa4023dba 100644
--- a/ARKBreedingStats/ARKOverlay.cs
+++ b/ARKBreedingStats/ARKOverlay.cs
@@ -80,6 +80,7 @@ public ARKOverlay()
public void SetInfoPositionsAndFontSize()
{
labelTimer.Location = Properties.Settings.Default.OverlayTimerPosition;
+ labelInfo.Size = Properties.Settings.Default.OverlayInfoSize;
labelInfo.Location = new Point(Size.Width - labelInfo.Width - Properties.Settings.Default.OverlayInfoPosition.X, Properties.Settings.Default.OverlayInfoPosition.Y);
SetLabelFontSize(Properties.Settings.Default.OverlayRelativeFontSize);
}
diff --git a/ARKBreedingStats/App.config b/ARKBreedingStats/App.config
index 9d448ab77..179ae62f1 100644
--- a/ARKBreedingStats/App.config
+++ b/ARKBreedingStats/App.config
@@ -520,6 +520,18 @@
True
+
+ False
+
+
+ False
+
+
+
+
+
+ 400, 800
+
diff --git a/ARKBreedingStats/AsbServer/Connection.cs b/ARKBreedingStats/AsbServer/Connection.cs
index c8bbda87b..f1dc08911 100644
--- a/ARKBreedingStats/AsbServer/Connection.cs
+++ b/ARKBreedingStats/AsbServer/Connection.cs
@@ -6,6 +6,7 @@
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
+using System.Windows.Forms.VisualStyles;
using ARKBreedingStats.importExportGun;
using ARKBreedingStats.Library;
using Newtonsoft.Json.Linq;
@@ -22,9 +23,9 @@ internal static class Connection
private static CancellationTokenSource _lastCancellationTokenSource;
public static async void StartListeningAsync(
- IProgress progressDataSent, string token = null)
+ IProgress progressDataSent, string serverToken = null)
{
- if (string.IsNullOrEmpty(token)) return;
+ if (string.IsNullOrEmpty(serverToken)) return;
// stop previous listening if any
StopListening();
@@ -37,7 +38,8 @@ public static async void StartListeningAsync(
while (!cancellationTokenSource.Token.IsCancellationRequested)
{
- var requestUri = ApiUri + "listen/" + token; // "https://httpstat.us/429";
+ //var requestUri = "https://httpstat.us/429"; // for debugging
+ var requestUri = ApiUri + "listen/" + serverToken;
try
{
@@ -56,6 +58,7 @@ public static async void StartListeningAsync(
catch
{
// server message in unknown format, use raw content string
+ serverMessage = "unknown response content format, expected json token \"error.message\" not found in content: " + serverMessage;
}
serverMessage = Environment.NewLine + serverMessage;
@@ -89,14 +92,13 @@ public static async void StartListeningAsync(
using (var stream = await response.Content.ReadAsStreamAsync())
using (var reader = new StreamReader(stream))
{
- var report = await ReadServerSentEvents(reader, progressDataSent, token, cancellationTokenSource.Token);
+ var report = await ReadServerSentEvents(reader, progressDataSent, serverToken, cancellationTokenSource.Token);
if (report != null)
{
+ if (report.StoppedListening
+ && cancellationTokenSource == _lastCancellationTokenSource)
+ _lastCancellationTokenSource = null;
progressDataSent.Report(report);
- if (report.StopListening)
- {
- StopListening();
- }
}
}
}
@@ -116,42 +118,40 @@ public static async void StartListeningAsync(
finally
{
#if DEBUG
- Console.WriteLine($"ASB Server listening stopped using token: {token}");
+ Console.WriteLine($"{DateTime.Now}: ASB Server listening stopped using token: {serverToken}");
#endif
}
}
- }
-
- _lastCancellationTokenSource = null;
- return;
-
- // Displays an error message in the UI, also logs on the console if in debug mode
- void WriteErrorMessage(string message, HttpResponseMessage response = null, bool stopListening = true)
- {
- if (response != null)
+ // Displays an error message in the UI, also logs on the console if in debug mode
+ void WriteErrorMessage(string message, HttpResponseMessage response = null, bool stopListening = true)
{
- message = $"{(int)response.StatusCode}: {response.ReasonPhrase}{Environment.NewLine}{message}";
- }
+ if (response != null)
+ {
+ message = $"{(int)response.StatusCode}: {response.ReasonPhrase}{Environment.NewLine}{message}";
+ }
#if DEBUG
- Console.WriteLine(message);
+ Console.WriteLine(message);
#endif
- progressDataSent.Report(new ProgressReportAsbServer { Message = message, StopListening = stopListening, IsError = true });
+ if (stopListening)
+ cancellationTokenSource.Cancel();
+ progressDataSent.Report(new ProgressReportAsbServer { Message = message, StoppedListening = stopListening, IsError = true });
+ }
}
}
- private static Regex _eventRegex = new Regex(@"^event: (welcome|ping|replaced|export|server|closing)(?: (\-?\d+))?(?:\ndata:\s(.+))?$");
+ private static readonly Regex ServerEventRegex = new Regex(@"^event: (welcome|ping|replaced|export|server|closing)(?: (\-?\d+))?(?:\ndata:\s(.+))?$");
- private static async Task ReadServerSentEvents(StreamReader reader, IProgress progressDataSent, string token, CancellationToken cancellationToken)
+ private static async Task ReadServerSentEvents(StreamReader reader, IProgress progressDataSent, string serverToken, CancellationToken cancellationToken)
{
#if DEBUG
- Console.WriteLine($"Now listening using token: {token}");
+ Console.WriteLine($"{DateTime.Now}: Now listening using token: {serverToken}");
#endif
progressDataSent.Report(new ProgressReportAsbServer
{
- Message = "Now listening to the export server using the token (also copied to clipboard)",
- ServerToken = token,
- ClipboardText = token
+ Message = $"Now listening for remote exports.{Environment.NewLine}Enter the following token into the ASB export gun mod:",
+ ServerToken = serverToken,
+ ClipboardText = serverToken
});
while (!cancellationToken.IsCancellationRequested)
@@ -161,7 +161,7 @@ private static async Task ReadServerSentEvents(StreamRe
continue; // empty line marks end of event
#if DEBUG
- Console.WriteLine($"{received} (token: {token})");
+ Console.WriteLine($"{DateTime.Now}: {received} (token: {serverToken})");
#endif
switch (received)
{
@@ -171,36 +171,51 @@ private static async Task ReadServerSentEvents(StreamRe
continue;
case "event: replaced":
if (cancellationToken.IsCancellationRequested) return null;
-
return new ProgressReportAsbServer
{
Message = "ASB Server listening stopped. Connection used by a different user",
- StopListening = true,
+ StoppedListening = true,
IsError = true
};
case "event: closing":
// only report closing if the user hasn't done this already
if (cancellationToken.IsCancellationRequested) return null;
return new ProgressReportAsbServer
- { Message = "ASB Server listening stopped. Connection closed by the server, trying to reconnect", StopListening = false, IsError = true };
+ {
+ Message = "ASB Server listening stopped. Connection closed by the server, trying to reconnect",
+ IsError = true
+ };
}
if (received != "event: export" && !received.StartsWith("event: server"))
{
- Console.WriteLine($"unknown server event: {received}");
+ Console.WriteLine($"{DateTime.Now}: unknown server event: {received}");
continue;
}
received += "\n" + await reader.ReadLineAsync();
if (cancellationToken.IsCancellationRequested)
break;
- var m = _eventRegex.Match(received);
+ var m = ServerEventRegex.Match(received);
if (m.Success)
{
switch (m.Groups[1].Value)
{
case "export":
- progressDataSent.Report(new ProgressReportAsbServer { JsonText = m.Groups[3].Value });
+ var report = new ProgressReportAsbServer
+ {
+ JsonText = m.Groups[3].Value,
+ TaskNameGenerated = new TaskCompletionSource()
+ };
+ progressDataSent.Report(report);
+ var nameGeneratedTask = report.TaskNameGenerated.Task;
+ string creatureName = null;
+ if (nameGeneratedTask.Wait(TimeSpan.FromSeconds(5))
+ && nameGeneratedTask.Status == TaskStatus.RanToCompletion)
+ {
+ creatureName = nameGeneratedTask.Result;
+ // TODO send creatureName as response
+ }
break;
case "server":
progressDataSent.Report(new ProgressReportAsbServer { JsonText = m.Groups[3].Value, ServerHash = m.Groups[2].Value });
@@ -215,13 +230,19 @@ private static async Task ReadServerSentEvents(StreamRe
///
/// Stops the currently running listener. Returns false if no listener was running.
///
- public static void StopListening()
+ public static bool StopListening()
{
if (_lastCancellationTokenSource == null)
- return; // nothing to stop
+ return false; // nothing to stop
+ if (_lastCancellationTokenSource.IsCancellationRequested)
+ {
+ _lastCancellationTokenSource = null;
+ return false; // already stopped
+ }
_lastCancellationTokenSource.Cancel();
_lastCancellationTokenSource = null;
+ return true;
}
///
@@ -237,16 +258,20 @@ public static async void SendCreatureData(Creature creature, string token)
var msg = new HttpRequestMessage(HttpMethod.Put, ApiUri + "export/" + token);
msg.Content = new StringContent(contentString, Encoding.UTF8, "application/json");
msg.Content.Headers.Add("Content-Length", contentString.Length.ToString());
+ Console.WriteLine($"{DateTime.Now}: Sending creature data of {creature} using token: {token}"); //\nContent:\n{contentString}");
using (var response = await client.SendAsync(msg))
{
- Console.WriteLine($"Sent creature data of {creature} using token: {token}\nContent:\n{contentString}");
- Console.WriteLine(msg.ToString());
- Console.WriteLine($"Response: StatusCode {(int)response.StatusCode}, ReasonPhrase: {response.ReasonPhrase}");
+ //Console.WriteLine(msg.ToString());
+ Console.WriteLine($"{DateTime.Now}: Response: StatusCode {(int)response.StatusCode}, ReasonPhrase: {response.ReasonPhrase}");
}
}
+ ///
+ /// Returns a new string token that can be used as identifier in combination with the export gun mod.
+ ///
public static string CreateNewToken()
{
+ // only use characters that are easily distinguishable
var allowedCharacters = Enumerable.Range(0x31, 9) // 1-9
.Concat(Enumerable.Range(0x61, 8)) // a-h
.Concat(new[] { 0x6b, 0x6d, 0x6e }) // k, m, n
@@ -258,16 +283,24 @@ public static string CreateNewToken()
var guid = Guid.NewGuid().ToByteArray();
const int tokenLength = 14; // from these each 5th character is a dash for readability
var token = new char[tokenLength];
- for (var i = 0; i < tokenLength; i++)
+ var checkSum = 0;
+ var tokenLengthWithoutCheckDigit = tokenLength - 1;
+ for (var i = 0; i < tokenLengthWithoutCheckDigit; i++)
{
if ((i + 1) % 5 == 0)
{
token[i] = '-';
continue;
}
- token[i] = allowedCharacters[guid[i] % l];
- }
+ var character = allowedCharacters[guid[i] % l];
+ token[i] = character;
+ checkSum += character;
+ }
+ // use last character as check digit
+ // checkSum % 15, add 1 (to avoid ambiguous 0), display as hex digit (range [1-9a-f])
+ token[tokenLength - 1] = ((checkSum % 15) + 1).ToString("x")[0];
+
return new string(token);
}
@@ -276,6 +309,6 @@ public static string CreateNewToken()
///
public static string TokenStringForDisplay(string token) => Properties.Settings.Default.StreamerMode ? "****" : token;
- public static bool IsCurrentlyListening => _lastCancellationTokenSource != null;
+ public static bool IsCurrentlyListening => _lastCancellationTokenSource?.IsCancellationRequested == false;
}
}
diff --git a/ARKBreedingStats/AsbServer/ProgressReportAsbServer.cs b/ARKBreedingStats/AsbServer/ProgressReportAsbServer.cs
index b8218e772..31b51126d 100644
--- a/ARKBreedingStats/AsbServer/ProgressReportAsbServer.cs
+++ b/ARKBreedingStats/AsbServer/ProgressReportAsbServer.cs
@@ -1,4 +1,6 @@
-namespace ARKBreedingStats.AsbServer
+using System.Threading.Tasks;
+
+namespace ARKBreedingStats.AsbServer
{
///
/// Info of progress reports while listening to an AsbServer.
@@ -10,7 +12,8 @@ internal class ProgressReportAsbServer
public string Message;
public string ServerToken;
public bool IsError;
- public bool StopListening;
+ public bool StoppedListening;
public string ClipboardText;
+ public TaskCompletionSource TaskNameGenerated;
}
}
diff --git a/ARKBreedingStats/BreedingPlanning/BreedingPlan.Designer.cs b/ARKBreedingStats/BreedingPlanning/BreedingPlan.Designer.cs
index 7d7d55c27..7cf7c1c67 100644
--- a/ARKBreedingStats/BreedingPlanning/BreedingPlan.Designer.cs
+++ b/ARKBreedingStats/BreedingPlanning/BreedingPlan.Designer.cs
@@ -91,6 +91,7 @@ private void InitializeComponent()
this.panelCombinations = new System.Windows.Forms.Panel();
this.lbBreedingPlanInfo = new System.Windows.Forms.Label();
this.flowLayoutPanelPairs = new System.Windows.Forms.FlowLayoutPanel();
+ this.CbConsiderMutationLevels = new System.Windows.Forms.CheckBox();
this.tableLayoutMain.SuspendLayout();
this.tableLayoutPanel5.SuspendLayout();
this.gbBPBreedingMode.SuspendLayout();
@@ -117,10 +118,11 @@ private void InitializeComponent()
this.tableLayoutMain.Controls.Add(this.tableLayoutPanel1, 1, 0);
this.tableLayoutMain.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutMain.Location = new System.Drawing.Point(0, 0);
+ this.tableLayoutMain.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.tableLayoutMain.Name = "tableLayoutMain";
this.tableLayoutMain.RowCount = 1;
this.tableLayoutMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
- this.tableLayoutMain.Size = new System.Drawing.Size(1732, 1023);
+ this.tableLayoutMain.Size = new System.Drawing.Size(3464, 1967);
this.tableLayoutMain.TabIndex = 5;
//
// tableLayoutPanel5
@@ -133,17 +135,19 @@ private void InitializeComponent()
this.tableLayoutPanel5.Controls.Add(this.tabControl1, 0, 0);
this.tableLayoutPanel5.Controls.Add(this.statWeighting1, 0, 2);
this.tableLayoutPanel5.Dock = System.Windows.Forms.DockStyle.Fill;
- this.tableLayoutPanel5.Location = new System.Drawing.Point(3, 3);
+ this.tableLayoutPanel5.Location = new System.Drawing.Point(6, 6);
+ this.tableLayoutPanel5.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.tableLayoutPanel5.Name = "tableLayoutPanel5";
this.tableLayoutPanel5.RowCount = 3;
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle());
- this.tableLayoutPanel5.Size = new System.Drawing.Size(244, 1017);
+ this.tableLayoutPanel5.Size = new System.Drawing.Size(488, 1955);
this.tableLayoutPanel5.TabIndex = 0;
//
// gbBPBreedingMode
//
+ this.gbBPBreedingMode.Controls.Add(this.CbConsiderMutationLevels);
this.gbBPBreedingMode.Controls.Add(this.CbIgnoreSexInPlanning);
this.gbBPBreedingMode.Controls.Add(this.CbDontSuggestOverLimitOffspring);
this.gbBPBreedingMode.Controls.Add(this.cbBPMutationLimitOnlyOnePartner);
@@ -156,9 +160,11 @@ private void InitializeComponent()
this.gbBPBreedingMode.Controls.Add(this.rbBPHighStats);
this.gbBPBreedingMode.Controls.Add(this.rbBPTopStats);
this.gbBPBreedingMode.Dock = System.Windows.Forms.DockStyle.Fill;
- this.gbBPBreedingMode.Location = new System.Drawing.Point(3, 503);
+ this.gbBPBreedingMode.Location = new System.Drawing.Point(6, 925);
+ this.gbBPBreedingMode.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.gbBPBreedingMode.Name = "gbBPBreedingMode";
- this.gbBPBreedingMode.Size = new System.Drawing.Size(238, 252);
+ this.gbBPBreedingMode.Padding = new System.Windows.Forms.Padding(6, 6, 6, 6);
+ this.gbBPBreedingMode.Size = new System.Drawing.Size(476, 513);
this.gbBPBreedingMode.TabIndex = 6;
this.gbBPBreedingMode.TabStop = false;
this.gbBPBreedingMode.Text = "Breeding-Mode";
@@ -166,9 +172,10 @@ private void InitializeComponent()
// CbIgnoreSexInPlanning
//
this.CbIgnoreSexInPlanning.AutoSize = true;
- this.CbIgnoreSexInPlanning.Location = new System.Drawing.Point(6, 183);
+ this.CbIgnoreSexInPlanning.Location = new System.Drawing.Point(12, 384);
+ this.CbIgnoreSexInPlanning.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.CbIgnoreSexInPlanning.Name = "CbIgnoreSexInPlanning";
- this.CbIgnoreSexInPlanning.Size = new System.Drawing.Size(142, 17);
+ this.CbIgnoreSexInPlanning.Size = new System.Drawing.Size(283, 29);
this.CbIgnoreSexInPlanning.TabIndex = 11;
this.CbIgnoreSexInPlanning.Text = "Ignore sex for all species";
this.CbIgnoreSexInPlanning.UseVisualStyleBackColor = true;
@@ -177,9 +184,10 @@ private void InitializeComponent()
// CbDontSuggestOverLimitOffspring
//
this.CbDontSuggestOverLimitOffspring.AutoSize = true;
- this.CbDontSuggestOverLimitOffspring.Location = new System.Drawing.Point(6, 229);
+ this.CbDontSuggestOverLimitOffspring.Location = new System.Drawing.Point(12, 466);
+ this.CbDontSuggestOverLimitOffspring.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.CbDontSuggestOverLimitOffspring.Name = "CbDontSuggestOverLimitOffspring";
- this.CbDontSuggestOverLimitOffspring.Size = new System.Drawing.Size(178, 17);
+ this.CbDontSuggestOverLimitOffspring.Size = new System.Drawing.Size(356, 29);
this.CbDontSuggestOverLimitOffspring.TabIndex = 10;
this.CbDontSuggestOverLimitOffspring.Text = "Don\'t suggest over limit offspring";
this.CbDontSuggestOverLimitOffspring.UseVisualStyleBackColor = true;
@@ -188,9 +196,10 @@ private void InitializeComponent()
// cbBPMutationLimitOnlyOnePartner
//
this.cbBPMutationLimitOnlyOnePartner.AutoSize = true;
- this.cbBPMutationLimitOnlyOnePartner.Location = new System.Drawing.Point(29, 160);
+ this.cbBPMutationLimitOnlyOnePartner.Location = new System.Drawing.Point(58, 308);
+ this.cbBPMutationLimitOnlyOnePartner.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.cbBPMutationLimitOnlyOnePartner.Name = "cbBPMutationLimitOnlyOnePartner";
- this.cbBPMutationLimitOnlyOnePartner.Size = new System.Drawing.Size(205, 17);
+ this.cbBPMutationLimitOnlyOnePartner.Size = new System.Drawing.Size(410, 29);
this.cbBPMutationLimitOnlyOnePartner.TabIndex = 8;
this.cbBPMutationLimitOnlyOnePartner.Text = "One partner may have more mutations";
this.cbBPMutationLimitOnlyOnePartner.UseVisualStyleBackColor = true;
@@ -199,9 +208,10 @@ private void InitializeComponent()
// cbBPOnlyOneSuggestionForFemales
//
this.cbBPOnlyOneSuggestionForFemales.AutoSize = true;
- this.cbBPOnlyOneSuggestionForFemales.Location = new System.Drawing.Point(6, 206);
+ this.cbBPOnlyOneSuggestionForFemales.Location = new System.Drawing.Point(12, 425);
+ this.cbBPOnlyOneSuggestionForFemales.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.cbBPOnlyOneSuggestionForFemales.Name = "cbBPOnlyOneSuggestionForFemales";
- this.cbBPOnlyOneSuggestionForFemales.Size = new System.Drawing.Size(178, 17);
+ this.cbBPOnlyOneSuggestionForFemales.Size = new System.Drawing.Size(358, 29);
this.cbBPOnlyOneSuggestionForFemales.TabIndex = 7;
this.cbBPOnlyOneSuggestionForFemales.Text = "Only best suggestion for females";
this.cbBPOnlyOneSuggestionForFemales.UseVisualStyleBackColor = true;
@@ -210,9 +220,10 @@ private void InitializeComponent()
// cbBPIncludeCryoCreatures
//
this.cbBPIncludeCryoCreatures.AutoSize = true;
- this.cbBPIncludeCryoCreatures.Location = new System.Drawing.Point(6, 111);
+ this.cbBPIncludeCryoCreatures.Location = new System.Drawing.Point(12, 213);
+ this.cbBPIncludeCryoCreatures.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.cbBPIncludeCryoCreatures.Name = "cbBPIncludeCryoCreatures";
- this.cbBPIncludeCryoCreatures.Size = new System.Drawing.Size(167, 17);
+ this.cbBPIncludeCryoCreatures.Size = new System.Drawing.Size(334, 29);
this.cbBPIncludeCryoCreatures.TabIndex = 6;
this.cbBPIncludeCryoCreatures.Text = "Include Creatures in Cryopods";
this.cbBPIncludeCryoCreatures.UseVisualStyleBackColor = true;
@@ -221,7 +232,8 @@ private void InitializeComponent()
// nudBPMutationLimit
//
this.nudBPMutationLimit.ForeColor = System.Drawing.SystemColors.GrayText;
- this.nudBPMutationLimit.Location = new System.Drawing.Point(162, 134);
+ this.nudBPMutationLimit.Location = new System.Drawing.Point(324, 258);
+ this.nudBPMutationLimit.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.nudBPMutationLimit.Maximum = new decimal(new int[] {
1000,
0,
@@ -238,25 +250,27 @@ private void InitializeComponent()
0,
0,
0});
- this.nudBPMutationLimit.Size = new System.Drawing.Size(50, 20);
+ this.nudBPMutationLimit.Size = new System.Drawing.Size(100, 31);
this.nudBPMutationLimit.TabIndex = 4;
this.nudBPMutationLimit.ValueChanged += new System.EventHandler(this.nudMutationLimit_ValueChanged);
//
// label2
//
this.label2.AutoSize = true;
- this.label2.Location = new System.Drawing.Point(6, 136);
+ this.label2.Location = new System.Drawing.Point(12, 262);
+ this.label2.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
this.label2.Name = "label2";
- this.label2.Size = new System.Drawing.Size(150, 13);
+ this.label2.Size = new System.Drawing.Size(304, 25);
this.label2.TabIndex = 5;
this.label2.Text = "Creatures with Mutations up to";
//
// cbBPIncludeCooldowneds
//
this.cbBPIncludeCooldowneds.AutoSize = true;
- this.cbBPIncludeCooldowneds.Location = new System.Drawing.Point(6, 88);
+ this.cbBPIncludeCooldowneds.Location = new System.Drawing.Point(12, 169);
+ this.cbBPIncludeCooldowneds.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.cbBPIncludeCooldowneds.Name = "cbBPIncludeCooldowneds";
- this.cbBPIncludeCooldowneds.Size = new System.Drawing.Size(181, 17);
+ this.cbBPIncludeCooldowneds.Size = new System.Drawing.Size(358, 29);
this.cbBPIncludeCooldowneds.TabIndex = 3;
this.cbBPIncludeCooldowneds.Text = "Include Creatures with Cooldown";
this.cbBPIncludeCooldowneds.UseVisualStyleBackColor = true;
@@ -266,9 +280,10 @@ private void InitializeComponent()
//
this.rbBPTopStatsCn.AutoSize = true;
this.rbBPTopStatsCn.Checked = true;
- this.rbBPTopStatsCn.Location = new System.Drawing.Point(6, 19);
+ this.rbBPTopStatsCn.Location = new System.Drawing.Point(12, 37);
+ this.rbBPTopStatsCn.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.rbBPTopStatsCn.Name = "rbBPTopStatsCn";
- this.rbBPTopStatsCn.Size = new System.Drawing.Size(115, 17);
+ this.rbBPTopStatsCn.Size = new System.Drawing.Size(226, 29);
this.rbBPTopStatsCn.TabIndex = 2;
this.rbBPTopStatsCn.TabStop = true;
this.rbBPTopStatsCn.Text = "Combine Top Stats";
@@ -278,9 +293,10 @@ private void InitializeComponent()
// rbBPHighStats
//
this.rbBPHighStats.AutoSize = true;
- this.rbBPHighStats.Location = new System.Drawing.Point(6, 65);
+ this.rbBPHighStats.Location = new System.Drawing.Point(12, 125);
+ this.rbBPHighStats.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.rbBPHighStats.Name = "rbBPHighStats";
- this.rbBPHighStats.Size = new System.Drawing.Size(126, 17);
+ this.rbBPHighStats.Size = new System.Drawing.Size(248, 29);
this.rbBPHighStats.TabIndex = 1;
this.rbBPHighStats.Text = "Best Next Generation";
this.rbBPHighStats.UseVisualStyleBackColor = true;
@@ -289,9 +305,10 @@ private void InitializeComponent()
// rbBPTopStats
//
this.rbBPTopStats.AutoSize = true;
- this.rbBPTopStats.Location = new System.Drawing.Point(6, 42);
+ this.rbBPTopStats.Location = new System.Drawing.Point(12, 81);
+ this.rbBPTopStats.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.rbBPTopStats.Name = "rbBPTopStats";
- this.rbBPTopStats.Size = new System.Drawing.Size(86, 17);
+ this.rbBPTopStats.Size = new System.Drawing.Size(164, 29);
this.rbBPTopStats.TabIndex = 0;
this.rbBPTopStats.Text = "Top Stats Lc";
this.rbBPTopStats.UseVisualStyleBackColor = true;
@@ -302,20 +319,22 @@ private void InitializeComponent()
this.tabControl1.Controls.Add(this.tabPageBreedableSpecies);
this.tabControl1.Controls.Add(this.tabPageTags);
this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.tabControl1.Location = new System.Drawing.Point(3, 3);
- this.tabControl1.MinimumSize = new System.Drawing.Size(0, 200);
+ this.tabControl1.Location = new System.Drawing.Point(6, 6);
+ this.tabControl1.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
+ this.tabControl1.MinimumSize = new System.Drawing.Size(0, 385);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
- this.tabControl1.Size = new System.Drawing.Size(238, 494);
+ this.tabControl1.Size = new System.Drawing.Size(476, 907);
this.tabControl1.TabIndex = 8;
//
// tabPageBreedableSpecies
//
this.tabPageBreedableSpecies.Controls.Add(this.listViewSpeciesBP);
- this.tabPageBreedableSpecies.Location = new System.Drawing.Point(4, 22);
+ this.tabPageBreedableSpecies.Location = new System.Drawing.Point(8, 39);
+ this.tabPageBreedableSpecies.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.tabPageBreedableSpecies.Name = "tabPageBreedableSpecies";
- this.tabPageBreedableSpecies.Padding = new System.Windows.Forms.Padding(3);
- this.tabPageBreedableSpecies.Size = new System.Drawing.Size(230, 468);
+ this.tabPageBreedableSpecies.Padding = new System.Windows.Forms.Padding(6, 6, 6, 6);
+ this.tabPageBreedableSpecies.Size = new System.Drawing.Size(460, 860);
this.tabPageBreedableSpecies.TabIndex = 0;
this.tabPageBreedableSpecies.Text = "Breedable Species";
this.tabPageBreedableSpecies.UseVisualStyleBackColor = true;
@@ -328,10 +347,11 @@ private void InitializeComponent()
this.listViewSpeciesBP.FullRowSelect = true;
this.listViewSpeciesBP.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
this.listViewSpeciesBP.HideSelection = false;
- this.listViewSpeciesBP.Location = new System.Drawing.Point(3, 3);
+ this.listViewSpeciesBP.Location = new System.Drawing.Point(6, 6);
+ this.listViewSpeciesBP.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.listViewSpeciesBP.MultiSelect = false;
this.listViewSpeciesBP.Name = "listViewSpeciesBP";
- this.listViewSpeciesBP.Size = new System.Drawing.Size(224, 462);
+ this.listViewSpeciesBP.Size = new System.Drawing.Size(448, 848);
this.listViewSpeciesBP.TabIndex = 3;
this.listViewSpeciesBP.UseCompatibleStateImageBehavior = false;
this.listViewSpeciesBP.View = System.Windows.Forms.View.Details;
@@ -345,10 +365,11 @@ private void InitializeComponent()
// tabPageTags
//
this.tabPageTags.Controls.Add(this.tableLayoutPanel3);
- this.tabPageTags.Location = new System.Drawing.Point(4, 22);
+ this.tabPageTags.Location = new System.Drawing.Point(8, 39);
+ this.tabPageTags.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.tabPageTags.Name = "tabPageTags";
- this.tabPageTags.Padding = new System.Windows.Forms.Padding(3);
- this.tabPageTags.Size = new System.Drawing.Size(230, 447);
+ this.tabPageTags.Padding = new System.Windows.Forms.Padding(6, 6, 6, 6);
+ this.tabPageTags.Size = new System.Drawing.Size(460, 891);
this.tabPageTags.TabIndex = 1;
this.tabPageTags.Text = "Filters / Tags";
this.tabPageTags.UseVisualStyleBackColor = true;
@@ -364,7 +385,8 @@ private void InitializeComponent()
this.tableLayoutPanel3.Controls.Add(this.cbServerFilterLibrary, 0, 2);
this.tableLayoutPanel3.Controls.Add(this.label1, 0, 3);
this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
- this.tableLayoutPanel3.Location = new System.Drawing.Point(3, 3);
+ this.tableLayoutPanel3.Location = new System.Drawing.Point(6, 6);
+ this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.tableLayoutPanel3.Name = "tableLayoutPanel3";
this.tableLayoutPanel3.RowCount = 6;
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());
@@ -373,15 +395,16 @@ private void InitializeComponent()
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
- this.tableLayoutPanel3.Size = new System.Drawing.Size(224, 441);
+ this.tableLayoutPanel3.Size = new System.Drawing.Size(448, 879);
this.tableLayoutPanel3.TabIndex = 7;
//
// cbTribeFilterLibrary
//
this.cbTribeFilterLibrary.AutoSize = true;
- this.cbTribeFilterLibrary.Location = new System.Drawing.Point(3, 26);
+ this.cbTribeFilterLibrary.Location = new System.Drawing.Point(6, 47);
+ this.cbTribeFilterLibrary.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.cbTribeFilterLibrary.Name = "cbTribeFilterLibrary";
- this.cbTribeFilterLibrary.Size = new System.Drawing.Size(129, 17);
+ this.cbTribeFilterLibrary.Size = new System.Drawing.Size(260, 29);
this.cbTribeFilterLibrary.TabIndex = 7;
this.cbTribeFilterLibrary.Text = "Tribe filter from Library";
this.cbTribeFilterLibrary.UseVisualStyleBackColor = true;
@@ -390,9 +413,10 @@ private void InitializeComponent()
// cbOwnerFilterLibrary
//
this.cbOwnerFilterLibrary.AutoSize = true;
- this.cbOwnerFilterLibrary.Location = new System.Drawing.Point(3, 3);
+ this.cbOwnerFilterLibrary.Location = new System.Drawing.Point(6, 6);
+ this.cbOwnerFilterLibrary.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.cbOwnerFilterLibrary.Name = "cbOwnerFilterLibrary";
- this.cbOwnerFilterLibrary.Size = new System.Drawing.Size(136, 17);
+ this.cbOwnerFilterLibrary.Size = new System.Drawing.Size(273, 29);
this.cbOwnerFilterLibrary.TabIndex = 6;
this.cbOwnerFilterLibrary.Text = "Owner filter from Library";
this.cbOwnerFilterLibrary.UseVisualStyleBackColor = true;
@@ -402,17 +426,19 @@ private void InitializeComponent()
//
this.tagSelectorList1.AutoScroll = true;
this.tagSelectorList1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.tagSelectorList1.Location = new System.Drawing.Point(3, 164);
+ this.tagSelectorList1.Location = new System.Drawing.Point(12, 309);
+ this.tagSelectorList1.Margin = new System.Windows.Forms.Padding(12, 12, 12, 12);
this.tagSelectorList1.Name = "tagSelectorList1";
- this.tagSelectorList1.Size = new System.Drawing.Size(218, 274);
+ this.tagSelectorList1.Size = new System.Drawing.Size(424, 558);
this.tagSelectorList1.TabIndex = 3;
//
// cbBPTagExcludeDefault
//
this.cbBPTagExcludeDefault.AutoSize = true;
- this.cbBPTagExcludeDefault.Location = new System.Drawing.Point(3, 141);
+ this.cbBPTagExcludeDefault.Location = new System.Drawing.Point(6, 262);
+ this.cbBPTagExcludeDefault.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.cbBPTagExcludeDefault.Name = "cbBPTagExcludeDefault";
- this.cbBPTagExcludeDefault.Size = new System.Drawing.Size(160, 17);
+ this.cbBPTagExcludeDefault.Size = new System.Drawing.Size(317, 29);
this.cbBPTagExcludeDefault.TabIndex = 4;
this.cbBPTagExcludeDefault.Text = "Exclude creatures by default";
this.cbBPTagExcludeDefault.UseVisualStyleBackColor = true;
@@ -421,9 +447,10 @@ private void InitializeComponent()
// cbServerFilterLibrary
//
this.cbServerFilterLibrary.AutoSize = true;
- this.cbServerFilterLibrary.Location = new System.Drawing.Point(3, 49);
+ this.cbServerFilterLibrary.Location = new System.Drawing.Point(6, 88);
+ this.cbServerFilterLibrary.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.cbServerFilterLibrary.Name = "cbServerFilterLibrary";
- this.cbServerFilterLibrary.Size = new System.Drawing.Size(136, 17);
+ this.cbServerFilterLibrary.Size = new System.Drawing.Size(274, 29);
this.cbServerFilterLibrary.TabIndex = 5;
this.cbServerFilterLibrary.Text = "Server filter from Library";
this.cbServerFilterLibrary.UseVisualStyleBackColor = true;
@@ -431,32 +458,35 @@ private void InitializeComponent()
//
// label1
//
- this.label1.Location = new System.Drawing.Point(3, 69);
+ this.label1.Location = new System.Drawing.Point(6, 123);
+ this.label1.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
this.label1.Name = "label1";
- this.label1.Size = new System.Drawing.Size(174, 69);
+ this.label1.Size = new System.Drawing.Size(348, 133);
this.label1.TabIndex = 2;
this.label1.Text = "Consider creatures by tag. \r\n✕ excludes creatures, ✓ includes creatures (even if " +
"they have an exclusive tag). Add tags in the library with F3.";
//
// statWeighting1
//
- this.statWeighting1.AnyOddEven = new StatValueEvenOdd[] {
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0};
+ this.statWeighting1.AnyOddEven = new ARKBreedingStats.uiControls.StatWeighting.StatValueEvenOdd[] {
+ ARKBreedingStats.uiControls.StatWeighting.StatValueEvenOdd.Indifferent,
+ ARKBreedingStats.uiControls.StatWeighting.StatValueEvenOdd.Indifferent,
+ ARKBreedingStats.uiControls.StatWeighting.StatValueEvenOdd.Indifferent,
+ ARKBreedingStats.uiControls.StatWeighting.StatValueEvenOdd.Indifferent,
+ ARKBreedingStats.uiControls.StatWeighting.StatValueEvenOdd.Indifferent,
+ ARKBreedingStats.uiControls.StatWeighting.StatValueEvenOdd.Indifferent,
+ ARKBreedingStats.uiControls.StatWeighting.StatValueEvenOdd.Indifferent,
+ ARKBreedingStats.uiControls.StatWeighting.StatValueEvenOdd.Indifferent,
+ ARKBreedingStats.uiControls.StatWeighting.StatValueEvenOdd.Indifferent,
+ ARKBreedingStats.uiControls.StatWeighting.StatValueEvenOdd.Indifferent,
+ ARKBreedingStats.uiControls.StatWeighting.StatValueEvenOdd.Indifferent,
+ ARKBreedingStats.uiControls.StatWeighting.StatValueEvenOdd.Indifferent};
+ this.statWeighting1.CustomWeightings = ((System.Collections.Generic.Dictionary>)(resources.GetObject("statWeighting1.CustomWeightings")));
this.statWeighting1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.statWeighting1.Location = new System.Drawing.Point(3, 761);
+ this.statWeighting1.Location = new System.Drawing.Point(12, 1456);
+ this.statWeighting1.Margin = new System.Windows.Forms.Padding(12, 12, 12, 12);
this.statWeighting1.Name = "statWeighting1";
- this.statWeighting1.Size = new System.Drawing.Size(238, 253);
+ this.statWeighting1.Size = new System.Drawing.Size(464, 487);
this.statWeighting1.TabIndex = 7;
this.statWeighting1.WeightValues = new double[] {
1D,
@@ -480,13 +510,14 @@ private void InitializeComponent()
this.tableLayoutPanel1.Controls.Add(this.gbBPOffspring, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.panelCombinations, 0, 1);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.tableLayoutPanel1.Location = new System.Drawing.Point(253, 3);
+ this.tableLayoutPanel1.Location = new System.Drawing.Point(506, 6);
+ this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 3;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
- this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 182F));
- this.tableLayoutPanel1.Size = new System.Drawing.Size(1476, 1017);
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 350F));
+ this.tableLayoutPanel1.Size = new System.Drawing.Size(2952, 1955);
this.tableLayoutPanel1.TabIndex = 4;
//
// flowLayoutPanel1
@@ -500,9 +531,10 @@ private void InitializeComponent()
this.flowLayoutPanel1.Controls.Add(this.lbBPBreedingScore);
this.flowLayoutPanel1.Controls.Add(this.pedigreeCreature2);
this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.flowLayoutPanel1.Location = new System.Drawing.Point(3, 3);
+ this.flowLayoutPanel1.Location = new System.Drawing.Point(6, 6);
+ this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.flowLayoutPanel1.Name = "flowLayoutPanel1";
- this.flowLayoutPanel1.Size = new System.Drawing.Size(1470, 161);
+ this.flowLayoutPanel1.Size = new System.Drawing.Size(2940, 310);
this.flowLayoutPanel1.TabIndex = 5;
//
// lbBreedingPlanHeader
@@ -510,10 +542,11 @@ private void InitializeComponent()
this.lbBreedingPlanHeader.AutoSize = true;
this.flowLayoutPanel1.SetFlowBreak(this.lbBreedingPlanHeader, true);
this.lbBreedingPlanHeader.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
- this.lbBreedingPlanHeader.Location = new System.Drawing.Point(3, 0);
- this.lbBreedingPlanHeader.MinimumSize = new System.Drawing.Size(700, 0);
+ this.lbBreedingPlanHeader.Location = new System.Drawing.Point(6, 0);
+ this.lbBreedingPlanHeader.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
+ this.lbBreedingPlanHeader.MinimumSize = new System.Drawing.Size(1400, 0);
this.lbBreedingPlanHeader.Name = "lbBreedingPlanHeader";
- this.lbBreedingPlanHeader.Size = new System.Drawing.Size(700, 20);
+ this.lbBreedingPlanHeader.Size = new System.Drawing.Size(1400, 37);
this.lbBreedingPlanHeader.TabIndex = 1;
this.lbBreedingPlanHeader.Text = "Select a species and click on \"Determine Best Breeding\" to see suggestions";
this.lbBreedingPlanHeader.TextAlign = System.Drawing.ContentAlignment.TopCenter;
@@ -521,19 +554,20 @@ private void InitializeComponent()
// pedigreeCreatureBestPossibleInSpecies
//
this.pedigreeCreatureBestPossibleInSpecies.Creature = null;
- this.pedigreeCreatureBestPossibleInSpecies.Location = new System.Drawing.Point(3, 44);
+ this.pedigreeCreatureBestPossibleInSpecies.Location = new System.Drawing.Point(12, 103);
+ this.pedigreeCreatureBestPossibleInSpecies.Margin = new System.Windows.Forms.Padding(12, 12, 12, 12);
this.pedigreeCreatureBestPossibleInSpecies.Name = "pedigreeCreatureBestPossibleInSpecies";
this.pedigreeCreatureBestPossibleInSpecies.OnlyLevels = false;
- this.pedigreeCreatureBestPossibleInSpecies.Size = new System.Drawing.Size(325, 35);
+ this.pedigreeCreatureBestPossibleInSpecies.Size = new System.Drawing.Size(650, 67);
this.pedigreeCreatureBestPossibleInSpecies.TabIndex = 5;
this.pedigreeCreatureBestPossibleInSpecies.TotalLevelUnknown = false;
//
// btShowAllCreatures
//
- this.btShowAllCreatures.Location = new System.Drawing.Point(426, 44);
- this.btShowAllCreatures.Margin = new System.Windows.Forms.Padding(95, 3, 3, 3);
+ this.btShowAllCreatures.Location = new System.Drawing.Point(864, 97);
+ this.btShowAllCreatures.Margin = new System.Windows.Forms.Padding(190, 6, 6, 6);
this.btShowAllCreatures.Name = "btShowAllCreatures";
- this.btShowAllCreatures.Size = new System.Drawing.Size(297, 35);
+ this.btShowAllCreatures.Size = new System.Drawing.Size(594, 67);
this.btShowAllCreatures.TabIndex = 6;
this.btShowAllCreatures.Text = "Unset restriction to …";
this.btShowAllCreatures.UseVisualStyleBackColor = true;
@@ -542,50 +576,52 @@ private void InitializeComponent()
// panel1
//
this.flowLayoutPanel1.SetFlowBreak(this.panel1, true);
- this.panel1.Location = new System.Drawing.Point(729, 44);
+ this.panel1.Location = new System.Drawing.Point(1470, 97);
+ this.panel1.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.panel1.Name = "panel1";
- this.panel1.Size = new System.Drawing.Size(10, 32);
+ this.panel1.Size = new System.Drawing.Size(20, 62);
this.panel1.TabIndex = 7;
//
// pedigreeCreatureBestPossibleInSpeciesFiltered
//
this.pedigreeCreatureBestPossibleInSpeciesFiltered.Creature = null;
this.flowLayoutPanel1.SetFlowBreak(this.pedigreeCreatureBestPossibleInSpeciesFiltered, true);
- this.pedigreeCreatureBestPossibleInSpeciesFiltered.Location = new System.Drawing.Point(3, 85);
+ this.pedigreeCreatureBestPossibleInSpeciesFiltered.Location = new System.Drawing.Point(12, 194);
+ this.pedigreeCreatureBestPossibleInSpeciesFiltered.Margin = new System.Windows.Forms.Padding(12, 12, 12, 12);
this.pedigreeCreatureBestPossibleInSpeciesFiltered.Name = "pedigreeCreatureBestPossibleInSpeciesFiltered";
this.pedigreeCreatureBestPossibleInSpeciesFiltered.OnlyLevels = false;
- this.pedigreeCreatureBestPossibleInSpeciesFiltered.Size = new System.Drawing.Size(325, 35);
+ this.pedigreeCreatureBestPossibleInSpeciesFiltered.Size = new System.Drawing.Size(650, 67);
this.pedigreeCreatureBestPossibleInSpeciesFiltered.TabIndex = 8;
this.pedigreeCreatureBestPossibleInSpeciesFiltered.TotalLevelUnknown = false;
//
// pedigreeCreature1
//
this.pedigreeCreature1.Creature = null;
- this.pedigreeCreature1.Location = new System.Drawing.Point(3, 123);
- this.pedigreeCreature1.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3);
+ this.pedigreeCreature1.Location = new System.Drawing.Point(6, 273);
+ this.pedigreeCreature1.Margin = new System.Windows.Forms.Padding(6, 0, 6, 6);
this.pedigreeCreature1.Name = "pedigreeCreature1";
this.pedigreeCreature1.OnlyLevels = false;
- this.pedigreeCreature1.Size = new System.Drawing.Size(325, 35);
+ this.pedigreeCreature1.Size = new System.Drawing.Size(650, 67);
this.pedigreeCreature1.TabIndex = 2;
this.pedigreeCreature1.TotalLevelUnknown = false;
//
// lbBPBreedingScore
//
- this.lbBPBreedingScore.Location = new System.Drawing.Point(334, 138);
- this.lbBPBreedingScore.Margin = new System.Windows.Forms.Padding(3, 15, 3, 0);
+ this.lbBPBreedingScore.Location = new System.Drawing.Point(668, 302);
+ this.lbBPBreedingScore.Margin = new System.Windows.Forms.Padding(6, 29, 6, 0);
this.lbBPBreedingScore.Name = "lbBPBreedingScore";
- this.lbBPBreedingScore.Size = new System.Drawing.Size(87, 20);
+ this.lbBPBreedingScore.Size = new System.Drawing.Size(174, 38);
this.lbBPBreedingScore.TabIndex = 4;
this.lbBPBreedingScore.Text = "Breeding-Score";
//
// pedigreeCreature2
//
this.pedigreeCreature2.Creature = null;
- this.pedigreeCreature2.Location = new System.Drawing.Point(427, 123);
- this.pedigreeCreature2.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3);
+ this.pedigreeCreature2.Location = new System.Drawing.Point(854, 273);
+ this.pedigreeCreature2.Margin = new System.Windows.Forms.Padding(6, 0, 6, 6);
this.pedigreeCreature2.Name = "pedigreeCreature2";
this.pedigreeCreature2.OnlyLevels = false;
- this.pedigreeCreature2.Size = new System.Drawing.Size(325, 35);
+ this.pedigreeCreature2.Size = new System.Drawing.Size(650, 67);
this.pedigreeCreature2.TabIndex = 3;
this.pedigreeCreature2.TotalLevelUnknown = false;
//
@@ -593,9 +629,11 @@ private void InitializeComponent()
//
this.gbBPOffspring.Controls.Add(this.tableLayoutPanel2);
this.gbBPOffspring.Dock = System.Windows.Forms.DockStyle.Fill;
- this.gbBPOffspring.Location = new System.Drawing.Point(3, 838);
+ this.gbBPOffspring.Location = new System.Drawing.Point(6, 1611);
+ this.gbBPOffspring.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.gbBPOffspring.Name = "gbBPOffspring";
- this.gbBPOffspring.Size = new System.Drawing.Size(1470, 176);
+ this.gbBPOffspring.Padding = new System.Windows.Forms.Padding(6, 6, 6, 6);
+ this.gbBPOffspring.Size = new System.Drawing.Size(2940, 338);
this.gbBPOffspring.TabIndex = 2;
this.gbBPOffspring.TabStop = false;
this.gbBPOffspring.Text = "Offspring";
@@ -610,11 +648,12 @@ private void InitializeComponent()
this.tableLayoutPanel2.Controls.Add(this.flowLayoutPanel2, 0, 0);
this.tableLayoutPanel2.Controls.Add(this.offspringPossibilities1, 1, 0);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
- this.tableLayoutPanel2.Location = new System.Drawing.Point(3, 16);
+ this.tableLayoutPanel2.Location = new System.Drawing.Point(6, 30);
+ this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 1;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
- this.tableLayoutPanel2.Size = new System.Drawing.Size(1464, 157);
+ this.tableLayoutPanel2.Size = new System.Drawing.Size(2928, 302);
this.tableLayoutPanel2.TabIndex = 9;
//
// tableLayoutPanel4
@@ -625,21 +664,23 @@ private void InitializeComponent()
this.tableLayoutPanel4.Controls.Add(this.listViewRaisingTimes, 0, 1);
this.tableLayoutPanel4.Controls.Add(this.lbBPBreedingTimes, 0, 0);
this.tableLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Fill;
- this.tableLayoutPanel4.Location = new System.Drawing.Point(614, 3);
+ this.tableLayoutPanel4.Location = new System.Drawing.Point(1240, 6);
+ this.tableLayoutPanel4.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.tableLayoutPanel4.Name = "tableLayoutPanel4";
this.tableLayoutPanel4.RowCount = 3;
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());
- this.tableLayoutPanel4.Size = new System.Drawing.Size(847, 151);
+ this.tableLayoutPanel4.Size = new System.Drawing.Size(1694, 290);
this.tableLayoutPanel4.TabIndex = 0;
//
// labelBreedingInfos
//
this.labelBreedingInfos.AutoSize = true;
- this.labelBreedingInfos.Location = new System.Drawing.Point(3, 121);
+ this.labelBreedingInfos.Location = new System.Drawing.Point(6, 228);
+ this.labelBreedingInfos.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
this.labelBreedingInfos.Name = "labelBreedingInfos";
- this.labelBreedingInfos.Size = new System.Drawing.Size(75, 13);
+ this.labelBreedingInfos.Size = new System.Drawing.Size(150, 25);
this.labelBreedingInfos.TabIndex = 7;
this.labelBreedingInfos.Text = "Breeding Infos";
//
@@ -652,10 +693,11 @@ private void InitializeComponent()
this.columnHeader4});
this.listViewRaisingTimes.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
this.listViewRaisingTimes.HideSelection = false;
- this.listViewRaisingTimes.Location = new System.Drawing.Point(3, 20);
+ this.listViewRaisingTimes.Location = new System.Drawing.Point(6, 37);
+ this.listViewRaisingTimes.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.listViewRaisingTimes.Name = "listViewRaisingTimes";
this.listViewRaisingTimes.ShowGroups = false;
- this.listViewRaisingTimes.Size = new System.Drawing.Size(351, 98);
+ this.listViewRaisingTimes.Size = new System.Drawing.Size(698, 185);
this.listViewRaisingTimes.TabIndex = 4;
this.listViewRaisingTimes.UseCompatibleStateImageBehavior = false;
this.listViewRaisingTimes.View = System.Windows.Forms.View.Details;
@@ -684,9 +726,10 @@ private void InitializeComponent()
//
this.lbBPBreedingTimes.AutoSize = true;
this.lbBPBreedingTimes.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
- this.lbBPBreedingTimes.Location = new System.Drawing.Point(3, 0);
+ this.lbBPBreedingTimes.Location = new System.Drawing.Point(6, 0);
+ this.lbBPBreedingTimes.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
this.lbBPBreedingTimes.Name = "lbBPBreedingTimes";
- this.lbBPBreedingTimes.Size = new System.Drawing.Size(121, 17);
+ this.lbBPBreedingTimes.Size = new System.Drawing.Size(217, 31);
this.lbBPBreedingTimes.TabIndex = 3;
this.lbBPBreedingTimes.Text = "Breeding Times";
//
@@ -698,18 +741,20 @@ private void InitializeComponent()
this.flowLayoutPanel2.Controls.Add(this.lbMutationProbability);
this.flowLayoutPanel2.Controls.Add(this.btBPJustMated);
this.flowLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
- this.flowLayoutPanel2.Location = new System.Drawing.Point(3, 3);
+ this.flowLayoutPanel2.Location = new System.Drawing.Point(6, 6);
+ this.flowLayoutPanel2.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.flowLayoutPanel2.Name = "flowLayoutPanel2";
- this.flowLayoutPanel2.Size = new System.Drawing.Size(352, 151);
+ this.flowLayoutPanel2.Size = new System.Drawing.Size(704, 290);
this.flowLayoutPanel2.TabIndex = 8;
//
// lbBPProbabilityBest
//
this.lbBPProbabilityBest.AutoSize = true;
this.flowLayoutPanel2.SetFlowBreak(this.lbBPProbabilityBest, true);
- this.lbBPProbabilityBest.Location = new System.Drawing.Point(3, 0);
+ this.lbBPProbabilityBest.Location = new System.Drawing.Point(6, 0);
+ this.lbBPProbabilityBest.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
this.lbBPProbabilityBest.Name = "lbBPProbabilityBest";
- this.lbBPProbabilityBest.Size = new System.Drawing.Size(202, 13);
+ this.lbBPProbabilityBest.Size = new System.Drawing.Size(415, 25);
this.lbBPProbabilityBest.TabIndex = 6;
this.lbBPProbabilityBest.Text = "Probability for this Best Possible outcome:";
//
@@ -718,10 +763,11 @@ private void InitializeComponent()
this.pedigreeCreatureBest.Creature = null;
this.pedigreeCreatureBest.Cursor = System.Windows.Forms.Cursors.Hand;
this.flowLayoutPanel2.SetFlowBreak(this.pedigreeCreatureBest, true);
- this.pedigreeCreatureBest.Location = new System.Drawing.Point(3, 16);
+ this.pedigreeCreatureBest.Location = new System.Drawing.Point(12, 37);
+ this.pedigreeCreatureBest.Margin = new System.Windows.Forms.Padding(12, 12, 12, 12);
this.pedigreeCreatureBest.Name = "pedigreeCreatureBest";
this.pedigreeCreatureBest.OnlyLevels = false;
- this.pedigreeCreatureBest.Size = new System.Drawing.Size(325, 35);
+ this.pedigreeCreatureBest.Size = new System.Drawing.Size(650, 67);
this.pedigreeCreatureBest.TabIndex = 1;
this.pedigreeCreatureBest.TotalLevelUnknown = false;
//
@@ -730,10 +776,11 @@ private void InitializeComponent()
this.pedigreeCreatureWorst.Creature = null;
this.pedigreeCreatureWorst.Cursor = System.Windows.Forms.Cursors.Hand;
this.flowLayoutPanel2.SetFlowBreak(this.pedigreeCreatureWorst, true);
- this.pedigreeCreatureWorst.Location = new System.Drawing.Point(3, 57);
+ this.pedigreeCreatureWorst.Location = new System.Drawing.Point(12, 128);
+ this.pedigreeCreatureWorst.Margin = new System.Windows.Forms.Padding(12, 12, 12, 12);
this.pedigreeCreatureWorst.Name = "pedigreeCreatureWorst";
this.pedigreeCreatureWorst.OnlyLevels = false;
- this.pedigreeCreatureWorst.Size = new System.Drawing.Size(325, 35);
+ this.pedigreeCreatureWorst.Size = new System.Drawing.Size(650, 67);
this.pedigreeCreatureWorst.TabIndex = 2;
this.pedigreeCreatureWorst.TotalLevelUnknown = false;
//
@@ -741,17 +788,19 @@ private void InitializeComponent()
//
this.lbMutationProbability.AutoSize = true;
this.flowLayoutPanel2.SetFlowBreak(this.lbMutationProbability, true);
- this.lbMutationProbability.Location = new System.Drawing.Point(3, 95);
+ this.lbMutationProbability.Location = new System.Drawing.Point(6, 207);
+ this.lbMutationProbability.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
this.lbMutationProbability.Name = "lbMutationProbability";
- this.lbMutationProbability.Size = new System.Drawing.Size(115, 13);
+ this.lbMutationProbability.Size = new System.Drawing.Size(236, 25);
this.lbMutationProbability.TabIndex = 7;
this.lbMutationProbability.Text = "Probability of mutations";
//
// btBPJustMated
//
- this.btBPJustMated.Location = new System.Drawing.Point(3, 111);
+ this.btBPJustMated.Location = new System.Drawing.Point(6, 238);
+ this.btBPJustMated.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.btBPJustMated.Name = "btBPJustMated";
- this.btBPJustMated.Size = new System.Drawing.Size(325, 29);
+ this.btBPJustMated.Size = new System.Drawing.Size(650, 56);
this.btBPJustMated.TabIndex = 0;
this.btBPJustMated.Text = "These Parents just mated";
this.btBPJustMated.UseVisualStyleBackColor = true;
@@ -759,9 +808,10 @@ private void InitializeComponent()
//
// offspringPossibilities1
//
- this.offspringPossibilities1.Location = new System.Drawing.Point(361, 3);
+ this.offspringPossibilities1.Location = new System.Drawing.Point(728, 12);
+ this.offspringPossibilities1.Margin = new System.Windows.Forms.Padding(12, 12, 12, 12);
this.offspringPossibilities1.Name = "offspringPossibilities1";
- this.offspringPossibilities1.Size = new System.Drawing.Size(247, 151);
+ this.offspringPossibilities1.Size = new System.Drawing.Size(494, 258);
this.offspringPossibilities1.TabIndex = 1;
//
// panelCombinations
@@ -769,17 +819,19 @@ private void InitializeComponent()
this.panelCombinations.Controls.Add(this.lbBreedingPlanInfo);
this.panelCombinations.Controls.Add(this.flowLayoutPanelPairs);
this.panelCombinations.Dock = System.Windows.Forms.DockStyle.Fill;
- this.panelCombinations.Location = new System.Drawing.Point(3, 170);
+ this.panelCombinations.Location = new System.Drawing.Point(6, 328);
+ this.panelCombinations.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.panelCombinations.Name = "panelCombinations";
- this.panelCombinations.Size = new System.Drawing.Size(1470, 662);
+ this.panelCombinations.Size = new System.Drawing.Size(2940, 1271);
this.panelCombinations.TabIndex = 3;
//
// lbBreedingPlanInfo
//
this.lbBreedingPlanInfo.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
- this.lbBreedingPlanInfo.Location = new System.Drawing.Point(10, 75);
+ this.lbBreedingPlanInfo.Location = new System.Drawing.Point(20, 144);
+ this.lbBreedingPlanInfo.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
this.lbBreedingPlanInfo.Name = "lbBreedingPlanInfo";
- this.lbBreedingPlanInfo.Size = new System.Drawing.Size(683, 193);
+ this.lbBreedingPlanInfo.Size = new System.Drawing.Size(1366, 371);
this.lbBreedingPlanInfo.TabIndex = 0;
this.lbBreedingPlanInfo.Text = "Infotext";
this.lbBreedingPlanInfo.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
@@ -790,18 +842,31 @@ private void InitializeComponent()
this.flowLayoutPanelPairs.AutoScroll = true;
this.flowLayoutPanelPairs.Dock = System.Windows.Forms.DockStyle.Fill;
this.flowLayoutPanelPairs.Location = new System.Drawing.Point(0, 0);
+ this.flowLayoutPanelPairs.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.flowLayoutPanelPairs.Name = "flowLayoutPanelPairs";
- this.flowLayoutPanelPairs.Size = new System.Drawing.Size(1470, 662);
+ this.flowLayoutPanelPairs.Size = new System.Drawing.Size(2940, 1271);
this.flowLayoutPanelPairs.TabIndex = 1;
//
+ // CbConsiderMutationLevels
+ //
+ this.CbConsiderMutationLevels.AutoSize = true;
+ this.CbConsiderMutationLevels.Location = new System.Drawing.Point(12, 346);
+ this.CbConsiderMutationLevels.Name = "CbConsiderMutationLevels";
+ this.CbConsiderMutationLevels.Size = new System.Drawing.Size(280, 29);
+ this.CbConsiderMutationLevels.TabIndex = 12;
+ this.CbConsiderMutationLevels.Text = "Consider mutation levels";
+ this.CbConsiderMutationLevels.UseVisualStyleBackColor = true;
+ this.CbConsiderMutationLevels.CheckedChanged += new System.EventHandler(this.CbConsiderMutationLevels_CheckedChanged);
+ //
// BreedingPlan
//
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 25F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoScroll = true;
this.Controls.Add(this.tableLayoutMain);
+ this.Margin = new System.Windows.Forms.Padding(6, 6, 6, 6);
this.Name = "BreedingPlan";
- this.Size = new System.Drawing.Size(1732, 1023);
+ this.Size = new System.Drawing.Size(3464, 1967);
this.tableLayoutMain.ResumeLayout(false);
this.tableLayoutPanel5.ResumeLayout(false);
this.gbBPBreedingMode.ResumeLayout(false);
@@ -884,5 +949,6 @@ private void InitializeComponent()
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel5;
private System.Windows.Forms.CheckBox CbDontSuggestOverLimitOffspring;
private System.Windows.Forms.CheckBox CbIgnoreSexInPlanning;
+ private System.Windows.Forms.CheckBox CbConsiderMutationLevels;
}
}
diff --git a/ARKBreedingStats/BreedingPlanning/BreedingPlan.cs b/ARKBreedingStats/BreedingPlanning/BreedingPlan.cs
index 47ce23cfe..9d4c9a18d 100644
--- a/ARKBreedingStats/BreedingPlanning/BreedingPlan.cs
+++ b/ARKBreedingStats/BreedingPlanning/BreedingPlan.cs
@@ -109,6 +109,7 @@ public BreedingPlan()
cbBPMutationLimitOnlyOnePartner.Checked = Settings.Default.BreedingPlanOnePartnerMoreMutationsThanLimit;
CbIgnoreSexInPlanning.Checked = Settings.Default.IgnoreSexInBreedingPlan;
CbDontSuggestOverLimitOffspring.Checked = Settings.Default.BreedingPlanDontSuggestOverLimitOffspring;
+ CbConsiderMutationLevels.Checked = Settings.Default.BreedingPlanConsiderMutatedLevels;
tagSelectorList1.OnTagChanged += TagSelectorList1_OnTagChanged;
@@ -415,7 +416,7 @@ private void DoCalculateBreedingScoresAndDisplayPairs()
bestPossLevels, _statWeights, _bestLevels, _breedingMode,
considerChosenCreature, considerMutationLimit, (int)nudBPMutationLimit.Value,
ref creaturesMutationsFilteredOut, levelLimitWithOutDomLevels, CbDontSuggestOverLimitOffspring.Checked,
- cbBPOnlyOneSuggestionForFemales.Checked, _statOddEvens, !cbBPIncludeCooldowneds.Checked && _currentSpecies.noGender);
+ cbBPOnlyOneSuggestionForFemales.Checked, _statOddEvens, !cbBPIncludeCooldowneds.Checked && _currentSpecies.noGender, CbConsiderMutationLevels.Checked);
double minScore = _breedingPairs.LastOrDefault()?.BreedingScore.OneNumber ?? 0;
var displayScoreOffset = (minScore < 0 ? -minScore : 0) + .5; // don't display negative scores, could be confusing
@@ -1204,5 +1205,11 @@ private void CbDontSuggestOverLimitOffspring_CheckedChanged(object sender, Event
Settings.Default.BreedingPlanDontSuggestOverLimitOffspring = CbDontSuggestOverLimitOffspring.Checked;
CalculateBreedingScoresAndDisplayPairs();
}
+
+ private void CbConsiderMutationLevels_CheckedChanged(object sender, EventArgs e)
+ {
+ Settings.Default.BreedingPlanConsiderMutatedLevels = CbConsiderMutationLevels.Checked;
+ CalculateBreedingScoresAndDisplayPairs();
+ }
}
}
diff --git a/ARKBreedingStats/BreedingPlanning/BreedingPlan.resx b/ARKBreedingStats/BreedingPlanning/BreedingPlan.resx
index dbc5f07cd..1af7de150 100644
--- a/ARKBreedingStats/BreedingPlanning/BreedingPlan.resx
+++ b/ARKBreedingStats/BreedingPlanning/BreedingPlan.resx
@@ -117,23 +117,4 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- AAEAAAD/////AQAAAAAAAAAMAgAAALoDbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1u
- ZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XSxbU3lzdGVtLlZhbHVlVHVwbGVg
- MltbU3lzdGVtLkRvdWJsZVtdLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRy
- YWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtTeXN0ZW0uQnl0ZVtdLCBtc2Nvcmxp
- YiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2
- MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJs
- aWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0sIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1
- bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OQwDAAAAmgFtc2Nvcmxp
- YiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2
- MTkzNGUwODldXSwgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJs
- aWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAA2U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMu
- RGljdGlvbmFyeWAyW1tTeXN0ZW0uU3RyaW5nAwAAAAdWZXJzaW9uCENvbXBhcmVyCEhhc2hTaXplAAQA
- CENTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5HZW5lcmljRXF1YWxpdHlDb21wYXJlcmAxW1tTeXN0
- ZW0uU3RyaW5nAwAAAAgCAAAAAAAAAAkEAAAAAAAAAAUEAAAAQ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5l
- cmljLkdlbmVyaWNFcXVhbGl0eUNvbXBhcmVyYDFbW1N5c3RlbS5TdHJpbmcAAAAAAwAAAAs=
-
-
\ No newline at end of file
diff --git a/ARKBreedingStats/BreedingPlanning/BreedingScore.cs b/ARKBreedingStats/BreedingPlanning/BreedingScore.cs
index e0c19c0c9..5920dd4f4 100644
--- a/ARKBreedingStats/BreedingPlanning/BreedingScore.cs
+++ b/ARKBreedingStats/BreedingPlanning/BreedingScore.cs
@@ -31,12 +31,14 @@ public static class BreedingScore
/// Only the pairing with the highest score is kept for each female. Is not used if species has no sex or sex is ignored in breeding planner.
/// Array for each stat if the higher level should be considered for score: 0: consider any level, 1: consider only if odd, 2: consider only if even.
/// For hermaphrodites only one partner needs to be not on cooldown. If creatures of a hermaphrodite species are passed and at least one needs to be not on cooldown, set this to true.
+ /// If true the breeding score considers both wild and mutation levels.
///
public static List CalculateBreedingScores(Creature[] females, Creature[] males, Species species,
short[] bestPossLevels, double[] statWeights, int[] bestLevelsOfSpecies, BreedingMode breedingMode,
bool considerChosenCreature, bool considerMutationLimit, int mutationLimit,
ref bool creaturesMutationsFilteredOut, int offspringLevelLimit = 0, bool downGradeOffspringWithLevelHigherThanLimit = false,
- bool onlyBestSuggestionForFemale = false, StatValueEvenOdd[] anyOddEven = null, bool checkIfAtLeastOnePartnerIsNotOnCooldown = false)
+ bool onlyBestSuggestionForFemale = false, StatValueEvenOdd[] anyOddEven = null, bool checkIfAtLeastOnePartnerIsNotOnCooldown = false,
+ bool considerMutationLevels = false)
{
var breedingPairs = new List();
var ignoreSex = Properties.Settings.Default.IgnoreSexInBreedingPlan || species.noGender;
@@ -51,6 +53,21 @@ public static List CalculateBreedingScores(Creature[] females, Cre
var now = DateTime.Now;
+ (int higherLevel, int lowerLevel) GetHigherLowerLevel(Creature parent1, Creature parent2, int statIndex)
+ {
+ int levelParent1 = parent1.levelsWild[statIndex];
+ int levelParent2 = parent2.levelsWild[statIndex];
+ return (Math.Max(levelParent1, levelParent2), Math.Min(levelParent1, levelParent2));
+ }
+ (int higherLevel, int lowerLevel) GetHigherLowerLevelWithMutationLevels(Creature parent1, Creature parent2, int statIndex)
+ {
+ int levelParent1 = parent1.levelsWild[statIndex] + (parent1.levelsMutated?[statIndex] ?? 0);
+ int levelParent2 = parent2.levelsWild[statIndex] + (parent2.levelsMutated?[statIndex] ?? 0);
+ return (Math.Max(levelParent1, levelParent2), Math.Min(levelParent1, levelParent2));
+ }
+
+ var getHigherLowerLevels = considerMutationLevels ? (Func)GetHigherLowerLevelWithMutationLevels : GetHigherLowerLevel;
+
for (int fi = 0; fi < females.Length; fi++)
{
var female = females[fi];
@@ -98,8 +115,7 @@ public static List CalculateBreedingScores(Creature[] females, Cre
{
if (s == Stats.Torpidity || !species.UsesStat(s)) continue;
bestPossLevels[s] = 0;
- int higherLevel = Math.Max(female.levelsWild[s], male.levelsWild[s]);
- int lowerLevel = Math.Min(female.levelsWild[s], male.levelsWild[s]);
+ var (higherLevel, lowerLevel) = getHigherLowerLevels(female, male, s);
if (higherLevel < 0) higherLevel = 0;
if (lowerLevel < 0) lowerLevel = 0;
maxPossibleOffspringLevel += higherLevel;
diff --git a/ARKBreedingStats/CreatureInfoInput.cs b/ARKBreedingStats/CreatureInfoInput.cs
index 8b247356f..1264e1041 100644
--- a/ARKBreedingStats/CreatureInfoInput.cs
+++ b/ARKBreedingStats/CreatureInfoInput.cs
@@ -839,20 +839,27 @@ internal void Clear(bool keepGeneralInfo = false)
FatherArkId = 0;
parentComboBoxMother.Clear();
parentComboBoxFather.Clear();
+ ParentInheritance?.SetCreatures();
+ parentListValid = false;
textBoxNote.Clear();
CooldownUntil = DateTime.Now;
GrowingUntil = DateTime.Now;
+ DomesticatedAt = null;
+ AddedToLibraryAt = null;
MutationCounterMother = 0;
MutationCounterFather = 0;
CreatureSex = Sex.Unknown;
CreatureFlags = CreatureFlags.None;
- ClearColors();
CreatureStatus = CreatureStatus.Available;
- ParentInheritance?.SetCreatures();
+ ClearColors();
SetRegionColorsExisting();
+ CreatureGuid = Guid.Empty;
+ SetArkId(0,false);
if (!keepGeneralInfo)
{
textBoxOwner.Clear();
+ textBoxTribe.Clear();
+ cbServer.Text = string.Empty;
}
}
diff --git a/ARKBreedingStats/Form1.Designer.cs b/ARKBreedingStats/Form1.Designer.cs
index 92f59f4b5..f0f471945 100644
--- a/ARKBreedingStats/Form1.Designer.cs
+++ b/ARKBreedingStats/Form1.Designer.cs
@@ -48,7 +48,8 @@ private void InitializeComponent()
this.openFolderOfCurrentFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator();
this.importingFromSavegameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.importingFromSavegameEmptyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.selectSavegameFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.configureSavegameImportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.importExportedCreaturesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.importFromTabSeparatedFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator19 = new System.Windows.Forms.ToolStripSeparator();
@@ -140,6 +141,7 @@ private void InitializeComponent()
this.currentTokenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.listenWithNewTokenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.sendExampleCreatureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.showTokenPopupOnListeningToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator28 = new System.Windows.Forms.ToolStripSeparator();
this.openModPageInBrowserToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -559,17 +561,25 @@ private void InitializeComponent()
// importingFromSavegameToolStripMenuItem
//
this.importingFromSavegameToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.importingFromSavegameEmptyToolStripMenuItem});
+ this.selectSavegameFileToolStripMenuItem,
+ this.configureSavegameImportToolStripMenuItem});
this.importingFromSavegameToolStripMenuItem.Name = "importingFromSavegameToolStripMenuItem";
this.importingFromSavegameToolStripMenuItem.Size = new System.Drawing.Size(277, 22);
this.importingFromSavegameToolStripMenuItem.Text = "Importing from savegame (only ASE)";
//
- // importingFromSavegameEmptyToolStripMenuItem
+ // selectSavegameFileToolStripMenuItem
//
- this.importingFromSavegameEmptyToolStripMenuItem.Name = "importingFromSavegameEmptyToolStripMenuItem";
- this.importingFromSavegameEmptyToolStripMenuItem.Size = new System.Drawing.Size(269, 22);
- this.importingFromSavegameEmptyToolStripMenuItem.Text = "At first configure \"Import Savegame\"";
- this.importingFromSavegameEmptyToolStripMenuItem.Click += new System.EventHandler(this.importingFromSavegameEmptyToolStripMenuItem_Click);
+ this.selectSavegameFileToolStripMenuItem.Name = "selectSavegameFileToolStripMenuItem";
+ this.selectSavegameFileToolStripMenuItem.Size = new System.Drawing.Size(236, 22);
+ this.selectSavegameFileToolStripMenuItem.Text = "Select savegame file…";
+ this.selectSavegameFileToolStripMenuItem.Click += new System.EventHandler(this.SavegameImportClick);
+ //
+ // configureSavegameImportToolStripMenuItem
+ //
+ this.configureSavegameImportToolStripMenuItem.Name = "configureSavegameImportToolStripMenuItem";
+ this.configureSavegameImportToolStripMenuItem.Size = new System.Drawing.Size(236, 22);
+ this.configureSavegameImportToolStripMenuItem.Text = "Configure savegame imports…";
+ this.configureSavegameImportToolStripMenuItem.Click += new System.EventHandler(this.importingFromSavegameEmptyToolStripMenuItem_Click);
//
// importExportedCreaturesToolStripMenuItem
//
@@ -1359,6 +1369,7 @@ private void InitializeComponent()
this.currentTokenToolStripMenuItem,
this.listenWithNewTokenToolStripMenuItem,
this.sendExampleCreatureToolStripMenuItem,
+ this.showTokenPopupOnListeningToolStripMenuItem,
this.toolStripSeparator28,
this.openModPageInBrowserToolStripMenuItem});
this.serverToolStripMenuItem.Name = "serverToolStripMenuItem";
@@ -1369,40 +1380,48 @@ private void InitializeComponent()
//
this.listenToolStripMenuItem.CheckOnClick = true;
this.listenToolStripMenuItem.Name = "listenToolStripMenuItem";
- this.listenToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
+ this.listenToolStripMenuItem.Size = new System.Drawing.Size(239, 22);
this.listenToolStripMenuItem.Text = "Listen";
- this.listenToolStripMenuItem.CheckedChanged += new System.EventHandler(this.listenToolStripMenuItem_CheckedChanged);
+ this.listenToolStripMenuItem.Click += new System.EventHandler(this.listenToolStripMenuItem_Click);
//
// currentTokenToolStripMenuItem
//
this.currentTokenToolStripMenuItem.Name = "currentTokenToolStripMenuItem";
- this.currentTokenToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
- this.currentTokenToolStripMenuItem.Text = "Current token";
+ this.currentTokenToolStripMenuItem.Size = new System.Drawing.Size(239, 22);
+ this.currentTokenToolStripMenuItem.Text = "View current token";
this.currentTokenToolStripMenuItem.Click += new System.EventHandler(this.currentTokenToolStripMenuItem_Click);
//
// listenWithNewTokenToolStripMenuItem
//
this.listenWithNewTokenToolStripMenuItem.Name = "listenWithNewTokenToolStripMenuItem";
- this.listenWithNewTokenToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
+ this.listenWithNewTokenToolStripMenuItem.Size = new System.Drawing.Size(239, 22);
this.listenWithNewTokenToolStripMenuItem.Text = "Listen with new token";
this.listenWithNewTokenToolStripMenuItem.Click += new System.EventHandler(this.listenWithNewTokenToolStripMenuItem_Click);
//
// sendExampleCreatureToolStripMenuItem
//
this.sendExampleCreatureToolStripMenuItem.Name = "sendExampleCreatureToolStripMenuItem";
- this.sendExampleCreatureToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
+ this.sendExampleCreatureToolStripMenuItem.Size = new System.Drawing.Size(239, 22);
this.sendExampleCreatureToolStripMenuItem.Text = "Send example creature";
this.sendExampleCreatureToolStripMenuItem.Click += new System.EventHandler(this.sendExampleCreatureToolStripMenuItem_Click);
//
+ // showTokenPopupOnListeningToolStripMenuItem
+ //
+ this.showTokenPopupOnListeningToolStripMenuItem.CheckOnClick = true;
+ this.showTokenPopupOnListeningToolStripMenuItem.Name = "showTokenPopupOnListeningToolStripMenuItem";
+ this.showTokenPopupOnListeningToolStripMenuItem.Size = new System.Drawing.Size(239, 22);
+ this.showTokenPopupOnListeningToolStripMenuItem.Text = "Show token popup on listening";
+ this.showTokenPopupOnListeningToolStripMenuItem.Click += new System.EventHandler(this.showTokenPopupOnListeningToolStripMenuItem_Click);
+ //
// toolStripSeparator28
//
this.toolStripSeparator28.Name = "toolStripSeparator28";
- this.toolStripSeparator28.Size = new System.Drawing.Size(215, 6);
+ this.toolStripSeparator28.Size = new System.Drawing.Size(236, 6);
//
// openModPageInBrowserToolStripMenuItem
//
this.openModPageInBrowserToolStripMenuItem.Name = "openModPageInBrowserToolStripMenuItem";
- this.openModPageInBrowserToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
+ this.openModPageInBrowserToolStripMenuItem.Size = new System.Drawing.Size(239, 22);
this.openModPageInBrowserToolStripMenuItem.Text = "Open mod page in browser";
this.openModPageInBrowserToolStripMenuItem.Click += new System.EventHandler(this.openModPageInBrowserToolStripMenuItem_Click);
//
@@ -3331,6 +3350,7 @@ private void InitializeComponent()
//
// statsMultiplierTesting1
//
+ this.statsMultiplierTesting1.AllowDrop = true;
this.statsMultiplierTesting1.Dock = System.Windows.Forms.DockStyle.Fill;
this.statsMultiplierTesting1.Location = new System.Drawing.Point(3, 3);
this.statsMultiplierTesting1.Name = "statsMultiplierTesting1";
@@ -4187,7 +4207,7 @@ private void InitializeComponent()
private System.Windows.Forms.Label lbWildLevelTester;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator13;
private System.Windows.Forms.ToolStripMenuItem importingFromSavegameToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem importingFromSavegameEmptyToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem configureSavegameImportToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem cryopodToolStripMenuItem;
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanelStatIOsExtractor;
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanelStatIOsTester;
@@ -4310,5 +4330,7 @@ private void InitializeComponent()
private System.Windows.Forms.ToolStripSeparator toolStripSeparator28;
private System.Windows.Forms.ToolStripMenuItem openModPageInBrowserToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem nameGeneratorToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem selectSavegameFileToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem showTokenPopupOnListeningToolStripMenuItem;
}
}
diff --git a/ARKBreedingStats/Form1.collection.cs b/ARKBreedingStats/Form1.collection.cs
index 004178840..f9ba3d77c 100644
--- a/ARKBreedingStats/Form1.collection.cs
+++ b/ARKBreedingStats/Form1.collection.cs
@@ -824,7 +824,7 @@ private void OpenRecentlyUsedFile(object sender, EventArgs e)
/// Imports creature from file created by the export gun mod.
/// Returns already existing Creature or null if it's a new creature.
///
- private Creature ImportExportGunFiles(string[] filePaths, out bool creatureAdded, out Creature lastAddedCreature, out bool copiedNameToClipboard, bool playImportSound = false)
+ private Creature ImportExportGunFiles(string[] filePaths, bool addCreatures, out bool creatureAdded, out Creature lastImportedCreature, out bool copiedNameToClipboard, bool playImportSound = false)
{
creatureAdded = false;
copiedNameToClipboard = false;
@@ -896,40 +896,50 @@ private Creature ImportExportGunFiles(string[] filePaths, out bool creatureAdded
? alreadyExistingCreature
: c, oldName: alreadyExistingCreature?.name)).ToArray();
- lastAddedCreature = newCreatures.LastOrDefault();
- var creatureWasAdded = lastAddedCreature != null;
- if (creatureWasAdded)
+ lastImportedCreature = newCreatures.LastOrDefault();
+ var importCreatureExists = lastImportedCreature != null;
+ if (importCreatureExists)
{
- creatureAdded = true;
- // calculate level status of last added creature
- DetermineLevelStatusAndSoundFeedback(lastAddedCreature, playImportSound);
+ if (addCreatures)
+ {
+ creatureAdded = true;
+ // calculate level status of last added creature
+ DetermineLevelStatusAndSoundFeedback(lastImportedCreature, playImportSound);
- _creatureCollection.MergeCreatureList(newCreatures, true);
- UpdateCreatureParentLinkingSort(false);
+ _creatureCollection.MergeCreatureList(newCreatures, true);
+ UpdateCreatureParentLinkingSort(false);
- // apply naming pattern if needed. This can only be done after parent linking to get correct name pattern values related to parents
- Species lastSpecies = null;
- Creature[] creaturesOfSpecies = null;
- foreach (var c in persistentCreaturesAndOldName)
- {
- copiedNameToClipboard = SetNameOfImportedCreature(c.creature, lastSpecies == c.creature.Species ? creaturesOfSpecies : null, out creaturesOfSpecies, new Creature(c.creature.Species, c.oldName), totalCreatureCount);
- lastSpecies = c.creature.Species;
- if (c.oldName == null) totalCreatureCount++; // if creature was added, increase total count for name pattern
- }
+ // apply naming pattern if needed. This can only be done after parent linking to get correct name pattern values related to parents
+ Species lastSpecies = null;
+ Creature[] creaturesOfSpecies = null;
+ foreach (var c in persistentCreaturesAndOldName)
+ {
+ copiedNameToClipboard = SetNameOfImportedCreature(c.creature,
+ lastSpecies == c.creature.Species ? creaturesOfSpecies : null, out creaturesOfSpecies,
+ new Creature(c.creature.Species, c.oldName), totalCreatureCount);
+ lastSpecies = c.creature.Species;
+ if (c.oldName == null)
+ totalCreatureCount++; // if creature was added, increase total count for name pattern
+ }
- UpdateListsAfterCreaturesAdded(Properties.Settings.Default.AutoImportGotoLibraryAfterSuccess);
+ UpdateListsAfterCreaturesAdded(Properties.Settings.Default.AutoImportGotoLibraryAfterSuccess);
- if (Properties.Settings.Default.AutoImportGotoLibraryAfterSuccess)
- {
- tabControlMain.SelectedTab = tabPageLibrary;
- if (listBoxSpeciesLib.SelectedItem != null &&
- listBoxSpeciesLib.SelectedItem != lastAddedCreature.Species)
- listBoxSpeciesLib.SelectedItem = lastAddedCreature.Species;
- SelectCreatureInLibrary(lastAddedCreature);
+ if (Properties.Settings.Default.AutoImportGotoLibraryAfterSuccess)
+ {
+ tabControlMain.SelectedTab = tabPageLibrary;
+ if (listBoxSpeciesLib.SelectedItem != null &&
+ listBoxSpeciesLib.SelectedItem != lastImportedCreature.Species)
+ listBoxSpeciesLib.SelectedItem = lastImportedCreature.Species;
+ SelectCreatureInLibrary(lastImportedCreature);
+ }
+ else
+ {
+ EditCreatureInTester(lastImportedCreature);
+ }
}
else
{
- EditCreatureInTester(lastAddedCreature);
+ SetCreatureValuesLevelsAndInfoToExtractor(lastImportedCreature);
}
}
else if (multipliersImportSuccessful == true)
@@ -938,7 +948,7 @@ private Creature ImportExportGunFiles(string[] filePaths, out bool creatureAdded
}
var resultText = (importedCounter > 0 || importFailedCounter > 0
- ? $"Imported {importedCounter} creatures successfully.{(importFailedCounter > 0 ? $"Failed to import {importFailedCounter} files. Last error:{Environment.NewLine}{lastError}" : $"{Environment.NewLine}Last file: {lastCreatureFilePath}")}"
+ ? $"Imported{(addCreatures ? " and added" : string.Empty)} {importedCounter} creatures successfully.{(importFailedCounter > 0 ? $"Failed to import {importFailedCounter} files. Last error:{Environment.NewLine}{lastError}" : $"{Environment.NewLine}Last file: {lastCreatureFilePath}")}"
: string.Empty)
+ (string.IsNullOrEmpty(serverImportResult)
? string.Empty
@@ -946,7 +956,7 @@ private Creature ImportExportGunFiles(string[] filePaths, out bool creatureAdded
+ serverImportResult);
SetMessageLabelText(resultText, importFailedCounter > 0 || multipliersImportSuccessful == false ? MessageBoxIcon.Error : MessageBoxIcon.Information, lastCreatureFilePath);
- if (creatureWasAdded)
+ if (importCreatureExists && addCreatures)
_ignoreNextMessageLabel = true; // ignore message of selected creature (is shown after some delay / debouncing)
return alreadyExistingCreature;
@@ -1004,75 +1014,5 @@ private void DetermineLevelStatusAndSoundFeedback(Creature c, bool playImportSou
SoundFeedback.BeepSignalCurrentLevelFlags(IsCreatureAlreadyInLibrary(c.guid, c.ArkId, out _));
}
}
-
- ///
- /// Handle reports from the AsbServer listening, e.g. importing creatures or handle errors.
- ///
- private void AsbServerDataSent(ProgressReportAsbServer data)
- {
- if (!string.IsNullOrEmpty(data.Message))
- {
- var displayPopup = false;
- var message = data.Message;
- if (!string.IsNullOrEmpty(data.ServerToken))
- {
- message += Environment.NewLine + Connection.TokenStringForDisplay(data.ServerToken);
- displayPopup = !Properties.Settings.Default.StreamerMode && Properties.Settings.Default.DisplayPopupForServerToken;
- }
-
- SetMessageLabelText(message, data.IsError ? MessageBoxIcon.Error : MessageBoxIcon.Information, clipboardText: data.ClipboardText, displayPopup: displayPopup);
-
- if (!string.IsNullOrEmpty(data.ClipboardText))
- Clipboard.SetText(data.ClipboardText);
-
- if (data.StopListening)
- {
- // don't remove the error message with the stop listening message
- _ignoreNextMessageLabel = true;
- listenToolStripMenuItem.Checked = false;
- }
-
- return;
- }
-
- string resultText;
- if (string.IsNullOrEmpty(data.ServerHash))
- {
- // import creature
- var creature = ImportExportGun.LoadCreatureFromJson(data.JsonText, null, out resultText, out _);
- if (creature == null)
- {
- SetMessageLabelText(resultText, MessageBoxIcon.Error);
- return;
- }
-
- DetermineLevelStatusAndSoundFeedback(creature, Properties.Settings.Default.PlaySoundOnAutoImport);
-
- _creatureCollection.MergeCreatureList(new[] { creature }, true);
- var gotoLibraryTab = Properties.Settings.Default.AutoImportGotoLibraryAfterSuccess;
- UpdateCreatureParentLinkingSort(goToLibraryTab: gotoLibraryTab);
-
- if (resultText == null)
- resultText = $"Received creature from server: {creature}";
-
- SetMessageLabelText(resultText, MessageBoxIcon.Information);
-
- if (gotoLibraryTab)
- {
- tabControlMain.SelectedTab = tabPageLibrary;
- if (listBoxSpeciesLib.SelectedItem != null &&
- listBoxSpeciesLib.SelectedItem != creature.Species)
- listBoxSpeciesLib.SelectedItem = creature.Species;
-
- _ignoreNextMessageLabel = true;
- SelectCreatureInLibrary(creature);
- }
- return;
- }
-
- // import server settings
- var success = ImportExportGun.ImportServerMultipliersFromJson(_creatureCollection, data.JsonText, data.ServerHash, out resultText);
- SetMessageLabelText(resultText, success ? MessageBoxIcon.Information : MessageBoxIcon.Error, resultText);
- }
}
}
diff --git a/ARKBreedingStats/Form1.cs b/ARKBreedingStats/Form1.cs
index 61b2e39bb..b2e051621 100644
--- a/ARKBreedingStats/Form1.cs
+++ b/ARKBreedingStats/Form1.cs
@@ -57,7 +57,7 @@ public delegate void
bool triggeredByFileWatcher = false);
public delegate void SetMessageLabelTextEventHandler(string text = null, MessageBoxIcon icon = MessageBoxIcon.None,
- string path = null, string clipboardContent = null, bool displayPopup = false);
+ string path = null, string clipboardContent = null, bool displayPopup = false, string customPopupMessage = null);
private bool _updateTorporInTester;
private bool _filterListAllowed;
@@ -160,6 +160,7 @@ public Form1()
breedingPlan1.SetMessageLabelText += SetMessageLabelText;
creatureInfoInputExtractor.SetMessageLabelText += SetMessageLabelText;
creatureInfoInputTester.SetMessageLabelText += SetMessageLabelText;
+ statsMultiplierTesting1.SetMessageLabelText += SetMessageLabelText;
timerList1.OnTimerChange += SetCollectionChanged;
timerList1.TimerAddedRemoved += EnableGlobalTimerIfNeeded;
breedingPlan1.BindChildrenControlEvents();
@@ -305,6 +306,7 @@ private void Form1_Load(object sender, EventArgs e)
_creatureListSorter.IgnoreSpacesBetweenWords = Properties.Settings.Default.NaturalSortIgnoreSpaces;
CbLibraryInfoUseFilter.Checked = Properties.Settings.Default.LibraryColorInfoUseFilter;
+ showTokenPopupOnListeningToolStripMenuItem.Checked = Properties.Settings.Default.DisplayPopupForServerToken;
// load stat weights
double[][] custWd = Properties.Settings.Default.customStatWeights;
@@ -432,6 +434,7 @@ private void Form1_Load(object sender, EventArgs e)
tabControlMain.TabPages.Remove(tabPageMultiplierTesting);
devToolStripMenuItem.Visible = false;
sendExampleCreatureToolStripMenuItem.Visible = false;
+ cbExactlyImprinting.Visible = false;
}
else
{
@@ -733,7 +736,7 @@ private void SpeciesSelector1OnSpeciesSelected(bool speciesChanged)
UpdateAllTesterValues();
statPotentials1.Species = species;
statPotentials1.SetLevels(_testingIOs.Select(s => s.LevelWild).ToArray(), _testingIOs.Select(s => s.LevelMut).ToArray(), true);
- SetTesterInfoInputCreature();
+ SetInfoInputCreature();
}
else if (tabControlMain.SelectedTab == tabPageLibrary)
{
@@ -883,12 +886,14 @@ private void ApplySettingsToValues()
}
CreateImportExportedMenu();
+ CreateSavegameImportMenu();
+ }
- // save game importer menu
+ private void CreateSavegameImportMenu()
+ {
importingFromSavegameToolStripMenuItem.DropDownItems.Clear();
if (Properties.Settings.Default.arkSavegamePaths?.Any() != true)
{
- importingFromSavegameToolStripMenuItem.DropDownItems.Add(importingFromSavegameEmptyToolStripMenuItem);
TsbQuickSaveGameImport.ToolTipText = "No quick import save files configured,\nyou can do this in the settings.";
}
else
@@ -899,7 +904,7 @@ private void ApplySettingsToValues()
ATImportFileLocation atImportFileLocation = ATImportFileLocation.CreateFromString(f);
string menuItemHeader = string.IsNullOrEmpty(atImportFileLocation.ConvenientName)
- ? ""
+ ? Utils.ShortPath(atImportFileLocation.FileLocation)
: atImportFileLocation.ConvenientName;
ToolStripMenuItem tsmi = new ToolStripMenuItem(menuItemHeader)
{
@@ -915,7 +920,11 @@ private void ApplySettingsToValues()
TsbQuickSaveGameImport.ToolTipText = quickImportInfo.Any()
? "Quick save game import. The following save files will be imported:\n\n" + string.Join("\n", quickImportInfo)
: "No quick import save files configured,\nyou can do this in the settings.";
+
+ importingFromSavegameToolStripMenuItem.DropDownItems.Add(new ToolStripSeparator());
}
+ importingFromSavegameToolStripMenuItem.DropDownItems.Add(selectSavegameFileToolStripMenuItem);
+ importingFromSavegameToolStripMenuItem.DropDownItems.Add(configureSavegameImportToolStripMenuItem);
}
private void importingFromSavegameEmptyToolStripMenuItem_Click(object sender, EventArgs e)
@@ -1124,10 +1133,11 @@ private async void CheckForUpdates(bool silentCheck = false, bool selectDefaultI
// check if values-files can be updated
var downloadedModFiles = Values.V.modsManifest.modsByFiles.Select(mikv => mikv.Value)
- .Where(mi => mi.LocallyAvailable).Select(mi => mi.mod.FileName).ToList();
- downloadedModFiles.Add(FileService.ValuesJson); // check also base values file
+ .Where(mi => mi.LocallyAvailable).Select(mi => mi.mod.FileName)
+ .Append(FileService.ValuesJson) // check also base values file
+ .ToList();
- bool valuesUpdated = CheckAvailabilityAndUpdateModFiles(downloadedModFiles, Values.V);
+ bool valuesUpdated = CheckAvailabilityAndUpdateModFiles(downloadedModFiles, Values.V, out var updatesAvailable);
// update last successful update check
Properties.Settings.Default.lastUpdateCheck = DateTime.Now;
@@ -1151,7 +1161,7 @@ private async void CheckForUpdates(bool silentCheck = false, bool selectDefaultI
"Download of new stat successful, but files couldn't be loaded.\nTry again later, or redownload the tool.");
}
}
- else if (!silentCheck)
+ else if (!silentCheck && !updatesAvailable)
{
MessageBox.Show(
$"You already have the newest version of both the program ({Application.ProductVersion}) and values file ({Values.V.Version}).\n\n" +
@@ -1407,7 +1417,7 @@ private void Form1_FormClosed(object sender, FormClosedEventArgs e)
/// If valid path to file or folder, the user can click on the message to display the path in the explorer
/// If not null, user can copy this text to the clipboard by clicking on the label
private void SetMessageLabelText(string text = null, MessageBoxIcon icon = MessageBoxIcon.None,
- string path = null, string clipboardText = null, bool displayPopup = false)
+ string path = null, string clipboardText = null, bool displayPopup = false, string customPopupText = null)
{
if (_ignoreNextMessageLabel)
{
@@ -1433,6 +1443,8 @@ private void SetMessageLabelText(string text = null, MessageBoxIcon icon = Messa
TbMessageLabel.BackColor = SystemColors.Control;
break;
}
+
+ text = customPopupText ?? text;
if (displayPopup && !string.IsNullOrEmpty(text))
PopupMessage.Show(this, text, 20);
}
@@ -2092,6 +2104,9 @@ private void OpenSettingsDialog(SettingsTabPages page = SettingsTabPages.Unknown
_overlay?.SetInfoPositionsAndFontSize();
if (Properties.Settings.Default.DevTools)
statsMultiplierTesting1.CheckIfMultipliersAreEqualToSettings();
+ else
+ cbExactlyImprinting.Checked = false;
+ cbExactlyImprinting.Visible = Properties.Settings.Default.DevTools;
devToolStripMenuItem.Visible = Properties.Settings.Default.DevTools;
sendExampleCreatureToolStripMenuItem.Visible = Properties.Settings.Default.DevTools;
@@ -2554,7 +2569,7 @@ private void toolStripButtonCopy2Tester_Click(object sender, EventArgs e)
}
// set the data in the creatureInfoInput
- SetTesterInfoInputCreature(); // clear data
+ SetInfoInputCreature(); // clear data
creatureInfoInputTester.CreatureName = creatureInfoInputExtractor.CreatureName;
creatureInfoInputTester.CreatureOwner = creatureInfoInputExtractor.CreatureOwner;
creatureInfoInputTester.CreatureTribe = creatureInfoInputExtractor.CreatureTribe;
@@ -2594,7 +2609,7 @@ private void toolStripButtonClear_Click(object sender, EventArgs e)
}
creatureInfoInputTester.Clear();
- SetTesterInfoInputCreature();
+ SetInfoInputCreature();
}
}
@@ -3442,7 +3457,7 @@ private void ProcessDroppedFiles(string[] files)
break;
case ".sav":
case ".json":
- ImportExportGunFiles(files, out _, out _, out _, Properties.Settings.Default.PlaySoundOnAutoImport);
+ ImportExportGunFiles(files, true, out _, out _, out _, Properties.Settings.Default.PlaySoundOnAutoImport);
break;
case ".asb":
case ".xml":
@@ -3909,69 +3924,6 @@ private void discordServerToolStripMenuItem_Click(object sender, EventArgs e)
Process.Start(RepositoryInfo.DiscordServerInviteLink);
}
- #region Server
-
- private void listenToolStripMenuItem_CheckedChanged(object sender, EventArgs e)
- {
- if (listenToolStripMenuItem.Checked)
- AsbServerStartListening();
- else AsbServerStopListening();
- }
-
- private void listenWithNewTokenToolStripMenuItem_Click(object sender, EventArgs e)
- {
- listenToolStripMenuItem.Checked = false;
- Properties.Settings.Default.ExportServerToken = null;
- listenToolStripMenuItem.Checked = true;
- }
-
- private void AsbServerStartListening()
- {
- var progressReporter = new Progress(AsbServerDataSent);
- if (string.IsNullOrEmpty(Properties.Settings.Default.ExportServerToken))
- Properties.Settings.Default.ExportServerToken = AsbServer.Connection.CreateNewToken();
- Task.Factory.StartNew(() => AsbServer.Connection.StartListeningAsync(progressReporter, Properties.Settings.Default.ExportServerToken));
- }
-
- private void AsbServerStopListening(bool displayMessage = true)
- {
- AsbServer.Connection.StopListening();
- if (displayMessage)
- SetMessageLabelText($"ASB Server listening stopped using token: {Connection.TokenStringForDisplay(Properties.Settings.Default.ExportServerToken)}", MessageBoxIcon.Error);
- }
-
- private void currentTokenToolStripMenuItem_Click(object sender, EventArgs e)
- {
- var tokenIsSet = !string.IsNullOrEmpty(Properties.Settings.Default.ExportServerToken);
- string message;
- bool isError;
- if (tokenIsSet)
- {
- message = $"Currently {(Connection.IsCurrentlyListening ? string.Empty : "not ")}listening to the server."
- + " The current token is " + Environment.NewLine + Connection.TokenStringForDisplay(Properties.Settings.Default.ExportServerToken)
- + Environment.NewLine + "(token copied to clipboard)";
-
- Clipboard.SetText(Properties.Settings.Default.ExportServerToken);
- isError = false;
- }
- else
- {
- message = "Currently no token set. A token is created once you start listening to the server.";
- isError = true;
- }
-
- SetMessageLabelText(message, isError ? MessageBoxIcon.Error : MessageBoxIcon.Information,
- clipboardText: Properties.Settings.Default.ExportServerToken, displayPopup: !Properties.Settings.Default.StreamerMode && Properties.Settings.Default.DisplayPopupForServerToken);
- }
-
- private void sendExampleCreatureToolStripMenuItem_Click(object sender, EventArgs e)
- {
- // debug function, sends a test creature to the server
- AsbServer.Connection.SendCreatureData(DummyCreatures.CreateCreature(speciesSelector1.SelectedSpecies), Properties.Settings.Default.ExportServerToken);
- }
-
- #endregion
-
private void openModPageInBrowserToolStripMenuItem_Click(object sender, EventArgs e)
{
Process.Start(RepositoryInfo.ExportGunModPage);
@@ -3983,5 +3935,10 @@ private void MenuOpenNamePattern(object sender, EventArgs e)
var infoInput = tabControlMain.SelectedTab != tabPageStatTesting ? creatureInfoInputExtractor : creatureInfoInputTester;
CreatureInfoInput_CreatureDataRequested(infoInput, true, false, false, namePatternIndex, infoInput.AlreadyExistingCreature);
}
+
+ private void showTokenPopupOnListeningToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ Properties.Settings.Default.DisplayPopupForServerToken = showTokenPopupOnListeningToolStripMenuItem.Checked;
+ }
}
}
diff --git a/ARKBreedingStats/Form1.exportGun.cs b/ARKBreedingStats/Form1.exportGun.cs
new file mode 100644
index 000000000..69727ca43
--- /dev/null
+++ b/ARKBreedingStats/Form1.exportGun.cs
@@ -0,0 +1,170 @@
+using ARKBreedingStats.AsbServer;
+using ARKBreedingStats.importExportGun;
+using ARKBreedingStats.library;
+using System;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using ARKBreedingStats.utils;
+
+namespace ARKBreedingStats
+{
+ public partial class Form1
+ {
+ private void listenToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ if (listenToolStripMenuItem.Checked)
+ AsbServerStartListening();
+ else AsbServerStopListening();
+ }
+
+ private void listenWithNewTokenToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ AsbServerStartListening(true);
+ listenToolStripMenuItem.Checked = true;
+ }
+
+ private void AsbServerStartListening(bool useNewToken = false)
+ {
+ var progressReporter = new Progress(AsbServerDataSent);
+ if (useNewToken || string.IsNullOrEmpty(Properties.Settings.Default.ExportServerToken))
+ Properties.Settings.Default.ExportServerToken = AsbServer.Connection.CreateNewToken();
+ Task.Factory.StartNew(() => AsbServer.Connection.StartListeningAsync(progressReporter, Properties.Settings.Default.ExportServerToken));
+ }
+
+ private void AsbServerStopListening(bool displayMessage = true)
+ {
+ if (!AsbServer.Connection.StopListening()) return;
+ if (displayMessage)
+ SetMessageLabelText($"ASB Server listening stopped using token: {Connection.TokenStringForDisplay(Properties.Settings.Default.ExportServerToken)}", MessageBoxIcon.Error);
+ }
+
+ private void currentTokenToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ var tokenIsSet = !string.IsNullOrEmpty(Properties.Settings.Default.ExportServerToken);
+ string message;
+ bool isError;
+ if (tokenIsSet)
+ {
+ message = $"Currently {(Connection.IsCurrentlyListening ? string.Empty : "not ")}listening to the server."
+ + " The current token is " + Environment.NewLine + Connection.TokenStringForDisplay(Properties.Settings.Default.ExportServerToken)
+ + Environment.NewLine + "(token copied to clipboard)";
+
+ Clipboard.SetText(Properties.Settings.Default.ExportServerToken);
+ isError = false;
+ }
+ else
+ {
+ message = "Currently no token set. A token is created once you start listening to the server.";
+ isError = true;
+ }
+
+ SetMessageLabelText(message, isError ? MessageBoxIcon.Error : MessageBoxIcon.Information,
+ clipboardText: Properties.Settings.Default.ExportServerToken, displayPopup: !Properties.Settings.Default.StreamerMode && Properties.Settings.Default.DisplayPopupForServerToken);
+ }
+
+ private void sendExampleCreatureToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ // debug function, sends a test creature to the server
+ AsbServer.Connection.SendCreatureData(DummyCreatures.CreateCreature(speciesSelector1.SelectedSpecies), Properties.Settings.Default.ExportServerToken);
+ }
+
+ ///
+ /// Handle reports from the AsbServer listening, e.g. importing creatures or handle errors.
+ ///
+ private void AsbServerDataSent(ProgressReportAsbServer data)
+ {
+ if (!string.IsNullOrEmpty(data.Message))
+ {
+ var displayPopup = false;
+ var message = data.Message;
+ string popupMessage = null;
+ var copyToClipboard = !string.IsNullOrEmpty(data.ClipboardText);
+ if (!string.IsNullOrEmpty(data.ServerToken))
+ {
+ displayPopup = !Properties.Settings.Default.StreamerMode && Properties.Settings.Default.DisplayPopupForServerToken;
+ var tokenInfo = Environment.NewLine
+ + Connection.TokenStringForDisplay(data.ServerToken)
+ + (copyToClipboard
+ ? Environment.NewLine + "(this has been copied to the clipboard)"
+ : string.Empty);
+
+ if (displayPopup)
+ popupMessage = message + Environment.NewLine + tokenInfo
+ + Environment.NewLine + Environment.NewLine + "Enable Streamer mode in Settings -> General to mask the token in future";
+ message += tokenInfo;
+ }
+
+ if (copyToClipboard)
+ Clipboard.SetText(data.ClipboardText);
+
+ if (listenToolStripMenuItem.Checked == data.StoppedListening)
+ listenToolStripMenuItem.Checked = !data.StoppedListening;
+
+ SetMessageLabelText(message, data.IsError ? MessageBoxIcon.Error : MessageBoxIcon.Information, clipboardText: data.ClipboardText,
+ displayPopup: displayPopup, customPopupText: popupMessage);
+
+ return;
+ }
+
+ string resultText;
+ if (string.IsNullOrEmpty(data.ServerHash))
+ {
+ // import creature
+ var creature = ImportExportGun.LoadCreatureFromJson(data.JsonText, null, out resultText, out _);
+ if (creature == null)
+ {
+ SetMessageLabelText(resultText, MessageBoxIcon.Error);
+ return;
+ }
+
+ creature.domesticatedAt = DateTime.Now;
+
+ var addCreature = Properties.Settings.Default.OnAutoImportAddToLibrary;
+ var gotoLibraryTab = addCreature && Properties.Settings.Default.AutoImportGotoLibraryAfterSuccess;
+ if (addCreature)
+ {
+ DetermineLevelStatusAndSoundFeedback(creature, Properties.Settings.Default.PlaySoundOnAutoImport);
+
+ SetNameOfImportedCreature(creature, null, out _,
+ _creatureCollection.creatures.FirstOrDefault(c => c.guid == creature.guid));
+
+ data.TaskNameGenerated?.SetResult(creature.name);
+
+ _creatureCollection.MergeCreatureList(new[] { creature }, true);
+ UpdateCreatureParentLinkingSort(goToLibraryTab: gotoLibraryTab);
+ }
+ else
+ {
+ SetCreatureValuesLevelsAndInfoToExtractor(creature);
+
+ if (Properties.Settings.Default.PlaySoundOnAutoImport)
+ {
+ SoundFeedback.BeepSignalCurrentLevelFlags(IsCreatureAlreadyInLibrary(creature.guid, creature.ArkId, out _));
+ }
+ }
+
+ if (resultText == null)
+ resultText = $"Received creature from server: {creature}";
+
+ SetMessageLabelText(resultText, MessageBoxIcon.Information);
+
+ if (gotoLibraryTab)
+ {
+ tabControlMain.SelectedTab = tabPageLibrary;
+ if (listBoxSpeciesLib.SelectedItem != null &&
+ listBoxSpeciesLib.SelectedItem != creature.Species)
+ listBoxSpeciesLib.SelectedItem = creature.Species;
+
+ _ignoreNextMessageLabel = true;
+ SelectCreatureInLibrary(creature);
+ }
+ return;
+ }
+
+ // import server settings
+ var success = ImportExportGun.ImportServerMultipliersFromJson(_creatureCollection, data.JsonText, data.ServerHash, out resultText);
+ SetMessageLabelText(resultText, success ? MessageBoxIcon.Information : MessageBoxIcon.Error, resultText);
+ }
+ }
+}
diff --git a/ARKBreedingStats/Form1.extractor.cs b/ARKBreedingStats/Form1.extractor.cs
index db3ca08ad..96c36b49a 100644
--- a/ARKBreedingStats/Form1.extractor.cs
+++ b/ARKBreedingStats/Form1.extractor.cs
@@ -13,6 +13,7 @@
using ARKBreedingStats.utils;
using ARKBreedingStats.ocr;
using ARKBreedingStats.uiControls;
+using System.Reflection;
namespace ARKBreedingStats
{
@@ -140,59 +141,79 @@ private void ShowSumOfChosenLevels(int levelsImpossibleToDistribute)
bool allValid = valid && inbound && torporLevelValid && _extractor.ValidResults;
if (allValid)
{
- radarChartExtractor.SetLevels(_statIOs.Select(s => s.LevelWild).ToArray(), _statIOs.Select(s => s.LevelMut).ToArray(), speciesSelector1.SelectedSpecies);
- cbExactlyImprinting.BackColor = Color.Transparent;
- var species = speciesSelector1.SelectedSpecies;
- _highestSpeciesLevels.TryGetValue(species, out int[] highSpeciesLevels);
- _lowestSpeciesLevels.TryGetValue(species, out int[] lowSpeciesLevels);
- _highestSpeciesMutationLevels.TryGetValue(species, out int[] highSpeciesMutationLevels);
- //_lowestSpeciesMutationLevels.TryGetValue(species, out int[] lowSpeciesMutationLevels);
+ UpdateStatusInfoOfExtractorCreature();
+ }
- var statWeights = breedingPlan1.StatWeighting.GetWeightingForSpecies(species);
+ UpdateAddToLibraryButtonAccordingToExtractorValidity(allValid);
+ }
- LevelStatusFlags.DetermineLevelStatus(species, highSpeciesLevels, lowSpeciesLevels, highSpeciesMutationLevels,
- statWeights, GetCurrentWildLevels(), GetCurrentMutLevels(), GetCurrentBreedingValues(),
- out var topStatsText, out var newTopStatsText);
+ ///
+ /// Updates level analysis of creature levels in extractor.
+ ///
+ private void UpdateStatusInfoOfExtractorCreature()
+ {
+ radarChartExtractor.SetLevels(_statIOs.Select(s => s.LevelWild).ToArray(), _statIOs.Select(s => s.LevelMut).ToArray(), speciesSelector1.SelectedSpecies);
+ cbExactlyImprinting.BackColor = Color.Transparent;
+ var species = speciesSelector1.SelectedSpecies;
+ _highestSpeciesLevels.TryGetValue(species, out int[] highSpeciesLevels);
+ _lowestSpeciesLevels.TryGetValue(species, out int[] lowSpeciesLevels);
+ _highestSpeciesMutationLevels.TryGetValue(species, out int[] highSpeciesMutationLevels);
+ //_lowestSpeciesMutationLevels.TryGetValue(species, out int[] lowSpeciesMutationLevels);
- for (var s = 0; s < Stats.StatsCount; s++)
- {
- var levelStatusForStatIo = LevelStatusFlags.LevelStatusFlagsCurrentNewCreature[s];
+ var statWeights = breedingPlan1.StatWeighting.GetWeightingForSpecies(species);
- // ASA can have up to 511 levels because 255 mutation levels also contribute to the wild value. TODO separate to mutation levels
- if (_creatureCollection.Game != Ark.Asa && s != Stats.Torpidity)
- {
- if (_statIOs[s].LevelWild > 255)
- levelStatusForStatIo |= LevelStatusFlags.LevelStatus.UltraMaxLevel;
- else if (_statIOs[s].LevelWild == 255)
- levelStatusForStatIo |= LevelStatusFlags.LevelStatus.MaxLevel;
- else if (_statIOs[s].LevelWild == 254)
- levelStatusForStatIo |= LevelStatusFlags.LevelStatus.MaxLevelForLevelUp;
- }
+ LevelStatusFlags.DetermineLevelStatus(species, highSpeciesLevels, lowSpeciesLevels, highSpeciesMutationLevels,
+ statWeights, GetCurrentWildLevels(), GetCurrentMutLevels(), GetCurrentBreedingValues(),
+ out var topStatsText, out var newTopStatsText);
- _statIOs[s].TopLevel = levelStatusForStatIo;
- }
+ for (var s = 0; s < Stats.StatsCount; s++)
+ {
+ var levelStatusForStatIo = LevelStatusFlags.LevelStatusFlagsCurrentNewCreature[s];
- string infoText = null;
- if (newTopStatsText.Any())
- {
- infoText = $"New top stats: {string.Join(", ", newTopStatsText)}";
- }
- if (topStatsText.Any())
+ // ASA can have up to 511 levels because 255 mutation levels also contribute to the wild value. TODO separate to mutation levels
+ if (_creatureCollection.Game != Ark.Asa && s != Stats.Torpidity)
{
- infoText += $"{(infoText == null ? null : "\n")}Existing top stats: {string.Join(", ", topStatsText)}";
+ if (_statIOs[s].LevelWild > 255)
+ levelStatusForStatIo |= LevelStatusFlags.LevelStatus.UltraMaxLevel;
+ else if (_statIOs[s].LevelWild == 255)
+ levelStatusForStatIo |= LevelStatusFlags.LevelStatus.MaxLevel;
+ else if (_statIOs[s].LevelWild == 254)
+ levelStatusForStatIo |= LevelStatusFlags.LevelStatus.MaxLevelForLevelUp;
}
- if (infoText == null) infoText = "No top stats";
+ _statIOs[s].TopLevel = levelStatusForStatIo;
+ }
- creatureAnalysis1.SetStatsAnalysis(LevelStatusFlags.CombinedLevelStatusFlags, infoText);
+ string infoText = null;
+ if (newTopStatsText.Any())
+ {
+ infoText = $"New top stats: {string.Join(", ", newTopStatsText)}";
}
- creatureInfoInputExtractor.ButtonEnabled = allValid;
- groupBoxRadarChartExtractor.Visible = allValid;
- creatureAnalysis1.Visible = allValid;
+ if (topStatsText.Any())
+ {
+ infoText += $"{(infoText == null ? null : "\n")}Existing top stats: {string.Join(", ", topStatsText)}";
+ }
+
+ if (infoText == null) infoText = "No top stats";
+
+ creatureAnalysis1.SetStatsAnalysis(LevelStatusFlags.CombinedLevelStatusFlags, infoText);
+ }
+
+ private void UpdateAddToLibraryButtonAccordingToExtractorValidity(bool valid)
+ {
+ creatureInfoInputExtractor.ButtonEnabled = valid;
+ groupBoxRadarChartExtractor.Visible = valid;
+ creatureAnalysis1.Visible = valid;
// update inheritance info
CreatureInfoInput_CreatureDataRequested(creatureInfoInputExtractor, false, true, false, 0, null);
}
+ private void SetAllExtractorLevelsToStatus(StatIOStatus status)
+ {
+ foreach (var sio in _statIOs)
+ sio.Status = status;
+ }
+
///
/// Clears all the parameters of the extractor.
///
@@ -901,7 +922,7 @@ private void CopyExtractionToClipboard()
{
try
{
- cv = importExported.ImportExported.ImportExportedCreature(exportFilePath);
+ cv = importExported.ImportExported.ReadExportedCreature(exportFilePath);
break;
}
catch (IOException ex)
@@ -1055,6 +1076,36 @@ void SetExistingValueIfNewValueIsEmpty(ref string newValue, ref string oldValue)
ExtractLevels(autoExtraction, highPrecisionValues, existingCreature: alreadyExistingCreature, possiblyMutagenApplied: cv.flags.HasFlag(CreatureFlags.MutagenApplied));
+ UpdateMutationLevels(cv, alreadyExistingCreature);
+
+ SetCreatureValuesToInfoInput(cv, creatureInfoInputExtractor);
+ UpdateParentListInput(creatureInfoInputExtractor); // this function is only used for single-creature extractions, e.g. LastExport
+ creatureInfoInputExtractor.AlreadyExistingCreature = alreadyExistingCreature;
+ if (!string.IsNullOrEmpty(filePath))
+ SetMessageLabelText(Loc.S("creatureOfFile") + Environment.NewLine + filePath, path: filePath);
+ return creatureExists;
+ }
+
+ private void UpdateMutationLevels(CreatureValues cv, Creature alreadyExistingCreature)
+ {
+ // Do we have enough information to assume the mutation counts are accurate
+ bool AreMutationCountsAccurate(Creature creature)
+ {
+ // assume non-zero mutation counts are accurate
+ return creature.Mutations > 0
+ // assume creatures with parents have accurate mutation counts
+ || creature.motherGuid != Guid.Empty || creature.fatherGuid != Guid.Empty
+ // trust a zero mutation count if the creature is tamed (TamerString, but no ImprinterName or Ancestry)
+ || (!string.IsNullOrEmpty(creature.tribe) && string.IsNullOrEmpty(creature.imprinterName));
+ }
+
+ // Do we have enough information to assume the mutation levels are accurate
+ bool AreMutationLevelsAccurate(Creature creature)
+ {
+ // trust non-zero mutation levels or zeros if the mutation count is accurate
+ return creature.levelsMutated?.Any(m => m != 0) == true || AreMutationCountsAccurate(creature);
+ }
+
if (alreadyExistingCreature?.levelsMutated != null)
{
// use already set mutation levels
@@ -1068,13 +1119,129 @@ void SetExistingValueIfNewValueIsEmpty(ref string newValue, ref string oldValue)
}
}
}
+ else if (cv.Mother?.levelsWild != null && cv.Father?.levelsWild != null
+ && AreMutationLevelsAccurate(cv.Mother) && AreMutationCountsAccurate(cv.Mother)
+ && AreMutationLevelsAccurate(cv.Father) && AreMutationCountsAccurate(cv.Father))
+ {
+ // This doesn't handle the case where a wild baby with mutations and their single parent is extracted
+ // In that case, the baby will have a single parent, but we can trust that they only have 1 parent to mutate from
+
+ // Derive mutation levels from parents
+
+ // Given child with 16 points and 3 new mutations in a given stat
+ // and a mother with 10 wild and 2 mutations
+ // and a father with 14 wild and 2 mutations
+ //
+ // Then the possible child values would be:
+ // | wild | mutations | new mutations |
+ // |------|-----------|---------------|
+ // | 10 | 6 | 2 |
+ // | 14 | 2 | 0 |
+ //
+ //
+ // Given child with 18 points and 2 new mutation
+ // and a mother with 14 wild and 2 mutations
+ // and a father with 12 wild and 4 mutations
+ //
+ // Then the possible child values would be:
+ // | wild | mutations | new mutations |
+ // |------|-----------|---------------|
+ // | 14 | 4 | 1 |
+ // | 12 | 6 | 2 |
+ //
+
+ var possibileLevelsByStat = new List<(int wild, int mutated, int change)>[Stats.StatsCount];
- SetCreatureValuesToInfoInput(cv, creatureInfoInputExtractor);
- UpdateParentListInput(creatureInfoInputExtractor); // this function is only used for single-creature extractions, e.g. LastExport
- creatureInfoInputExtractor.AlreadyExistingCreature = alreadyExistingCreature;
- if (!string.IsNullOrEmpty(filePath))
- SetMessageLabelText(Loc.S("creatureOfFile") + Environment.NewLine + filePath, path: filePath);
- return creatureExists;
+ for (int s = 0; s < Stats.StatsCount; s++)
+ {
+ var possibleLevels = new List<(int, int, int)>();
+ var extractedWild = _statIOs[s].LevelWild;
+
+ if (s == Stats.Torpidity)
+ {
+ // Torpidity is not mutated
+ possibleLevels.Add((extractedWild, 0, 0));
+ }
+ else
+ {
+ var motherWild = cv.Mother.levelsWild[s];
+ var motherMutated = cv.Mother.levelsMutated?[s] ?? 0;
+ var fatherWild = cv.Father.levelsWild[s];
+ var fatherMutated = cv.Father.levelsMutated?[s] ?? 0;
+
+ var lowWild = Math.Min(motherWild, fatherWild);
+ var highWild = Math.Max(motherWild, fatherWild);
+ var lowMutated = Math.Min(motherMutated, fatherMutated);
+ var highMutated = Math.Max(motherMutated, fatherMutated);
+
+ // The number of levels that would have been gained from mutation if the parents' low stats were used
+ var lowChange = extractedWild - lowWild - lowMutated;
+
+ // The number of levels that would have been gained from mutation if the parents' low stats were used
+ var highChange = extractedWild - highWild - highMutated;
+
+ var newLowStats = (wild: lowWild, mutated: lowMutated + lowChange, change: lowChange);
+ var newHighStats = (wild: highWild, mutated: highMutated + highChange, change: highChange);
+
+ // only add low value variation it adds an even number of level and adds less than or equal to the new mutations
+ if (lowChange >= 0 && lowChange <= Ark.MutationRolls * Ark.LevelsAddedPerMutation && lowChange % Ark.LevelsAddedPerMutation == 0)
+ {
+ possibleLevels.Add(newLowStats);
+ }
+
+ // only add a high pair variation if it's not the same as the low
+ if (newLowStats != newHighStats && highChange >= 0 && highChange <= Ark.MutationRolls * Ark.LevelsAddedPerMutation && highChange % Ark.LevelsAddedPerMutation == 0)
+ {
+ possibleLevels.Add(newHighStats);
+ }
+ }
+
+ possibileLevelsByStat[s] = possibleLevels;
+ }
+
+ // It's possible for more than one combination of parent levels and new mutations to account for the
+ // child's levels. If there is only 1 set, use that
+ if (possibileLevelsByStat.All(x => x.Count == 1))
+ {
+ for (int s = 0; s < Stats.StatsCount; s++)
+ {
+ var statIo = _statIOs[s];
+ var levels = possibileLevelsByStat[s][0];
+
+ statIo.LevelWild = levels.wild;
+ statIo.LevelMut = levels.mutated;
+ statIo.Status = StatIOStatus.Neutral;
+ }
+ }
+ else
+ {
+ // When it's ambiguous which parent's stats + new mutations went into the child's stats, we try to
+ // reduce the set of possible new mutation combinations to only those that match the mutation count
+ // difference between the child and the parents
+ var newMutationsMaternal = Math.Max(cv.mutationCounterMother - cv.Mother.Mutations, 0);
+ var newMutationsPaternal = Math.Max(cv.mutationCounterFather - cv.Father.Mutations, 0);
+ var totalNewMutations = newMutationsMaternal + newMutationsPaternal;
+
+ var validLevelCombinations = possibileLevelsByStat
+ .CartesianProduct()
+ .Where(x => x.Sum(y => y.change) == totalNewMutations * Ark.LevelsAddedPerMutation)
+ .ToArray();
+
+ if (validLevelCombinations.Length == 1)
+ {
+ var validCombination = validLevelCombinations[0];
+ for (int s = 0; s < Stats.StatsCount; s++)
+ {
+ var statIo = _statIOs[s];
+ var levels = validCombination[s];
+
+ statIo.LevelWild = levels.wild;
+ statIo.LevelMut = levels.mutated;
+ statIo.Status = StatIOStatus.Neutral;
+ }
+ }
+ }
+ }
}
///
@@ -1220,6 +1387,57 @@ private Creature GetCreatureFromInput(bool fromExtractor, Species species, int?
return creature;
}
+ private void SetCreatureValuesToExtractor(Creature c, bool onlyWild = false)
+ {
+ if (c == null) return;
+ Species species = c.Species;
+ if (species == null)
+ {
+ MessageBoxes.ShowMessageBox($"Unknown species\n{c.speciesBlueprint}\nTry to update the species-stats, or redownload the tool.");
+ return;
+ }
+
+ ClearAll();
+ speciesSelector1.SetSpecies(species);
+ // copy values over to extractor
+ for (int s = 0; s < Stats.StatsCount; s++)
+ {
+ _statIOs[s].Input = onlyWild
+ ? StatValueCalculation.CalculateValue(species, s, c.levelsWild[s], c.levelsMutated[s], 0, true, c.tamingEff,
+ c.imprintingBonus)
+ : c.valuesDom[s];
+ if (c.levelsDom[s] > 0) _statIOs[s].DomLevelLockedZero = false;
+ }
+
+ if (c.isBred)
+ rbBredExtractor.Checked = true;
+ else if (c.isDomesticated)
+ rbTamedExtractor.Checked = true;
+ else
+ rbWildExtractor.Checked = true;
+
+ numericUpDownImprintingBonusExtractor.ValueSave = (decimal)c.imprintingBonus * 100;
+ // set total level
+ int level = onlyWild ? c.levelsWild[Stats.Torpidity] : c.Level;
+ numericUpDownLevel.ValueSave = level;
+
+ // set colors
+ creatureInfoInputExtractor.RegionColors = c.colors;
+
+ tabControlMain.SelectedTab = tabPageExtractor;
+ }
+
+ private void SetCreatureLevelsToExtractor(Creature c)
+ {
+ for (var si = 0; si < Stats.StatsCount; si++)
+ {
+ _statIOs[si].LevelWild = c.levelsWild[si];
+ _statIOs[si].LevelDom = c.levelsDom[si];
+ _statIOs[si].LevelMut = c.levelsMutated?[si] ?? 0;
+ _statIOs[si].BreedingValue = c.valuesBreeding[si];
+ }
+ }
+
///
/// Gives feedback to the user if the current creature in the extractor is already in the library.
/// This uses the ARK-ID and only works if exported creatures are imported
diff --git a/ARKBreedingStats/Form1.importExported.cs b/ARKBreedingStats/Form1.importExported.cs
index ca14ba1a6..c63be529f 100644
--- a/ARKBreedingStats/Form1.importExported.cs
+++ b/ARKBreedingStats/Form1.importExported.cs
@@ -12,6 +12,7 @@
using ARKBreedingStats.NamePatterns;
using ARKBreedingStats.species;
using ARKBreedingStats.utils;
+using ARKBreedingStats.uiControls;
namespace ARKBreedingStats
{
@@ -217,10 +218,10 @@ private Creature ImportExportedAddIfPossible(string filePath)
break;
case ".sav":
case ".json":
- alreadyExistingCreature = ImportExportGunFiles(new[] { filePath }, out addedToLibrary,
+ alreadyExistingCreature = ImportExportGunFiles(new[] { filePath }, Properties.Settings.Default.OnAutoImportAddToLibrary, out addedToLibrary,
out creature, out copiedNameToClipboard);
alreadyExists = alreadyExistingCreature != null;
- if (!addedToLibrary || creature == null) return null;
+ if (creature == null) return null;
uniqueExtraction = true;
break;
default: return null;
@@ -311,10 +312,10 @@ private Creature ImportExportedAddIfPossible(string filePath)
/// Sets the name of an imported creature and copies it to the clipboard depending on the user settings.
///
/// True if name was copied to clipboard
- private bool SetNameOfImportedCreature(Creature creature, Creature[] creaturesOfSpeciesIn, out Creature[] creaturesOfSpecies, Creature alreadyExistingCreature, int totalCreatureCount)
+ private bool SetNameOfImportedCreature(Creature creature, Creature[] creaturesOfSpeciesIn, out Creature[] creaturesOfSpecies, Creature alreadyExistingCreature, int totalCreatureCount = -1)
{
creaturesOfSpecies = creaturesOfSpeciesIn;
- if (ApplyNamingPattern(creature, alreadyExistingCreature))
+ if (ShouldNamingPatternBeApplied(creature, alreadyExistingCreature))
{
// don't overwrite existing ASB creature name with empty ingame name
if (!string.IsNullOrEmpty(alreadyExistingCreature?.name) && string.IsNullOrEmpty(creature.name))
@@ -326,6 +327,9 @@ private bool SetNameOfImportedCreature(Creature creature, Creature[] creaturesOf
if (creaturesOfSpecies == null)
creaturesOfSpecies = _creatureCollection.creatures.Where(c => c.Species == creature.Species)
.ToArray();
+ if (totalCreatureCount < 0)
+ totalCreatureCount = _creatureCollection.GetTotalCreatureCount();
+
creature.name = NamePattern.GenerateCreatureName(creature, alreadyExistingCreature, creaturesOfSpecies,
_highestSpeciesLevels.TryGetValue(creature.Species, out var topLevels) ? topLevels : null,
_lowestSpeciesLevels.TryGetValue(creature.Species, out var lowestLevels) ? lowestLevels : null,
@@ -343,7 +347,7 @@ private bool SetNameOfImportedCreature(Creature creature, Creature[] creaturesOf
///
/// Returns true if the naming pattern should be applied according to the settings.
///
- private bool ApplyNamingPattern(Creature creature, Creature alreadyExistingCreature) =>
+ private bool ShouldNamingPatternBeApplied(Creature creature, Creature alreadyExistingCreature) =>
Properties.Settings.Default.applyNamePatternOnAutoImportAlways
|| (Properties.Settings.Default.applyNamePatternOnImportIfEmptyName
&& string.IsNullOrEmpty(creature.name))
@@ -380,6 +384,12 @@ private void OverlayFeedbackForImport(Creature creature, bool uniqueExtraction,
sb.Append(LevelStatusFlags.LevelInfoText);
+ if (!string.IsNullOrEmpty(creatureAnalysis1.ColorStatus))
+ {
+ sb.AppendLine();
+ sb.AppendLine(creatureAnalysis1.ColorStatus.Replace(": ", ":" + Environment.NewLine).Replace(", ", Environment.NewLine));
+ }
+
infoText = sb.ToString();
textColor = Color.FromArgb(colorSaturation, 255, colorSaturation);
}
@@ -492,7 +502,7 @@ private void CreateImportExportedMenu()
ATImportExportedFolderLocation aTImportExportedFolderLocation =
ATImportExportedFolderLocation.CreateFromString(f);
string menuItemHeader = string.IsNullOrEmpty(aTImportExportedFolderLocation.ConvenientName)
- ? ""
+ ? Utils.ShortPath(aTImportExportedFolderLocation.FolderPath)
: aTImportExportedFolderLocation.ConvenientName;
ToolStripMenuItem tsmi = new ToolStripMenuItem(menuItemHeader
+ (string.IsNullOrEmpty(
@@ -500,7 +510,8 @@ private void CreateImportExportedMenu()
? string.Empty
: " - " + aTImportExportedFolderLocation.OwnerSuffix))
{
- Tag = aTImportExportedFolderLocation
+ Tag = aTImportExportedFolderLocation,
+ ToolTipText = aTImportExportedFolderLocation.FolderPath
};
tsmi.Click += OpenImportExportForm;
importExportedCreaturesToolStripMenuItem.DropDownItems.Add(tsmi);
diff --git a/ARKBreedingStats/Form1.importSave.cs b/ARKBreedingStats/Form1.importSave.cs
index e45fe4433..908c0e74a 100644
--- a/ARKBreedingStats/Form1.importSave.cs
+++ b/ARKBreedingStats/Form1.importSave.cs
@@ -21,7 +21,36 @@ public partial class Form1
{
private async void SavegameImportClick(object sender, EventArgs e)
{
- var error = await RunSavegameImport((ATImportFileLocation)((ToolStripMenuItem)sender).Tag);
+ string error = null;
+ if (sender is ToolStripMenuItem tsmi && tsmi.Tag is ATImportFileLocation atImportFileLocation)
+ {
+ error = await RunSavegameImport(atImportFileLocation);
+ }
+ else
+ {
+ var initialFolder = Properties.Settings.Default.ManualSaveGameImportFolder;
+ if (string.IsNullOrEmpty(initialFolder) || !Directory.Exists(initialFolder))
+ initialFolder = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
+
+ string saveFileLocation = null;
+ using (OpenFileDialog dlg = new OpenFileDialog
+ {
+ Filter = "ARK save file (*.ark)|*.ark",
+ InitialDirectory = initialFolder
+ })
+ {
+ if (dlg.ShowDialog() == DialogResult.OK)
+ {
+ saveFileLocation = dlg.FileName;
+ Properties.Settings.Default.ManualSaveGameImportFolder = Path.GetDirectoryName(dlg.FileName);
+ }
+ }
+
+ if (string.IsNullOrEmpty(saveFileLocation)) return;
+
+ error = await RunSavegameImport(saveFileLocation);
+ }
+
if (string.IsNullOrEmpty(error)) return;
MessageBoxes.ShowMessageBox(error, "Savegame import error");
}
@@ -31,10 +60,20 @@ private async void SavegameImportClick(object sender, EventArgs e)
///
/// null on success, else an error message to show, or an empty string if the error was already displayed.
private async Task RunSavegameImport(ATImportFileLocation atImportFileLocation)
+ {
+ return await RunSavegameImport(atImportFileLocation.FileLocation, atImportFileLocation.ConvenientName,
+ atImportFileLocation.ServerName);
+ }
+
+ ///
+ /// Imports the creatures from the given saveGame. ftp is possible.
+ ///
+ /// null on success, else an error message to show, or an empty string if the error was already displayed.
+ private async Task RunSavegameImport(string fileLocation, string convenientName = null, string serverName = null)
{
TsbQuickSaveGameImport.Enabled = false;
TsbQuickSaveGameImport.BackColor = Color.Yellow;
- ToolStripStatusLabelImport.Text = $"{Loc.S("ImportingSavegame")} {atImportFileLocation.ConvenientName}";
+ ToolStripStatusLabelImport.Text = $"{Loc.S("ImportingSavegame")} {convenientName ?? fileLocation}";
ToolStripStatusLabelImport.Visible = true;
string workingCopyFolderPath = Properties.Settings.Default.savegameExtractionPath;
@@ -44,12 +83,11 @@ private async Task RunSavegameImport(ATImportFileLocation atImportFileLo
// working dir not configured? use temp dir
// luser configured savegame folder as working dir? use temp dir instead
if (string.IsNullOrWhiteSpace(workingCopyFolderPath) ||
- Path.GetDirectoryName(atImportFileLocation.FileLocation) == workingCopyFolderPath)
+ Path.GetDirectoryName(fileLocation) == workingCopyFolderPath)
{
workingCopyFolderPath = Path.GetTempPath();
}
- var fileLocation = atImportFileLocation.FileLocation;
string uriFileRegex = null;
var indexLastSlash = fileLocation.LastIndexOf('/');
@@ -70,7 +108,7 @@ private async Task RunSavegameImport(ATImportFileLocation atImportFileLo
{
case "ftp":
string errorMessage;
- (workingCopyFilePath, errorMessage) = await CopyFtpFileAsync(uri, uriFileRegex, atImportFileLocation.ConvenientName,
+ (workingCopyFilePath, errorMessage) = await CopyFtpFileAsync(uri, uriFileRegex, convenientName ?? serverName ?? fileLocation,
workingCopyFolderPath);
if (errorMessage != null)
// the user didn't enter credentials
@@ -82,14 +120,14 @@ private async Task RunSavegameImport(ATImportFileLocation atImportFileLo
}
else
{
- if (!File.Exists(atImportFileLocation.FileLocation))
- return $"File not found: {atImportFileLocation.FileLocation}";
+ if (!File.Exists(fileLocation))
+ return $"File not found: {fileLocation}";
workingCopyFilePath = Path.Combine(workingCopyFolderPath,
- Path.GetFileName(atImportFileLocation.FileLocation));
+ Path.GetFileName(fileLocation));
try
{
- File.Copy(atImportFileLocation.FileLocation, workingCopyFilePath, true);
+ File.Copy(fileLocation, workingCopyFilePath, true);
}
catch (Exception ex)
{
@@ -98,14 +136,14 @@ private async Task RunSavegameImport(ATImportFileLocation atImportFileLo
}
}
- if (new FileInfo(workingCopyFilePath).Length > int.MaxValue
- && MessageBox.Show("The file is very large (> 2 GB), importing can take some minutes. Continue?", "Importing large file", MessageBoxButtons.YesNo) != DialogResult.Yes)
+ var fileSize = new FileInfo(workingCopyFilePath).Length;
+ if (fileSize > int.MaxValue
+ && MessageBox.Show($"The file is very large (~{Math.Round(fileSize / 1e9, 1)} GB), importing can take some minutes. Continue?", "Importing large file", MessageBoxButtons.YesNo) != DialogResult.Yes)
{
return "Import aborted by user because of large file size";
}
- await ImportSavegame.ImportCollectionFromSavegame(_creatureCollection, workingCopyFilePath,
- atImportFileLocation.ServerName);
+ await ImportSavegame.ImportCollectionFromSavegame(_creatureCollection, workingCopyFilePath, serverName);
UpdateCreatureParentLinkingSort(goToLibraryTab: true);
@@ -116,7 +154,8 @@ await ImportSavegame.ImportCollectionFromSavegame(_creatureCollection, workingCo
}
catch (Exception ex)
{
- MessageBoxes.ExceptionMessageBox(ex, $"An error occurred while importing the file {atImportFileLocation.FileLocation}.", "Save file import error");
+ var noAsaSupportInfo = ex.Message.StartsWith("Found unknown Version 20819") ? "Importing save games from ARK: Survival Ascended (ASA) is not yet supported, currently only ARK: Survival Evolved (ASE) is supported for save file import.\n\n" : null;
+ MessageBoxes.ExceptionMessageBox(ex, $"{noAsaSupportInfo}An error occurred while importing the file {fileLocation}.", "Save file import error");
return string.Empty;
}
finally
@@ -163,6 +202,8 @@ await ImportSavegame.ImportCollectionFromSavegame(_creatureCollection, workingCo
}
}
var client = new AsyncFtpClient(ftpUri.Host, credentials.Username, credentials.Password, ftpUri.Port);
+ client.Config.EncryptionMode = FtpEncryptionMode.Auto;
+ client.Config.ValidateAnyCertificate = true;
string ftpPath = null;
try
diff --git a/ARKBreedingStats/Form1.l10n.cs b/ARKBreedingStats/Form1.l10n.cs
index 914247d7f..b56e238bf 100644
--- a/ARKBreedingStats/Form1.l10n.cs
+++ b/ARKBreedingStats/Form1.l10n.cs
@@ -25,7 +25,7 @@ private void SetLocalizations(bool initialize = true)
Loc.ControlText(saveToolStripMenuItem);
Loc.ControlText(saveAsToolStripMenuItem);
Loc.ControlText(importingFromSavegameToolStripMenuItem);
- Loc.ControlText(importingFromSavegameEmptyToolStripMenuItem);
+ Loc.ControlText(configureSavegameImportToolStripMenuItem);
//Loc.ControlText(runDefaultExtractionAndImportFileToolStripMenuItem);
//Loc.ControlText(runDefaultExtractionToolStripMenuItem);
//Loc.ControlText(importCreatedJsonfileToolStripMenuItem);
diff --git a/ARKBreedingStats/Form1.tester.cs b/ARKBreedingStats/Form1.tester.cs
index 5c8881dac..926022d95 100644
--- a/ARKBreedingStats/Form1.tester.cs
+++ b/ARKBreedingStats/Form1.tester.cs
@@ -63,7 +63,7 @@ private void EditCreatureInTester(Creature c, bool virtualCreature = false)
_testingIOs[s].LevelDom = c.levelsDom[s];
}
tabControlMain.SelectedTab = tabPageStatTesting;
- SetTesterInfoInputCreature(c, virtualCreature);
+ SetInfoInputCreature(c, virtualCreature);
}
private void UpdateAllTesterValues()
@@ -231,7 +231,7 @@ private void creatureInfoInputTester_Save2Library_Clicked(CreatureInfoInput send
raisingControl1.RecreateList();
}
- SetTesterInfoInputCreature();
+ SetInfoInputCreature();
_libraryNeedsUpdate = true;
tabControlMain.SelectedTab = tabPageLibrary;
}
@@ -239,101 +239,69 @@ private void creatureInfoInputTester_Save2Library_Clicked(CreatureInfoInput send
///
/// Set the values in the creatureInfoInput control to the values of the creature or clears the inputs.
///
- private void SetTesterInfoInputCreature(Creature c = null, bool virtualCreature = false)
+ private void SetInfoInputCreature(Creature c = null, bool virtualCreature = false, bool tester = true)
{
bool enable = c != null; // set to a creature, or clear
- creatureInfoInputTester.ShowSaveButton = enable && !virtualCreature;
- labelCurrentTesterCreature.Visible = enable;
- lbCurrentCreature.Visible = enable;
+ var infoInput = creatureInfoInputExtractor;
+ if (tester)
+ {
+ infoInput = creatureInfoInputTester;
+ creatureInfoInputTester.ShowSaveButton = enable && !virtualCreature;
+ labelCurrentTesterCreature.Visible = enable;
+ if (enable)
+ labelCurrentTesterCreature.Text = c.name;
+ lbCurrentCreature.Visible = enable;
+ _creatureTesterEdit = c;
+ }
+
if (enable)
{
- labelCurrentTesterCreature.Text = c.name;
- creatureInfoInputTester.Mother = c.Mother;
- creatureInfoInputTester.Father = c.Father;
- creatureInfoInputTester.CreatureName = c.name;
- creatureInfoInputTester.CreatureSex = c.sex;
- creatureInfoInputTester.CreatureOwner = c.owner;
- creatureInfoInputTester.CreatureTribe = c.tribe;
- creatureInfoInputTester.CreatureServer = c.server;
- creatureInfoInputTester.CreatureStatus = c.Status;
- creatureInfoInputTester.CreatureNote = c.note;
- creatureInfoInputTester.CooldownUntil = c.cooldownUntil;
- creatureInfoInputTester.GrowingUntil = c.growingUntil;
- creatureInfoInputTester.DomesticatedAt = c.domesticatedAt;
- creatureInfoInputTester.AddedToLibraryAt = c.addedToLibrary;
- creatureInfoInputTester.CreatureFlags = c.flags;
- creatureInfoInputTester.RegionColors = c.colors;
- creatureInfoInputTester.ColorIdsAlsoPossible = c.ColorIdsAlsoPossible;
- creatureInfoInputTester.CreatureGuid = c.guid;
- creatureInfoInputTester.SetArkId(c.ArkId, c.ArkIdImported);
- UpdateParentListInput(creatureInfoInputTester);
- creatureInfoInputTester.MutationCounterMother = c.mutationsMaternal;
- creatureInfoInputTester.MutationCounterFather = c.mutationsPaternal;
+ infoInput.Mother = c.Mother;
+ infoInput.Father = c.Father;
+ infoInput.CreatureName = c.name;
+ infoInput.CreatureSex = c.sex;
+ infoInput.CreatureOwner = c.owner;
+ infoInput.CreatureTribe = c.tribe;
+ infoInput.CreatureServer = c.server;
+ infoInput.CreatureStatus = c.Status;
+ infoInput.CreatureNote = c.note;
+ infoInput.CooldownUntil = c.cooldownUntil;
+ infoInput.GrowingUntil = c.growingUntil;
+ infoInput.DomesticatedAt = c.domesticatedAt;
+ infoInput.AddedToLibraryAt = c.addedToLibrary;
+ infoInput.CreatureFlags = c.flags;
+ infoInput.RegionColors = c.colors;
+ infoInput.ColorIdsAlsoPossible = c.ColorIdsAlsoPossible;
+ infoInput.CreatureGuid = c.guid;
+ infoInput.SetArkId(c.ArkId, c.ArkIdImported);
+ UpdateParentListInput(infoInput);
+ infoInput.MutationCounterMother = c.mutationsMaternal;
+ infoInput.MutationCounterFather = c.mutationsPaternal;
}
else
{
- creatureInfoInputTester.Mother = null;
- creatureInfoInputTester.Father = null;
- creatureInfoInputTester.CreatureName = string.Empty;
- creatureInfoInputTester.CreatureSex = Sex.Unknown;
- creatureInfoInputTester.CreatureOwner = string.Empty;
- creatureInfoInputTester.CreatureTribe = string.Empty;
- creatureInfoInputTester.CreatureServer = string.Empty;
- creatureInfoInputTester.CreatureStatus = CreatureStatus.Available;
- creatureInfoInputTester.CreatureNote = string.Empty;
- creatureInfoInputTester.CooldownUntil = DateTime.Now.AddHours(-1);
- creatureInfoInputTester.GrowingUntil = DateTime.Now.AddHours(-1);
- creatureInfoInputTester.DomesticatedAt = null;
- creatureInfoInputTester.AddedToLibraryAt = null;
- creatureInfoInputTester.CreatureFlags = CreatureFlags.None;
- creatureInfoInputTester.RegionColors = new byte[Ark.ColorRegionCount];
- creatureInfoInputTester.ColorIdsAlsoPossible = null;
- creatureInfoInputTester.CreatureGuid = Guid.Empty;
- creatureInfoInputTester.SetArkId(0, false);
- creatureInfoInputTester.MutationCounterMother = 0;
- creatureInfoInputTester.parentListValid = false;
+ infoInput.Clear();
}
- _creatureTesterEdit = c;
}
- private void SetCreatureValuesToExtractor(Creature c, bool onlyWild = false)
+ ///
+ /// Set values in extractor to values of given creature
+ ///
+ ///
+ private void SetCreatureValuesLevelsAndInfoToExtractor(Creature c)
{
- if (c == null) return;
- Species species = c.Species;
- if (species == null)
- {
- MessageBoxes.ShowMessageBox($"Unknown species\n{c.speciesBlueprint}\nTry to update the species-stats, or redownload the tool.");
- return;
- }
-
- ClearAll();
- speciesSelector1.SetSpecies(species);
- // copy values over to extractor
- for (int s = 0; s < Stats.StatsCount; s++)
- {
- _statIOs[s].Input = onlyWild
- ? StatValueCalculation.CalculateValue(species, s, c.levelsWild[s], c.levelsMutated[s], 0, true, c.tamingEff,
- c.imprintingBonus)
- : c.valuesDom[s];
- if (c.levelsDom[s] > 0) _statIOs[s].DomLevelLockedZero = false;
- }
-
- if (c.isBred)
- rbBredExtractor.Checked = true;
- else if (c.isDomesticated)
- rbTamedExtractor.Checked = true;
- else
- rbWildExtractor.Checked = true;
-
- numericUpDownImprintingBonusExtractor.ValueSave = (decimal)c.imprintingBonus * 100;
- // set total level
- int level = onlyWild ? c.levelsWild[Stats.Torpidity] : c.Level;
- numericUpDownLevel.ValueSave = level;
-
- // set colors
- creatureInfoInputExtractor.RegionColors = c.colors;
-
- tabControlMain.SelectedTab = tabPageExtractor;
+ IsCreatureAlreadyInLibrary(c.guid, c.ArkId, out var alreadyExistingCreature);
+ SetNameOfImportedCreature(c, null, out _, alreadyExistingCreature);
+ SetInfoInputCreature(c, tester: false);
+ SetCreatureValuesToExtractor(c);
+ creatureInfoInputExtractor.CreatureGuid = c.guid;
+ creatureInfoInputExtractor.SetArkId(c.ArkId, c.ArkIdImported);
+ SetCreatureLevelsToExtractor(c);
+ SetAllExtractorLevelsToStatus(StatIOStatus.Unique);
+ UpdateParentListInput(creatureInfoInputExtractor);
+ creatureInfoInputExtractor.AlreadyExistingCreature = alreadyExistingCreature;
+ UpdateStatusInfoOfExtractorCreature();
+ UpdateAddToLibraryButtonAccordingToExtractorValidity(true);
}
private void SetRandomWildLevels(object sender, EventArgs e)
diff --git a/ARKBreedingStats/Form1.values.cs b/ARKBreedingStats/Form1.values.cs
index eb3556203..8aa4f0e7f 100644
--- a/ARKBreedingStats/Form1.values.cs
+++ b/ARKBreedingStats/Form1.values.cs
@@ -30,7 +30,7 @@ private bool LoadModValueFiles(List modFilesToLoad, bool showResult, boo
if (modFilesToLoad == null) throw new ArgumentNullException();
// first ensure that all mod-files are available
- CheckAvailabilityAndUpdateModFiles(modFilesToLoad, Values.V);
+ CheckAvailabilityAndUpdateModFiles(modFilesToLoad, Values.V, out _);
bool modFilesLoaded = Values.V.LoadModValues(modFilesToLoad, true, out mods, out string resultsMessage);
@@ -61,6 +61,7 @@ private static void CheckForMissingModFiles(CreatureCollection creatureCollectio
bool alreadyLoadedModFilesWithoutNeededClassExist = alreadyLoadedModFilesWithoutNeededClass != null && alreadyLoadedModFilesWithoutNeededClass.Any();
MessageBoxes.ShowMessageBox("Some of the creatures to be imported have an unknown species, most likely because a mod is used.\n"
+ + "If you play Ark: Survival Ascended, make sure you have set the mode to ASA in the settings.\n"
+ "To import these creatures, this application needs additional information about these mods."
+ (locallyAvailableModsExist ?
"\n\nThe value files for the following mods are already locally available and just need to be added to the library:\n\n- "
@@ -101,10 +102,11 @@ private static void CheckForMissingModFiles(CreatureCollection creatureCollectio
///
/// Returns true if files were downloaded.
///
- private static bool CheckAvailabilityAndUpdateModFiles(List modFilesToCheck, Values values)
+ private static bool CheckAvailabilityAndUpdateModFiles(List modFilesToCheck, Values values, out bool updatesAreAvailable)
{
var (missingModValueFilesOnlineAvailable, missingModValueFilesOnlineNotAvailable, modValueFilesWithAvailableUpdate) = values.CheckAvailabilityAndUpdateModFiles(modFilesToCheck);
+ updatesAreAvailable = modValueFilesWithAvailableUpdate.Any() || missingModValueFilesOnlineAvailable.Any();
bool filesDownloaded = false;
if (modValueFilesWithAvailableUpdate.Any()
diff --git a/ARKBreedingStats/NamePatterns/NamePatternFunctions.cs b/ARKBreedingStats/NamePatterns/NamePatternFunctions.cs
index 4ebff1d5f..1e7a29e61 100644
--- a/ARKBreedingStats/NamePatterns/NamePatternFunctions.cs
+++ b/ARKBreedingStats/NamePatterns/NamePatternFunctions.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
@@ -14,6 +15,9 @@ namespace ARKBreedingStats.NamePatterns
///
internal static class NamePatternFunctions
{
+ ///
+ /// Match is expected to have 4 groups, first the function name, then three optional parameters.
+ ///
internal static string ResolveFunction(Match match, NamePatternParameters parameters)
{
var functionName = match.Groups[1].Value.ToLower();
@@ -60,7 +64,8 @@ private static string ParametersInvalid(string specificError, string expression,
{"colornew", FunctionColorNew},
{"indexof", FunctionIndexOf},
{"md5", FunctionMd5},
- {"listname", FunctionListName }
+ {"listname", FunctionListName },
+ {"list", FunctionList }
};
private static string FunctionIf(Match m, NamePatternParameters p)
@@ -384,6 +389,22 @@ private static string FunctionListName(Match m, NamePatternParameters p)
return NameList.GetName(nameIndex, m.Groups[3].Value);
}
+ private static string FunctionList(Match m, NamePatternParameters p)
+ {
+ // splits string at separator, trims, removes empty entries, joins with separator
+ // parameter: 1: list string, 2: initial separator, 3: final separator
+
+ var listString = m.Groups[2].Value;
+ var initialSeparator = m.Groups[3].Value;
+ var finalSeparator = m.Groups[4].Value;
+ if (string.IsNullOrWhiteSpace(listString)) return string.Empty;
+ if (string.IsNullOrEmpty(initialSeparator)) return listString;
+
+ return string.Join(finalSeparator,
+ listString.Split(new[] { initialSeparator }, StringSplitOptions.RemoveEmptyEntries)
+ .Select(e => e.Trim()).Where(e => !string.IsNullOrEmpty(e)));
+ }
+
public static void Dispose()
{
_md5?.Dispose();
diff --git a/ARKBreedingStats/NamePatterns/PatternEditor.Designer.cs b/ARKBreedingStats/NamePatterns/PatternEditor.Designer.cs
index f16d553f4..dc26c46cf 100644
--- a/ARKBreedingStats/NamePatterns/PatternEditor.Designer.cs
+++ b/ARKBreedingStats/NamePatterns/PatternEditor.Designer.cs
@@ -82,7 +82,7 @@ private void InitializeComponent()
this.label2.Dock = System.Windows.Forms.DockStyle.Fill;
this.label2.Location = new System.Drawing.Point(3, 46);
this.label2.Name = "label2";
- this.label2.Size = new System.Drawing.Size(696, 32);
+ this.label2.Size = new System.Drawing.Size(696, 40);
this.label2.TabIndex = 3;
this.label2.Text = resources.GetString("label2.Text");
//
@@ -135,7 +135,7 @@ private void InitializeComponent()
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 5;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 46F));
- this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 32F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
@@ -179,7 +179,7 @@ private void InitializeComponent()
// linkLabel1
//
this.linkLabel1.AutoSize = true;
- this.linkLabel1.Location = new System.Drawing.Point(3, 106);
+ this.linkLabel1.Location = new System.Drawing.Point(3, 114);
this.linkLabel1.Name = "linkLabel1";
this.linkLabel1.Size = new System.Drawing.Size(185, 13);
this.linkLabel1.TabIndex = 10;
@@ -192,10 +192,10 @@ private void InitializeComponent()
this.tabControl1.Controls.Add(this.TabPageKeysFunctions);
this.tabControl1.Controls.Add(this.TabPagePatternTemplates);
this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.tabControl1.Location = new System.Drawing.Point(3, 129);
+ this.tabControl1.Location = new System.Drawing.Point(3, 137);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
- this.tabControl1.Size = new System.Drawing.Size(696, 498);
+ this.tabControl1.Size = new System.Drawing.Size(696, 490);
this.tabControl1.TabIndex = 16;
//
// TabPageKeysFunctions
@@ -204,7 +204,7 @@ private void InitializeComponent()
this.TabPageKeysFunctions.Location = new System.Drawing.Point(4, 22);
this.TabPageKeysFunctions.Name = "TabPageKeysFunctions";
this.TabPageKeysFunctions.Padding = new System.Windows.Forms.Padding(3);
- this.TabPageKeysFunctions.Size = new System.Drawing.Size(688, 472);
+ this.TabPageKeysFunctions.Size = new System.Drawing.Size(688, 464);
this.TabPageKeysFunctions.TabIndex = 0;
this.TabPageKeysFunctions.Text = "Keys and Functions";
this.TabPageKeysFunctions.UseVisualStyleBackColor = true;
@@ -222,7 +222,7 @@ private void InitializeComponent()
this.TlpKeysFunctions.RowCount = 2;
this.TlpKeysFunctions.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F));
this.TlpKeysFunctions.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
- this.TlpKeysFunctions.Size = new System.Drawing.Size(682, 466);
+ this.TlpKeysFunctions.Size = new System.Drawing.Size(682, 458);
this.TlpKeysFunctions.TabIndex = 15;
//
// panel3
@@ -298,7 +298,7 @@ private void InitializeComponent()
// CbPatternNameToClipboardAfterManualApplication
//
this.CbPatternNameToClipboardAfterManualApplication.AutoSize = true;
- this.CbPatternNameToClipboardAfterManualApplication.Location = new System.Drawing.Point(3, 81);
+ this.CbPatternNameToClipboardAfterManualApplication.Location = new System.Drawing.Point(3, 89);
this.CbPatternNameToClipboardAfterManualApplication.Name = "CbPatternNameToClipboardAfterManualApplication";
this.CbPatternNameToClipboardAfterManualApplication.Size = new System.Drawing.Size(339, 17);
this.CbPatternNameToClipboardAfterManualApplication.TabIndex = 17;
diff --git a/ARKBreedingStats/NamePatterns/PatternEditor.cs b/ARKBreedingStats/NamePatterns/PatternEditor.cs
index f9662a90b..a77b677c4 100644
--- a/ARKBreedingStats/NamePatterns/PatternEditor.cs
+++ b/ARKBreedingStats/NamePatterns/PatternEditor.cs
@@ -544,7 +544,8 @@ private void InsertText(string text)
{"color","{{#color: regionId | return color name | return value even for unused regions }}. Returns the colorId of the region. If the second parameter is not empty, the color name will be returned. Unused regions will only return a value if the third value is not empty.\n{{#color: 0 | true }}"},
{"colorNew","{{#colorNew: regionId }}. Returns newInRegion if the region contains a color that is not yet available in that species. Returns newInSpecies if that color is not yet available in any region of that species.\n{{#colorNew: 0 }}"},
{"indexOf","{{#indexof: source string | string to find }}. Returns the index of the second parameter in the first parameter. If the string is not contained, an empty string will be returned.\n{{#indexof: hello | ll }}"},
- {"md5", "{{#md5: string }}, returns the md5 hash of a given string\n{{#md5: {hp}{st}{we} }}"}
+ {"md5", "{{#md5: string }}, returns the md5 hash of a given string\n{{#md5: {hp}{st}{we} }}"},
+ {"list", "{{#list: list string | initial separator | final separator }}, removes empty entries, especially the last separator is removed.\n{{#list: 10,,48,24, | , | , }}"}
};
private void btnClear_Click(object sender, EventArgs e)
diff --git a/ARKBreedingStats/NamePatterns/PatternEditor.resx b/ARKBreedingStats/NamePatterns/PatternEditor.resx
index c96085258..1eeb27286 100644
--- a/ARKBreedingStats/NamePatterns/PatternEditor.resx
+++ b/ARKBreedingStats/NamePatterns/PatternEditor.resx
@@ -118,6 +118,6 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
- Use the listed keywords to create a pattern that can be applied to a creature. This will make it easier to give names to creatures that follow the same pattern. Any text that is not a pattern will appear literally.
+ Use the listed keywords to create a pattern that can be applied to a creature. This will make it easier to give names to creatures that follow the same pattern. Any text that is not a pattern will appear literally. Parameters will be trimmed (i.e. spaces at the front and end will be removed). You can use &&sp; for space and &{ for {, &} for } and &&vline; for |.
\ No newline at end of file
diff --git a/ARKBreedingStats/Properties/AssemblyInfo.cs b/ARKBreedingStats/Properties/AssemblyInfo.cs
index b0a195a61..da125186d 100644
--- a/ARKBreedingStats/Properties/AssemblyInfo.cs
+++ b/ARKBreedingStats/Properties/AssemblyInfo.cs
@@ -30,6 +30,6 @@
// Revision
//
[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("0.60.4.0")]
+[assembly: AssemblyFileVersion("0.61.0.0")]
[assembly: NeutralResourcesLanguage("en")]
diff --git a/ARKBreedingStats/Properties/Settings.Designer.cs b/ARKBreedingStats/Properties/Settings.Designer.cs
index 10db61536..cee2d107b 100644
--- a/ARKBreedingStats/Properties/Settings.Designer.cs
+++ b/ARKBreedingStats/Properties/Settings.Designer.cs
@@ -2337,5 +2337,53 @@ public bool DisplayPopupForServerToken {
this["DisplayPopupForServerToken"] = value;
}
}
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool BreedingPlanConsiderMutatedLevels {
+ get {
+ return ((bool)(this["BreedingPlanConsiderMutatedLevels"]));
+ }
+ set {
+ this["BreedingPlanConsiderMutatedLevels"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool InfoGraphicDisplaySumWildMut {
+ get {
+ return ((bool)(this["InfoGraphicDisplaySumWildMut"]));
+ }
+ set {
+ this["InfoGraphicDisplaySumWildMut"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string ManualSaveGameImportFolder {
+ get {
+ return ((string)(this["ManualSaveGameImportFolder"]));
+ }
+ set {
+ this["ManualSaveGameImportFolder"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("400, 800")]
+ public global::System.Drawing.Size OverlayInfoSize {
+ get {
+ return ((global::System.Drawing.Size)(this["OverlayInfoSize"]));
+ }
+ set {
+ this["OverlayInfoSize"] = value;
+ }
+ }
}
}
diff --git a/ARKBreedingStats/Properties/Settings.settings b/ARKBreedingStats/Properties/Settings.settings
index a96d3cf76..b2dc04eea 100644
--- a/ARKBreedingStats/Properties/Settings.settings
+++ b/ARKBreedingStats/Properties/Settings.settings
@@ -587,5 +587,17 @@
True
+
+ False
+
+
+ False
+
+
+
+
+
+ 400, 800
+
\ No newline at end of file
diff --git a/ARKBreedingStats/SpeciesSelector.cs b/ARKBreedingStats/SpeciesSelector.cs
index 5e7d2e106..9c7d453ec 100644
--- a/ARKBreedingStats/SpeciesSelector.cs
+++ b/ARKBreedingStats/SpeciesSelector.cs
@@ -125,7 +125,11 @@ private static List CreateSpeciesList(List species, D
}
}
- entryList = entryList.OrderBy(s => s.DisplayName).ToList();
+ entryList = entryList.OrderBy(s => s.DisplayName)
+ .ThenBy(s => !s.Species.IsDomesticable) // prefer domesticable species variants
+ .ThenBy(s => s.Species.Mod == null) // prefer loaded mod species
+ .ThenBy(s => s.Species.variants?.Length ?? 0) // prefer species that are not variants
+ .ToList();
return entryList;
}
diff --git a/ARKBreedingStats/Updater/Updater.cs b/ARKBreedingStats/Updater/Updater.cs
index 839d6a8ac..6494f7f56 100644
--- a/ARKBreedingStats/Updater/Updater.cs
+++ b/ARKBreedingStats/Updater/Updater.cs
@@ -66,8 +66,8 @@ private static bool IsInstalled()
}
// if otherwise located in the programs folder use the installer otherwise the updater
- return assemblyLocation.StartsWith(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)) ||
- assemblyLocation.StartsWith(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles));
+ return assemblyLocation.StartsWith(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86) + "\\", StringComparison.InvariantCultureIgnoreCase) ||
+ assemblyLocation.StartsWith(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) + "\\", StringComparison.InvariantCultureIgnoreCase);
}
public static async Task CheckForPortableUpdate(bool silentCheck, bool collectionDirty)
diff --git a/ARKBreedingStats/Utils.cs b/ARKBreedingStats/Utils.cs
index 71ba04480..eac71e149 100644
--- a/ARKBreedingStats/Utils.cs
+++ b/ARKBreedingStats/Utils.cs
@@ -6,6 +6,7 @@
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
+using System.Windows.Forms.VisualStyles;
using ARKBreedingStats.values;
namespace ARKBreedingStats
@@ -616,19 +617,35 @@ public static bool IsArkIdImported(long arkId, Guid guid)
public static (int, int) ConvertArkId64ToArkIds32(long id) => ((int)(id >> 32), (int)id);
///
- /// returns a shortened string with an ellipsis in the middle. One third of the beginning is shown and two thirds of then end
+ /// Returns a shortened string with an ellipsis in the middle. One third of the beginning is shown and two thirds of then end.
///
/// long string
/// max length of the string
- /// string with ellipsis in the middle
+ /// String with ellipsis in the middle
public static string ShortPath(string longPath, int maxLength = 50)
{
+ if (string.IsNullOrEmpty(longPath)) return longPath;
if (longPath.Length <= maxLength)
return longPath;
+ if (maxLength < 1) return string.Empty;
+ if (maxLength == 1) return longPath.Substring(0, 1);
int begin = maxLength / 3;
return longPath.Substring(0, begin) + "…" + longPath.Substring(longPath.Length - maxLength + begin + 1);
}
+ ///
+ /// If the passed string is longer than the stated length, it's shortened by removing a part in the middle.
+ /// Useful for file paths where the first and last part contain the more relevant info.
+ ///
+ public static string ShortenStringByTrimmingMiddle(string str, int maxLength = 30)
+ {
+ var l = str.Length;
+ if (maxLength < 1) return string.Empty;
+ if (l <= maxLength) return str;
+ var startEndLength = maxLength / 2;
+ return str.Substring(0, startEndLength) + "…" + str.Substring(l - startEndLength);
+ }
+
///
/// Determines the default import export folder.
///
@@ -754,5 +771,19 @@ public static string ApplicationNameVersion
return _applicationNameVersion;
}
}
+
+ public static IList> CartesianProduct(this IEnumerable> sequences)
+ {
+ IEnumerable> emptyProduct = new[] { Enumerable.Empty() };
+
+ var combinations = sequences.Aggregate(emptyProduct, (accumulator, sequence) => accumulator
+ .SelectMany(accseq => sequence
+ .Select(item => accseq.Append(item)))
+ );
+
+ return combinations
+ .Select(x => x.ToArray())
+ .ToArray();
+ }
}
}
diff --git a/ARKBreedingStats/_manifest.json b/ARKBreedingStats/_manifest.json
index 0be00ed2d..7b758e9d8 100644
--- a/ARKBreedingStats/_manifest.json
+++ b/ARKBreedingStats/_manifest.json
@@ -4,7 +4,7 @@
"ARK Smart Breeding": {
"Id": "ARK Smart Breeding",
"Category": "main",
- "version": "0.60.4.0"
+ "version": "0.61.0.0"
},
"SpeciesColorImages": {
"Id": "SpeciesColorImages",
diff --git a/ARKBreedingStats/importExportGun/ImportExportGun.cs b/ARKBreedingStats/importExportGun/ImportExportGun.cs
index 009aa53e1..5ea11a290 100644
--- a/ARKBreedingStats/importExportGun/ImportExportGun.cs
+++ b/ARKBreedingStats/importExportGun/ImportExportGun.cs
@@ -1,6 +1,7 @@
using System;
using System.IO;
using System.Threading;
+using System.Windows.Forms.VisualStyles;
using ARKBreedingStats.Library;
using ARKBreedingStats.values;
using Newtonsoft.Json;
@@ -14,8 +15,9 @@ internal static class ImportExportGun
{
///
/// Load creature from file created with the export gun (mod).
+ /// Supports .sav files (ASE) and .json files (ASA).
///
- public static Creature LoadCreature(string filePath, out string resultText, out string serverMultipliersHash)
+ public static Creature LoadCreature(string filePath, out string resultText, out string serverMultipliersHash, bool allowUnknownSpecies = false)
{
resultText = null;
serverMultipliersHash = null;
@@ -40,8 +42,10 @@ public static Creature LoadCreature(string filePath, out string resultText, out
break;
}
- return LoadCreatureFromJson(jsonText, resultText, out resultText, out serverMultipliersHash);
-
+ var creature = LoadCreatureFromJson(jsonText, resultText, out resultText, out serverMultipliersHash, filePath, allowUnknownSpecies);
+ if (creature == null) return null;
+ creature.domesticatedAt = File.GetLastWriteTime(filePath);
+ return creature;
}
catch (IOException) when (tryIndex < tryLoadCount - 1)
{
@@ -58,13 +62,13 @@ public static Creature LoadCreature(string filePath, out string resultText, out
return null;
}
- public static Creature LoadCreatureFromJson(string jsonText, string resultSoFar, out string resultText, out string serverMultipliersHash, string filePath = null)
+ public static Creature LoadCreatureFromJson(string jsonText, string resultSoFar, out string resultText, out string serverMultipliersHash, string filePath = null, bool allowUnknownSpecies = false)
{
resultText = resultSoFar;
serverMultipliersHash = null;
if (string.IsNullOrEmpty(jsonText))
{
- resultText = $"Error when importing file {filePath}: {resultText}";
+ resultText = $"Error when importing file {filePath}: file is empty. {resultText}";
return null;
}
var exportedCreature = JsonConvert.DeserializeObject(jsonText);
@@ -76,16 +80,16 @@ public static Creature LoadCreatureFromJson(string jsonText, string resultSoFar,
if (string.IsNullOrEmpty(exportedCreature.BlueprintPath))
{
- resultText = "file contains no blueprint path, it's probably not a creature file"; // could be a server multipliers file
+ resultText = $"file {filePath} contains no blueprint path, it's probably not a creature file (could be a server multipliers file).";
return null;
}
serverMultipliersHash = exportedCreature.ServerMultipliersHash;
- return ConvertExportGunToCreature(exportedCreature, out resultText);
+ return ConvertExportGunToCreature(exportedCreature, out resultText, allowUnknownSpecies);
}
- private static Creature ConvertExportGunToCreature(ExportGunCreatureFile ec, out string error)
+ private static Creature ConvertExportGunToCreature(ExportGunCreatureFile ec, out string error, bool allowUnknownSpecies = false)
{
error = null;
if (ec == null) return null;
@@ -94,7 +98,8 @@ private static Creature ConvertExportGunToCreature(ExportGunCreatureFile ec, out
if (species == null)
{
error = $"blueprintpath {ec.BlueprintPath} couldn't be found, maybe you need to load a mod values file.";
- return null;
+ if (!allowUnknownSpecies)
+ return null;
}
var wildLevels = new int[Stats.StatsCount];
@@ -126,7 +131,7 @@ private static Creature ConvertExportGunToCreature(ExportGunCreatureFile ec, out
: !string.IsNullOrEmpty(ec.ImprinterName) ? ec.ImprinterName
: ec.TamerString;
- var c = new Creature(species, ec.DinoName, owner, ec.TribeName, species.noGender ? Sex.Unknown : ec.IsFemale ? Sex.Female : Sex.Male,
+ var c = new Creature(species, ec.DinoName, owner, ec.TribeName, species?.noGender != false ? Sex.Unknown : ec.IsFemale ? Sex.Female : Sex.Male,
wildLevels, domLevels, mutLevels, isWild ? -3 : ec.TameEffectiveness, isBred, ec.DinoImprintingQuality,
CreatureCollection.CurrentCreatureCollection?.wildLevelStep)
{
diff --git a/ARKBreedingStats/importExportGun/ReadExportFile.cs b/ARKBreedingStats/importExportGun/ReadExportFile.cs
index d76b8bbd2..ee2492b9c 100644
--- a/ARKBreedingStats/importExportGun/ReadExportFile.cs
+++ b/ARKBreedingStats/importExportGun/ReadExportFile.cs
@@ -4,7 +4,7 @@
namespace ARKBreedingStats.importExportGun
{
///
- /// Reads the content of an export files created by the export gun mod.
+ /// Reads the content of an export file encapsulating a json string, created by the export gun mod (ASE).
///
internal static class ReadExportFile
{
diff --git a/ARKBreedingStats/importExported/ExportedCreatureControl.cs b/ARKBreedingStats/importExported/ExportedCreatureControl.cs
index 7e89431ae..bb7db7a2d 100644
--- a/ARKBreedingStats/importExported/ExportedCreatureControl.cs
+++ b/ARKBreedingStats/importExported/ExportedCreatureControl.cs
@@ -30,7 +30,7 @@ public ExportedCreatureControl()
public ExportedCreatureControl(string filePath) : this()
{
exportedFile = filePath;
- creatureValues = ImportExported.ImportExportedCreature(filePath);
+ creatureValues = ImportExported.ReadExportedCreature(filePath);
// check if the values are valid, i.e. if the read file was a creature-file at all.
if (creatureValues?.Species == null)
diff --git a/ARKBreedingStats/importExported/ImportExported.cs b/ARKBreedingStats/importExported/ImportExported.cs
index e8bff7dd8..911272f62 100644
--- a/ARKBreedingStats/importExported/ImportExported.cs
+++ b/ARKBreedingStats/importExported/ImportExported.cs
@@ -10,7 +10,10 @@ namespace ARKBreedingStats.importExported
{
static class ImportExported
{
- public static CreatureValues ImportExportedCreature(string filePath)
+ ///
+ /// Reads export file created by the game.
+ ///
+ public static CreatureValues ReadExportedCreature(string filePath)
{
CreatureValues cv = new CreatureValues
{
diff --git a/ARKBreedingStats/json/namePatternTemplates.json b/ARKBreedingStats/json/namePatternTemplates.json
index 8f8a98d0a..ae56a0043 100644
--- a/ARKBreedingStats/json/namePatternTemplates.json
+++ b/ARKBreedingStats/json/namePatternTemplates.json
@@ -1,6 +1,6 @@
{
"Format": "1.0",
- "Version": "2021.5.11",
+ "Version": "2024.5.4",
"Data": [
{
"Pattern": "{{#substring: {{#format_int: {{#substring: {arkid} | -9 }} | X9 }} | -4 }}",
@@ -16,6 +16,41 @@
"Pattern": "{{#ifexpr: {n} > 1 | _{n} }}",
"Title": "Unique identifier",
"Description": "Adds a unique identifier only if the name is not unique without it."
+ },
+ {
+ "Pattern": "{{#listName: {{#rand: 100}} | {sex_short} }}",
+ "Title": "Random list name",
+ "Description": "Uses a random name from a predefined list."
+ },
+ {
+ "Pattern": "{species} [{{#ifexpr: {muta} > 0 | D | C }}] {sex_short}-{{#padleft: {n} | 3 | 0 }}",
+ "Title": "Species with mutation indicator",
+ "Description": "Species name followed by an indicator for [C]lean or [D]irty if there was a mutation. Creature's sex as well as an incremental counter.\nExample: Argentavis [D] M-001\nBy Mr. Plow"
+ },
+ {
+ "Pattern": "{{#substring: {{#color: 0 | true }} | 0 | 14 }} {hp}H {we}W {dm}D",
+ "Title": "Primary color and Hp, We and Dm levels",
+ "Description": "Show primary Color (region 0), then HP, Weight and Damage in Wild levels.\nExample: Dino Dark Purp 4H 4W 4D\nBy Keelow"
+ },
+ {
+ "Pattern": "{spcsNm}{baselvl}{sex_short} {highest1s}{highest1l}{{#ifexpr: {n} > 1 | -{n} }}",
+ "Title": "Species with top level stat",
+ "Description": "Generates a shortened species name, base level, sex, and the top wild stat and its level; adds a unique number if an animal with that name already exists.\nExample: Hyndn150M HP39\nBy Maira"
+ },
+ {
+ "Pattern": "{{#ifexpr: {species} == Dodo | {{#ifexpr: {sex_short} == M | Rooster | Hen }} | {species} }}",
+ "Title": "Custom species naming",
+ "Description": "Checks a species names and produces an equivalent sex-dependent name.\nExample: Hen\nBy Maira"
+ },
+ {
+ "Pattern": "{sex_short}{baselvl}-{n} | {{#list:\r\n{{#if: {isTophp} | HP{hp}/ | }}\r\n{{#if: {isTopst} | ST{st}/ | }}\r\n{{#if: {isTopox} | OX{ox}/ | }}\r\n{{#if: {isTopfo} | FO{fo}/ | }}\r\n{{#if: {isTopwe} | WE{we}/ | }}\r\n{{#if: {isTopdm} | DM{dm}/ | }}\r\n| / | / }}",
+ "Title": "Base level and top stats",
+ "Description": "Shows base level, gender & number (if multiple). Shows all top stats creature has.\nExample: M250-1 | HP43/OX39/FO39/\nBy Apollo"
+ },
+ {
+ "Pattern": "{sex_short}{n} {{#list:\r\n{{#ifexpr: {hp} > 35 | {{#if: {isTophp} | HP{hp}/ }} }}\r\n{{#ifexpr: {st} > 35 | {{#if: {isTopst} | ST{st}/ }} }}\r\n{{#ifexpr: {ox} > 35 | {{#if: {isTopox} | OX{ox}/ }} }}\r\n{{#ifexpr: {fo} > 35 | {{#if: {isTopfo} | F{fo}/ }} }}\r\n{{#ifexpr: {we} > 35 | {{#if: {isTopwe} | W{we}/ }} }}\r\n{{#ifexpr: {dm} > 35 | {{#if: {isTopdm} | D{dm}/ }} }}\r\n{{#ifexpr: {sp} > 35 | {{#if: {isTopsp} | SP{sp}/ }} }}\r\n{{#ifexpr: {cr} > 35 | {{#if: {isTopcr} | C{cr}/ }} }}\r\n| / | / }}",
+ "Title": "Gender and top stats (if they're > 35)",
+ "Description": "Shows gender & number (if multiple). Shows all top stats creature has upper 35 points.\nExample: F1 HP46/OX37/D42\nBy Xeikos"
}
]
}
\ No newline at end of file
diff --git a/ARKBreedingStats/json/values/ASA-values.json b/ARKBreedingStats/json/values/ASA-values.json
index 6ba35e99c..f54c76a71 100644
--- a/ARKBreedingStats/json/values/ASA-values.json
+++ b/ARKBreedingStats/json/values/ASA-values.json
@@ -1,13 +1,314 @@
{
- "version": "32.11.468632",
+ "version": "38.690.452717",
"format": "1.15-asa",
"mod": {
"id": "ASA",
"tag": "",
"title": "Ark: Survival Ascended",
- "shortTitle": "ASA"
+ "shortTitle": "ASA",
+ "official": true
},
"species": [
+ {
+ "blueprintPath": "/Game/ASA/Dinos/Fasolasuchus/Fasola_Character_BP.Fasola_Character_BP",
+ "name": "Fasolasuchus",
+ "variants": [ "ScorchedEarth" ],
+ "fullStatsRaw": [
+ [ 950, 0.2, 0.27, 0.5, 0 ],
+ [ 350, 0.1, 0.1, 0, 0 ],
+ [ 1350, 0.06, 0, 0.5, 0 ],
+ [ 150, 0.1, 0.1, 0, 0 ],
+ [ 2750, 0.1, 0.1, 0, 0 ],
+ null,
+ null,
+ [ 450, 0.02, 0.04, 0, 0 ],
+ [ 1, 0.05, 0.1, 0.5, 0.4 ],
+ [ 1, 0, 0.01, 0, 0 ],
+ null,
+ null
+ ],
+ "breeding": {
+ "gestationTime": 0,
+ "incubationTime": 17998.5601,
+ "eggTempMin": 47,
+ "eggTempMax": 50,
+ "maturationTime": 666666.667,
+ "matingCooldownMin": 64800,
+ "matingCooldownMax": 172800
+ },
+ "taming": {
+ "nonViolent": false,
+ "violent": true,
+ "tamingIneffectiveness": 1.5,
+ "affinityNeeded0": 3000,
+ "affinityIncreasePL": 150,
+ "torporDepletionPS0": 1.5,
+ "foodConsumptionBase": 0.001543,
+ "foodConsumptionMult": 288.0392,
+ "babyFoodConsumptionMult": 510
+ },
+ "displayedStats": 927,
+ "skipWildLevelStats": 512,
+ "colors": [
+ {
+ "name": "Body Main",
+ "colors": [
+ "Dino Light Orange",
+ "Dino Dark Orange",
+ "Dino Light Yellow",
+ "Dino Dark Yellow",
+ "Dino Light Green",
+ "Dino Medium Green",
+ "Dino Light Blue",
+ "Dino Dark Blue",
+ "Dino Light Purple",
+ "Dino Light Brown",
+ "Dino Medium Brown",
+ "Dino Dark Brown",
+ "Light Grey",
+ "Dino Darker Grey",
+ "Dino Albino",
+ "BigFoot0",
+ "BigFoot4",
+ "BigFoot5",
+ "WolfFur",
+ "DarkWolfFur",
+ "DragonBase0",
+ "DragonBase1",
+ "DragonGreen0",
+ "DragonGreen1",
+ "DragonGreen2",
+ "DragonGreen3",
+ "WyvernPurple0",
+ "WyvernPurple1",
+ "WyvernBlue0",
+ "WyvernBlue1",
+ "NearBlack",
+ "GreenSlate",
+ "Sage",
+ "DarkWarmGray",
+ "MediumWarmGray",
+ "LightWarmGray",
+ "DarkCement",
+ "LightCement",
+ "LightAutumn",
+ "Mustard",
+ "MidnightBlue",
+ "BlackSands",
+ "Glacial",
+ "Cammo",
+ "DryMoss",
+ "Custard"
+ ]
+ },
+ {
+ "name": "Body Spots",
+ "colors": [
+ "Dino Light Orange",
+ "Dino Dark Orange",
+ "Dino Light Yellow",
+ "Dino Dark Yellow",
+ "Dino Light Green",
+ "Dino Medium Green",
+ "Dino Light Blue",
+ "Dino Dark Blue",
+ "Dino Light Purple",
+ "Dino Light Brown",
+ "Dino Medium Brown",
+ "Dino Dark Brown",
+ "Light Grey",
+ "Dino Darker Grey",
+ "Dino Albino",
+ "BigFoot0",
+ "BigFoot4",
+ "BigFoot5",
+ "WolfFur",
+ "DarkWolfFur",
+ "DragonBase0",
+ "DragonBase1",
+ "DragonGreen0",
+ "DragonGreen1",
+ "DragonGreen2",
+ "DragonGreen3",
+ "WyvernPurple0",
+ "WyvernPurple1",
+ "WyvernBlue0",
+ "WyvernBlue1",
+ "NearBlack",
+ "GreenSlate",
+ "Sage",
+ "DarkWarmGray",
+ "MediumWarmGray",
+ "LightWarmGray",
+ "DarkCement",
+ "LightCement",
+ "LightAutumn",
+ "Mustard",
+ "MidnightBlue",
+ "BlackSands",
+ "Glacial",
+ "Cammo",
+ "DryMoss",
+ "Custard"
+ ]
+ },
+ {
+ "name": "Spikes",
+ "colors": [
+ "Dino Light Orange",
+ "Dino Dark Orange",
+ "Dino Light Yellow",
+ "Dino Dark Yellow",
+ "Dino Light Green",
+ "Dino Medium Green",
+ "Dino Light Blue",
+ "Dino Dark Blue",
+ "Dino Light Purple",
+ "Dino Light Brown",
+ "Dino Medium Brown",
+ "Dino Dark Brown",
+ "Light Grey",
+ "Dino Darker Grey",
+ "Dino Albino",
+ "BigFoot0",
+ "BigFoot4",
+ "BigFoot5",
+ "WolfFur",
+ "DarkWolfFur",
+ "DragonBase0",
+ "DragonBase1",
+ "DragonGreen0",
+ "DragonGreen1",
+ "DragonGreen2",
+ "DragonGreen3",
+ "WyvernPurple0",
+ "WyvernPurple1",
+ "WyvernBlue0",
+ "WyvernBlue1",
+ "NearBlack",
+ "GreenSlate",
+ "Sage",
+ "DarkWarmGray",
+ "MediumWarmGray",
+ "LightWarmGray",
+ "DarkCement",
+ "LightCement",
+ "LightAutumn",
+ "Mustard",
+ "MidnightBlue",
+ "BlackSands",
+ "Glacial",
+ "Cammo",
+ "DryMoss",
+ "Custard"
+ ]
+ },
+ null,
+ {
+ "name": "Body Rings",
+ "colors": [
+ "Dino Light Orange",
+ "Dino Dark Orange",
+ "Dino Light Yellow",
+ "Dino Dark Yellow",
+ "Dino Light Green",
+ "Dino Medium Green",
+ "Dino Light Blue",
+ "Dino Dark Blue",
+ "Dino Light Purple",
+ "Dino Light Brown",
+ "Dino Medium Brown",
+ "Dino Dark Brown",
+ "Light Grey",
+ "Dino Darker Grey",
+ "Dino Albino",
+ "BigFoot0",
+ "BigFoot4",
+ "BigFoot5",
+ "WolfFur",
+ "DarkWolfFur",
+ "DragonBase0",
+ "DragonBase1",
+ "DragonGreen0",
+ "DragonGreen1",
+ "DragonGreen2",
+ "DragonGreen3",
+ "WyvernPurple0",
+ "WyvernPurple1",
+ "WyvernBlue0",
+ "WyvernBlue1",
+ "NearBlack",
+ "GreenSlate",
+ "Sage",
+ "DarkWarmGray",
+ "MediumWarmGray",
+ "LightWarmGray",
+ "DarkCement",
+ "LightCement",
+ "LightAutumn",
+ "Mustard",
+ "MidnightBlue",
+ "BlackSands",
+ "Glacial",
+ "Cammo",
+ "DryMoss",
+ "Custard"
+ ]
+ },
+ {
+ "name": "Head/Back Highlights",
+ "colors": [
+ "Dino Light Orange",
+ "Dino Dark Orange",
+ "Dino Light Yellow",
+ "Dino Dark Yellow",
+ "Dino Light Green",
+ "Dino Medium Green",
+ "Dino Light Blue",
+ "Dino Dark Blue",
+ "Dino Light Purple",
+ "Dino Light Brown",
+ "Dino Medium Brown",
+ "Dino Dark Brown",
+ "Light Grey",
+ "Dino Darker Grey",
+ "Dino Albino",
+ "BigFoot0",
+ "BigFoot4",
+ "BigFoot5",
+ "WolfFur",
+ "DarkWolfFur",
+ "DragonBase0",
+ "DragonBase1",
+ "DragonGreen0",
+ "DragonGreen1",
+ "DragonGreen2",
+ "DragonGreen3",
+ "WyvernPurple0",
+ "WyvernPurple1",
+ "WyvernBlue0",
+ "WyvernBlue1",
+ "NearBlack",
+ "GreenSlate",
+ "Sage",
+ "DarkWarmGray",
+ "MediumWarmGray",
+ "LightWarmGray",
+ "DarkCement",
+ "LightCement",
+ "LightAutumn",
+ "Mustard",
+ "MidnightBlue",
+ "BlackSands",
+ "Glacial",
+ "Cammo",
+ "DryMoss",
+ "Custard"
+ ]
+ }
+ ],
+ "immobilizedBy": [ "Chain Bola", "Large Bear Trap", "Plant Species Y" ]
+ },
{
"blueprintPath": "/Game/Aberration/Dinos/Basilisk/Basilisk_Character_BP.Basilisk_Character_BP",
"skipWildLevelStats": 512
@@ -84,6 +385,78 @@
"blueprintPath": "/Game/Aberration/Dinos/RockDrake/RockDrake_Character_BP.RockDrake_Character_BP",
"skipWildLevelStats": 512
},
+ {
+ "blueprintPath": "/Game/EndGame/Dinos/Drone/EndDrone_Character_BP.EndDrone_Character_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/EndGame/Dinos/Drone/EndDrone_Character_BP_Hard.EndDrone_Character_BP_Hard",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/EndGame/Dinos/Drone/EndDrone_Character_BP_Med.EndDrone_Character_BP_Med",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/EndGame/Dinos/Endboss/EndBoss_Character_Easy.EndBoss_Character_Easy",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/EndGame/Dinos/Endboss/EndBoss_Character_Hard.EndBoss_Character_Hard",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/EndGame/Dinos/Endboss/EndBoss_Character_Medium.EndBoss_Character_Medium",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/EndGame/Dinos/Endboss/EndbossDragon/EndBossDragon_Character_BP_Easy.EndBossDragon_Character_BP_Easy",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/EndGame/Dinos/Endboss/EndbossDragon/EndBossDragon_Character_BP_Hard.EndBossDragon_Character_BP_Hard",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/EndGame/Dinos/Endboss/EndbossDragon/EndBossDragon_Character_BP_Medium.EndBossDragon_Character_BP_Medium",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/EndGame/Dinos/Endboss/EndbossGorilla/EndBossGorilla_Character_BP_Easy.EndBossGorilla_Character_BP_Easy",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/EndGame/Dinos/Endboss/EndbossGorilla/EndBossGorilla_Character_BP_Hard.EndBossGorilla_Character_BP_Hard",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/EndGame/Dinos/Endboss/EndbossGorilla/EndBossGorilla_Character_BP_Medium.EndBossGorilla_Character_BP_Medium",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/EndGame/Dinos/Endboss/EndbossSpider/EndBossSpiderL_Character_BP_Easy.EndBossSpiderL_Character_BP_Easy",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/EndGame/Dinos/Endboss/EndbossSpider/EndBossSpiderL_Character_BP_Hard.EndBossSpiderL_Character_BP_Hard",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/EndGame/Dinos/Endboss/EndbossSpider/EndBossSpiderL_Character_BP_Medium.EndBossSpiderL_Character_BP_Medium",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/EndGame/Dinos/Tank/EndTank_Character_BP.EndTank_Character_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/EndGame/Dinos/Tank/EndTank_Character_BP_Hard.EndTank_Character_BP_Hard",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/EndGame/Dinos/Tank/EndTank_Character_BP_Med.EndTank_Character_BP_Med",
+ "skipWildLevelStats": 512
+ },
{
"blueprintPath": "/Game/Extinction/Dinos/DesertKaiju/DesertKaiju_Character_BP.DesertKaiju_Character_BP",
"skipWildLevelStats": 512
@@ -108,10 +481,6 @@
"blueprintPath": "/Game/Extinction/Dinos/Gacha/Gacha_Character_BP.Gacha_Character_BP",
"skipWildLevelStats": 512
},
- {
- "blueprintPath": "/Game/Extinction/Dinos/Gacha/Gacha_Claus_Character_BP.Gacha_Claus_Character_BP",
- "skipWildLevelStats": 512
- },
{
"blueprintPath": "/Game/Extinction/Dinos/GasBag/GasBags_Character_BP.GasBags_Character_BP",
"skipWildLevelStats": 512
@@ -156,10 +525,6 @@
"blueprintPath": "/Game/Fjordur/Dinos/Desmodus/Desmodus_Character_BP.Desmodus_Character_BP",
"skipWildLevelStats": 512
},
- {
- "blueprintPath": "/Game/Genesis/Dinos/BiomeVariants/BogPara/Bog_Para_Character_BP.Bog_Para_Character_BP",
- "skipWildLevelStats": 512
- },
{
"blueprintPath": "/Game/Genesis/Dinos/BiomeVariants/BogParaceratherium/Bog_Paracer_Character_BP.Bog_Paracer_Character_BP",
"skipWildLevelStats": 512
@@ -252,26 +617,6 @@
"blueprintPath": "/Game/Genesis/Dinos/BogSpider/BogSpider_Character_BP.BogSpider_Character_BP",
"skipWildLevelStats": 512
},
- {
- "blueprintPath": "/Game/Genesis/Dinos/Bots/Bot_Character_BP.Bot_Character_BP",
- "skipWildLevelStats": 512
- },
- {
- "blueprintPath": "/Game/Genesis/Dinos/Bots/Bot_WithBow_BP.Bot_WithBow_BP",
- "skipWildLevelStats": 512
- },
- {
- "blueprintPath": "/Game/Genesis/Dinos/Bots/Bot_WithSpear_BP.Bot_WithSpear_BP",
- "skipWildLevelStats": 512
- },
- {
- "blueprintPath": "/Game/Genesis/Dinos/Bots/Bot_WithTekGrenades_BP.Bot_WithTekGrenades_BP",
- "skipWildLevelStats": 512
- },
- {
- "blueprintPath": "/Game/Genesis/Dinos/Bots/Bot_WithTekRifle_BP.Bot_WithTekRifle_BP",
- "skipWildLevelStats": 512
- },
{
"blueprintPath": "/Game/Genesis/Dinos/Cherufe/Cherufe_Character_BP.Cherufe_Character_BP",
"skipWildLevelStats": 512
@@ -314,18 +659,6 @@
"blueprintPath": "/Game/Genesis/Dinos/Swarms/MicrobeSwarmChar_BP.MicrobeSwarmChar_BP",
"skipWildLevelStats": 512
},
- {
- "blueprintPath": "/Game/Genesis/Dinos/VRMainBoss/VRMainBoss_Character_Easy.VRMainBoss_Character_Easy",
- "skipWildLevelStats": 512
- },
- {
- "blueprintPath": "/Game/Genesis/Dinos/VRMainBoss/VRMainBoss_Character_Hard.VRMainBoss_Character_Hard",
- "skipWildLevelStats": 512
- },
- {
- "blueprintPath": "/Game/Genesis/Dinos/VRMainBoss/VRMainBoss_Character_Medium.VRMainBoss_Character_Medium",
- "skipWildLevelStats": 512
- },
{
"blueprintPath": "/Game/Genesis2/Dinos/BiomeVariants/Allo_Character_BP_Rockwell.Allo_Character_BP_Rockwell",
"skipWildLevelStats": 512
@@ -440,7 +773,7 @@
},
{
"blueprintPath": "/Game/Genesis2/Dinos/Summoner/SummonedDinos/Arthro_Character_BP_Aberrant_Summoned.Arthro_Character_BP_Aberrant_Summoned",
- "skipWildLevelStats": 512
+ "skipWildLevelStats": 520
},
{
"blueprintPath": "/Game/Genesis2/Dinos/Summoner/SummonedDinos/Baryonyx_Character_BP_Summoned.Baryonyx_Character_BP_Summoned",
@@ -500,7 +833,7 @@
},
{
"blueprintPath": "/Game/Genesis2/Dinos/Summoner/SummonedDinos/Kaprosuchus_Character_BP_Summoned.Kaprosuchus_Character_BP_Summoned",
- "skipWildLevelStats": 512
+ "skipWildLevelStats": 520
},
{
"blueprintPath": "/Game/Genesis2/Dinos/Summoner/SummonedDinos/LionfishLion_Character_BP_Summoned.LionfishLion_Character_BP_Summoned",
@@ -634,6 +967,18 @@
null,
null
],
+ "taming": {
+ "nonViolent": true,
+ "violent": false,
+ "tamingIneffectiveness": 2,
+ "affinityNeeded0": 5000,
+ "affinityIncreasePL": 750,
+ "wakeAffinityMult": 1.6,
+ "wakeFoodDeplMult": 1,
+ "foodConsumptionBase": 0.000185,
+ "foodConsumptionMult": 199.984,
+ "babyFoodConsumptionMult": 39
+ },
"skipWildLevelStats": 512
},
{
@@ -648,6 +993,255 @@
"blueprintPath": "/Game/LostIsland/Dinos/Sinomacrops/Sinomacrops_Character_BP.Sinomacrops_Character_BP",
"skipWildLevelStats": 512
},
+ {
+ "blueprintPath": "/Game/Mods/Ragnarok/Custom_Assets/Dinos/Polar_Bear/Polar_Bear.Polar_Bear",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/Mods/Ragnarok/Custom_Assets/Dinos/Wyvern/Ice_Wyvern/Ragnarok_Wyvern_Override_Ice.Ragnarok_Wyvern_Override_Ice",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/Mods/Ragnarok/Custom_Assets/Dinos/Wyvern/Ragnarok_Wyvern_Override.Ragnarok_Wyvern_Override",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/Mods/Valguero/Assets/Dinos/RockGolem/ChalkGolem/ChalkGolem_Character_BP.ChalkGolem_Character_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/Mods/Valguero/Assets/Dinos/RockGolem/IceGolem/IceGolem_Character_BP.IceGolem_Character_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/Packs/Frontier/Dinos/Oasisaur/Oasisaur_Character_BP.Oasisaur_Character_BP",
+ "name": "Oasisaur",
+ "variants": [ "ScorchedEarth" ],
+ "isFlyer": true,
+ "fullStatsRaw": [
+ [ 20000, 0.2, 0.2295, 0.5, 0 ],
+ [ 100, 0.1, 0.1, 0, 0 ],
+ [ 10000, 0.06, 0, 0.5, 0 ],
+ [ 150, 0.1, 0.1, 0, 0 ],
+ [ 8800, 0.1, 0.1, 0, 0 ],
+ null,
+ null,
+ [ 2500, 0.02, 0.04, 0, 0 ],
+ [ 1, 0.05, 0.1, 0.5, 0.4 ],
+ [ 1, 0, 0.01, 0, 0 ],
+ null,
+ null
+ ],
+ "taming": {
+ "violent": false,
+ "nonViolent": true
+ },
+ "displayedStats": 663,
+ "noGender": true,
+ "skipWildLevelStats": 520,
+ "colors": [
+ {
+ "name": "Main",
+ "colors": [
+ "Dino Light Orange",
+ "Dino Light Brown",
+ "Dino Medium Brown",
+ "Dino Dark Brown",
+ "Light Grey",
+ "Dino Darker Grey",
+ "Dino Albino",
+ "BigFoot0",
+ "BigFoot4",
+ "BigFoot5",
+ "WolfFur",
+ "DarkWolfFur",
+ "NearBlack",
+ "DarkWarmGray",
+ "MediumWarmGray",
+ "LightWarmGray",
+ "LightAutumn"
+ ]
+ },
+ {
+ "name": "Claws",
+ "colors": [
+ "Dino Light Orange",
+ "Dino Light Brown",
+ "Dino Medium Brown",
+ "Dino Dark Brown",
+ "Light Grey",
+ "Dino Darker Grey",
+ "Dino Albino",
+ "BigFoot0",
+ "BigFoot4",
+ "BigFoot5",
+ "WolfFur",
+ "DarkWolfFur",
+ "NearBlack",
+ "DarkWarmGray",
+ "MediumWarmGray",
+ "LightWarmGray",
+ "LightAutumn"
+ ]
+ },
+ {
+ "name": "Skin",
+ "colors": [
+ "Dino Light Orange",
+ "Dino Light Brown",
+ "Dino Medium Brown",
+ "Dino Dark Brown",
+ "Light Grey",
+ "Dino Darker Grey",
+ "Dino Albino",
+ "BigFoot0",
+ "BigFoot4",
+ "BigFoot5",
+ "WolfFur",
+ "DarkWolfFur",
+ "NearBlack",
+ "DarkWarmGray",
+ "MediumWarmGray",
+ "LightWarmGray",
+ "LightAutumn",
+ "DragonBase0",
+ "Peach",
+ "DryMoss",
+ "Cream",
+ "WyvernPurple0",
+ "LightCement",
+ "Glacial",
+ "Custard",
+ "Dino Light Red",
+ "Dino Dark Orange",
+ "BlackSands"
+ ]
+ },
+ {
+ "name": "Head tubes",
+ "colors": [
+ "Dino Light Orange",
+ "Light Grey",
+ "Dino Albino",
+ "BigFoot0",
+ "BigFoot4",
+ "BigFoot5",
+ "WolfFur",
+ "NearBlack",
+ "LightWarmGray",
+ "LightAutumn",
+ "DragonBase0",
+ "Peach",
+ "PowderBlue",
+ "DryMoss",
+ "Cream",
+ "WyvernPurple0",
+ "LightCement",
+ "Glacial",
+ "Custard",
+ "Dino Light Red",
+ "DragonBase1",
+ "LightPink",
+ "Lavender"
+ ]
+ },
+ {
+ "name": "Accents",
+ "colors": [
+ "Dino Light Orange",
+ "Dino Light Brown",
+ "Dino Medium Brown",
+ "Dino Dark Brown",
+ "Light Grey",
+ "Dino Darker Grey",
+ "Dino Albino",
+ "BigFoot0",
+ "BigFoot4",
+ "BigFoot5",
+ "WolfFur",
+ "DarkWolfFur",
+ "NearBlack",
+ "DarkWarmGray",
+ "MediumWarmGray",
+ "LightWarmGray",
+ "LightAutumn"
+ ]
+ },
+ {
+ "name": "Belly",
+ "colors": [
+ "Dino Light Orange",
+ "Dino Light Brown",
+ "Dino Medium Brown",
+ "Dino Dark Brown",
+ "Light Grey",
+ "Dino Darker Grey",
+ "Dino Albino",
+ "BigFoot0",
+ "BigFoot4",
+ "BigFoot5",
+ "WolfFur",
+ "DarkWolfFur",
+ "NearBlack",
+ "DarkWarmGray",
+ "MediumWarmGray",
+ "LightWarmGray",
+ "LightAutumn",
+ "DragonBase0",
+ "Peach",
+ "PowderBlue",
+ "DryMoss",
+ "Cream",
+ "WyvernPurple0",
+ "LightCement",
+ "Glacial",
+ "Custard"
+ ]
+ }
+ ]
+ },
+ {
+ "blueprintPath": "/Game/Packs/Frontier/Dinos/Oasisaur/TamingDinos/Vulture_Character_BP_OasisaurTaming.Vulture_Character_BP_OasisaurTaming",
+ "name": "Vulture",
+ "variants": [ "Minion", "ScorchedEarth" ],
+ "isFlyer": true,
+ "fullStatsRaw": [
+ [ 125, 0.2, 0.27, 0.5, 0 ],
+ [ 150, 0.1, 0.1, 0, 0 ],
+ [ 100, 0.06, 0, 0.5, 0 ],
+ [ 150, 0.1, 0.1, 0, 0 ],
+ [ 900, 0.1, 0.1, 0, 0 ],
+ null,
+ null,
+ [ 50, 0.02, 0.04, 0, 0 ],
+ [ 1, 0.05, 0.1, 0.5, 0.4 ],
+ [ 1, 0, 0.01, 0, 0 ],
+ null,
+ null
+ ],
+ "breeding": {
+ "gestationTime": 0,
+ "incubationTime": 4864.47571,
+ "eggTempMin": 35,
+ "eggTempMax": 38,
+ "maturationTime": 90090.0901,
+ "matingCooldownMin": 64800,
+ "matingCooldownMax": 172800
+ },
+ "taming": {
+ "nonViolent": false,
+ "violent": false,
+ "tamingIneffectiveness": 4.166666,
+ "affinityNeeded0": 655,
+ "affinityIncreasePL": 45,
+ "foodConsumptionBase": 0.001302,
+ "foodConsumptionMult": 1152.074,
+ "babyFoodConsumptionMult": 510
+ },
+ "boneDamageAdjusters": { "c_head": 3 },
+ "displayedStats": 927,
+ "skipWildLevelStats": 512
+ },
{
"blueprintPath": "/Game/PrimalEarth/Dinos/Achatina/Achatina_Character_BP.Achatina_Character_BP",
"skipWildLevelStats": 520
@@ -698,11 +1292,11 @@
},
{
"blueprintPath": "/Game/PrimalEarth/Dinos/Arthropluera/Arthro_Character_BP.Arthro_Character_BP",
- "skipWildLevelStats": 512
+ "skipWildLevelStats": 520
},
{
"blueprintPath": "/Game/PrimalEarth/Dinos/Arthropluera/Arthro_Character_BP_Aberrant.Arthro_Character_BP_Aberrant",
- "skipWildLevelStats": 512
+ "skipWildLevelStats": 520
},
{
"blueprintPath": "/Game/PrimalEarth/Dinos/Baryonyx/Baryonyx_Character_BP.Baryonyx_Character_BP",
@@ -922,6 +1516,7 @@
},
{
"blueprintPath": "/Game/PrimalEarth/Dinos/Dodo/Turkey_Character_BP.Turkey_Character_BP",
+ "name": "Murder Turkey",
"skipWildLevelStats": 512
},
{
@@ -946,20 +1541,6 @@
},
{
"blueprintPath": "/Game/PrimalEarth/Dinos/Dragon/Dragon_Character_BP_Boss_Medium.Dragon_Character_BP_Boss_Medium",
- "fullStatsRaw": [
- [ 864000, 0.2, 0.2, 0.3, 0 ],
- [ 10000, 0.1, 0.1, 0, 0 ],
- [ 350, 0.06, 0, 0.5, 0 ],
- [ 2000, 0.1, 0.1, 0, 0 ],
- [ 2600, 0.1, 0.1, 0, 0 ],
- null,
- null,
- [ 4000, 0.02, 0.02, 0, 0 ],
- [ 1, 0.05, 0.04, 0.3, 0.3 ],
- [ 1, 0, 0, 0, 0 ],
- null,
- null
- ],
"skipWildLevelStats": 512
},
{
@@ -1068,7 +1649,7 @@
},
{
"blueprintPath": "/Game/PrimalEarth/Dinos/Kaprosuchus/Kaprosuchus_Character_BP.Kaprosuchus_Character_BP",
- "skipWildLevelStats": 512
+ "skipWildLevelStats": 520
},
{
"blueprintPath": "/Game/PrimalEarth/Dinos/Kentrosaurus/Kentro_Character_BP.Kentro_Character_BP",
@@ -1172,6 +1753,13 @@
},
{
"blueprintPath": "/Game/PrimalEarth/Dinos/Mosasaurus/Mosa_Character_BP_Cave.Mosa_Character_BP_Cave",
+ "breeding": {
+ "gestationTime": 28571.4286,
+ "incubationTime": 0,
+ "maturationTime": 666666.667,
+ "matingCooldownMin": 64800,
+ "matingCooldownMax": 172800
+ },
"skipWildLevelStats": 520
},
{
@@ -1214,10 +1802,6 @@
"blueprintPath": "/Game/PrimalEarth/Dinos/Pachyrhinosaurus/Pachyrhino_Character_BP.Pachyrhino_Character_BP",
"skipWildLevelStats": 512
},
- {
- "blueprintPath": "/Game/PrimalEarth/Dinos/Para/BionicPara_Character_BP.BionicPara_Character_BP",
- "skipWildLevelStats": 512
- },
{
"blueprintPath": "/Game/PrimalEarth/Dinos/Para/Para_Character_BP.Para_Character_BP",
"skipWildLevelStats": 512
@@ -1340,7 +1924,6 @@
},
{
"blueprintPath": "/Game/PrimalEarth/Dinos/Rhyniognatha/Rhynio_Character_BP.Rhynio_Character_BP",
- "skipWildLevelStats": 512,
"fullStatsRaw": [
[ 900, 0.17, 0.1755, 0.5, 0 ],
[ 350, 0.05, 0.06, 0, 0 ],
@@ -1354,7 +1937,8 @@
[ 1, 0, 0.01, 0, 0 ],
null,
null
- ]
+ ],
+ "skipWildLevelStats": 512
},
{
"blueprintPath": "/Game/PrimalEarth/Dinos/Saber/Saber_Character_BP.Saber_Character_BP",
@@ -1410,20 +1994,6 @@
},
{
"blueprintPath": "/Game/PrimalEarth/Dinos/Spider-Large/SpiderL_Character_BP_Hard.SpiderL_Character_BP_Hard",
- "fullStatsRaw": [
- [ 972000, 0.25, 0.27, 0.5, 0 ],
- [ 150, 0.1, 0.1, 0, 0 ],
- [ 100000, 0.06, 0, 0.5, 0 ],
- [ 150, 0.1, 0.1, 0, 0 ],
- [ 1500, 0.1, 0.1, 0, 0 ],
- null,
- null,
- [ 4000, 0.02, 0.04, 0, 0 ],
- [ 1, 0.075, 0.1, 0.5, 0.4 ],
- [ 1, 0, 0.01, 0.151, 0 ],
- null,
- null
- ],
"skipWildLevelStats": 512
},
{
@@ -1562,6 +2132,253 @@
"blueprintPath": "/Game/PrimalEarth/Dinos/Yutyrannus/Yutyrannus_Character_BP.Yutyrannus_Character_BP",
"skipWildLevelStats": 512
},
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Camelsaurus/camelsaurus_Character_BP.camelsaurus_Character_BP",
+ "fullStatsRaw": [
+ [ 400, 0.2, 0.27, 0.5, 0 ],
+ [ 220, 0.1, 0.1, 0, 0 ],
+ [ 315, 0.06, 0, 0.5, 0 ],
+ [ 150, 0.1, 0.1, 0, 0 ],
+ [ 6000, 0.1, 0.1, 0, 0 ],
+ [ 750, 0.01, 0.015, 0, 0 ],
+ null,
+ [ 440, 0.02, 0.04, 0, 0 ],
+ [ 1, 0.05, 0.1, 0.5, 0.4 ],
+ [ 1, 0, 0.01, 0.964, 0 ],
+ null,
+ null
+ ],
+ "displayedStats": 959,
+ "skipWildLevelStats": 544
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Deathworm/Deathworm_Character_BP.Deathworm_Character_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Deathworm/MegaDeathworm_Character_BP.MegaDeathworm_Character_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Jerboa/Bone_Jerboa_Character_BP.Bone_Jerboa_Character_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Jerboa/Jerboa_Character_BP.Jerboa_Character_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/JugBug/Jugbug_Oil_Character_BP.Jugbug_Oil_Character_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/JugBug/Jugbug_Water_Character_BP.Jugbug_Water_Character_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Manticore/Manticore_Character_BP_Easy.Manticore_Character_BP_Easy",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Manticore/Manticore_Character_BP_Hard.Manticore_Character_BP_Hard",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Manticore/Manticore_Character_BP_Medium.Manticore_Character_BP_Medium",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Manticore/Minions/Deathworm_Character_Minion_BP.Deathworm_Character_Minion_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Manticore/RockGolem_Character_Minion_BP.RockGolem_Character_Minion_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Mantis/Ghost_Mantis_Character_BP.Ghost_Mantis_Character_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Mantis/Mantis_Character_BP.Mantis_Character_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Moth/Moth_Character_BP.Moth_Character_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Phoenix/Phoenix_Character_BP.Phoenix_Character_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/RockGolem/RockGolem_Character_BP.RockGolem_Character_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/RockGolem/RubbleGolem_Character_BP.RubbleGolem_Character_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/SpineyLizard/SpineyLizard_Character_BP.SpineyLizard_Character_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Vulture/Vulture_Character_BP.Vulture_Character_BP",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Wyvern/Bone_MegaWyvern_Character_BP_Fire.Bone_MegaWyvern_Character_BP_Fire",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Wyvern/MegaWyvern_Character_BP_Fire.MegaWyvern_Character_BP_Fire",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Wyvern/Wyvern_Character_BP_Fire.Wyvern_Character_BP_Fire",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Wyvern/Wyvern_Character_BP_Lightning.Wyvern_Character_BP_Lightning",
+ "skipWildLevelStats": 512,
+ "colors": [
+ {
+ "name": "Body main",
+ "colors": [
+ "Dino Light Purple",
+ "NearBlack",
+ "WyvernBlue0",
+ "Dino Darker Grey",
+ "Dino Dark Purple",
+ "WyvernPurple0",
+ "WyvernPurple1",
+ "WyvernBlue1",
+ "NearBlack",
+ "DarkWarmGray",
+ "MidnightBlue",
+ "BlackSands"
+ ]
+ },
+ {
+ "name": "Fins",
+ "colors": [
+ "Dino Light Purple",
+ "Dino Light Blue",
+ "NearBlack",
+ "WyvernBlue0",
+ "Light Grey",
+ "Dino Darker Grey",
+ "Dino Dark Purple",
+ "WyvernPurple0",
+ "WyvernPurple1",
+ "WyvernBlue1",
+ "NearBlack",
+ "DarkWarmGray",
+ "MidnightBlue",
+ "BlackSands",
+ "Lavender"
+ ]
+ },
+ {
+ "name": "Wings",
+ "colors": [
+ "Dino Light Purple",
+ "Dino Light Blue",
+ "NearBlack",
+ "WyvernBlue0",
+ "Light Grey",
+ "Dino Darker Grey",
+ "Dino Dark Purple",
+ "WyvernPurple0",
+ "WyvernPurple1",
+ "WyvernBlue1",
+ "NearBlack",
+ "DarkWarmGray",
+ "MidnightBlue",
+ "BlackSands",
+ "Lavender"
+ ]
+ },
+ {
+ "name": "Lightning",
+ "colors": [
+ "Dino Light Purple",
+ "Dino Light Blue",
+ "WyvernBlue0",
+ "Light Grey",
+ "Dino Darker Grey",
+ "Dino Dark Purple",
+ "WyvernPurple0",
+ "WyvernPurple1",
+ "WyvernBlue1",
+ "MidnightBlue",
+ "BlackSands",
+ "Lavender",
+ "Dino Light Orange",
+ "Peach",
+ "Dino Albino",
+ "BigFoot0",
+ "LightWarmGray",
+ "DragonBase0",
+ "DragonBase1",
+ "Glacial"
+ ]
+ },
+ {
+ "name": "Scales top",
+ "colors": [
+ "Dino Light Purple",
+ "Dino Light Blue",
+ "NearBlack",
+ "WyvernBlue0",
+ "Light Grey",
+ "Dino Darker Grey",
+ "Dino Dark Purple",
+ "WyvernPurple0",
+ "WyvernPurple1",
+ "WyvernBlue1",
+ "NearBlack",
+ "DarkWarmGray",
+ "MidnightBlue",
+ "BlackSands"
+ ]
+ },
+ {
+ "name": "Belly",
+ "colors": [
+ "Dino Light Purple",
+ "Dino Light Blue",
+ "WyvernBlue0",
+ "Light Grey",
+ "Dino Darker Grey",
+ "WyvernPurple0",
+ "WyvernPurple1",
+ "WyvernBlue1",
+ "Dino Light Orange",
+ "LightWarmGray",
+ "PowderBlue",
+ "Glacial"
+ ]
+ }
+ ]
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Wyvern/Wyvern_Character_BP_Poison.Wyvern_Character_BP_Poison",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Wyvern/Wyvern_Character_BP_ZombieFire.Wyvern_Character_BP_ZombieFire",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Wyvern/Wyvern_Character_BP_ZombieLightning.Wyvern_Character_BP_ZombieLightning",
+ "skipWildLevelStats": 512
+ },
+ {
+ "blueprintPath": "/Game/ScorchedEarth/Dinos/Wyvern/Wyvern_Character_BP_ZombiePoison.Wyvern_Character_BP_ZombiePoison",
+ "skipWildLevelStats": 512
+ },
{
"name": "Gigantoraptor",
"blueprintPath": "/Gigantoraptor/Gigantoraptor/Gigantoraptor_Character_BP.Gigantoraptor_Character_BP",
@@ -1609,7 +2426,6 @@
"foodConsumptionMult": 180.0634,
"babyFoodConsumptionMult": 510
},
- "TamedBaseHealthMultiplier": 1,
"displayedStats": 927
}
],
@@ -1746,4 +2562,4 @@
[ "Thistle Coloring", [ 0.791298, 0.545725, 0.723055, 1.0 ] ],
[ "Bubblegum Coloring", [ 1.0, 0.520996, 0.623961, 1.0 ] ]
]
-}
\ No newline at end of file
+}
diff --git a/ARKBreedingStats/json/values/_manifest.json b/ARKBreedingStats/json/values/_manifest.json
index e79a5b82c..a6c4ad3ef 100644
--- a/ARKBreedingStats/json/values/_manifest.json
+++ b/ARKBreedingStats/json/values/_manifest.json
@@ -67,7 +67,7 @@
"mod": { "id": "1356703358", "tag": "Primal_Fear_Noxious_Creatures", "title": "Primal Fear Noxious Creatures" }
},
"1373744537-AC2.json": {
- "version": "358.17.1705110964",
+ "version": "358.24.1713491648",
"mod": { "id": "1373744537", "tag": "AC2", "title": "Additional Creatures 2: Wild Ark" }
},
"1379111008-RealismPlus.json": {
@@ -314,7 +314,7 @@
"mod": { "id": "2447186973", "tag": "ArkOmega", "title": "Ark Omega" }
},
"2453342929-MoreDragonsMod.json": {
- "version": "358.17.1701039233",
+ "version": "358.24.1714424674",
"mod": { "id": "2453342929", "tag": "MoreDragonsMod", "title": "More Dragons Evolved" }
},
"2472371628-MilicrocaWarriors_MOD.json": {
@@ -398,9 +398,9 @@
"mod": { "id": "919470289", "tag": "SSFlyer", "title": "SSFlyer" }
},
"ASA-values.json": {
- "version": "32.11.468632",
+ "version": "38.690.452717",
"format": "1.15-asa",
- "mod": { "id": "ASA", "tag": "", "title": "Ark: Survival Ascended", "shortTitle": "ASA" }
+ "mod": { "id": "ASA", "tag": "", "title": "Ark: Survival Ascended", "shortTitle": "ASA", "official": true }
},
"CrystalIsles-CrystalIsles.json": {
"version": "345.39.8870324.1",
diff --git a/ARKBreedingStats/library/CreatureCollection.cs b/ARKBreedingStats/library/CreatureCollection.cs
index bba69d7c3..706105198 100644
--- a/ARKBreedingStats/library/CreatureCollection.cs
+++ b/ARKBreedingStats/library/CreatureCollection.cs
@@ -238,6 +238,8 @@ public bool MergeCreatureList(IEnumerable creaturesToMerge, bool addPr
if (!guidDict.TryGetValue(creatureNew.guid, out var creatureExisting))
{
+ if (creatureNew.addedToLibrary == null)
+ creatureNew.addedToLibrary = DateTime.Now;
creatures.Add(creatureNew);
creaturesWereAddedOrUpdated = true;
continue;
@@ -400,18 +402,18 @@ internal void DeleteCreature(Creature c)
///
/// Checks if an existing creature has the given ARK-ID
///
- /// ARK-ID to check
+ /// ARK-ID to check
/// the creature with that id (if already in the collection it will be ignored)
/// null if the Ark-Id is not yet in the collection, else the creature with the same Ark-Id
/// True if there is a creature with the given Ark-Id
- public bool ArkIdAlreadyExist(long arkID, Creature concerningCreature, out Creature creatureWithSameId)
+ public bool ArkIdAlreadyExist(long arkId, Creature concerningCreature, out Creature creatureWithSameId)
{
// ArkId is not always unique. ARK uses ArkId = id1.ToString() + id2.ToString(); internally. If id2 has less decimal digits than int.MaxValue, the ids will differ. TODO handle this correctly
creatureWithSameId = null;
bool exists = false;
foreach (var c in creatures)
{
- if (c.ArkId == arkID && c != concerningCreature)
+ if (c.ArkId == arkId && c != concerningCreature)
{
creatureWithSameId = c;
exists = true;
@@ -603,7 +605,7 @@ string ColorDescription(byte colorId)
infoText += $"{(infoText == null ? null : "\n")}These colors are new in their region: {string.Join(", ", newRegionColors)}.";
}
- infoText = infoText == null ? "No new colors" : infoText;
+ infoText = infoText ?? "No new colors";
return results;
}
diff --git a/ARKBreedingStats/library/CreatureInfoGraphic.cs b/ARKBreedingStats/library/CreatureInfoGraphic.cs
index 94087975a..88b87c312 100644
--- a/ARKBreedingStats/library/CreatureInfoGraphic.cs
+++ b/ARKBreedingStats/library/CreatureInfoGraphic.cs
@@ -30,6 +30,7 @@ public static Bitmap InfoGraphic(this Creature creature, CreatureCollection cc)
Properties.Settings.Default.InfoGraphicBorderColor,
Properties.Settings.Default.InfoGraphicDisplayName,
Properties.Settings.Default.InfoGraphicWithDomLevels,
+ Properties.Settings.Default.InfoGraphicDisplaySumWildMut,
Properties.Settings.Default.InfoGraphicDisplayMutations,
Properties.Settings.Default.InfoGraphicDisplayGeneration,
Properties.Settings.Default.InfoGraphicShowStatValues,
@@ -45,7 +46,7 @@ public static Bitmap InfoGraphic(this Creature creature, CreatureCollection cc)
/// CreatureCollection for server settings.
public static Bitmap InfoGraphic(this Creature creature, CreatureCollection cc,
int infoGraphicHeight, string fontName, Color foreColor, Color backColor, Color borderColor,
- bool displayCreatureName, bool displayWithDomLevels, bool displayMutations, bool displayGenerations, bool displayStatValues, bool displayMaxWildLevel,
+ bool displayCreatureName, bool displayWithDomLevels, bool displaySumWildMutLevels, bool displayMutations, bool displayGenerations, bool displayStatValues, bool displayMaxWildLevel,
bool displayExtraRegionNames, bool displayRegionNamesIfNoImage)
{
if (creature?.Species == null) return null;
@@ -102,7 +103,7 @@ public static Bitmap InfoGraphic(this Creature creature, CreatureCollection cc,
string creatureInfos = $"{Loc.S("Level", secondaryCulture: secondaryCulture)} {creatureLevel} | {Utils.SexSymbol(creature.sex) + (creature.flags.HasFlag(CreatureFlags.Neutered) ? $" ({Loc.S(creature.sex == Sex.Female ? "Spayed" : "Neutered", secondaryCulture: secondaryCulture)})" : string.Empty)}";
if (displayMutations)
- creatureInfos += $" | {creature.Mutations} {Loc.S("Mutations", secondaryCulture: secondaryCulture)}";
+ creatureInfos += $" | {Loc.S("mutation counter", secondaryCulture: secondaryCulture)} {creature.Mutations}";
if (displayGenerations)
creatureInfos += $" | {Loc.S("generation", secondaryCulture: secondaryCulture)} {creature.generation}";
@@ -126,7 +127,7 @@ public static Bitmap InfoGraphic(this Creature creature, CreatureCollection cc,
// levels
double meanLetterWidth = fontSize * 7d / 10;
int xStatName = (int)meanLetterWidth;
- var displayMutatedLevels = creature.levelsMutated != null && cc?.Game == Ark.Asa;
+ var displayMutatedLevels = !displaySumWildMutLevels && creature.levelsMutated != null && cc?.Game == Ark.Asa;
// x position of level number. torpor is the largest level number.
int xRightLevelValue = (int)(xStatName + (6 + creature.levelsWild[Stats.Torpidity].ToString().Length) * meanLetterWidth);
int xRightLevelMutValue = xRightLevelValue + (!displayMutatedLevels ? 0 : (int)((creature.levelsMutated.Max().ToString().Length + 2) * meanLetterWidth));
@@ -134,7 +135,8 @@ public static Bitmap InfoGraphic(this Creature creature, CreatureCollection cc,
int xRightBrValue = (int)(xRightLevelDomValue + (2 + MaxCharLength(creature.valuesBreeding)) * meanLetterWidth);
int maxBoxLength = xRightBrValue - xStatName;
int statBoxHeight = Math.Max(2, height / 90);
- g.DrawString(Loc.S("W", secondaryCulture: secondaryCulture), font, fontBrush, xRightLevelValue - (displayMutatedLevels || displayWithDomLevels ? (int)meanLetterWidth : 0), currentYPosition, stringFormatRight);
+ g.DrawString(Loc.S("W", secondaryCulture: secondaryCulture) + (displaySumWildMutLevels ? "+" + Loc.S("M", secondaryCulture: secondaryCulture) : string.Empty)
+ , font, fontBrush, xRightLevelValue - (displayMutatedLevels || displayWithDomLevels ? (int)meanLetterWidth : 0), currentYPosition, stringFormatRight);
if (displayMutatedLevels)
g.DrawString(Loc.S("M", secondaryCulture: secondaryCulture), font, fontBrush, xRightLevelMutValue - (displayWithDomLevels ? (int)meanLetterWidth : 0), currentYPosition, stringFormatRight);
if (displayWithDomLevels)
@@ -173,7 +175,8 @@ public static Bitmap InfoGraphic(this Creature creature, CreatureCollection cc,
g.DrawString($"{Utils.StatName(statIndex, true, creature.Species.statNames, secondaryCulture)}",
font, fontBrush, xStatName, y);
// stat level number
- g.DrawString($"{(creature.levelsWild[statIndex] < 0 ? "?" : creature.levelsWild[statIndex].ToString())}{(displayMutatedLevels || displayWithDomLevels ? " |" : string.Empty)}",
+ var displayedLevel = creature.levelsWild[statIndex] + (displaySumWildMutLevels && creature.levelsMutated != null && creature.levelsMutated[statIndex] > 0 ? creature.levelsMutated[statIndex] : 0);
+ g.DrawString($"{(creature.levelsWild[statIndex] < 0 ? "?" : displayedLevel.ToString())}{(displayMutatedLevels || displayWithDomLevels ? " |" : string.Empty)}",
font, fontBrush, xRightLevelValue, y, stringFormatRight);
if (displayMutatedLevels)
g.DrawString($"{(creature.levelsMutated[statIndex] < 0 ? string.Empty : creature.levelsMutated[statIndex].ToString())}{(displayWithDomLevels ? " |" : string.Empty)}",
diff --git a/ARKBreedingStats/local/strings.de.resx b/ARKBreedingStats/local/strings.de.resx
index 386ee0be1..28144cabe 100644
--- a/ARKBreedingStats/local/strings.de.resx
+++ b/ARKBreedingStats/local/strings.de.resx
@@ -921,8 +921,8 @@ Wählen, um die Top stats in einer Kreature zu vereinen. Dieser Modus geht ein R
Von Spielstand-Datei importieren
-
- Zuerst "Import Savegame" konfigurieren
+
+ "Import Savegame" konfigurieren
bis
diff --git a/ARKBreedingStats/local/strings.es.resx b/ARKBreedingStats/local/strings.es.resx
index 90feebd2e..6970df555 100644
--- a/ARKBreedingStats/local/strings.es.resx
+++ b/ARKBreedingStats/local/strings.es.resx
@@ -929,8 +929,8 @@ Algunas crías pueden ser peores que en el modo de estadísticas altas, pero tam
Importando desde archivo de guardado
-
- Al principio configurar "Importar Archivo de Guardado"
+
+ Configurar "Importar Archivo de Guardado"
hasta
diff --git a/ARKBreedingStats/local/strings.fr.resx b/ARKBreedingStats/local/strings.fr.resx
index 6da36a643..a56b8e472 100644
--- a/ARKBreedingStats/local/strings.fr.resx
+++ b/ARKBreedingStats/local/strings.fr.resx
@@ -927,8 +927,8 @@ Certaines progénitures peuvent être moins bonnes qu'en mode Statistiques Elev
Importer d'une sauvegarde
-
- Configurez d'abord "Import Savegame"
+
+ Configurez "Import Savegame"
jusqu'à
diff --git a/ARKBreedingStats/local/strings.ja.resx b/ARKBreedingStats/local/strings.ja.resx
index 349a980fb..52ca8300a 100644
--- a/ARKBreedingStats/local/strings.ja.resx
+++ b/ARKBreedingStats/local/strings.ja.resx
@@ -932,7 +932,7 @@ OCRで種族の推測が頻繁に間違える場合は、この設定を無効
savegameからインポート中
-
+
先に「Import Savegame」を設定してください
diff --git a/ARKBreedingStats/local/strings.pl.resx b/ARKBreedingStats/local/strings.pl.resx
index 4808166e9..82ec410f1 100644
--- a/ARKBreedingStats/local/strings.pl.resx
+++ b/ARKBreedingStats/local/strings.pl.resx
@@ -605,7 +605,7 @@
Zaimportuj z zapisu gry
-
+
Najpierw skonfiguruj "Import z zapisu gry"
diff --git a/ARKBreedingStats/local/strings.pt-br.resx b/ARKBreedingStats/local/strings.pt-br.resx
index 980dc876a..04b95dddb 100644
--- a/ARKBreedingStats/local/strings.pt-br.resx
+++ b/ARKBreedingStats/local/strings.pt-br.resx
@@ -586,8 +586,8 @@ Segure Ctrl + Shift para cores aleatórias
Importando do ARK-Tools
-
- Primeiro configure "Import Savegame"
+
+ Configure "Import Savegame"
Importando do savegame
diff --git a/ARKBreedingStats/local/strings.resx b/ARKBreedingStats/local/strings.resx
index 2ccf57839..b59aaaaec 100644
--- a/ARKBreedingStats/local/strings.resx
+++ b/ARKBreedingStats/local/strings.resx
@@ -929,8 +929,8 @@ Some offsprings might be worse than in High-Stats-Mode, but you also have a chan
Importing from savegame
-
- At first configure "Import Savegame"
+
+ Configure Import Savegame
until
diff --git a/ARKBreedingStats/local/strings.ru.resx b/ARKBreedingStats/local/strings.ru.resx
index 204e07066..b801b885c 100644
--- a/ARKBreedingStats/local/strings.ru.resx
+++ b/ARKBreedingStats/local/strings.ru.resx
@@ -826,7 +826,7 @@
Импорт из сохраненной игры
-
+
Сначала настройте «Импортировать сохранение игры»
diff --git a/ARKBreedingStats/local/strings.zh-tw.resx b/ARKBreedingStats/local/strings.zh-tw.resx
index b5a36bd19..12981fff9 100644
--- a/ARKBreedingStats/local/strings.zh-tw.resx
+++ b/ARKBreedingStats/local/strings.zh-tw.resx
@@ -633,7 +633,7 @@
從 ARK 工具匯入生物
-
+
請先設定 "匯入保存遊戲"
diff --git a/ARKBreedingStats/local/strings.zh.resx b/ARKBreedingStats/local/strings.zh.resx
index 6588c5396..200c59875 100644
--- a/ARKBreedingStats/local/strings.zh.resx
+++ b/ARKBreedingStats/local/strings.zh.resx
@@ -954,7 +954,7 @@
当前生物
-
+
首先请配置 "导入保存游戏"
diff --git a/ARKBreedingStats/multiplierTesting/StatMultiplierTestingControl.cs b/ARKBreedingStats/multiplierTesting/StatMultiplierTestingControl.cs
index 60cf4095c..52cd3a502 100644
--- a/ARKBreedingStats/multiplierTesting/StatMultiplierTestingControl.cs
+++ b/ARKBreedingStats/multiplierTesting/StatMultiplierTestingControl.cs
@@ -148,6 +148,9 @@ public string StatName
set => lStatName.Text = value;
}
+ ///
+ /// [tamingAdd, tamingMult, levelupDom, levelupWild]
+ ///
public double[] StatMultipliers
{
get => new[] { (double)nudTaM.Value, (double)nudTmM.Value, (double)nudIdM.Value, (double)nudIwM.Value };
@@ -158,10 +161,10 @@ public double[] StatMultipliers
var updateValuesKeeper = updateValues;
updateValues = false;
// 0:tamingAdd, 1:tamingMult, 2:levelupDom, 3:levelupWild
- nudTaM.Value = (decimal)value[0];
- nudTmM.Value = (decimal)value[1];
- nudIdM.Value = (decimal)value[2];
- nudIwM.Value = (decimal)value[3];
+ nudTaM.ValueSaveDouble = value[0];
+ nudTmM.ValueSaveDouble = value[1];
+ nudIdM.ValueSaveDouble = value[2];
+ nudIwM.ValueSaveDouble = value[3];
UpdateCalculations(updateValuesKeeper);
}
}
diff --git a/ARKBreedingStats/multiplierTesting/StatsMultiplierTesting.Designer.cs b/ARKBreedingStats/multiplierTesting/StatsMultiplierTesting.Designer.cs
index 49eda36d4..8f559eaef 100644
--- a/ARKBreedingStats/multiplierTesting/StatsMultiplierTesting.Designer.cs
+++ b/ARKBreedingStats/multiplierTesting/StatsMultiplierTesting.Designer.cs
@@ -30,9 +30,10 @@ private void InitializeComponent()
{
this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
this.groupBox4 = new System.Windows.Forms.GroupBox();
- this.button1 = new System.Windows.Forms.Button();
+ this.BtResetSpeciesValues = new System.Windows.Forms.Button();
this.cbUpdateOnSpeciesChange = new System.Windows.Forms.CheckBox();
this.groupBox5 = new System.Windows.Forms.GroupBox();
+ this.CbAllowSpeedLeveling = new System.Windows.Forms.CheckBox();
this.CbAtlas = new System.Windows.Forms.CheckBox();
this.CbAllowFlyerSpeedLeveling = new System.Windows.Forms.CheckBox();
this.cbSingleplayerSettings = new System.Windows.Forms.CheckBox();
@@ -46,11 +47,8 @@ private void InitializeComponent()
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.LbCalculatedWildLevel = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
- this.nudTE = new ARKBreedingStats.uiControls.Nud();
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.label2 = new System.Windows.Forms.Label();
- this.nudIBM = new ARKBreedingStats.uiControls.Nud();
- this.nudIB = new ARKBreedingStats.uiControls.Nud();
this.gbFineAdjustment = new System.Windows.Forms.GroupBox();
this.tbFineAdjustments = new System.Windows.Forms.TrackBar();
this.lBDummyEmptyFlowBreak = new System.Windows.Forms.Label();
@@ -72,7 +70,6 @@ private void InitializeComponent()
this.lbLevelSumDom = new System.Windows.Forms.Label();
this.lbLevelSumWild = new System.Windows.Forms.Label();
this.label16 = new System.Windows.Forms.Label();
- this.nudCreatureLevel = new ARKBreedingStats.uiControls.Nud();
this.LbAbbreviations = new System.Windows.Forms.Label();
this.menuStrip1 = new System.Windows.Forms.MenuStrip();
this.statMultipliersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -91,22 +88,25 @@ private void InitializeComponent()
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.setAllWildLevelsToTheClosestValueToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.setAllDomLevelsToTheClosestValueToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.CbAllowSpeedLeveling = new System.Windows.Forms.CheckBox();
+ this.nudTE = new ARKBreedingStats.uiControls.Nud();
+ this.nudIBM = new ARKBreedingStats.uiControls.Nud();
+ this.nudIB = new ARKBreedingStats.uiControls.Nud();
+ this.nudCreatureLevel = new ARKBreedingStats.uiControls.Nud();
this.flowLayoutPanel1.SuspendLayout();
this.groupBox4.SuspendLayout();
this.groupBox5.SuspendLayout();
this.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.nudTE)).BeginInit();
this.groupBox3.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.nudIBM)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.nudIB)).BeginInit();
this.gbFineAdjustment.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.tbFineAdjustments)).BeginInit();
this.panel1.SuspendLayout();
this.gbLevel.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.nudCreatureLevel)).BeginInit();
this.menuStrip1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nudTE)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nudIBM)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nudIB)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nudCreatureLevel)).BeginInit();
this.SuspendLayout();
//
// flowLayoutPanel1
@@ -133,7 +133,7 @@ private void InitializeComponent()
//
// groupBox4
//
- this.groupBox4.Controls.Add(this.button1);
+ this.groupBox4.Controls.Add(this.BtResetSpeciesValues);
this.groupBox4.Controls.Add(this.cbUpdateOnSpeciesChange);
this.groupBox4.Location = new System.Drawing.Point(3, 3);
this.groupBox4.Name = "groupBox4";
@@ -142,15 +142,15 @@ private void InitializeComponent()
this.groupBox4.TabStop = false;
this.groupBox4.Text = "Species Values";
//
- // button1
+ // BtResetSpeciesValues
//
- this.button1.Location = new System.Drawing.Point(6, 42);
- this.button1.Name = "button1";
- this.button1.Size = new System.Drawing.Size(125, 23);
- this.button1.TabIndex = 1;
- this.button1.Text = "Set to current Species";
- this.button1.UseVisualStyleBackColor = true;
- this.button1.Click += new System.EventHandler(this.btUpdateSpecies_Click);
+ this.BtResetSpeciesValues.Location = new System.Drawing.Point(6, 42);
+ this.BtResetSpeciesValues.Name = "BtResetSpeciesValues";
+ this.BtResetSpeciesValues.Size = new System.Drawing.Size(284, 23);
+ this.BtResetSpeciesValues.TabIndex = 1;
+ this.BtResetSpeciesValues.Text = "Reset species values";
+ this.BtResetSpeciesValues.UseVisualStyleBackColor = true;
+ this.BtResetSpeciesValues.Click += new System.EventHandler(this.btUpdateSpecies_Click);
//
// cbUpdateOnSpeciesChange
//
@@ -177,6 +177,17 @@ private void InitializeComponent()
this.groupBox5.TabStop = false;
this.groupBox5.Text = "Settings";
//
+ // CbAllowSpeedLeveling
+ //
+ this.CbAllowSpeedLeveling.AutoSize = true;
+ this.CbAllowSpeedLeveling.Location = new System.Drawing.Point(6, 42);
+ this.CbAllowSpeedLeveling.Name = "CbAllowSpeedLeveling";
+ this.CbAllowSpeedLeveling.Size = new System.Drawing.Size(122, 17);
+ this.CbAllowSpeedLeveling.TabIndex = 3;
+ this.CbAllowSpeedLeveling.Text = "AllowSpeedLeveling";
+ this.CbAllowSpeedLeveling.UseVisualStyleBackColor = true;
+ this.CbAllowSpeedLeveling.CheckedChanged += new System.EventHandler(this.CbAllowSpeedLeveling_CheckedChanged);
+ //
// CbAtlas
//
this.CbAtlas.AutoSize = true;
@@ -320,21 +331,6 @@ private void InitializeComponent()
this.label1.TabIndex = 2;
this.label1.Text = "%";
//
- // nudTE
- //
- this.nudTE.DecimalPlaces = 3;
- this.nudTE.ForeColor = System.Drawing.SystemColors.GrayText;
- this.nudTE.Location = new System.Drawing.Point(6, 19);
- this.nudTE.Name = "nudTE";
- this.nudTE.NeutralNumber = new decimal(new int[] {
- 0,
- 0,
- 0,
- 0});
- this.nudTE.Size = new System.Drawing.Size(71, 20);
- this.nudTE.TabIndex = 1;
- this.nudTE.ValueChanged += new System.EventHandler(this.nudTE_ValueChanged);
- //
// groupBox3
//
this.groupBox3.Controls.Add(this.label2);
@@ -356,51 +352,6 @@ private void InitializeComponent()
this.label2.TabIndex = 3;
this.label2.Text = "% IBM";
//
- // nudIBM
- //
- this.nudIBM.DecimalPlaces = 4;
- this.nudIBM.ForeColor = System.Drawing.SystemColors.WindowText;
- this.nudIBM.Increment = new decimal(new int[] {
- 1,
- 0,
- 0,
- 65536});
- this.nudIBM.Location = new System.Drawing.Point(135, 19);
- this.nudIBM.Name = "nudIBM";
- this.nudIBM.NeutralNumber = new decimal(new int[] {
- 0,
- 0,
- 0,
- 0});
- this.nudIBM.Size = new System.Drawing.Size(71, 20);
- this.nudIBM.TabIndex = 2;
- this.nudIBM.Value = new decimal(new int[] {
- 1,
- 0,
- 0,
- 0});
- this.nudIBM.ValueChanged += new System.EventHandler(this.nudIBM_ValueChanged);
- //
- // nudIB
- //
- this.nudIB.DecimalPlaces = 6;
- this.nudIB.ForeColor = System.Drawing.SystemColors.GrayText;
- this.nudIB.Location = new System.Drawing.Point(6, 19);
- this.nudIB.Maximum = new decimal(new int[] {
- 200,
- 0,
- 0,
- 0});
- this.nudIB.Name = "nudIB";
- this.nudIB.NeutralNumber = new decimal(new int[] {
- 0,
- 0,
- 0,
- 0});
- this.nudIB.Size = new System.Drawing.Size(80, 20);
- this.nudIB.TabIndex = 1;
- this.nudIB.ValueChanged += new System.EventHandler(this.nudIB_ValueChanged);
- //
// gbFineAdjustment
//
this.gbFineAdjustment.Controls.Add(this.tbFineAdjustments);
@@ -623,25 +574,6 @@ private void InitializeComponent()
this.label16.TabIndex = 14;
this.label16.Text = "Creature-Level";
//
- // nudCreatureLevel
- //
- this.nudCreatureLevel.ForeColor = System.Drawing.SystemColors.GrayText;
- this.nudCreatureLevel.Location = new System.Drawing.Point(87, 19);
- this.nudCreatureLevel.Maximum = new decimal(new int[] {
- 100000,
- 0,
- 0,
- 0});
- this.nudCreatureLevel.Name = "nudCreatureLevel";
- this.nudCreatureLevel.NeutralNumber = new decimal(new int[] {
- 0,
- 0,
- 0,
- 0});
- this.nudCreatureLevel.Size = new System.Drawing.Size(107, 20);
- this.nudCreatureLevel.TabIndex = 13;
- this.nudCreatureLevel.ValueChanged += new System.EventHandler(this.nudCreatureLevel_ValueChanged);
- //
// LbAbbreviations
//
this.LbAbbreviations.AutoSize = true;
@@ -786,25 +718,96 @@ private void InitializeComponent()
this.setAllDomLevelsToTheClosestValueToolStripMenuItem.Text = "Set all Dom levels to the closest value";
this.setAllDomLevelsToTheClosestValueToolStripMenuItem.Click += new System.EventHandler(this.setAllDomLevelsToTheClosestValueToolStripMenuItem_Click);
//
- // CbAllowSpeedLeveling
+ // nudTE
//
- this.CbAllowSpeedLeveling.AutoSize = true;
- this.CbAllowSpeedLeveling.Location = new System.Drawing.Point(6, 42);
- this.CbAllowSpeedLeveling.Name = "CbAllowSpeedLeveling";
- this.CbAllowSpeedLeveling.Size = new System.Drawing.Size(122, 17);
- this.CbAllowSpeedLeveling.TabIndex = 3;
- this.CbAllowSpeedLeveling.Text = "AllowSpeedLeveling";
- this.CbAllowSpeedLeveling.UseVisualStyleBackColor = true;
- this.CbAllowSpeedLeveling.CheckedChanged += new System.EventHandler(this.CbAllowSpeedLeveling_CheckedChanged);
+ this.nudTE.DecimalPlaces = 3;
+ this.nudTE.ForeColor = System.Drawing.SystemColors.GrayText;
+ this.nudTE.Location = new System.Drawing.Point(6, 19);
+ this.nudTE.Name = "nudTE";
+ this.nudTE.NeutralNumber = new decimal(new int[] {
+ 0,
+ 0,
+ 0,
+ 0});
+ this.nudTE.Size = new System.Drawing.Size(71, 20);
+ this.nudTE.TabIndex = 1;
+ this.nudTE.ValueChanged += new System.EventHandler(this.nudTE_ValueChanged);
+ //
+ // nudIBM
+ //
+ this.nudIBM.DecimalPlaces = 4;
+ this.nudIBM.ForeColor = System.Drawing.SystemColors.WindowText;
+ this.nudIBM.Increment = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 65536});
+ this.nudIBM.Location = new System.Drawing.Point(135, 19);
+ this.nudIBM.Name = "nudIBM";
+ this.nudIBM.NeutralNumber = new decimal(new int[] {
+ 0,
+ 0,
+ 0,
+ 0});
+ this.nudIBM.Size = new System.Drawing.Size(71, 20);
+ this.nudIBM.TabIndex = 2;
+ this.nudIBM.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nudIBM.ValueChanged += new System.EventHandler(this.nudIBM_ValueChanged);
+ //
+ // nudIB
+ //
+ this.nudIB.DecimalPlaces = 6;
+ this.nudIB.ForeColor = System.Drawing.SystemColors.GrayText;
+ this.nudIB.Location = new System.Drawing.Point(6, 19);
+ this.nudIB.Maximum = new decimal(new int[] {
+ 200,
+ 0,
+ 0,
+ 0});
+ this.nudIB.Name = "nudIB";
+ this.nudIB.NeutralNumber = new decimal(new int[] {
+ 0,
+ 0,
+ 0,
+ 0});
+ this.nudIB.Size = new System.Drawing.Size(80, 20);
+ this.nudIB.TabIndex = 1;
+ this.nudIB.ValueChanged += new System.EventHandler(this.nudIB_ValueChanged);
+ //
+ // nudCreatureLevel
+ //
+ this.nudCreatureLevel.ForeColor = System.Drawing.SystemColors.GrayText;
+ this.nudCreatureLevel.Location = new System.Drawing.Point(87, 19);
+ this.nudCreatureLevel.Maximum = new decimal(new int[] {
+ 100000,
+ 0,
+ 0,
+ 0});
+ this.nudCreatureLevel.Name = "nudCreatureLevel";
+ this.nudCreatureLevel.NeutralNumber = new decimal(new int[] {
+ 0,
+ 0,
+ 0,
+ 0});
+ this.nudCreatureLevel.Size = new System.Drawing.Size(107, 20);
+ this.nudCreatureLevel.TabIndex = 13;
+ this.nudCreatureLevel.ValueChanged += new System.EventHandler(this.nudCreatureLevel_ValueChanged);
//
// StatsMultiplierTesting
//
+ this.AllowDrop = true;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.flowLayoutPanel1);
this.Controls.Add(this.menuStrip1);
this.Name = "StatsMultiplierTesting";
this.Size = new System.Drawing.Size(1011, 532);
+ this.DragDrop += new System.Windows.Forms.DragEventHandler(this.StatsMultiplierTesting_DragDrop);
+ this.DragEnter += new System.Windows.Forms.DragEventHandler(this.StatsMultiplierTesting_DragEnter);
this.flowLayoutPanel1.ResumeLayout(false);
this.flowLayoutPanel1.PerformLayout();
this.groupBox4.ResumeLayout(false);
@@ -815,19 +818,19 @@ private void InitializeComponent()
this.groupBox1.PerformLayout();
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
- ((System.ComponentModel.ISupportInitialize)(this.nudTE)).EndInit();
this.groupBox3.ResumeLayout(false);
this.groupBox3.PerformLayout();
- ((System.ComponentModel.ISupportInitialize)(this.nudIBM)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.nudIB)).EndInit();
this.gbFineAdjustment.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.tbFineAdjustments)).EndInit();
this.panel1.ResumeLayout(false);
this.gbLevel.ResumeLayout(false);
this.gbLevel.PerformLayout();
- ((System.ComponentModel.ISupportInitialize)(this.nudCreatureLevel)).EndInit();
this.menuStrip1.ResumeLayout(false);
this.menuStrip1.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nudTE)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nudIBM)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nudIB)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nudCreatureLevel)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
@@ -844,7 +847,7 @@ private void InitializeComponent()
private uiControls.Nud nudIBM;
private uiControls.Nud nudIB;
private System.Windows.Forms.GroupBox groupBox4;
- private System.Windows.Forms.Button button1;
+ private System.Windows.Forms.Button BtResetSpeciesValues;
private System.Windows.Forms.CheckBox cbUpdateOnSpeciesChange;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Label LbFinalValue;
diff --git a/ARKBreedingStats/multiplierTesting/StatsMultiplierTesting.cs b/ARKBreedingStats/multiplierTesting/StatsMultiplierTesting.cs
index 5d020b9da..716b741ed 100644
--- a/ARKBreedingStats/multiplierTesting/StatsMultiplierTesting.cs
+++ b/ARKBreedingStats/multiplierTesting/StatsMultiplierTesting.cs
@@ -4,15 +4,20 @@
using ARKBreedingStats.uiControls;
using ARKBreedingStats.values;
using System;
+using System.Collections.Generic;
using System.Drawing;
+using System.IO;
using System.Windows.Forms;
using ARKBreedingStats.utils;
+using System.Linq;
+using ARKBreedingStats.importExportGun;
namespace ARKBreedingStats.multiplierTesting
{
public partial class StatsMultiplierTesting : UserControl
{
public event Action OnApplyMultipliers;
+ public event Form1.SetMessageLabelTextEventHandler SetMessageLabelText;
private readonly StatMultiplierTestingControl[] _statControls;
private CreatureCollection _cc;
@@ -235,6 +240,7 @@ public void SetSpecies(Species species, bool forceUpdate = false)
(!forceUpdate && (_selectedSpecies == species || !cbUpdateOnSpeciesChange.Checked))) return;
_selectedSpecies = species;
+ BtResetSpeciesValues.Text = $"Reset species values - {_selectedSpecies.DescriptiveNameAndMod}";
LbBlueprintPath.Text = $"BlueprintPath: {species.blueprintPath}";
double?[][] customStatOverrides = null;
@@ -302,10 +308,10 @@ public void SetCreatureValues(double[] statValues, int[] levelsWild, int[] level
SetTE(TE);
SetIB(IB);
- if (tamed)
- rbTamed.Checked = true;
- else if (bred)
+ if (bred)
rbBred.Checked = true;
+ else if (tamed)
+ rbTamed.Checked = true;
else rbWild.Checked = true;
for (int s = 0; s < Stats.StatsCount; s++)
@@ -556,5 +562,120 @@ private void SetToolTips()
_tt.SetToolTip(LbFinalValue, "Final stat value displayed in the game");
_tt.SetToolTip(LbCalculatedWildLevel, "Calculated pre tame level, dependent on the taming effectiveness and the post tame level");
}
+
+ private void StatsMultiplierTesting_DragEnter(object sender, DragEventArgs e)
+ {
+ if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy;
+ }
+
+ ///
+ /// Use stat values of file, and if it's an export gun files also the levels.
+ ///
+ private void StatsMultiplierTesting_DragDrop(object sender, DragEventArgs e)
+ {
+ if (!(e.Data.GetData(DataFormats.FileDrop) is string[] files && files.Any()))
+ return;
+ ProcessDroppedFiles(files);
+ }
+
+ private void ProcessDroppedFiles(string[] files)
+ {
+ var creatureImported = false; // only import one creature (second would only overwrite first)
+ var serverMultipliersImported = false;
+ var errorOccured = false;
+ var results = new List();
+ string lastFilePath = null;
+ foreach (var filePath in files)
+ {
+ if (string.IsNullOrEmpty(filePath) || !File.Exists(filePath)) continue;
+
+ var extension = Path.GetExtension(filePath);
+ lastFilePath = filePath;
+ switch (extension)
+ {
+ case ".ini":
+ // export file
+ if (creatureImported) continue;
+ var cv = importExported.ImportExported.ReadExportedCreature(filePath);
+ SetCreatureValueValues(cv);
+ results.Add($"imported creature values from {filePath}");
+ continue;
+ case ".sav":
+ case ".json":
+ // export gun file of ASE
+ string lastError = null;
+ string serverMultipliersHash = null;
+ Creature creature = null;
+ if (!creatureImported)
+ creature = ImportExportGun.LoadCreature(filePath, out lastError, out serverMultipliersHash, true);
+ if (creature != null)
+ {
+ creatureImported = true;
+ SetCreatureValuesAndLevels(creature);
+ results.Add($"imported creature values and levels from {filePath}{(string.IsNullOrEmpty(lastError) ? string.Empty : $". {lastError}")}");
+ }
+ else if (lastError != null)
+ {
+ if (!serverMultipliersImported)
+ {
+ // file could be a server multiplier file, try to read it that way
+ var esm = ImportExportGun.ReadServerMultipliers(filePath, out var serverImportResult);
+ if (esm != null)
+ {
+ SetServerMultipliers(esm);
+ results.Add($"imported server multipliers from {filePath}");
+ serverMultipliersImported = true;
+ continue;
+ }
+ if (string.IsNullOrEmpty(serverImportResult))
+ results.Add(serverImportResult);
+ continue;
+ }
+
+ results.Add($"error when importing file {filePath}: {lastError}");
+ errorOccured = true;
+ }
+
+ break;
+ }
+ }
+ SetMessageLabelText?.Invoke(string.Join(Environment.NewLine, results),
+ errorOccured ? MessageBoxIcon.Error : MessageBoxIcon.Information, lastFilePath);
+ }
+
+ private void SetCreatureValueValues(CreatureValues cv)
+ {
+ SetCreatureValues(cv.statValues, null, null, cv.level, (cv.tamingEffMax - cv.tamingEffMin) / 2, cv.imprintingBonus, cv.isTamed, cv.isBred, cv.Species);
+ }
+
+ private void SetCreatureValuesAndLevels(Creature cr)
+ {
+ var levelsWildAndMutated = cr.levelsWild;
+ if (cr.levelsMutated != null)
+ {
+ for (int si = 0; si < Stats.StatsCount; si++)
+ levelsWildAndMutated[si] = cr.levelsWild[si] + cr.levelsMutated[si];
+ }
+ SetCreatureValues(cr.valuesDom, levelsWildAndMutated, cr.levelsDom, cr.Level, cr.tamingEff, cr.imprintingBonus, cr.isDomesticated, cr.isBred, cr.Species);
+ }
+
+ private void SetServerMultipliers(ExportGunServerFile esm)
+ {
+ if (esm?.WildLevel == null) return;
+
+ for (int si = 0; si < Stats.StatsCount; si++)
+ {
+ _statControls[si].StatMultipliers = new[]
+ { esm.TameAdd[si], esm.TameAff[si], esm.TameLevel[si], esm.WildLevel[si] };
+ }
+ SetIBM(esm.BabyImprintingStatScaleMultiplier);
+
+ cbSingleplayerSettings.Checked = esm.UseSingleplayerSettings;
+ CbAtlas.Checked = false; // atlas has no export gun mod
+ CbAllowSpeedLeveling.Checked = esm.AllowSpeedLeveling;
+ CbAllowFlyerSpeedLeveling.Checked = esm.AllowFlyerSpeedLeveling;
+
+ CheckIfMultipliersAreEqualToSettings();
+ }
}
}
diff --git a/ARKBreedingStats/settings/Settings.Designer.cs b/ARKBreedingStats/settings/Settings.Designer.cs
index 39a95265a..31ff8ef44 100644
--- a/ARKBreedingStats/settings/Settings.Designer.cs
+++ b/ARKBreedingStats/settings/Settings.Designer.cs
@@ -80,6 +80,7 @@ private void InitializeComponent()
this.nudMaxWildLevels = new ARKBreedingStats.uiControls.Nud();
this.label10 = new System.Windows.Forms.Label();
this.nudMaxDomLevels = new ARKBreedingStats.uiControls.Nud();
+ this.label27 = new System.Windows.Forms.Label();
this.groupBox4 = new System.Windows.Forms.GroupBox();
this.label57 = new System.Windows.Forms.Label();
this.label56 = new System.Windows.Forms.Label();
@@ -108,7 +109,6 @@ private void InitializeComponent()
this.label14 = new System.Windows.Forms.Label();
this.nudDinoCharacterFoodDrain = new ARKBreedingStats.uiControls.Nud();
this.nudTamingSpeed = new ARKBreedingStats.uiControls.Nud();
- this.label15 = new System.Windows.Forms.Label();
this.groupBox6 = new System.Windows.Forms.GroupBox();
this.label55 = new System.Windows.Forms.Label();
this.NudWaitBeforeAutoLoad = new ARKBreedingStats.uiControls.Nud();
@@ -124,6 +124,10 @@ private void InitializeComponent()
this.checkBoxDisplayHiddenStats = new System.Windows.Forms.CheckBox();
this.tabControlSettings = new System.Windows.Forms.TabControl();
this.tabPageMultipliers = new System.Windows.Forms.TabPage();
+ this.groupBox12 = new System.Windows.Forms.GroupBox();
+ this.BtnUpdateOfficialEventValues = new System.Windows.Forms.Button();
+ this.CbAutoOfficialMultipliers = new System.Windows.Forms.CheckBox();
+ this.CbbOfficialMultipliers = new System.Windows.Forms.ComboBox();
this.GbNewLibraryGame = new System.Windows.Forms.GroupBox();
this.RbNewLibraryGameAskEachTime = new System.Windows.Forms.RadioButton();
this.RbNewLibraryGameKeep = new System.Windows.Forms.RadioButton();
@@ -147,7 +151,6 @@ private void InitializeComponent()
this.groupBox18 = new System.Windows.Forms.GroupBox();
this.btApplyPreset = new System.Windows.Forms.Button();
this.cbbStatMultiplierPresets = new System.Windows.Forms.ComboBox();
- this.label27 = new System.Windows.Forms.Label();
this.cbSingleplayerSettings = new System.Windows.Forms.CheckBox();
this.groupBox11 = new System.Windows.Forms.GroupBox();
this.cbAllowMoreThanHundredImprinting = new System.Windows.Forms.CheckBox();
@@ -214,13 +217,16 @@ private void InitializeComponent()
this.BtInfoGraphicBorderColor = new System.Windows.Forms.Button();
this.label51 = new System.Windows.Forms.Label();
this.groupBox28 = new System.Windows.Forms.GroupBox();
+ this.CbInfoGraphicSumWildMut = new System.Windows.Forms.CheckBox();
+ this.PanelDomLevels = new System.Windows.Forms.Panel();
+ this.RbInfoGraphicDomValues = new System.Windows.Forms.RadioButton();
+ this.RbInfoGraphicBreedingValues = new System.Windows.Forms.RadioButton();
this.CbInfoGraphicColorRegionNamesIfNoImage = new System.Windows.Forms.CheckBox();
this.CbInfoGraphicStatValues = new System.Windows.Forms.CheckBox();
this.CbInfoGraphicAddRegionNames = new System.Windows.Forms.CheckBox();
this.CbInfoGraphicCreatureName = new System.Windows.Forms.CheckBox();
this.CbInfoGraphicMutationCounter = new System.Windows.Forms.CheckBox();
this.CbInfoGraphicGenerations = new System.Windows.Forms.CheckBox();
- this.CbInfoGraphicDomLevels = new System.Windows.Forms.CheckBox();
this.CbInfoGraphicDisplayMaxWildLevel = new System.Windows.Forms.CheckBox();
this.label50 = new System.Windows.Forms.Label();
this.tabPageImportSavegame = new System.Windows.Forms.TabPage();
@@ -310,6 +316,10 @@ private void InitializeComponent()
this.label20 = new System.Windows.Forms.Label();
this.tabPageOverlay = new System.Windows.Forms.TabPage();
this.groupBox10 = new System.Windows.Forms.GroupBox();
+ this.label70 = new System.Windows.Forms.Label();
+ this.label15 = new System.Windows.Forms.Label();
+ this.nudOverlayInfoHeight = new ARKBreedingStats.uiControls.Nud();
+ this.nudOverlayInfoWidth = new ARKBreedingStats.uiControls.Nud();
this.NudOverlayRelativeFontSize = new ARKBreedingStats.uiControls.Nud();
this.label65 = new System.Windows.Forms.Label();
this.CbOverlayDisplayInheritance = new System.Windows.Forms.CheckBox();
@@ -361,6 +371,7 @@ private void InitializeComponent()
this.label1 = new System.Windows.Forms.Label();
this.panel1 = new System.Windows.Forms.Panel();
this.colorDialog1 = new System.Windows.Forms.ColorDialog();
+ this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.groupBoxMultiplier.SuspendLayout();
this.groupBox2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.nudTamedDinoCharacterFoodDrain)).BeginInit();
@@ -406,6 +417,7 @@ private void InitializeComponent()
this.groupBox7.SuspendLayout();
this.tabControlSettings.SuspendLayout();
this.tabPageMultipliers.SuspendLayout();
+ this.groupBox12.SuspendLayout();
this.GbNewLibraryGame.SuspendLayout();
this.panel3.SuspendLayout();
this.groupBox29.SuspendLayout();
@@ -430,6 +442,7 @@ private void InitializeComponent()
this.groupBox32.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.nudInfoGraphicHeight)).BeginInit();
this.groupBox28.SuspendLayout();
+ this.PanelDomLevels.SuspendLayout();
this.tabPageImportSavegame.SuspendLayout();
this.groupBox14.SuspendLayout();
this.groupBox15.SuspendLayout();
@@ -452,6 +465,8 @@ private void InitializeComponent()
this.groupBox8.SuspendLayout();
this.tabPageOverlay.SuspendLayout();
this.groupBox10.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nudOverlayInfoHeight)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nudOverlayInfoWidth)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.NudOverlayRelativeFontSize)).BeginInit();
this.pCustomOverlayLocation.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.nudCustomOverlayLocX)).BeginInit();
@@ -1245,6 +1260,18 @@ private void InitializeComponent()
0});
this.nudMaxDomLevels.Size = new System.Drawing.Size(57, 20);
this.nudMaxDomLevels.TabIndex = 1;
+ //
+ // label27
+ //
+ this.label27.AutoSize = true;
+ this.label27.Font = new System.Drawing.Font("Microsoft Sans Serif", 20.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label27.Location = new System.Drawing.Point(288, 21);
+ this.label27.Name = "label27";
+ this.label27.Size = new System.Drawing.Size(46, 31);
+ this.label27.TabIndex = 12;
+ this.label27.Text = "💡";
+ this.toolTip1.SetToolTip(this.label27, "If you have the files Game.ini or GameUserSettings.ini from your server, you can " +
+ "drag&&drop them on this window to insert their values.");
//
// groupBox4
//
@@ -1693,14 +1720,6 @@ private void InitializeComponent()
0,
0});
//
- // label15
- //
- this.label15.Location = new System.Drawing.Point(450, 548);
- this.label15.Name = "label15";
- this.label15.Size = new System.Drawing.Size(289, 77);
- this.label15.TabIndex = 9;
- this.label15.Text = resources.GetString("label15.Text");
- //
// groupBox6
//
this.groupBox6.Controls.Add(this.label55);
@@ -1876,6 +1895,7 @@ private void InitializeComponent()
//
this.tabPageMultipliers.AllowDrop = true;
this.tabPageMultipliers.AutoScroll = true;
+ this.tabPageMultipliers.Controls.Add(this.groupBox12);
this.tabPageMultipliers.Controls.Add(this.GbNewLibraryGame);
this.tabPageMultipliers.Controls.Add(this.TbRemoteServerSettingsUri);
this.tabPageMultipliers.Controls.Add(this.BtSettingsToClipboard);
@@ -1889,7 +1909,6 @@ private void InitializeComponent()
this.tabPageMultipliers.Controls.Add(this.groupBox29);
this.tabPageMultipliers.Controls.Add(this.label34);
this.tabPageMultipliers.Controls.Add(this.groupBox18);
- this.tabPageMultipliers.Controls.Add(this.label27);
this.tabPageMultipliers.Controls.Add(this.cbSingleplayerSettings);
this.tabPageMultipliers.Controls.Add(this.groupBox11);
this.tabPageMultipliers.Controls.Add(this.buttonEventToDefault);
@@ -1897,7 +1916,6 @@ private void InitializeComponent()
this.tabPageMultipliers.Controls.Add(this.groupBoxMultiplier);
this.tabPageMultipliers.Controls.Add(this.groupBox2);
this.tabPageMultipliers.Controls.Add(this.groupBox3);
- this.tabPageMultipliers.Controls.Add(this.label15);
this.tabPageMultipliers.Controls.Add(this.groupBox5);
this.tabPageMultipliers.Location = new System.Drawing.Point(4, 22);
this.tabPageMultipliers.Name = "tabPageMultipliers";
@@ -1909,6 +1927,54 @@ private void InitializeComponent()
this.tabPageMultipliers.DragDrop += new System.Windows.Forms.DragEventHandler(this.tabPage2_DragDrop);
this.tabPageMultipliers.DragEnter += new System.Windows.Forms.DragEventHandler(this.tabPage2_DragEnter);
//
+ // groupBox12
+ //
+ this.groupBox12.Controls.Add(this.BtnUpdateOfficialEventValues);
+ this.groupBox12.Controls.Add(this.CbAutoOfficialMultipliers);
+ this.groupBox12.Controls.Add(this.CbbOfficialMultipliers);
+ this.groupBox12.Controls.Add(this.label27);
+ this.groupBox12.Location = new System.Drawing.Point(395, 551);
+ this.groupBox12.Name = "groupBox12";
+ this.groupBox12.Size = new System.Drawing.Size(344, 71);
+ this.groupBox12.TabIndex = 22;
+ this.groupBox12.TabStop = false;
+ this.groupBox12.Text = "Official server multipliers";
+ //
+ // BtnUpdateOfficialEventValues
+ //
+ this.BtnUpdateOfficialEventValues.Location = new System.Drawing.Point(12, 42);
+ this.BtnUpdateOfficialEventValues.Name = "BtnUpdateOfficialEventValues";
+ this.BtnUpdateOfficialEventValues.Size = new System.Drawing.Size(140, 23);
+ this.BtnUpdateOfficialEventValues.TabIndex = 2;
+ this.BtnUpdateOfficialEventValues.Text = "Update Event-values";
+ this.BtnUpdateOfficialEventValues.UseVisualStyleBackColor = true;
+ this.BtnUpdateOfficialEventValues.Click += new System.EventHandler(this.BtnUpdateOfficialEventValues_Click);
+ //
+ // CbAutoOfficialMultipliers
+ //
+ this.CbAutoOfficialMultipliers.AutoSize = true;
+ this.CbAutoOfficialMultipliers.Location = new System.Drawing.Point(176, 46);
+ this.CbAutoOfficialMultipliers.Name = "CbAutoOfficialMultipliers";
+ this.CbAutoOfficialMultipliers.Size = new System.Drawing.Size(84, 17);
+ this.CbAutoOfficialMultipliers.TabIndex = 24;
+ this.CbAutoOfficialMultipliers.Text = "Auto update";
+ this.toolTip1.SetToolTip(this.CbAutoOfficialMultipliers, "Update event multipliers to match official servers every 30 seconds.");
+ this.CbAutoOfficialMultipliers.UseVisualStyleBackColor = true;
+ this.CbAutoOfficialMultipliers.Visible = false;
+ //
+ // CbbOfficialMultipliers
+ //
+ this.CbbOfficialMultipliers.FormattingEnabled = true;
+ this.CbbOfficialMultipliers.Items.AddRange(new object[] {
+ "ASA Official",
+ "ASA Smalltribes",
+ "ASA Arkpocalypse"});
+ this.CbbOfficialMultipliers.Location = new System.Drawing.Point(12, 19);
+ this.CbbOfficialMultipliers.Name = "CbbOfficialMultipliers";
+ this.CbbOfficialMultipliers.Size = new System.Drawing.Size(248, 21);
+ this.CbbOfficialMultipliers.TabIndex = 23;
+ this.CbbOfficialMultipliers.Text = "ASA Official";
+ //
// GbNewLibraryGame
//
this.GbNewLibraryGame.Controls.Add(this.RbNewLibraryGameAskEachTime);
@@ -2149,16 +2215,6 @@ private void InitializeComponent()
this.cbbStatMultiplierPresets.Size = new System.Drawing.Size(217, 21);
this.cbbStatMultiplierPresets.TabIndex = 0;
//
- // label27
- //
- this.label27.AutoSize = true;
- this.label27.Font = new System.Drawing.Font("Microsoft Sans Serif", 16F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
- this.label27.Location = new System.Drawing.Point(407, 562);
- this.label27.Name = "label27";
- this.label27.Size = new System.Drawing.Size(37, 26);
- this.label27.TabIndex = 12;
- this.label27.Text = "💡";
- //
// cbSingleplayerSettings
//
this.cbSingleplayerSettings.AutoSize = true;
@@ -2761,7 +2817,7 @@ private void InitializeComponent()
//
// BtNewRandomInfoGraphicCreature
//
- this.BtNewRandomInfoGraphicCreature.Location = new System.Drawing.Point(62, 293);
+ this.BtNewRandomInfoGraphicCreature.Location = new System.Drawing.Point(62, 315);
this.BtNewRandomInfoGraphicCreature.Name = "BtNewRandomInfoGraphicCreature";
this.BtNewRandomInfoGraphicCreature.Size = new System.Drawing.Size(200, 20);
this.BtNewRandomInfoGraphicCreature.TabIndex = 19;
@@ -2772,7 +2828,7 @@ private void InitializeComponent()
// label63
//
this.label63.AutoSize = true;
- this.label63.Location = new System.Drawing.Point(11, 300);
+ this.label63.Location = new System.Drawing.Point(11, 322);
this.label63.Name = "label63";
this.label63.Size = new System.Drawing.Size(45, 13);
this.label63.TabIndex = 18;
@@ -2780,7 +2836,7 @@ private void InitializeComponent()
//
// PbInfoGraphicPreview
//
- this.PbInfoGraphicPreview.Location = new System.Drawing.Point(8, 325);
+ this.PbInfoGraphicPreview.Location = new System.Drawing.Point(8, 347);
this.PbInfoGraphicPreview.Name = "PbInfoGraphicPreview";
this.PbInfoGraphicPreview.Size = new System.Drawing.Size(333, 143);
this.PbInfoGraphicPreview.TabIndex = 9;
@@ -2892,53 +2948,98 @@ private void InitializeComponent()
//
// groupBox28
//
+ this.groupBox28.Controls.Add(this.CbInfoGraphicSumWildMut);
+ this.groupBox28.Controls.Add(this.PanelDomLevels);
this.groupBox28.Controls.Add(this.CbInfoGraphicColorRegionNamesIfNoImage);
this.groupBox28.Controls.Add(this.CbInfoGraphicStatValues);
this.groupBox28.Controls.Add(this.CbInfoGraphicAddRegionNames);
this.groupBox28.Controls.Add(this.CbInfoGraphicCreatureName);
this.groupBox28.Controls.Add(this.CbInfoGraphicMutationCounter);
this.groupBox28.Controls.Add(this.CbInfoGraphicGenerations);
- this.groupBox28.Controls.Add(this.CbInfoGraphicDomLevels);
this.groupBox28.Controls.Add(this.CbInfoGraphicDisplayMaxWildLevel);
this.groupBox28.Location = new System.Drawing.Point(8, 47);
this.groupBox28.Name = "groupBox28";
- this.groupBox28.Size = new System.Drawing.Size(474, 224);
+ this.groupBox28.Size = new System.Drawing.Size(474, 262);
this.groupBox28.TabIndex = 8;
this.groupBox28.TabStop = false;
this.groupBox28.Text = "Include Info";
//
+ // CbInfoGraphicSumWildMut
+ //
+ this.CbInfoGraphicSumWildMut.AutoSize = true;
+ this.CbInfoGraphicSumWildMut.Location = new System.Drawing.Point(6, 88);
+ this.CbInfoGraphicSumWildMut.Name = "CbInfoGraphicSumWildMut";
+ this.CbInfoGraphicSumWildMut.Size = new System.Drawing.Size(355, 17);
+ this.CbInfoGraphicSumWildMut.TabIndex = 21;
+ this.CbInfoGraphicSumWildMut.Text = "Display sum of wild and mutated levels instead each in its own column";
+ this.CbInfoGraphicSumWildMut.UseVisualStyleBackColor = true;
+ this.CbInfoGraphicSumWildMut.CheckedChanged += new System.EventHandler(this.CbInfoGraphicCheckBoxRadioButtonChanged);
+ //
+ // PanelDomLevels
+ //
+ this.PanelDomLevels.Controls.Add(this.RbInfoGraphicDomValues);
+ this.PanelDomLevels.Controls.Add(this.RbInfoGraphicBreedingValues);
+ this.PanelDomLevels.Location = new System.Drawing.Point(3, 61);
+ this.PanelDomLevels.Name = "PanelDomLevels";
+ this.PanelDomLevels.Size = new System.Drawing.Size(281, 24);
+ this.PanelDomLevels.TabIndex = 20;
+ //
+ // RbInfoGraphicDomValues
+ //
+ this.RbInfoGraphicDomValues.AutoSize = true;
+ this.RbInfoGraphicDomValues.Location = new System.Drawing.Point(110, 3);
+ this.RbInfoGraphicDomValues.Name = "RbInfoGraphicDomValues";
+ this.RbInfoGraphicDomValues.Size = new System.Drawing.Size(167, 17);
+ this.RbInfoGraphicDomValues.TabIndex = 1;
+ this.RbInfoGraphicDomValues.TabStop = true;
+ this.RbInfoGraphicDomValues.Text = "Current values and dom levels";
+ this.RbInfoGraphicDomValues.UseVisualStyleBackColor = true;
+ this.RbInfoGraphicDomValues.CheckedChanged += new System.EventHandler(this.CbInfoGraphicCheckBoxRadioButtonChanged);
+ //
+ // RbInfoGraphicBreedingValues
+ //
+ this.RbInfoGraphicBreedingValues.AutoSize = true;
+ this.RbInfoGraphicBreedingValues.Location = new System.Drawing.Point(3, 3);
+ this.RbInfoGraphicBreedingValues.Name = "RbInfoGraphicBreedingValues";
+ this.RbInfoGraphicBreedingValues.Size = new System.Drawing.Size(101, 17);
+ this.RbInfoGraphicBreedingValues.TabIndex = 0;
+ this.RbInfoGraphicBreedingValues.TabStop = true;
+ this.RbInfoGraphicBreedingValues.Text = "Breeding values";
+ this.RbInfoGraphicBreedingValues.UseVisualStyleBackColor = true;
+ this.RbInfoGraphicBreedingValues.CheckedChanged += new System.EventHandler(this.CbInfoGraphicCheckBoxRadioButtonChanged);
+ //
// CbInfoGraphicColorRegionNamesIfNoImage
//
this.CbInfoGraphicColorRegionNamesIfNoImage.AutoSize = true;
- this.CbInfoGraphicColorRegionNamesIfNoImage.Location = new System.Drawing.Point(6, 157);
+ this.CbInfoGraphicColorRegionNamesIfNoImage.Location = new System.Drawing.Point(6, 180);
this.CbInfoGraphicColorRegionNamesIfNoImage.Name = "CbInfoGraphicColorRegionNamesIfNoImage";
this.CbInfoGraphicColorRegionNamesIfNoImage.Size = new System.Drawing.Size(224, 17);
this.CbInfoGraphicColorRegionNamesIfNoImage.TabIndex = 15;
this.CbInfoGraphicColorRegionNamesIfNoImage.Text = "color region names if no image is available";
this.CbInfoGraphicColorRegionNamesIfNoImage.UseVisualStyleBackColor = true;
- this.CbInfoGraphicColorRegionNamesIfNoImage.CheckedChanged += new System.EventHandler(this.CbInfoGraphicCheckBoxChanged);
+ this.CbInfoGraphicColorRegionNamesIfNoImage.CheckedChanged += new System.EventHandler(this.CbInfoGraphicCheckBoxRadioButtonChanged);
//
// CbInfoGraphicStatValues
//
this.CbInfoGraphicStatValues.AutoSize = true;
- this.CbInfoGraphicStatValues.Location = new System.Drawing.Point(6, 65);
+ this.CbInfoGraphicStatValues.Location = new System.Drawing.Point(6, 42);
this.CbInfoGraphicStatValues.Name = "CbInfoGraphicStatValues";
this.CbInfoGraphicStatValues.Size = new System.Drawing.Size(192, 17);
this.CbInfoGraphicStatValues.TabIndex = 14;
this.CbInfoGraphicStatValues.Text = "stat values additionally to the levels";
this.CbInfoGraphicStatValues.UseVisualStyleBackColor = true;
- this.CbInfoGraphicStatValues.CheckedChanged += new System.EventHandler(this.CbInfoGraphicCheckBoxChanged);
+ this.CbInfoGraphicStatValues.CheckedChanged += new System.EventHandler(this.CbInfoGraphicCheckBoxRadioButtonChanged);
//
// CbInfoGraphicAddRegionNames
//
this.CbInfoGraphicAddRegionNames.AutoSize = true;
- this.CbInfoGraphicAddRegionNames.Location = new System.Drawing.Point(6, 134);
+ this.CbInfoGraphicAddRegionNames.Location = new System.Drawing.Point(6, 157);
this.CbInfoGraphicAddRegionNames.Name = "CbInfoGraphicAddRegionNames";
this.CbInfoGraphicAddRegionNames.Size = new System.Drawing.Size(115, 17);
this.CbInfoGraphicAddRegionNames.TabIndex = 13;
this.CbInfoGraphicAddRegionNames.Text = "color region names";
this.CbInfoGraphicAddRegionNames.UseVisualStyleBackColor = true;
- this.CbInfoGraphicAddRegionNames.CheckedChanged += new System.EventHandler(this.CbInfoGraphicCheckBoxChanged);
+ this.CbInfoGraphicAddRegionNames.CheckedChanged += new System.EventHandler(this.CbInfoGraphicCheckBoxRadioButtonChanged);
//
// CbInfoGraphicCreatureName
//
@@ -2949,52 +3050,40 @@ private void InitializeComponent()
this.CbInfoGraphicCreatureName.TabIndex = 12;
this.CbInfoGraphicCreatureName.Text = "creature name";
this.CbInfoGraphicCreatureName.UseVisualStyleBackColor = true;
- this.CbInfoGraphicCreatureName.CheckedChanged += new System.EventHandler(this.CbInfoGraphicCheckBoxChanged);
+ this.CbInfoGraphicCreatureName.CheckedChanged += new System.EventHandler(this.CbInfoGraphicCheckBoxRadioButtonChanged);
//
// CbInfoGraphicMutationCounter
//
this.CbInfoGraphicMutationCounter.AutoSize = true;
- this.CbInfoGraphicMutationCounter.Location = new System.Drawing.Point(6, 88);
+ this.CbInfoGraphicMutationCounter.Location = new System.Drawing.Point(6, 111);
this.CbInfoGraphicMutationCounter.Name = "CbInfoGraphicMutationCounter";
this.CbInfoGraphicMutationCounter.Size = new System.Drawing.Size(105, 17);
this.CbInfoGraphicMutationCounter.TabIndex = 5;
this.CbInfoGraphicMutationCounter.Text = "mutation counter";
this.CbInfoGraphicMutationCounter.UseVisualStyleBackColor = true;
- this.CbInfoGraphicMutationCounter.CheckedChanged += new System.EventHandler(this.CbInfoGraphicCheckBoxChanged);
+ this.CbInfoGraphicMutationCounter.CheckedChanged += new System.EventHandler(this.CbInfoGraphicCheckBoxRadioButtonChanged);
//
// CbInfoGraphicGenerations
//
this.CbInfoGraphicGenerations.AutoSize = true;
- this.CbInfoGraphicGenerations.Location = new System.Drawing.Point(6, 111);
+ this.CbInfoGraphicGenerations.Location = new System.Drawing.Point(6, 134);
this.CbInfoGraphicGenerations.Name = "CbInfoGraphicGenerations";
this.CbInfoGraphicGenerations.Size = new System.Drawing.Size(148, 17);
this.CbInfoGraphicGenerations.TabIndex = 6;
this.CbInfoGraphicGenerations.Text = "generation of the creature";
this.CbInfoGraphicGenerations.UseVisualStyleBackColor = true;
- this.CbInfoGraphicGenerations.CheckedChanged += new System.EventHandler(this.CbInfoGraphicCheckBoxChanged);
- //
- // CbInfoGraphicDomLevels
- //
- this.CbInfoGraphicDomLevels.AutoSize = true;
- this.CbInfoGraphicDomLevels.Location = new System.Drawing.Point(6, 42);
- this.CbInfoGraphicDomLevels.Name = "CbInfoGraphicDomLevels";
- this.CbInfoGraphicDomLevels.Size = new System.Drawing.Size(460, 17);
- this.CbInfoGraphicDomLevels.TabIndex = 4;
- this.CbInfoGraphicDomLevels.Text = "levels and values of the current state (if disabled the values relevant for breed" +
- "ing are shown)";
- this.CbInfoGraphicDomLevels.UseVisualStyleBackColor = true;
- this.CbInfoGraphicDomLevels.CheckedChanged += new System.EventHandler(this.CbInfoGraphicCheckBoxChanged);
+ this.CbInfoGraphicGenerations.CheckedChanged += new System.EventHandler(this.CbInfoGraphicCheckBoxRadioButtonChanged);
//
// CbInfoGraphicDisplayMaxWildLevel
//
this.CbInfoGraphicDisplayMaxWildLevel.AutoSize = true;
- this.CbInfoGraphicDisplayMaxWildLevel.Location = new System.Drawing.Point(6, 180);
+ this.CbInfoGraphicDisplayMaxWildLevel.Location = new System.Drawing.Point(6, 203);
this.CbInfoGraphicDisplayMaxWildLevel.Name = "CbInfoGraphicDisplayMaxWildLevel";
this.CbInfoGraphicDisplayMaxWildLevel.Size = new System.Drawing.Size(123, 17);
this.CbInfoGraphicDisplayMaxWildLevel.TabIndex = 3;
this.CbInfoGraphicDisplayMaxWildLevel.Text = "max wild server level";
this.CbInfoGraphicDisplayMaxWildLevel.UseVisualStyleBackColor = true;
- this.CbInfoGraphicDisplayMaxWildLevel.CheckedChanged += new System.EventHandler(this.CbInfoGraphicCheckBoxChanged);
+ this.CbInfoGraphicDisplayMaxWildLevel.CheckedChanged += new System.EventHandler(this.CbInfoGraphicCheckBoxRadioButtonChanged);
//
// label50
//
@@ -3077,13 +3166,13 @@ private void InitializeComponent()
// groupBox14
//
this.groupBox14.Controls.Add(this.fileSelectorExtractedSaveFolder);
- this.groupBox14.Location = new System.Drawing.Point(8, 236);
+ this.groupBox14.Location = new System.Drawing.Point(8, 691);
this.groupBox14.Name = "groupBox14";
this.groupBox14.Size = new System.Drawing.Size(730, 47);
this.groupBox14.TabIndex = 6;
this.groupBox14.TabStop = false;
- this.groupBox14.Text = "Target folder for save-game working copy (user\'s temp dir if empty). It\'s recomme" +
- "nded to leave this setting empty.";
+ this.groupBox14.Text = "Advanced settings - Target folder for save-game working copy (user\'s temp dir if " +
+ "empty). It\'s recommended to leave this setting empty.";
//
// fileSelectorExtractedSaveFolder
//
@@ -3108,7 +3197,7 @@ private void InitializeComponent()
this.groupBox15.Controls.Add(this.dataGridView_FileLocations);
this.groupBox15.Controls.Add(this.btAddSavegameFileLocation);
this.groupBox15.Controls.Add(this.labelSavegameFileLocationHint);
- this.groupBox15.Location = new System.Drawing.Point(8, 289);
+ this.groupBox15.Location = new System.Drawing.Point(8, 228);
this.groupBox15.Name = "groupBox15";
this.groupBox15.Size = new System.Drawing.Size(730, 386);
this.groupBox15.TabIndex = 7;
@@ -3863,7 +3952,7 @@ private void InitializeComponent()
this.customSCCustom.Location = new System.Drawing.Point(6, 139);
this.customSCCustom.Name = "customSCCustom";
this.customSCCustom.Size = new System.Drawing.Size(401, 23);
- this.customSCCustom.SoundFile = null;
+ this.customSCCustom.SoundFile = "";
this.customSCCustom.TabIndex = 4;
//
// customSCWakeup
@@ -3871,7 +3960,7 @@ private void InitializeComponent()
this.customSCWakeup.Location = new System.Drawing.Point(6, 81);
this.customSCWakeup.Name = "customSCWakeup";
this.customSCWakeup.Size = new System.Drawing.Size(401, 23);
- this.customSCWakeup.SoundFile = "";
+ this.customSCWakeup.SoundFile = null;
this.customSCWakeup.TabIndex = 2;
//
// customSCBirth
@@ -3879,7 +3968,7 @@ private void InitializeComponent()
this.customSCBirth.Location = new System.Drawing.Point(6, 110);
this.customSCBirth.Name = "customSCBirth";
this.customSCBirth.Size = new System.Drawing.Size(401, 23);
- this.customSCBirth.SoundFile = "";
+ this.customSCBirth.SoundFile = null;
this.customSCBirth.TabIndex = 3;
//
// customSCStarving
@@ -3887,7 +3976,7 @@ private void InitializeComponent()
this.customSCStarving.Location = new System.Drawing.Point(6, 52);
this.customSCStarving.Name = "customSCStarving";
this.customSCStarving.Size = new System.Drawing.Size(401, 23);
- this.customSCStarving.SoundFile = null;
+ this.customSCStarving.SoundFile = "";
this.customSCStarving.TabIndex = 1;
//
// label20
@@ -3912,6 +4001,10 @@ private void InitializeComponent()
//
// groupBox10
//
+ this.groupBox10.Controls.Add(this.label70);
+ this.groupBox10.Controls.Add(this.label15);
+ this.groupBox10.Controls.Add(this.nudOverlayInfoHeight);
+ this.groupBox10.Controls.Add(this.nudOverlayInfoWidth);
this.groupBox10.Controls.Add(this.NudOverlayRelativeFontSize);
this.groupBox10.Controls.Add(this.label65);
this.groupBox10.Controls.Add(this.CbOverlayDisplayInheritance);
@@ -3940,6 +4033,70 @@ private void InitializeComponent()
this.groupBox10.TabStop = false;
this.groupBox10.Text = "Overlay";
//
+ // label70
+ //
+ this.label70.AutoSize = true;
+ this.label70.Location = new System.Drawing.Point(509, 187);
+ this.label70.Name = "label70";
+ this.label70.Size = new System.Drawing.Size(36, 13);
+ this.label70.TabIndex = 23;
+ this.label70.Text = "height";
+ //
+ // label15
+ //
+ this.label15.AutoSize = true;
+ this.label15.Location = new System.Drawing.Point(398, 187);
+ this.label15.Name = "label15";
+ this.label15.Size = new System.Drawing.Size(32, 13);
+ this.label15.TabIndex = 22;
+ this.label15.Text = "width";
+ //
+ // nudOverlayInfoHeight
+ //
+ this.nudOverlayInfoHeight.ForeColor = System.Drawing.SystemColors.GrayText;
+ this.nudOverlayInfoHeight.Increment = new decimal(new int[] {
+ 10,
+ 0,
+ 0,
+ 0});
+ this.nudOverlayInfoHeight.Location = new System.Drawing.Point(551, 185);
+ this.nudOverlayInfoHeight.Maximum = new decimal(new int[] {
+ 100000,
+ 0,
+ 0,
+ 0});
+ this.nudOverlayInfoHeight.Name = "nudOverlayInfoHeight";
+ this.nudOverlayInfoHeight.NeutralNumber = new decimal(new int[] {
+ 0,
+ 0,
+ 0,
+ 0});
+ this.nudOverlayInfoHeight.Size = new System.Drawing.Size(64, 20);
+ this.nudOverlayInfoHeight.TabIndex = 21;
+ //
+ // nudOverlayInfoWidth
+ //
+ this.nudOverlayInfoWidth.ForeColor = System.Drawing.SystemColors.GrayText;
+ this.nudOverlayInfoWidth.Increment = new decimal(new int[] {
+ 10,
+ 0,
+ 0,
+ 0});
+ this.nudOverlayInfoWidth.Location = new System.Drawing.Point(436, 185);
+ this.nudOverlayInfoWidth.Maximum = new decimal(new int[] {
+ 100000,
+ 0,
+ 0,
+ 0});
+ this.nudOverlayInfoWidth.Name = "nudOverlayInfoWidth";
+ this.nudOverlayInfoWidth.NeutralNumber = new decimal(new int[] {
+ 0,
+ 0,
+ 0,
+ 0});
+ this.nudOverlayInfoWidth.Size = new System.Drawing.Size(64, 20);
+ this.nudOverlayInfoWidth.TabIndex = 20;
+ //
// NudOverlayRelativeFontSize
//
this.NudOverlayRelativeFontSize.DecimalPlaces = 2;
@@ -4018,6 +4175,11 @@ private void InitializeComponent()
// nudCustomOverlayLocX
//
this.nudCustomOverlayLocX.ForeColor = System.Drawing.SystemColors.GrayText;
+ this.nudCustomOverlayLocX.Increment = new decimal(new int[] {
+ 10,
+ 0,
+ 0,
+ 0});
this.nudCustomOverlayLocX.Location = new System.Drawing.Point(24, 3);
this.nudCustomOverlayLocX.Maximum = new decimal(new int[] {
100000,
@@ -4059,6 +4221,11 @@ private void InitializeComponent()
// nudCustomOverlayLocY
//
this.nudCustomOverlayLocY.ForeColor = System.Drawing.SystemColors.GrayText;
+ this.nudCustomOverlayLocY.Increment = new decimal(new int[] {
+ 10,
+ 0,
+ 0,
+ 0});
this.nudCustomOverlayLocY.Location = new System.Drawing.Point(125, 3);
this.nudCustomOverlayLocY.Maximum = new decimal(new int[] {
100000,
@@ -4103,6 +4270,11 @@ private void InitializeComponent()
// nudOverlayInfoPosY
//
this.nudOverlayInfoPosY.ForeColor = System.Drawing.SystemColors.GrayText;
+ this.nudOverlayInfoPosY.Increment = new decimal(new int[] {
+ 10,
+ 0,
+ 0,
+ 0});
this.nudOverlayInfoPosY.Location = new System.Drawing.Point(320, 185);
this.nudOverlayInfoPosY.Maximum = new decimal(new int[] {
10000,
@@ -4130,6 +4302,11 @@ private void InitializeComponent()
// nudOverlayInfoPosDFR
//
this.nudOverlayInfoPosDFR.ForeColor = System.Drawing.SystemColors.GrayText;
+ this.nudOverlayInfoPosDFR.Increment = new decimal(new int[] {
+ 10,
+ 0,
+ 0,
+ 0});
this.nudOverlayInfoPosDFR.Location = new System.Drawing.Point(219, 185);
this.nudOverlayInfoPosDFR.Maximum = new decimal(new int[] {
10000,
@@ -4166,9 +4343,14 @@ private void InitializeComponent()
// nudOverlayTimerPosY
//
this.nudOverlayTimerPosY.ForeColor = System.Drawing.SystemColors.GrayText;
+ this.nudOverlayTimerPosY.Increment = new decimal(new int[] {
+ 10,
+ 0,
+ 0,
+ 0});
this.nudOverlayTimerPosY.Location = new System.Drawing.Point(320, 159);
this.nudOverlayTimerPosY.Maximum = new decimal(new int[] {
- 10000,
+ 100000,
0,
0,
0});
@@ -4193,9 +4375,14 @@ private void InitializeComponent()
// nudOverlayTimerPosX
//
this.nudOverlayTimerPosX.ForeColor = System.Drawing.SystemColors.GrayText;
+ this.nudOverlayTimerPosX.Increment = new decimal(new int[] {
+ 10,
+ 0,
+ 0,
+ 0});
this.nudOverlayTimerPosX.Location = new System.Drawing.Point(219, 159);
this.nudOverlayTimerPosX.Maximum = new decimal(new int[] {
- 10000,
+ 100000,
0,
0,
0});
@@ -4675,6 +4862,8 @@ private void InitializeComponent()
this.tabControlSettings.ResumeLayout(false);
this.tabPageMultipliers.ResumeLayout(false);
this.tabPageMultipliers.PerformLayout();
+ this.groupBox12.ResumeLayout(false);
+ this.groupBox12.PerformLayout();
this.GbNewLibraryGame.ResumeLayout(false);
this.GbNewLibraryGame.PerformLayout();
this.panel3.ResumeLayout(false);
@@ -4715,6 +4904,8 @@ private void InitializeComponent()
((System.ComponentModel.ISupportInitialize)(this.nudInfoGraphicHeight)).EndInit();
this.groupBox28.ResumeLayout(false);
this.groupBox28.PerformLayout();
+ this.PanelDomLevels.ResumeLayout(false);
+ this.PanelDomLevels.PerformLayout();
this.tabPageImportSavegame.ResumeLayout(false);
this.tabPageImportSavegame.PerformLayout();
this.groupBox14.ResumeLayout(false);
@@ -4749,6 +4940,8 @@ private void InitializeComponent()
this.tabPageOverlay.ResumeLayout(false);
this.groupBox10.ResumeLayout(false);
this.groupBox10.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nudOverlayInfoHeight)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nudOverlayInfoWidth)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.NudOverlayRelativeFontSize)).EndInit();
this.pCustomOverlayLocation.ResumeLayout(false);
this.pCustomOverlayLocation.PerformLayout();
@@ -4808,7 +5001,6 @@ private void InitializeComponent()
private ARKBreedingStats.uiControls.Nud nudDinoCharacterFoodDrain;
private ARKBreedingStats.uiControls.Nud nudTamingSpeed;
private System.Windows.Forms.CheckBox chkCollectionSync;
- private System.Windows.Forms.Label label15;
private System.Windows.Forms.Label label16;
private System.Windows.Forms.RadioButton radioButtonFahrenheit;
private System.Windows.Forms.RadioButton radioButtonCelsius;
@@ -5050,7 +5242,6 @@ private void InitializeComponent()
private System.Windows.Forms.CheckBox CbInfoGraphicCreatureName;
private System.Windows.Forms.CheckBox CbInfoGraphicMutationCounter;
private System.Windows.Forms.CheckBox CbInfoGraphicGenerations;
- private System.Windows.Forms.CheckBox CbInfoGraphicDomLevels;
private System.Windows.Forms.Button BtInfoGraphicBorderColor;
private System.Windows.Forms.Button BtInfoGraphicBackColor;
private System.Windows.Forms.Button BtInfoGraphicForeColor;
@@ -5106,5 +5297,18 @@ private void InitializeComponent()
private System.Windows.Forms.RadioButton RbNewLibraryGameAse;
private System.Windows.Forms.RadioButton RbNewLibraryGameAskEachTime;
private System.Windows.Forms.CheckBox CbDisplayServerTokenPopup;
+ private System.Windows.Forms.ToolTip toolTip1;
+ private System.Windows.Forms.ComboBox CbbOfficialMultipliers;
+ private System.Windows.Forms.CheckBox CbAutoOfficialMultipliers;
+ private System.Windows.Forms.GroupBox groupBox12;
+ private System.Windows.Forms.Button BtnUpdateOfficialEventValues;
+ private System.Windows.Forms.Panel PanelDomLevels;
+ private System.Windows.Forms.RadioButton RbInfoGraphicDomValues;
+ private System.Windows.Forms.RadioButton RbInfoGraphicBreedingValues;
+ private System.Windows.Forms.CheckBox CbInfoGraphicSumWildMut;
+ private System.Windows.Forms.Label label70;
+ private System.Windows.Forms.Label label15;
+ private uiControls.Nud nudOverlayInfoHeight;
+ private uiControls.Nud nudOverlayInfoWidth;
}
}
\ No newline at end of file
diff --git a/ARKBreedingStats/settings/Settings.cs b/ARKBreedingStats/settings/Settings.cs
index a604fd10e..f65134d7f 100644
--- a/ARKBreedingStats/settings/Settings.cs
+++ b/ARKBreedingStats/settings/Settings.cs
@@ -298,6 +298,8 @@ private void LoadSettings(CreatureCollection cc)
nudOverlayTimerPosY.ValueSave = Properties.Settings.Default.OverlayTimerPosition.Y;
nudOverlayInfoPosDFR.ValueSave = Properties.Settings.Default.OverlayInfoPosition.X;
nudOverlayInfoPosY.ValueSave = Properties.Settings.Default.OverlayInfoPosition.Y;
+ nudOverlayInfoWidth.ValueSave = Properties.Settings.Default.OverlayInfoSize.Width;
+ nudOverlayInfoHeight.ValueSave = Properties.Settings.Default.OverlayInfoSize.Height;
cbCustomOverlayLocation.Checked = Properties.Settings.Default.UseCustomOverlayLocation;
nudCustomOverlayLocX.ValueSave = Properties.Settings.Default.CustomOverlayLocation.X;
nudCustomOverlayLocY.ValueSave = Properties.Settings.Default.CustomOverlayLocation.Y;
@@ -347,7 +349,11 @@ private void LoadSettings(CreatureCollection cc)
nudInfoGraphicHeight.ValueSave = Properties.Settings.Default.InfoGraphicHeight;
CbInfoGraphicDisplayMaxWildLevel.Checked = Properties.Settings.Default.InfoGraphicShowMaxWildLevel;
- CbInfoGraphicDomLevels.Checked = Properties.Settings.Default.InfoGraphicWithDomLevels;
+ if (Properties.Settings.Default.InfoGraphicWithDomLevels)
+ RbInfoGraphicDomValues.Checked = true;
+ else
+ RbInfoGraphicBreedingValues.Checked = true;
+ CbInfoGraphicSumWildMut.Checked = Properties.Settings.Default.InfoGraphicDisplaySumWildMut;
CbbInfoGraphicFontName.Text = Properties.Settings.Default.InfoGraphicFontName;
CbInfoGraphicMutationCounter.Checked = Properties.Settings.Default.InfoGraphicDisplayMutations;
CbInfoGraphicGenerations.Checked = Properties.Settings.Default.InfoGraphicDisplayGeneration;
@@ -570,6 +576,8 @@ private void SaveSettings()
Properties.Settings.Default.OverlayInfoDuration = (int)nudOverlayInfoDuration.Value;
Properties.Settings.Default.OverlayTimerPosition = new Point((int)nudOverlayTimerPosX.Value, (int)nudOverlayTimerPosY.Value);
Properties.Settings.Default.OverlayInfoPosition = new Point((int)nudOverlayInfoPosDFR.Value, (int)nudOverlayInfoPosY.Value);
+ Properties.Settings.Default.OverlayInfoSize = new Size((int)nudOverlayInfoWidth.Value, (int)nudOverlayInfoHeight.Value);
+
Properties.Settings.Default.UseCustomOverlayLocation = cbCustomOverlayLocation.Checked;
Properties.Settings.Default.CustomOverlayLocation = new Point((int)nudCustomOverlayLocX.Value, (int)nudCustomOverlayLocY.Value);
Properties.Settings.Default.DisplayInheritanceInOverlay = CbOverlayDisplayInheritance.Checked;
@@ -614,7 +622,8 @@ private void SaveSettings()
Properties.Settings.Default.InfoGraphicHeight = (int)nudInfoGraphicHeight.Value;
Properties.Settings.Default.InfoGraphicShowMaxWildLevel = CbInfoGraphicDisplayMaxWildLevel.Checked;
- Properties.Settings.Default.InfoGraphicWithDomLevels = CbInfoGraphicDomLevels.Checked;
+ Properties.Settings.Default.InfoGraphicWithDomLevels = RbInfoGraphicDomValues.Checked;
+ Properties.Settings.Default.InfoGraphicDisplaySumWildMut = CbInfoGraphicSumWildMut.Checked;
Properties.Settings.Default.InfoGraphicFontName = CbbInfoGraphicFontName.Text;
Properties.Settings.Default.InfoGraphicDisplayMutations = CbInfoGraphicMutationCounter.Checked;
Properties.Settings.Default.InfoGraphicDisplayGeneration = CbInfoGraphicGenerations.Checked;
@@ -963,6 +972,45 @@ void ParseAndSetCheckbox(CheckBox cb, string regexPattern)
}
}
+ ///
+ /// Parse the text and set the recognized event settings accordingly.
+ ///
+ /// Text containing the settings
+ private void ExtractEventSettingsFromText(string text)
+ {
+ if (string.IsNullOrWhiteSpace(text)) return;
+
+ // ignore lines that start with a semicolon (comments)
+ text = Regex.Replace(text, @"(?:\A|[\r\n]+);[^\r\n]*", string.Empty);
+
+ double d;
+ Match m;
+ var cultureForStrings = System.Globalization.CultureInfo.GetCultureInfo("en-US");
+
+ ParseAndSetValue(nudTamingSpeedEvent, @"TamingSpeedMultiplier ?= ?(\d*\.?\d+)");
+ ParseAndSetValue(nudMatingIntervalEvent, @"MatingIntervalMultiplier ?= ?(\d*\.?\d+)");
+ ParseAndSetValue(nudEggHatchSpeedEvent, @"EggHatchSpeedMultiplier ?= ?(\d*\.?\d+)");
+ ParseAndSetValue(nudBabyMatureSpeedEvent, @"BabyMatureSpeedMultiplier ?= ?(\d*\.?\d+)");
+ ParseAndSetValue(nudBabyImprintAmountEvent, @"BabyImprintAmountMultiplier ?= ?(\d*\.?\d+)");
+ ParseAndSetValue(nudBabyCuddleIntervalEvent, @"BabyCuddleIntervalMultiplier ?= ?(\d*\.?\d+)");
+ ParseAndSetValue(nudBabyFoodConsumptionSpeedEvent, @"BabyFoodConsumptionSpeedMultiplier ?= ?(\d*\.?\d+)");
+ ParseAndSetValue(nudTamedDinoCharacterFoodDrainEvent, @"TamedDinoCharacterFoodDrainMultiplier ?= ?(\d*\.?\d+)");
+
+ bool ParseAndSetValue(Nud nud, string regexPattern)
+ {
+ m = Regex.Match(text, regexPattern);
+ if (m.Success && double.TryParse(m.Groups[1].Value, System.Globalization.NumberStyles.AllowDecimalPoint,
+ cultureForStrings, out d))
+ {
+ nud.ValueSave = (decimal)d;
+ return true;
+ }
+
+ return false;
+ }
+ }
+
+
///
/// Load server multipliers from a file created by the export gun mod.
///
@@ -1492,6 +1540,7 @@ private void CbHighlightAdjustedMultipliers_CheckedChanged(object sender, EventA
nudBabyImprintAmount.SetExtraHighlightNonDefault(highlight);
nudBabyImprintingStatScale.SetExtraHighlightNonDefault(highlight);
nudBabyFoodConsumptionSpeed.SetExtraHighlightNonDefault(highlight);
+ nudTamedDinoCharacterFoodDrain.SetExtraHighlightNonDefault(highlight);
HighlightCheckbox(cbSingleplayerSettings);
HighlightCheckbox(CbAllowSpeedLeveling);
HighlightCheckbox(CbAllowFlyerSpeedLeveling);
@@ -1624,7 +1673,7 @@ private void UpdateChartLevelColors(PictureBox pb, int minHue, int maxHue)
private Creature _infoGraphicPreviewCreature;
private readonly Debouncer _infoGraphicPreviewDebouncer = new Debouncer();
- private void CbInfoGraphicCheckBoxChanged(object sender, EventArgs e)
+ private void CbInfoGraphicCheckBoxRadioButtonChanged(object sender, EventArgs e)
{
_infoGraphicPreviewDebouncer.Debounce(300, ShowInfoGraphicPreview, Dispatcher.CurrentDispatcher);
}
@@ -1641,7 +1690,8 @@ private void ShowInfoGraphicPreview()
BtInfoGraphicBackColor.BackColor,
BtInfoGraphicBorderColor.BackColor,
CbInfoGraphicCreatureName.Checked,
- CbInfoGraphicDomLevels.Checked,
+ RbInfoGraphicDomValues.Checked,
+ CbInfoGraphicSumWildMut.Checked,
CbInfoGraphicMutationCounter.Checked,
CbInfoGraphicGenerations.Checked,
CbInfoGraphicStatValues.Checked,
@@ -1671,6 +1721,15 @@ private void CreateInfoGraphicCreature()
_infoGraphicPreviewCreature.levelsDom[Stats.Stamina] = rand.Next(20);
_infoGraphicPreviewCreature.levelsDom[Stats.Weight] = rand.Next(20);
_infoGraphicPreviewCreature.levelsDom[Stats.MeleeDamageMultiplier] = rand.Next(20);
+ if (RbGameAsa.Checked)
+ {
+ _infoGraphicPreviewCreature.levelsMutated[Stats.Health] = rand.Next(5) * Ark.LevelsAddedPerMutation;
+ _infoGraphicPreviewCreature.levelsMutated[Stats.Stamina] = rand.Next(5) * Ark.LevelsAddedPerMutation;
+ _infoGraphicPreviewCreature.levelsMutated[Stats.Weight] = rand.Next(5) * Ark.LevelsAddedPerMutation;
+ _infoGraphicPreviewCreature.levelsMutated[Stats.MeleeDamageMultiplier] = rand.Next(5) * Ark.LevelsAddedPerMutation;
+ }
+ _infoGraphicPreviewCreature.mutationsMaternal = _infoGraphicPreviewCreature.levelsMutated.Sum() / Ark.LevelsAddedPerMutation + rand.Next(5);
+
_infoGraphicPreviewCreature.RecalculateCreatureValues(_cc.wildLevelStep);
}
@@ -1832,5 +1891,27 @@ private void RbGameAsa_CheckedChanged(object sender, EventArgs e)
if (isAsa && CbAllowFlyerSpeedLeveling.Checked)
CbAllowSpeedLeveling.Checked = true;
}
+
+ private void BtnUpdateOfficialEventValues_Click(object sender, EventArgs e)
+ {
+ var gameType = CbbOfficialMultipliers.Text;
+
+ try
+ {
+ var url = gameType == "ASA Arkpocalypse" ? "https://cdn2.arkdedicated.com/asa/arkpocalypse_dynamicconfig.ini"
+ : gameType == "ASA Smalltribes" ? "https://cdn2.arkdedicated.com/asa/smalltribes_dynamicconfig.ini"
+ : gameType == "ASA Official" ? "https://cdn2.arkdedicated.com/asa/dynamicconfig.ini"
+ : throw new Exception($"Unexpected official multipliers option {gameType}");
+
+ var httpClient = FileService.GetHttpClient;
+
+ var settingsText = httpClient.GetStringAsync(url).Result;
+ ExtractEventSettingsFromText(settingsText);
+ }
+ catch (Exception ex)
+ {
+ MessageBoxes.ExceptionMessageBox(ex, "Server settings file couldn't be loaded.");
+ }
+ }
}
}
diff --git a/ARKBreedingStats/settings/Settings.resx b/ARKBreedingStats/settings/Settings.resx
index ba4bd8b0e..4a29f8fc2 100644
--- a/ARKBreedingStats/settings/Settings.resx
+++ b/ARKBreedingStats/settings/Settings.resx
@@ -117,10 +117,9 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- If you have the files Game.ini or GameUserSettings.ini from your server, you can drag&&drop them on this window to insert their values.
-You can also select the text of the settings and drag&&drop the selection.
-
+
+ 647, 17
+
The creature data can be directly imported from the save-game, if you have access to that. This is also possible via an ftp-adress.
If you set the according files below, you can start the process automatically from the file-menu.
@@ -137,6 +136,30 @@ If you set the according files below, you can start the process automatically fr
17, 17
+
+ True
+
+
+ True
+
+
+ True
+
+
+ 17, 17
+
+
+ True
+
+
+ True
+
+
+ True
+
+
+ 262, 17
+
True
@@ -166,7 +189,10 @@ The window-mode "Fullscreen-Windowed" should be set ingame.
526, 17
+
+ 647, 17
+
- 56
+ 73
\ No newline at end of file
diff --git a/ARKBreedingStats/uiControls/CreatureAnalysis.cs b/ARKBreedingStats/uiControls/CreatureAnalysis.cs
index 969c3abc0..4f49b4bf8 100644
--- a/ARKBreedingStats/uiControls/CreatureAnalysis.cs
+++ b/ARKBreedingStats/uiControls/CreatureAnalysis.cs
@@ -13,6 +13,7 @@ public CreatureAnalysis()
private LevelStatusFlags.LevelStatus _statsStatus;
private LevelStatusFlags.LevelStatus _colorStatus;
+ public string ColorStatus;
public void SetStatsAnalysis(LevelStatusFlags.LevelStatus statsStatus, string statsAnalysis)
{
@@ -38,6 +39,7 @@ public void SetColorAnalysis(LevelStatusFlags.LevelStatus colorStatus, string co
_colorStatus = colorStatus;
SetStatus(LbColorStatus, colorStatus);
+ ColorStatus = colorAnalysis;
LbColorAnalysis.Text = colorAnalysis;
var generalStatus = _statsStatus;
@@ -82,6 +84,7 @@ private void SetStatus(Label labelIcon, LevelStatusFlags.LevelStatus status, Lab
///
public void Clear()
{
+ ColorStatus = null;
ClearLabel(LbIcon);
ClearLabel(LbConclusion);
ClearLabel(LbStatAnalysis);
diff --git a/ARKBreedingStats/uiControls/PopupMessage.cs b/ARKBreedingStats/uiControls/PopupMessage.cs
index daad7823d..1f9da6ba8 100644
--- a/ARKBreedingStats/uiControls/PopupMessage.cs
+++ b/ARKBreedingStats/uiControls/PopupMessage.cs
@@ -10,7 +10,7 @@ internal class PopupMessage : Form
public PopupMessage()
{
- Width = 500;
+ Width = 600;
Height = 400;
FormBorderStyle = FormBorderStyle.None;
ShowInTaskbar = false;