This commit is contained in:
Li 2023-03-05 05:10:07 +13:00
parent 9fcf29c841
commit 061bd14f6c
24 changed files with 1990 additions and 190 deletions

View File

@ -10,18 +10,48 @@ namespace LibW4M.Data.Stats
{
public class StatsContainerData : SaveDataEntry
{
int[] Values;
public int[] Values;
internal XomString? teamName;
public StatsContainerData(W4SaveFile fileBelongs, XomContainer mainContainer) : base(fileBelongs, mainContainer)
{
}
public bool IsRenamable
{
get
{
return (teamName is not null);
}
}
public void ChangeName(string newName)
{
if (!IsRenamable) return;
if (teamName.Value.Equals(newName)) return;
for(int i = 0; i < this.fileBelongs.TeamStatsCollective.Length; i++)
{
StatsContainerData? stat = this.fileBelongs.TeamStatsCollective[i] as StatsContainerData;
if (stat is null) continue;
if (stat.uuid.Equals(this.uuid))
{
if (i > this.fileBelongs.TeamStatsCollective.TeamNames.Count) break;
XomString xStr = this.fileBelongs.LookupString(newName);
// update in both places
this.fileBelongs.TeamStatsCollective.TeamNames[i] = xStr;
this.teamName = xStr;
}
}
}
public override string FriendlyName
{
get
{
if (teamName.Value is not null) return teamName.Value;
return base.FriendlyName;
if (IsRenamable) return teamName.Value;
return String.Join(" - ", Values);
}
}

BIN
Thumbs.db

Binary file not shown.

View File

@ -28,27 +28,27 @@
/// </summary>
private void InitializeComponent()
{
this.variableTabControl = new System.Windows.Forms.TabControl();
this.awardTabControl = new System.Windows.Forms.TabControl();
this.generalTab = new System.Windows.Forms.TabPage();
this.tblGeneral = new System.Windows.Forms.TableLayoutPanel();
this.lblAwardList = new System.Windows.Forms.Label();
this.selAwardList = new W4Gui.Components.IntList();
this.lblAwardListExplaination = new System.Windows.Forms.Label();
this.variableTabControl.SuspendLayout();
this.awardTabControl.SuspendLayout();
this.generalTab.SuspendLayout();
this.tblGeneral.SuspendLayout();
this.SuspendLayout();
//
// variableTabControl
// awardTabControl
//
this.variableTabControl.Controls.Add(this.generalTab);
this.variableTabControl.Dock = System.Windows.Forms.DockStyle.Fill;
this.variableTabControl.HotTrack = true;
this.variableTabControl.Location = new System.Drawing.Point(0, 0);
this.variableTabControl.Name = "variableTabControl";
this.variableTabControl.SelectedIndex = 0;
this.variableTabControl.Size = new System.Drawing.Size(707, 419);
this.variableTabControl.TabIndex = 1;
this.awardTabControl.Controls.Add(this.generalTab);
this.awardTabControl.Dock = System.Windows.Forms.DockStyle.Fill;
this.awardTabControl.HotTrack = true;
this.awardTabControl.Location = new System.Drawing.Point(0, 0);
this.awardTabControl.Name = "awardTabControl";
this.awardTabControl.SelectedIndex = 0;
this.awardTabControl.Size = new System.Drawing.Size(707, 419);
this.awardTabControl.TabIndex = 1;
//
// generalTab
//
@ -117,11 +117,11 @@
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.LightGray;
this.Controls.Add(this.variableTabControl);
this.BackColor = System.Drawing.SystemColors.Control;
this.Controls.Add(this.awardTabControl);
this.Name = "AwardPanel";
this.Size = new System.Drawing.Size(707, 419);
this.variableTabControl.ResumeLayout(false);
this.awardTabControl.ResumeLayout(false);
this.generalTab.ResumeLayout(false);
this.generalTab.PerformLayout();
this.tblGeneral.ResumeLayout(false);
@ -132,7 +132,7 @@
#endregion
private TabControl variableTabControl;
private TabControl awardTabControl;
private TabPage generalTab;
private TableLayoutPanel tblGeneral;
private Label lblAwardList;

View File

@ -0,0 +1,157 @@
namespace W4Gui.Components
{
partial class StatisticsPanel
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.statisticsTabControl = new System.Windows.Forms.TabControl();
this.generalTab = new System.Windows.Forms.TabPage();
this.tblGeneral = new System.Windows.Forms.TableLayoutPanel();
this.lblStatsValues = new System.Windows.Forms.Label();
this.lblTeamName = new System.Windows.Forms.Label();
this.selTeamName = new System.Windows.Forms.TextBox();
this.selStatValues = new W4Gui.Components.IntList();
this.statisticsTabControl.SuspendLayout();
this.generalTab.SuspendLayout();
this.tblGeneral.SuspendLayout();
this.SuspendLayout();
//
// statisticsTabControl
//
this.statisticsTabControl.Controls.Add(this.generalTab);
this.statisticsTabControl.Dock = System.Windows.Forms.DockStyle.Fill;
this.statisticsTabControl.HotTrack = true;
this.statisticsTabControl.Location = new System.Drawing.Point(0, 0);
this.statisticsTabControl.Name = "statisticsTabControl";
this.statisticsTabControl.SelectedIndex = 0;
this.statisticsTabControl.Size = new System.Drawing.Size(707, 419);
this.statisticsTabControl.TabIndex = 1;
//
// generalTab
//
this.generalTab.BackColor = System.Drawing.Color.Transparent;
this.generalTab.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.generalTab.Controls.Add(this.tblGeneral);
this.generalTab.Location = new System.Drawing.Point(4, 24);
this.generalTab.Name = "generalTab";
this.generalTab.Padding = new System.Windows.Forms.Padding(3);
this.generalTab.Size = new System.Drawing.Size(699, 391);
this.generalTab.TabIndex = 0;
this.generalTab.Text = "General";
//
// tblGeneral
//
this.tblGeneral.AutoSize = true;
this.tblGeneral.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Inset;
this.tblGeneral.ColumnCount = 2;
this.tblGeneral.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tblGeneral.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tblGeneral.Controls.Add(this.lblStatsValues, 0, 1);
this.tblGeneral.Controls.Add(this.lblTeamName, 0, 0);
this.tblGeneral.Controls.Add(this.selTeamName, 1, 0);
this.tblGeneral.Controls.Add(this.selStatValues, 1, 1);
this.tblGeneral.Dock = System.Windows.Forms.DockStyle.Top;
this.tblGeneral.Location = new System.Drawing.Point(3, 3);
this.tblGeneral.Name = "tblGeneral";
this.tblGeneral.RowCount = 2;
this.tblGeneral.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tblGeneral.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tblGeneral.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tblGeneral.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tblGeneral.Size = new System.Drawing.Size(689, 130);
this.tblGeneral.TabIndex = 0;
//
// lblStatsValues
//
this.lblStatsValues.AutoSize = true;
this.lblStatsValues.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblStatsValues.Location = new System.Drawing.Point(5, 33);
this.lblStatsValues.Name = "lblStatsValues";
this.lblStatsValues.Size = new System.Drawing.Size(93, 95);
this.lblStatsValues.TabIndex = 17;
this.lblStatsValues.Text = "Statistics Values:";
this.lblStatsValues.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// lblTeamName
//
this.lblTeamName.AutoSize = true;
this.lblTeamName.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblTeamName.Location = new System.Drawing.Point(5, 2);
this.lblTeamName.Name = "lblTeamName";
this.lblTeamName.Size = new System.Drawing.Size(93, 29);
this.lblTeamName.TabIndex = 0;
this.lblTeamName.Text = "Team Name:";
this.lblTeamName.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// selTeamName
//
this.selTeamName.Dock = System.Windows.Forms.DockStyle.Top;
this.selTeamName.Location = new System.Drawing.Point(106, 5);
this.selTeamName.Name = "selTeamName";
this.selTeamName.PlaceholderText = "Team Name";
this.selTeamName.ReadOnly = true;
this.selTeamName.Size = new System.Drawing.Size(578, 23);
this.selTeamName.TabIndex = 1;
//
// selStatValues
//
this.selStatValues.AutoSize = true;
this.selStatValues.Dock = System.Windows.Forms.DockStyle.Fill;
this.selStatValues.Label = "%n";
this.selStatValues.Location = new System.Drawing.Point(106, 36);
this.selStatValues.Name = "selStatValues";
this.selStatValues.Size = new System.Drawing.Size(578, 89);
this.selStatValues.TabIndex = 18;
//
// StatisticsPanel
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.LightGray;
this.Controls.Add(this.statisticsTabControl);
this.Name = "StatisticsPanel";
this.Size = new System.Drawing.Size(707, 419);
this.statisticsTabControl.ResumeLayout(false);
this.generalTab.ResumeLayout(false);
this.generalTab.PerformLayout();
this.tblGeneral.ResumeLayout(false);
this.tblGeneral.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private TabControl statisticsTabControl;
private TabPage generalTab;
private TableLayoutPanel tblGeneral;
private Label lblTeamName;
private TextBox selTeamName;
private Label lblStatsValues;
private IntList selStatValues;
}
}

View File

@ -0,0 +1,51 @@
using LibW4M.Data.Highscores;
using LibW4M.Data.Stats;
using LibW4M.Data.Teams;
using LibW4M.Data.WeaponFactory;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using W4Gui.Dialogs;
namespace W4Gui.Components
{
public partial class StatisticsPanel : UserControl
{
public StatisticsPanel()
{
InitializeComponent();
}
public void SaveStatsData(ref StatsContainerData stats)
{
// Save general
stats.Values = selStatValues.Values;
if (stats.IsRenamable) stats.ChangeName(selTeamName.Text);
}
public void LoadStatsData(StatsContainerData stats)
{
// Load general
selStatValues.LoadItems(stats.Values);
if (stats.IsRenamable)
{
selTeamName.Text = stats.FriendlyName;
selTeamName.ReadOnly = false;
}
else
{
selTeamName.Text = "(GLOBAL)";
selTeamName.ReadOnly = true;
}
}
}
}

View File

@ -0,0 +1,60 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

190
W4Gui/Dialogs/AboutW4Gui.Designer.cs generated Normal file
View File

@ -0,0 +1,190 @@
namespace W4Gui.Dialogs
{
partial class AboutW4Gui
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutW4Gui));
this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
this.logoPictureBox = new System.Windows.Forms.PictureBox();
this.labelProductName = new System.Windows.Forms.Label();
this.labelVersion = new System.Windows.Forms.Label();
this.labelCopyright = new System.Windows.Forms.Label();
this.labelCompanyName = new System.Windows.Forms.Label();
this.textBoxDescription = new System.Windows.Forms.TextBox();
this.okButton = new System.Windows.Forms.Button();
this.tableLayoutPanel.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit();
this.SuspendLayout();
//
// tableLayoutPanel
//
this.tableLayoutPanel.ColumnCount = 2;
this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F));
this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F));
this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0);
this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0);
this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1);
this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2);
this.tableLayoutPanel.Controls.Add(this.labelCompanyName, 1, 3);
this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4);
this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5);
this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel.Location = new System.Drawing.Point(10, 10);
this.tableLayoutPanel.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.tableLayoutPanel.Name = "tableLayoutPanel";
this.tableLayoutPanel.RowCount = 6;
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
this.tableLayoutPanel.Size = new System.Drawing.Size(487, 307);
this.tableLayoutPanel.TabIndex = 0;
//
// logoPictureBox
//
this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.logoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("logoPictureBox.Image")));
this.logoPictureBox.Location = new System.Drawing.Point(4, 3);
this.logoPictureBox.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.logoPictureBox.Name = "logoPictureBox";
this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6);
this.logoPictureBox.Size = new System.Drawing.Size(152, 301);
this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.logoPictureBox.TabIndex = 12;
this.logoPictureBox.TabStop = false;
//
// labelProductName
//
this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelProductName.Location = new System.Drawing.Point(167, 0);
this.labelProductName.Margin = new System.Windows.Forms.Padding(7, 0, 4, 0);
this.labelProductName.MaximumSize = new System.Drawing.Size(0, 20);
this.labelProductName.Name = "labelProductName";
this.labelProductName.Size = new System.Drawing.Size(316, 20);
this.labelProductName.TabIndex = 19;
this.labelProductName.Text = "Worms 4: Mayehm! Save Editor";
this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// labelVersion
//
this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelVersion.Location = new System.Drawing.Point(167, 30);
this.labelVersion.Margin = new System.Windows.Forms.Padding(7, 0, 4, 0);
this.labelVersion.MaximumSize = new System.Drawing.Size(0, 20);
this.labelVersion.Name = "labelVersion";
this.labelVersion.Size = new System.Drawing.Size(316, 20);
this.labelVersion.TabIndex = 0;
this.labelVersion.Text = "Version";
this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// labelCopyright
//
this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelCopyright.Location = new System.Drawing.Point(167, 60);
this.labelCopyright.Margin = new System.Windows.Forms.Padding(7, 0, 4, 0);
this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 20);
this.labelCopyright.Name = "labelCopyright";
this.labelCopyright.Size = new System.Drawing.Size(316, 20);
this.labelCopyright.TabIndex = 21;
this.labelCopyright.Text = "Public Domain 2023";
this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// labelCompanyName
//
this.labelCompanyName.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelCompanyName.Location = new System.Drawing.Point(167, 90);
this.labelCompanyName.Margin = new System.Windows.Forms.Padding(7, 0, 4, 0);
this.labelCompanyName.MaximumSize = new System.Drawing.Size(0, 20);
this.labelCompanyName.Name = "labelCompanyName";
this.labelCompanyName.Size = new System.Drawing.Size(316, 20);
this.labelCompanyName.TabIndex = 22;
this.labelCompanyName.Text = "Created by Li (They/Them)";
this.labelCompanyName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// textBoxDescription
//
this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill;
this.textBoxDescription.Location = new System.Drawing.Point(167, 123);
this.textBoxDescription.Margin = new System.Windows.Forms.Padding(7, 3, 4, 3);
this.textBoxDescription.Multiline = true;
this.textBoxDescription.Name = "textBoxDescription";
this.textBoxDescription.ReadOnly = true;
this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Both;
this.textBoxDescription.Size = new System.Drawing.Size(316, 147);
this.textBoxDescription.TabIndex = 23;
this.textBoxDescription.TabStop = false;
this.textBoxDescription.Text = resources.GetString("textBoxDescription.Text");
//
// okButton
//
this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.okButton.Location = new System.Drawing.Point(395, 277);
this.okButton.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.okButton.Name = "okButton";
this.okButton.Size = new System.Drawing.Size(88, 27);
this.okButton.TabIndex = 24;
this.okButton.Text = "&OK";
//
// AboutW4Gui
//
this.AcceptButton = this.okButton;
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(507, 327);
this.Controls.Add(this.tableLayoutPanel);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "AboutW4Gui";
this.Padding = new System.Windows.Forms.Padding(10);
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "About Worms 4: Mayhem! Save Editor";
this.tableLayoutPanel.ResumeLayout(false);
this.tableLayoutPanel.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
private System.Windows.Forms.PictureBox logoPictureBox;
private System.Windows.Forms.Label labelProductName;
private System.Windows.Forms.Label labelVersion;
private System.Windows.Forms.Label labelCopyright;
private System.Windows.Forms.Label labelCompanyName;
private System.Windows.Forms.TextBox textBoxDescription;
private System.Windows.Forms.Button okButton;
}
}

