Basic Bot - ability to save and load bot files

This commit is contained in:
adelikat 2015-09-05 23:39:51 -04:00
parent b8295f1d98
commit 92a7773b3a
2 changed files with 287 additions and 3 deletions

View File

@ -42,6 +42,7 @@
this.countRerecordsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.RunBtn = new System.Windows.Forms.Button();
this.BotStatusStrip = new System.Windows.Forms.StatusStrip();
this.MessageLabel = new System.Windows.Forms.ToolStripStatusLabel();
this.ControlsBox = new System.Windows.Forms.GroupBox();
this.ControlProbabilityPanel = new System.Windows.Forms.Panel();
this.BestGroupBox = new System.Windows.Forms.GroupBox();
@ -83,6 +84,7 @@
this.ClearBestButton = new System.Windows.Forms.Button();
this.PlayBestButton = new System.Windows.Forms.Button();
this.BotMenu.SuspendLayout();
this.BotStatusStrip.SuspendLayout();
this.ControlsBox.SuspendLayout();
this.BestGroupBox.SuspendLayout();
this.panel1.SuspendLayout();
@ -115,6 +117,7 @@
this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
this.fileToolStripMenuItem.Text = "&File";
this.fileToolStripMenuItem.DropDownOpened += new System.EventHandler(this.FileSubMenu_DropDownOpened);
//
// NewMenuItem
//
@ -123,6 +126,7 @@
this.NewMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N)));
this.NewMenuItem.Size = new System.Drawing.Size(195, 22);
this.NewMenuItem.Text = "&New";
this.NewMenuItem.Click += new System.EventHandler(this.NewMenuItem_Click);
//
// OpenMenuItem
//
@ -131,6 +135,7 @@
this.OpenMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));
this.OpenMenuItem.Size = new System.Drawing.Size(195, 22);
this.OpenMenuItem.Text = "&Open...";
this.OpenMenuItem.Click += new System.EventHandler(this.OpenMenuItem_Click);
//
// SaveMenuItem
//
@ -139,6 +144,7 @@
this.SaveMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));
this.SaveMenuItem.Size = new System.Drawing.Size(195, 22);
this.SaveMenuItem.Text = "&Save";
this.SaveMenuItem.Click += new System.EventHandler(this.SaveMenuItem_Click);
//
// SaveAsMenuItem
//
@ -147,6 +153,7 @@
| System.Windows.Forms.Keys.S)));
this.SaveAsMenuItem.Size = new System.Drawing.Size(195, 22);
this.SaveAsMenuItem.Text = "Save &As...";
this.SaveAsMenuItem.Click += new System.EventHandler(this.SaveAsMenuItem_Click);
//
// RecentSubMenu
//
@ -156,11 +163,12 @@
this.RecentSubMenu.Name = "RecentSubMenu";
this.RecentSubMenu.Size = new System.Drawing.Size(195, 22);
this.RecentSubMenu.Text = "Recent";
this.RecentSubMenu.DropDownOpened += new System.EventHandler(this.RecentSubMenu_DropDownOpened);
//
// toolStripSeparator2
//
this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(57, 6);
this.toolStripSeparator2.Size = new System.Drawing.Size(149, 6);
//
// toolStripSeparator1
//
@ -173,7 +181,7 @@
this.ExitMenuItem.ShortcutKeyDisplayString = "Alt+F4";
this.ExitMenuItem.Size = new System.Drawing.Size(195, 22);
this.ExitMenuItem.Text = "E&xit";
this.ExitMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click);
//
// optionsToolStripMenuItem
//
@ -203,12 +211,20 @@
//
// BotStatusStrip
//
this.BotStatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.MessageLabel});
this.BotStatusStrip.Location = new System.Drawing.Point(0, 530);
this.BotStatusStrip.Name = "BotStatusStrip";
this.BotStatusStrip.Size = new System.Drawing.Size(574, 22);
this.BotStatusStrip.TabIndex = 2;
this.BotStatusStrip.Text = "statusStrip1";
//
// MessageLabel
//
this.MessageLabel.Name = "MessageLabel";
this.MessageLabel.Size = new System.Drawing.Size(109, 17);
this.MessageLabel.Text = " ";
//
// ControlsBox
//
this.ControlsBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
@ -667,6 +683,8 @@
this.Load += new System.EventHandler(this.BasicBot_Load);
this.BotMenu.ResumeLayout(false);
this.BotMenu.PerformLayout();
this.BotStatusStrip.ResumeLayout(false);
this.BotStatusStrip.PerformLayout();
this.ControlsBox.ResumeLayout(false);
this.BestGroupBox.ResumeLayout(false);
this.BestGroupBox.PerformLayout();
@ -736,5 +754,6 @@
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
private System.Windows.Forms.ToolStripMenuItem NewMenuItem;
private System.Windows.Forms.Button PlayBestButton;
private System.Windows.Forms.ToolStripStatusLabel MessageLabel;
}
}

