BizHawk/BizHawk.Emulation.Cores/Consoles/WonderSwan/WonderSwan.ISettable.cs

187 lines
5.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BizHawk.Emulation.Common;
using System.ComponentModel;
using BizHawk.Common;
using System.Drawing;
namespace BizHawk.Emulation.Cores.WonderSwan
{
partial class WonderSwan : ISettable<WonderSwan.Settings, WonderSwan.SyncSettings>
{
Settings _Settings;
SyncSettings _SyncSettings;
public class Settings
{
[DisplayName("Background Layer")]
[Description("True to display the selected layer.")]
[DefaultValue(true)]
public bool EnableBG { get; set; }
[DisplayName("Foreground Layer")]
[Description("True to display the selected layer.")]
[DefaultValue(true)]
public bool EnableFG { get; set; }
[DisplayName("Sprites Layer")]
[Description("True to display the selected layer.")]
[DefaultValue(true)]
public bool EnableSprites { get; set; }
[DisplayName("B&W Palette")]
[Description("Colors to display in Wonderswan (not Color) mode")]
public Color[] BWPalette { get; private set; }
public BizSwan.Settings GetNativeSettings()
{
var ret = new BizSwan.Settings();
if (EnableBG) ret.LayerMask |= BizSwan.LayerFlags.BG;
if (EnableFG) ret.LayerMask |= BizSwan.LayerFlags.FG;
if (EnableSprites) ret.LayerMask |= BizSwan.LayerFlags.Sprite;
ret.BWPalette = new uint[16];
for (int i = 0; i < 16; i++)
ret.BWPalette[i] = (uint)BWPalette[i].ToArgb() | 0xff000000;
// default color algorithm from wonderswan
// todo: we could give options like the gameboy cores have
ret.ColorPalette = new uint[4096];
for (int r = 0; r < 16; r++)
{
for (int g = 0; g < 16; g++)
{
for (int b = 0; b < 16; b++)
{
uint neo_r, neo_g, neo_b;
neo_r = (uint)r * 17;
neo_g = (uint)g * 17;
neo_b = (uint)b * 17;
ret.ColorPalette[r << 8 | g << 4 | b] = 0xff000000 | neo_r << 16 | neo_g << 8 | neo_b << 0;
}
}
}
return ret;
}
public Settings()
{
SettingsUtil.SetDefaultValues(this);
BWPalette = new Color[16];
for (int i = 0; i < 16; i++)
{
BWPalette[i] = Color.FromArgb(255, i * 17, i * 17, i * 17);
}
}
public Settings Clone()
{
var ret = (Settings)MemberwiseClone();
ret.BWPalette = (Color[])BWPalette.Clone();
return ret;
}
}
public class SyncSettings
{
[DisplayName("Initial Time")]
[Description("Initial time of emulation. Only relevant when UseRealTime is false.")]
[DefaultValue(typeof(DateTime), "2010-01-01")]
public DateTime InitialTime { get; set; }
[Description("Your birthdate. Stored in EEPROM and used by some games.")]
[DefaultValue(typeof(DateTime), "1968-05-13")]
public DateTime BirthDate { get; set; }
[Description("True to emulate a color system.")]
[DefaultValue(true)]
public bool Color { get; set; }
[DisplayName("Use RealTime")]
[Description("If true, RTC clock will be based off of real time instead of emulated time. Ignored (set to false) when recording a movie.")]
[DefaultValue(false)]
public bool UseRealTime { get; set; }
[Description("Your gender. Stored in EEPROM and used by some games.")]
[DefaultValue(BizSwan.Gender.Female)]
public BizSwan.Gender Gender { get; set; }
[Description("Language to play games in. Most games ignore this.")]
[DefaultValue(BizSwan.Language.Japanese)]
public BizSwan.Language Language { get; set; }
[DisplayName("Blood Type")]
[Description("Your blood type. Stored in EEPROM and used by some games.")]
[DefaultValue(BizSwan.Bloodtype.AB)]
public BizSwan.Bloodtype BloodType { get; set; }
[Description("Your name. Stored in EEPROM and used by some games. Maximum of 16 characters")]
[DefaultValue("Lady Ashelia")]
public string Name { get; set; }
public BizSwan.SyncSettings GetNativeSettings()
{
var ret = new BizSwan.SyncSettings
{
color = Color,
userealtime = UseRealTime,
sex = Gender,
language = Language,
blood = BloodType
};
ret.SetName(Name);
ret.bday = (uint)BirthDate.Day;
ret.bmonth = (uint)BirthDate.Month;
ret.byear = (uint)BirthDate.Year;
ret.initialtime = (ulong)((InitialTime - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds);
return ret;
}
public SyncSettings()
{
SettingsUtil.SetDefaultValues(this);
}
public SyncSettings Clone()
{
return (SyncSettings)MemberwiseClone();
}
public static bool NeedsReboot(SyncSettings x, SyncSettings y)
{
return !DeepEquality.DeepEquals(x, y);
}
}
public Settings GetSettings()
{
return _Settings.Clone();
}
public SyncSettings GetSyncSettings()
{
return _SyncSettings.Clone();
}
public bool PutSettings(Settings o)
{
_Settings = o;
var native = _Settings.GetNativeSettings();
BizSwan.bizswan_putsettings(Core, ref native);
return false;
}
public bool PutSyncSettings(SyncSettings o)
{
bool ret = SyncSettings.NeedsReboot(o, _SyncSettings);
_SyncSettings = o;
return ret;
}
}
}