105
W4Gui/Dialogs/AboutW4Gui.cs Normal file
View File

@ -0,0 +1,105 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace W4Gui.Dialogs
{
partial class AboutW4Gui : Form
{
public AboutW4Gui()
{
InitializeComponent();
this.Text = String.Format("About {0}", AssemblyTitle);
this.labelProductName.Text = AssemblyProduct;
this.labelVersion.Text = String.Format("Version {0}", AssemblyVersion);
this.labelCopyright.Text = AssemblyCopyright;
//this.labelCompanyName.Text = AssemblyCompany;
//this.textBoxDescription.Text = AssemblyDescription;
}
#region Assembly Attribute Accessors
public string AssemblyTitle
{
get
{
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
if (attributes.Length > 0)
{
AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];
if (titleAttribute.Title != "")
{
return titleAttribute.Title;
}
}
return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
}
}
public string AssemblyVersion
{
get
{
return Assembly.GetExecutingAssembly().GetName().Version.ToString();
}
}
public string AssemblyDescription
{
get
{
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
if (attributes.Length == 0)
{
return "";
}
return ((AssemblyDescriptionAttribute)attributes[0]).Description;
}
}
public string AssemblyProduct
{
get
{
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);
if (attributes.Length == 0)
{
return "";
}
return ((AssemblyProductAttribute)attributes[0]).Product;
}
}
public string AssemblyCopyright
{
get
{
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
if (attributes.Length == 0)
{
return "";
}
return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;
}
}
public string AssemblyCompany
{
get
{
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);
if (attributes.Length == 0)
{
return "";
}
return ((AssemblyCompanyAttribute)attributes[0]).Company;
}
}
#endregion
}
}

