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 &&lcub; for {, &&rcub; 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;