View File

@ -5,6 +5,7 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BizHawk.Client.EmuHawk.ToolExtensions;
using BizHawk.Emulation.Common;
using BizHawk.Client.Common;
@ -13,6 +14,9 @@ namespace BizHawk.Client.EmuHawk
{
public partial class BasicBot : Form , IToolFormAutoConfig
{
private const string DialogTitle = "Basic Bot";
private string _currentFileName = string.Empty;
private bool _isBotting = false;
private long _attempts = 1;
private long _frames = 0;
@ -42,7 +46,12 @@ namespace BizHawk.Client.EmuHawk
public class BasicBotSettings
{
public BasicBotSettings()
{
RecentBotFiles = new RecentFiles();
}
public RecentFiles RecentBotFiles { get; set; }
}
#endregion
@ -52,10 +61,17 @@ namespace BizHawk.Client.EmuHawk
public BasicBot()
{
InitializeComponent();
Text = DialogTitle;
Settings = new BasicBotSettings();
}
private void BasicBot_Load(object sender, EventArgs e)
{
MaximizeAddressBox.SetHexProperties(MemoryDomains.MainMemory.Size);
TieBreaker1Box.SetHexProperties(MemoryDomains.MainMemory.Size);
TieBreaker2Box.SetHexProperties(MemoryDomains.MainMemory.Size);
TieBreaker3Box.SetHexProperties(MemoryDomains.MainMemory.Size);
StartFromSlotBox.SelectedIndex = 0;
int starty = 0;
@ -77,6 +93,11 @@ namespace BizHawk.Client.EmuHawk
accumulatedy += lineHeight;
count++;
}
if (Settings.RecentBotFiles.AutoLoad)
{
LoadFileFromRecent(Settings.RecentBotFiles.MostRecent);
}
}
#endregion
@ -128,6 +149,26 @@ namespace BizHawk.Client.EmuHawk
private int FrameLength
{
get { return (int)FrameLengthNumeric.Value; }
set { FrameLengthNumeric.Value = value; }
}
public int MaximizeAddress
{
get
{
int? addr = MaximizeAddressBox.ToRawInt();
if (addr.HasValue)
{
return addr.Value;
}
return 0;
}
set
{
MaximizeAddressBox.SetFromRawInt(value);
}
}
public int MaximizeValue
@ -144,6 +185,25 @@ namespace BizHawk.Client.EmuHawk
}
}
public int TieBreaker1Address
{
get
{
int? addr = TieBreaker1Box.ToRawInt();
if (addr.HasValue)
{
return addr.Value;
}
return 0;
}
set
{
TieBreaker1Box.SetFromRawInt(value);
}
}
public int TieBreaker1Value
{
get
@ -158,6 +218,25 @@ namespace BizHawk.Client.EmuHawk
}
}
public int TieBreaker2Address
{
get
{
int? addr = TieBreaker2Box.ToRawInt();
if (addr.HasValue)
{
return addr.Value;
}
return 0;
}
set
{
TieBreaker2Box.SetFromRawInt(value);
}
}
public int TieBreaker2Value
{
get
@ -172,6 +251,25 @@ namespace BizHawk.Client.EmuHawk
}
}
public int TieBreaker3Address
{
get
{
int? addr = TieBreaker3Box.ToRawInt();
if (addr.HasValue)
{
return addr.Value;
}
return 0;
}
set
{
TieBreaker3Box.SetFromRawInt(value);
}
}
public int TieBreaker3Value
{
get
@ -186,6 +284,32 @@ namespace BizHawk.Client.EmuHawk
}
}
public string FromSlot
{
get
{
return StartFromSlotBox.SelectedItem != null
? StartFromSlotBox.SelectedItem.ToString()
: string.Empty;
}
set
{
var item = StartFromSlotBox.Items.
OfType<object>()
.FirstOrDefault(o => o.ToString() == value);
if (item != null)
{
StartFromSlotBox.SelectedItem = item;
}
else
{
StartFromSlotBox.SelectedItem = null;
}
}
}
#endregion
#region IToolForm Implementation
@ -216,7 +340,12 @@ namespace BizHawk.Client.EmuHawk
#region Control Events
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
private void NewMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("TODO");
}
private void ExitMenuItem_Click(object sender, EventArgs e)
{
Close();
}
@ -247,6 +376,57 @@ namespace BizHawk.Client.EmuHawk
GlobalWin.MainForm.UnpauseEmulator();
}
private void FileSubMenu_DropDownOpened(object sender, EventArgs e)
{
SaveMenuItem.Enabled = !string.IsNullOrWhiteSpace(_currentFileName);
}
private void RecentSubMenu_DropDownOpened(object sender, EventArgs e)
{
RecentSubMenu.DropDownItems.Clear();
RecentSubMenu.DropDownItems.AddRange(
Settings.RecentBotFiles.RecentMenu(LoadFileFromRecent, true));
}
private void OpenMenuItem_Click(object sender, EventArgs e)
{
var file = ToolHelpers.OpenFileDialog(
_currentFileName,
PathManager.GetRomsPath(Global.Game.System), // TODO: bot path
"Bot files",
"bot"
);
if (file != null)
{
LoadBotFile(file.FullName);
}
}
private void SaveMenuItem_Click(object sender, EventArgs e)
{
if (!string.IsNullOrWhiteSpace(_currentFileName))
{
SaveBotFile(_currentFileName);
}
}
private void SaveAsMenuItem_Click(object sender, EventArgs e)
{
var file = ToolHelpers.SaveFileDialog(
_currentFileName,
PathManager.GetRomsPath(Global.Game.System), // TODO: bot path
"Bot files",
"bot"
);
if (file != null)
{
SaveBotFile(file.FullName);
Text = DialogTitle + Path.GetFileNameWithoutExtension(_currentFileName);
}
}
#endregion
private class BotAttempt
@ -264,6 +444,18 @@ namespace BizHawk.Client.EmuHawk
public List<string> Log { get; set; }
}
private class BotData
{
public BotAttempt Best { get; set; }
public Dictionary<string, double> ControlProbabilities { get; set; }
public int Maximize { get; set; }
public int TieBreaker1 { get; set; }
public int TieBreaker2 { get; set; }
public int TieBreaker3 { get; set; }
public int FrameLength { get; set; }
public string FromSlot { get; set; }
}
private int GetRamvalue(int addr)
{
// TODO: ability to pick memory domain
@ -488,5 +680,78 @@ namespace BizHawk.Client.EmuHawk
GlobalWin.MainForm.PauseEmulator();
}
private void SaveBotFile(string path)
{
var data = new BotData
{
Best = _bestBotAttempt,
ControlProbabilities = ControlProbabilities,
Maximize = MaximizeAddress,
TieBreaker1 = TieBreaker1Address,
TieBreaker2 = TieBreaker2Address,
TieBreaker3 = TieBreaker3Address,
FromSlot = FromSlot
};
var json = ConfigService.SaveWithType(data);
File.WriteAllText(path, json);
_currentFileName = path;
Settings.RecentBotFiles.Add(_currentFileName);
MessageLabel.Text = Path.GetFileName(_currentFileName) + " saved";
}
private void LoadFileFromRecent(string path)
{
var result = LoadBotFile(path);
if (!result)
{
Settings.RecentBotFiles.HandleLoadError(path);
}
}
private bool LoadBotFile(string path)
{
var file = new FileInfo(path);
if (!file.Exists)
{
return false;
}
var json = File.ReadAllText(path);
var botData = (BotData)ConfigService.LoadWithType(json);
_bestBotAttempt = botData.Best;
var probabilityControls = ControlProbabilityPanel.Controls
.OfType<BotControlsRow>()
.ToList();
foreach (var kvp in botData.ControlProbabilities)
{
var control = probabilityControls.Single(c => c.ButtonName == kvp.Key);
control.Probability = kvp.Value;
}
MaximizeAddress = botData.Maximize;
TieBreaker1Address = botData.TieBreaker1;
TieBreaker2Address = botData.TieBreaker2;
TieBreaker3Address = botData.TieBreaker3;
FrameLength = botData.FrameLength;
FromSlot = botData.FromSlot;
UpdateBestAttempt();
if (_bestBotAttempt != null)
{
PlayBestButton.Enabled = true;
}
_currentFileName = path;
Settings.RecentBotFiles.Add(_currentFileName);
return true;
}
}
}