View File

@ -0,0 +1,558 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="logoPictureBox.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="textBoxDescription.Text" xml:space="preserve">
<value>-- Credits --
- Program Development:
Li
- Corrected Typos:
RandomHuman2020
- Beta Testing:
DiamondCreeper75
hacker known as cbps [ Confirmed Xbox ]
Li [ Confirmed PS2 ]
- Int compression help:
Rufis_
shadowknight1620
- Reverse Engineering:
Li
- Worms 4 Mayhem:
Team17
Codemasters
Majesco
- PS2 psu format:
gothi [https://www.ps2savetools.com/documents/ps2-save-game-format-for-ems-adapter-psu]
- .NET Core:
Microsoft Corperation
- Windows Forms:
Microsoft Corperation
-- License --
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means.
In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to &lt;http://unlicense.org/&gt;</value>
</data>
</root>

80
W4Gui/Main.Designer.cs generated
View File

@ -36,10 +36,9 @@ namespace W4Gui
this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.convertToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.convertToPS2ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.convertToXboxToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.extractAllXomContainersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.aboutProgramToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mainTabControl = new System.Windows.Forms.TabControl();
this.weaponTab = new System.Windows.Forms.TabPage();
this.weaponPage = new W4Gui.Tabs.WeaponsTab();
@ -54,11 +53,11 @@ namespace W4Gui
this.inputTab = new System.Windows.Forms.TabPage();
this.inputEventMappingsPanel = new W4Gui.Tabs.InputEventMappingTab();
this.statsTab = new System.Windows.Forms.TabPage();
this.statsPanel = new W4Gui.Tabs.StatsTab.StatTypeSelectionTab();
this.awardsTab = new System.Windows.Forms.TabPage();
this.awardPanel = new W4Gui.Tabs.AwardTab();
this.variablesTab = new System.Windows.Forms.TabPage();
this.variablesPage = new W4Gui.Tabs.VariablesTab.VariablesTabs();
this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mainMenuStrip.SuspendLayout();
this.mainTabControl.SuspendLayout();
this.weaponTab.SuspendLayout();
@ -67,6 +66,7 @@ namespace W4Gui
this.highscoreTab.SuspendLayout();
this.unlockItemsTab.SuspendLayout();
this.inputTab.SuspendLayout();
this.statsTab.SuspendLayout();
this.awardsTab.SuspendLayout();
this.variablesTab.SuspendLayout();
this.SuspendLayout();
@ -76,7 +76,7 @@ namespace W4Gui
this.mainMenuStrip.BackColor = System.Drawing.SystemColors.Control;
this.mainMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.fileToolStripMenuItem,
this.convertToolStripMenuItem});
this.helpToolStripMenuItem});
this.mainMenuStrip.Location = new System.Drawing.Point(0, 0);
this.mainMenuStrip.Name = "mainMenuStrip";
this.mainMenuStrip.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;
@ -109,36 +109,28 @@ namespace W4Gui
this.saveToolStripMenuItem.Text = "Save";
this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click);
//
// convertToolStripMenuItem
// saveAsToolStripMenuItem
//
this.convertToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.convertToPS2ToolStripMenuItem,
this.convertToXboxToolStripMenuItem,
this.extractAllXomContainersToolStripMenuItem});
this.convertToolStripMenuItem.Enabled = false;
this.convertToolStripMenuItem.Name = "convertToolStripMenuItem";
this.convertToolStripMenuItem.Size = new System.Drawing.Size(61, 20);
this.convertToolStripMenuItem.Text = "Convert";
this.saveAsToolStripMenuItem.Enabled = false;
this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem";
this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.saveAsToolStripMenuItem.Text = "Save As";
this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click);
//
// convertToPS2ToolStripMenuItem
// helpToolStripMenuItem
//
this.convertToPS2ToolStripMenuItem.Name = "convertToPS2ToolStripMenuItem";
this.convertToPS2ToolStripMenuItem.Size = new System.Drawing.Size(211, 22);
this.convertToPS2ToolStripMenuItem.Text = "Convert to PS2";
this.convertToPS2ToolStripMenuItem.Click += new System.EventHandler(this.convertToPS2ToolStripMenuItem_Click);
this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.aboutProgramToolStripMenuItem});
this.helpToolStripMenuItem.Name = "helpToolStripMenuItem";
this.helpToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
this.helpToolStripMenuItem.Text = "Help";
//
// convertToXboxToolStripMenuItem
// aboutProgramToolStripMenuItem
//
this.convertToXboxToolStripMenuItem.Name = "convertToXboxToolStripMenuItem";
this.convertToXboxToolStripMenuItem.Size = new System.Drawing.Size(211, 22);
this.convertToXboxToolStripMenuItem.Text = "Convert to Xbox";
//
// extractAllXomContainersToolStripMenuItem
//
this.extractAllXomContainersToolStripMenuItem.Name = "extractAllXomContainersToolStripMenuItem";
this.extractAllXomContainersToolStripMenuItem.Size = new System.Drawing.Size(211, 22);
this.extractAllXomContainersToolStripMenuItem.Text = "Extract All XomContainers";
this.extractAllXomContainersToolStripMenuItem.Click += new System.EventHandler(this.extractAllXomContainersToolStripMenuItem_Click);
this.aboutProgramToolStripMenuItem.Name = "aboutProgramToolStripMenuItem";
this.aboutProgramToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.aboutProgramToolStripMenuItem.Text = "About";
this.aboutProgramToolStripMenuItem.Click += new System.EventHandler(this.aboutProgramToolStripMenuItem_Click);
//
// mainTabControl
//
@ -284,6 +276,7 @@ namespace W4Gui
// statsTab
//
this.statsTab.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.statsTab.Controls.Add(this.statsPanel);
this.statsTab.Location = new System.Drawing.Point(4, 24);
this.statsTab.Name = "statsTab";
this.statsTab.Padding = new System.Windows.Forms.Padding(3);
@ -292,6 +285,15 @@ namespace W4Gui
this.statsTab.Text = "Statistics";
this.statsTab.UseVisualStyleBackColor = true;
//
// statsPanel
//
this.statsPanel.BackColor = System.Drawing.SystemColors.Control;
this.statsPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.statsPanel.Location = new System.Drawing.Point(3, 3);
this.statsPanel.Name = "statsPanel";
this.statsPanel.Size = new System.Drawing.Size(182, 62);
this.statsPanel.TabIndex = 0;
//
// awardsTab
//
this.awardsTab.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
@ -333,14 +335,6 @@ namespace W4Gui
this.variablesPage.Size = new System.Drawing.Size(182, 62);
this.variablesPage.TabIndex = 0;
//
// saveAsToolStripMenuItem
//
this.saveAsToolStripMenuItem.Enabled = false;
this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem";
this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.saveAsToolStripMenuItem.Text = "Save As";
this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click);
//
// Main
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
@ -364,6 +358,7 @@ namespace W4Gui
this.highscoreTab.ResumeLayout(false);
this.unlockItemsTab.ResumeLayout(false);
this.inputTab.ResumeLayout(false);
this.statsTab.ResumeLayout(false);
this.awardsTab.ResumeLayout(false);
this.variablesTab.ResumeLayout(false);
this.ResumeLayout(false);
@ -380,10 +375,6 @@ namespace W4Gui
private TabControl mainTabControl;
private TabPage weaponTab;
private WeaponsTab weaponPage;
private ToolStripMenuItem convertToolStripMenuItem;
private ToolStripMenuItem convertToPS2ToolStripMenuItem;
private ToolStripMenuItem convertToXboxToolStripMenuItem;
private ToolStripMenuItem extractAllXomContainersToolStripMenuItem;
private TabPage teamTab;
private TeamsTab teamsPage;
private TabPage schemeTab;
@ -400,5 +391,8 @@ namespace W4Gui
private AwardTab awardPanel;
private InputEventMappingTab inputEventMappingsPanel;
private ToolStripMenuItem saveAsToolStripMenuItem;
private Tabs.StatsTab.StatTypeSelectionTab statsPanel;
private ToolStripMenuItem helpToolStripMenuItem;
private ToolStripMenuItem aboutProgramToolStripMenuItem;
}
}

View File

@ -13,6 +13,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using W4Gui.Dialogs;
using W4Gui.Tabs;
namespace W4Gui
@ -34,77 +35,74 @@ namespace W4Gui
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog fd = new OpenFileDialog();
fd.Filter = "Worms 4: Mayhem PC Save File|*.xom|Worms 4: Mayhem PS2 Save File|*.psu|Worms 4: Mayhem XBOX Save File|data";
fd.Title = "Open Worms 4 Save File";
if(fd.ShowDialog() == DialogResult.OK)
try
{
DataManager.LoadedSavePath = fd.FileName;
DataManager.LoadedSaveType = (SaveType)(fd.FilterIndex - 1);
switch (DataManager.LoadedSaveType)
OpenFileDialog fd = new OpenFileDialog();
fd.Filter = "Worms 4: Mayhem PC Save File|*.xom|Worms 4: Mayhem PS2 Save File|*.psu|Worms 4: Mayhem XBOX Save File|data";
fd.Title = "Open Worms 4 Save File";
if (fd.ShowDialog() == DialogResult.OK)
{
case SaveType.PC:
default:
DataManager.SaveFile = new W4SaveFile(XomReader.ReadXomFile(fd.FileName));
break;
case SaveType.PS2:
DataManager.SaveFile = Ps2Save.ReadPS2Save(fd.FileName);
break;
case SaveType.XBOX:
DataManager.SaveFile = XboxSave.ReadXboxSave(fd.FileName);
break;
DataManager.LoadedSavePath = fd.FileName;
DataManager.LoadedSaveType = (SaveType)(fd.FilterIndex - 1);
switch (DataManager.LoadedSaveType)
{
case SaveType.PC:
default:
DataManager.SaveFile = new W4SaveFile(XomReader.ReadXomFile(fd.FileName));
break;
case SaveType.PS2:
DataManager.SaveFile = Ps2Save.ReadPS2Save(fd.FileName);
break;
case SaveType.XBOX:
DataManager.SaveFile = XboxSave.ReadXboxSave(fd.FileName);
break;
}
this.mainTabControl.Enabled = true;
this.saveToolStripMenuItem.Enabled = true;
this.saveAsToolStripMenuItem.Enabled = true;
this.Text = defaultTitle + " (" + DataManager.LoadedSaveType.ToString() + ") " + "[" + fd.FileName + "]";
DataManager.LoadAll();
}
this.mainTabControl.Enabled = true;
this.saveToolStripMenuItem.Enabled = true;
this.saveAsToolStripMenuItem.Enabled = true;
this.convertToolStripMenuItem.Enabled = true;
this.Text = defaultTitle + " (" + DataManager.LoadedSaveType.ToString() + ") " + "[" + fd.FileName + "]";
DataManager.LoadAll();
}
catch (Exception ex)
{
MessageBox.Show("Failed to load save: " + ex.Message + "\nIt may be invalid or corrupt.", "Load failed!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
mainTabControl.Enabled = false;
DataManager.SaveAll();
switch (DataManager.LoadedSaveType)
try
{
case SaveType.PC:
DataManager.SaveFile.SavePC(DataManager.LoadedSavePath);
break;
case SaveType.PS2:
DataManager.SaveFile.SavePS2PSU(DataManager.LoadedSavePath);
break;
case SaveType.XBOX:
DataManager.SaveFile.SaveXBOX(DataManager.LoadedSavePath);
break;
mainTabControl.Enabled = false;
DataManager.SaveAll();
switch (DataManager.LoadedSaveType)
{
case SaveType.PC:
DataManager.SaveFile.SavePC(DataManager.LoadedSavePath);
break;
case SaveType.PS2:
DataManager.SaveFile.SavePS2PSU(DataManager.LoadedSavePath);
break;
case SaveType.XBOX:
DataManager.SaveFile.SaveXBOX(DataManager.LoadedSavePath);
break;
}
mainTabControl.Enabled = true;
MessageBox.Show("File saved to: " + DataManager.LoadedSavePath, "Save Complete!", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
mainTabControl.Enabled = true;
MessageBox.Show("File saved to: " + DataManager.LoadedSavePath, "Save Complete!", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void extractAllXomContainersToolStripMenuItem_Click(object sender, EventArgs e)
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.Description = "Select folder to extract XomContainers too.";
if(fbd.ShowDialog() == DialogResult.OK)
catch (Exception ex)
{
this.mainTabControl.Enabled = false;
DataManager.SaveFile.ExtractAllContainers(fbd.SelectedPath);
this.mainTabControl.Enabled = true;
MessageBox.Show("Failed to save: " + ex.Message, "Save failed!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void mainTabControl_SelectedIndexChanged(object sender, EventArgs e)
{
if (lastTabIndex >= 0)
@ -140,55 +138,50 @@ namespace W4Gui
lastTabIndex = this.mainTabControl.SelectedIndex;
}
private void convertToPS2ToolStripMenuItem_Click(object sender, EventArgs e)
private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveFileDialog fd = new SaveFileDialog();
fd.Filter = "Worms 4: Mayhem PlayStation 2 Save File|*";
fd.Title = "Save Worms 4 PlayStation 2 Save File";
fd.FileName = "BESLES-53096W4MA";
if (fd.ShowDialog() == DialogResult.OK)
try
{
this.mainTabControl.Enabled = false;
SaveFileDialog fd = new SaveFileDialog();
fd.Filter = "Worms 4: Mayhem PC Save File|*.xom|Worms 4: Mayhem PS2 Single Save File|*.psu|Worms 4: Mayhem XBOX Save File|data";
fd.Title = "Save Worms 4 Save File";
fd.FileName = Path.GetFileName(DataManager.LoadedSavePath);
if (fd.ShowDialog() == DialogResult.OK)
{
this.mainTabControl.Enabled = false;
DataManager.SaveAll();
DataManager.SaveFile.SavePS2(fd.FileName);
DataManager.SaveAll();
SaveType saveType = (SaveType)(fd.FilterIndex - 1);
this.mainTabControl.Enabled = true;
switch (saveType)
{
case SaveType.PC:
DataManager.SaveFile.SavePC(fd.FileName);
break;
case SaveType.PS2:
DataManager.SaveFile.SavePS2PSU(fd.FileName);
break;
case SaveType.XBOX:
DataManager.SaveFile.SaveXBOX(fd.FileName);
break;
}
DataManager.LoadedSavePath = fd.FileName;
DataManager.LoadedSaveType = saveType;
MessageBox.Show("File saved to: " + fd.FileName, "Save Complete!", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.mainTabControl.Enabled = true;
}
}
catch (Exception ex)
{
MessageBox.Show("Failed to save: " + ex.Message, "Save failed!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
private void aboutProgramToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveFileDialog fd = new SaveFileDialog();
fd.Filter = "Worms 4: Mayhem PC Save File|*.xom|Worms 4: Mayhem PS2 Single Save File|*.psu|Worms 4: Mayhem XBOX Save File|data";
fd.Title = "Save Worms 4 Save File";
fd.FileName = Path.GetFileName(DataManager.LoadedSavePath);
if (fd.ShowDialog() == DialogResult.OK)
{
this.mainTabControl.Enabled = false;
DataManager.SaveAll();
SaveType saveType = (SaveType)(fd.FilterIndex-1);
switch (saveType)
{
case SaveType.PC:
DataManager.SaveFile.SavePC(fd.FileName);
break;
case SaveType.PS2:
DataManager.SaveFile.SavePS2PSU(fd.FileName);
break;
case SaveType.XBOX:
DataManager.SaveFile.SaveXBOX(fd.FileName);
break;
}
DataManager.LoadedSavePath = fd.FileName;
DataManager.LoadedSaveType = saveType;
MessageBox.Show("File saved to: " + fd.FileName, "Save Complete!", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.mainTabControl.Enabled = true;
}
new AboutW4Gui().ShowDialog();
}
}
}

View File

@ -4,7 +4,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project>
<PropertyGroup>
<History>True|2023-03-03T16:17:31.1862857Z;True|2023-03-04T04:40:06.7859106+13:00;True|2023-03-01T11:45:37.3479871+13:00;True|2023-03-01T09:19:31.4651141+13:00;True|2023-02-25T21:53:35.8769435+13:00;True|2023-02-20T23:18:32.2496478+13:00;True|2023-02-19T06:40:54.2502643+13:00;False|2023-02-16T17:57:46.9563146+13:00;True|2023-01-19T20:41:26.7371208+13:00;True|2023-01-15T17:06:35.5919106+13:00;True|2023-01-14T13:57:56.0824690+13:00;True|2023-01-11T22:22:28.8737310+13:00;True|2023-01-11T22:16:55.3469226+13:00;</History>
<History>True|2023-03-04T00:33:03.9184567Z;True|2023-03-04T05:17:31.1862857+13:00;True|2023-03-04T04:40:06.7859106+13:00;True|2023-03-01T11:45:37.3479871+13:00;True|2023-03-01T09:19:31.4651141+13:00;True|2023-02-25T21:53:35.8769435+13:00;True|2023-02-20T23:18:32.2496478+13:00;True|2023-02-19T06:40:54.2502643+13:00;False|2023-02-16T17:57:46.9563146+13:00;True|2023-01-19T20:41:26.7371208+13:00;True|2023-01-15T17:06:35.5919106+13:00;True|2023-01-14T13:57:56.0824690+13:00;True|2023-01-11T22:22:28.8737310+13:00;True|2023-01-11T22:16:55.3469226+13:00;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>

View File

@ -33,7 +33,6 @@
//
// awardPanel
//
this.awardPanel.BackColor = System.Drawing.Color.LightGray;
this.awardPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.awardPanel.Location = new System.Drawing.Point(0, 0);
this.awardPanel.Name = "awardPanel";

View File

@ -0,0 +1,116 @@
namespace W4Gui.Tabs.StatsTab
{
partial class StatTypeSelectionTab
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.statTypeTabControl = new System.Windows.Forms.TabControl();
this.teamStatsTab = new System.Windows.Forms.TabPage();
this.globalStatsTab = new System.Windows.Forms.TabPage();
this.teamStatsPanel = new W4Gui.Tabs.StatsTab.TeamStatisticsTab();
this.statsPanel = new W4Gui.Tabs.StatsTab.StatisticsTab();
this.statTypeTabControl.SuspendLayout();
this.teamStatsTab.SuspendLayout();
this.globalStatsTab.SuspendLayout();
this.SuspendLayout();
//
// statTypeTabControl
//
this.statTypeTabControl.Controls.Add(this.teamStatsTab);
this.statTypeTabControl.Controls.Add(this.globalStatsTab);
this.statTypeTabControl.Dock = System.Windows.Forms.DockStyle.Fill;
this.statTypeTabControl.HotTrack = true;
this.statTypeTabControl.Location = new System.Drawing.Point(0, 0);
this.statTypeTabControl.Name = "statTypeTabControl";
this.statTypeTabControl.SelectedIndex = 0;
this.statTypeTabControl.Size = new System.Drawing.Size(885, 502);
this.statTypeTabControl.TabIndex = 0;
//
// teamStatsTab
//
this.teamStatsTab.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.teamStatsTab.Controls.Add(this.teamStatsPanel);
this.teamStatsTab.Location = new System.Drawing.Point(4, 24);
this.teamStatsTab.Name = "teamStatsTab";
this.teamStatsTab.Padding = new System.Windows.Forms.Padding(3);
this.teamStatsTab.Size = new System.Drawing.Size(877, 474);
this.teamStatsTab.TabIndex = 1;
this.teamStatsTab.Text = "Team Stats";
this.teamStatsTab.UseVisualStyleBackColor = true;
//
// globalStatsTab
//
this.globalStatsTab.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.globalStatsTab.Controls.Add(this.statsPanel);
this.globalStatsTab.Location = new System.Drawing.Point(4, 24);
this.globalStatsTab.Name = "globalStatsTab";
this.globalStatsTab.Padding = new System.Windows.Forms.Padding(3);
this.globalStatsTab.Size = new System.Drawing.Size(877, 474);
this.globalStatsTab.TabIndex = 2;
this.globalStatsTab.Text = "Global Stats";
this.globalStatsTab.UseVisualStyleBackColor = true;
//
// teamStatsPanel
//
this.teamStatsPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.teamStatsPanel.Location = new System.Drawing.Point(3, 3);
this.teamStatsPanel.Name = "teamStatsPanel";
this.teamStatsPanel.Size = new System.Drawing.Size(867, 464);
this.teamStatsPanel.TabIndex = 0;
//
// statsPanel
//
this.statsPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.statsPanel.Location = new System.Drawing.Point(3, 3);
this.statsPanel.Name = "statsPanel";
this.statsPanel.Size = new System.Drawing.Size(867, 464);
this.statsPanel.TabIndex = 0;
//
// StatsTab
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.Control;
this.Controls.Add(this.statTypeTabControl);
this.Name = "StatsTab";
this.Size = new System.Drawing.Size(885, 502);
this.statTypeTabControl.ResumeLayout(false);
this.teamStatsTab.ResumeLayout(false);
this.globalStatsTab.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private TabControl statTypeTabControl;
private TabPage teamStatsTab;
private TabPage globalStatsTab;
private TeamStatisticsTab teamStatsPanel;
private StatisticsTab statsPanel;
}
}

View File

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace W4Gui.Tabs.StatsTab
{
public partial class StatTypeSelectionTab : UserControl
{
public StatTypeSelectionTab()
{
InitializeComponent();
}
}
}

View File

@ -0,0 +1,60 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,98 @@
namespace W4Gui.Tabs.StatsTab
{
partial class StatisticsTab
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.statisticsSplitContainer = new System.Windows.Forms.SplitContainer();
this.statisticsList = new W4Gui.Components.CollectiveListAddDelete();
this.statisticsPanel = new W4Gui.Components.StatisticsPanel();
((System.ComponentModel.ISupportInitialize)(this.statisticsSplitContainer)).BeginInit();
this.statisticsSplitContainer.Panel1.SuspendLayout();
this.statisticsSplitContainer.Panel2.SuspendLayout();
this.statisticsSplitContainer.SuspendLayout();
this.SuspendLayout();
//
// statisticsSplitContainer
//
this.statisticsSplitContainer.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.statisticsSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
this.statisticsSplitContainer.Location = new System.Drawing.Point(3, 3);
this.statisticsSplitContainer.Name = "statisticsSplitContainer";
//
// statisticsSplitContainer.Panel1
//
this.statisticsSplitContainer.Panel1.Controls.Add(this.statisticsList);
//
// statisticsSplitContainer.Panel2
//
this.statisticsSplitContainer.Panel2.Controls.Add(this.statisticsPanel);
this.statisticsSplitContainer.Size = new System.Drawing.Size(797, 464);
this.statisticsSplitContainer.SplitterDistance = 265;
this.statisticsSplitContainer.TabIndex = 0;
//
// statisticsList
//
this.statisticsList.Dock = System.Windows.Forms.DockStyle.Fill;
this.statisticsList.Location = new System.Drawing.Point(0, 0);
this.statisticsList.Name = "statisticsList";
this.statisticsList.Size = new System.Drawing.Size(261, 460);
this.statisticsList.TabIndex = 0;
this.statisticsList.NewButton += new System.EventHandler<System.EventArgs>(this.statisticsList_NewButton);
this.statisticsList.DeleteButton += new System.EventHandler<System.EventArgs>(this.statisticsList_DelButton);
//
// statisticsPanel
//
this.statisticsPanel.BackColor = System.Drawing.Color.LightGray;
this.statisticsPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.statisticsPanel.Location = new System.Drawing.Point(0, 0);
this.statisticsPanel.Name = "statisticsPanel";
this.statisticsPanel.Size = new System.Drawing.Size(524, 460);
this.statisticsPanel.TabIndex = 0;
//
// StatisticsTab
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.statisticsSplitContainer);
this.Name = "StatisticsTab";
this.Size = new System.Drawing.Size(797, 464);
this.statisticsSplitContainer.Panel1.ResumeLayout(false);
this.statisticsSplitContainer.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.statisticsSplitContainer)).EndInit();
this.statisticsSplitContainer.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private SplitContainer statisticsSplitContainer;
private Components.CollectiveListAddDelete statisticsList;
private Components.StatisticsPanel statisticsPanel;
}
}

View File

@ -0,0 +1,62 @@
using LibW4M.Data.Stats;
using LibW4M.Data.Teams;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace W4Gui.Tabs.StatsTab
{
public partial class StatisticsTab : TabEntry
{
public StatisticsTab()
{
InitializeComponent();
this.statisticsList.List.Selected += statisticsList_Selected;
this.statisticsList.List.Unselected += statisticsList_Unselected;
}
public override void SaveFromControl()
{
if (this.statisticsList.List.IsItemSelected)
statisticsList_Unselected(null, null);
}
public override void LoadIntoControl()
{
this.statisticsList.List.LoadCollective(DataManager.SaveFile.StatsCollective);
statisticsPanel.Enabled = false;
}
private void statisticsList_Unselected(object? sender, EventArgs e)
{
StatsContainerData statsData = DataManager.SaveFile.StatsCollective[statisticsList.List.LastSelected] as StatsContainerData;
statisticsPanel.SaveStatsData(ref statsData);
statisticsList.List.UpdateName(statisticsList.List.LastSelected, statsData.FriendlyName);
}
private void statisticsList_Selected(object? sender, EventArgs e)
{
StatsContainerData statsData = DataManager.SaveFile.StatsCollective[statisticsList.List.CurrentlySelected] as StatsContainerData;
statisticsPanel.LoadStatsData(statsData);
statisticsPanel.Enabled = true;
}
private void statisticsList_NewButton(object sender, EventArgs e)
{
throw new NotImplementedException("Adding new statistics from here not implemented yet ;)");
}
private void statisticsList_DelButton(object sender, EventArgs e)
{
throw new NotImplementedException("Removing statistics from here not implemented yet ;)");
}
}
}

View File

@ -0,0 +1,60 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,98 @@
namespace W4Gui.Tabs.StatsTab
{
partial class TeamStatisticsTab
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.teamStatisticsSplitContainer = new System.Windows.Forms.SplitContainer();
this.teamStatisticsList = new W4Gui.Components.CollectiveListAddDelete();
this.teamStatisticsPanel = new W4Gui.Components.StatisticsPanel();
((System.ComponentModel.ISupportInitialize)(this.teamStatisticsSplitContainer)).BeginInit();
this.teamStatisticsSplitContainer.Panel1.SuspendLayout();
this.teamStatisticsSplitContainer.Panel2.SuspendLayout();
this.teamStatisticsSplitContainer.SuspendLayout();
this.SuspendLayout();
//
// teamStatisticsSplitContainer
//
this.teamStatisticsSplitContainer.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.teamStatisticsSplitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
this.teamStatisticsSplitContainer.Location = new System.Drawing.Point(3, 3);
this.teamStatisticsSplitContainer.Name = "teamStatisticsSplitContainer";
//
// teamStatisticsSplitContainer.Panel1
//
this.teamStatisticsSplitContainer.Panel1.Controls.Add(this.teamStatisticsList);
//
// teamStatisticsSplitContainer.Panel2
//
this.teamStatisticsSplitContainer.Panel2.Controls.Add(this.teamStatisticsPanel);
this.teamStatisticsSplitContainer.Size = new System.Drawing.Size(797, 464);
this.teamStatisticsSplitContainer.SplitterDistance = 265;
this.teamStatisticsSplitContainer.TabIndex = 0;
//
// teamStatisticsList
//
this.teamStatisticsList.Dock = System.Windows.Forms.DockStyle.Fill;
this.teamStatisticsList.Location = new System.Drawing.Point(0, 0);
this.teamStatisticsList.Name = "teamStatisticsList";
this.teamStatisticsList.Size = new System.Drawing.Size(261, 460);
this.teamStatisticsList.TabIndex = 0;
this.teamStatisticsList.NewButton += new System.EventHandler<System.EventArgs>(this.teamStatisticsList_NewButton);
this.teamStatisticsList.DeleteButton += new System.EventHandler<System.EventArgs>(this.teamStatisticsList_DelButton);
//
// teamStatisticsPanel
//
this.teamStatisticsPanel.BackColor = System.Drawing.Color.LightGray;
this.teamStatisticsPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.teamStatisticsPanel.Location = new System.Drawing.Point(0, 0);
this.teamStatisticsPanel.Name = "teamStatisticsPanel";
this.teamStatisticsPanel.Size = new System.Drawing.Size(524, 460);
this.teamStatisticsPanel.TabIndex = 0;
//
// StatisticsTab
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.teamStatisticsSplitContainer);
this.Name = "TeamStatisticsTab";
this.Size = new System.Drawing.Size(797, 464);
this.teamStatisticsSplitContainer.Panel1.ResumeLayout(false);
this.teamStatisticsSplitContainer.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.teamStatisticsSplitContainer)).EndInit();
this.teamStatisticsSplitContainer.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private SplitContainer teamStatisticsSplitContainer;
private Components.CollectiveListAddDelete teamStatisticsList;
private Components.StatisticsPanel teamStatisticsPanel;
}
}

View File

@ -0,0 +1,62 @@
using LibW4M.Data.Stats;
using LibW4M.Data.Teams;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace W4Gui.Tabs.StatsTab
{
public partial class TeamStatisticsTab : TabEntry
{
public TeamStatisticsTab()
{
InitializeComponent();
this.teamStatisticsList.List.Selected += teamStatistics_Selected;
this.teamStatisticsList.List.Unselected += teamStatistics_Unselected;
}
public override void SaveFromControl()
{
if (this.teamStatisticsList.List.IsItemSelected)
teamStatistics_Unselected(null, null);
}
public override void LoadIntoControl()
{
this.teamStatisticsList.List.LoadCollective(DataManager.SaveFile.TeamStatsCollective);
teamStatisticsPanel.Enabled = false;
}
private void teamStatistics_Unselected(object? sender, EventArgs e)
{
StatsContainerData statsData = DataManager.SaveFile.TeamStatsCollective[teamStatisticsList.List.LastSelected] as StatsContainerData;
teamStatisticsPanel.SaveStatsData(ref statsData);
teamStatisticsList.List.UpdateName(teamStatisticsList.List.LastSelected, statsData.FriendlyName);
}
private void teamStatistics_Selected(object? sender, EventArgs e)
{
StatsContainerData statsData = DataManager.SaveFile.TeamStatsCollective[teamStatisticsList.List.CurrentlySelected] as StatsContainerData;
teamStatisticsPanel.LoadStatsData(statsData);
teamStatisticsPanel.Enabled = true;
}
private void teamStatisticsList_NewButton(object sender, EventArgs e)
{
throw new NotImplementedException("Adding new team statistics from here not implemented yet ;)");
}
private void teamStatisticsList_DelButton(object sender, EventArgs e)
{
throw new NotImplementedException("Removing team statistics from here not implemented yet ;)");
}
}
}

View File

@ -0,0 +1,60 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -4,16 +4,29 @@
<OutputType>WinExe</OutputType>
<TargetFramework>net7.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<UseWindowsForms>True</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<AssemblyName>Worms 4 Mayhem! Save Editor</AssemblyName>
<ApplicationIcon>EditorIcon.ico</ApplicationIcon>
<Authors>Li</Authors>
<Company>Non-Binary Inc</Company>
<Description>Savegame Editor &amp; Converter for "Worms 4: Mayhem!"</Description>
<Copyright>Public Domain 2023</Copyright>
<Title>$(AssemblyName)</Title>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='Release'">
<DebugType>none</DebugType>
</PropertyGroup>
<ItemGroup>
<Content Include="EditorIcon.ico" />
</ItemGroup>
<ItemGroup>
<Compile Update="Components\StatisticsPanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Components\InputMappingPanel.cs">
<SubType>UserControl</SubType>
</Compile>
@ -50,9 +63,9 @@
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Update="Tabs\AwardTab.cs" />
<Compile Update="Tabs\InputEventMappingsTab.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Tabs\StatsTab\TeamStatisticsTab.cs" />
<Compile Update="Tabs\StatsTab\StatisticsTab.cs" />
<Compile Update="Tabs\InputEventMappingsTab.cs" />
<Compile Update="Tabs\OtherTabs\InputMappingsTab.cs">
<SubType>UserControl</SubType>
</Compile>
@ -61,15 +74,12 @@
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Tabs\SchemeTab.cs" />
<Compile Update="Tabs\VariablesTab\VectorVariablesTab.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Tabs\VariablesTab\StringVariablesTab.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Tabs\VariablesTab\FloatVariablesTab.cs">
<Compile Update="Tabs\StatsTab\StatTypeSelectionTab.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Tabs\VariablesTab\VectorVariablesTab.cs" />
<Compile Update="Tabs\VariablesTab\StringVariablesTab.cs" />
<Compile Update="Tabs\VariablesTab\FloatVariablesTab.cs" />
<Compile Update="Tabs\VariablesTab\UIntVariablesTab.cs" />
</ItemGroup>
@ -80,10 +90,6 @@
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Folder Include="Resources\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\LibW4M\LibW4M.csproj" />
</ItemGroup>

View File

@ -4,48 +4,51 @@
<_LastSelectedProfileId>C:\Users\Li\Documents\git\Worms4Editor\W4Gui\Properties\PublishProfiles\FolderProfile.pubxml</_LastSelectedProfileId>
</PropertyGroup>
<ItemGroup>
<Compile Update="Components\CollectiveListBox.cs">
<SubType>Component</SubType>
</Compile>
<Compile Update="Components\CollectiveListAddDelete.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Components\CollectiveListBox.cs">
<SubType>Component</SubType>
</Compile>
<Compile Update="Components\FloatUpDown.cs">
<SubType>Component</SubType>
</Compile>
<Compile Update="Components\GenericUpDown.cs">
<SubType>Component</SubType>
</Compile>
<Compile Update="Components\HexInputBox.cs">
<SubType>Component</SubType>
</Compile>
<Compile Update="Components\HighscoresPanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Components\IntUpDown.cs">
<SubType>Component</SubType>
</Compile>
<Compile Update="Components\UIntUpDown.cs">
<SubType>Component</SubType>
</Compile>
<Compile Update="Components\WeaponSettingsPanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Components\IntList.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Components\IntUpDown.cs">
<SubType>Component</SubType>
</Compile>
<Compile Update="Components\StringList.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Components\GenericUpDown.cs">
<SubType>Component</SubType>
</Compile>
<Compile Update="Components\TeamsPanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Components\UIntUpDown.cs">
<SubType>Component</SubType>
</Compile>
<Compile Update="Components\VariablePanel\IntVariablePanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Components\VectorSelect.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Dialogs\AboutW4Gui.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="Dialogs\CollectiveSelectionDialog.cs">
<SubType>Form</SubType>
</Compile>
@ -64,27 +67,45 @@
<Compile Update="Tabs\HighscoresTab.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Tabs\TabEntry.cs">
<Compile Update="Tabs\InputEventMappingsTab.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Tabs\SchemeTab.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Tabs\StatsTab\StatisticsTab.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Tabs\StatsTab\TeamStatisticsTab.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Tabs\TabEntry.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Tabs\TeamsTab.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Tabs\UnlockableItemsTab.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Tabs\VariablesTab\FloatVariablesTab.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Tabs\VariablesTab\IntVariablesTab.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Tabs\VariablesTab\StringVariablesTab.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Tabs\VariablesTab\UIntVariablesTab.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Tabs\VariablesTab\VariablesTabs.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Tabs\VariablesTab\VectorVariablesTab.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Tabs\WeaponsTab.cs">
<SubType>UserControl</SubType>
</Compile>