示例#1
0
        public RecordMovie(
            MainForm mainForm,
            Config config,
            GameInfo game,
            IEmulator core,
            IMovieSession movieSession)
        {
            _mainForm     = mainForm;
            _config       = config;
            _game         = game;
            _emulator     = core;
            _movieSession = movieSession;
            InitializeComponent();

            if (!_emulator.HasSavestates())
            {
                StartFromCombo.Items.Remove(
                    StartFromCombo.Items
                    .OfType <object>()
                    .First(i => i.ToString()
                           .ToLower() == "now"));
            }

            if (!_emulator.HasSaveRam())
            {
                StartFromCombo.Items.Remove(
                    StartFromCombo.Items
                    .OfType <object>()
                    .First(i => i.ToString()
                           .ToLower() == "saveram"));
            }
        }
 /// <summary>
 /// Sets the given <paramref name="emulator"/> save ram if the movie contains save ram
 /// and the core supports save ram
 /// </summary>
 public static void ProcessSram(this IMovie movie, IEmulator emulator)
 {
     if (movie.StartsFromSaveRam && emulator.HasSaveRam())
     {
         emulator.AsSaveRam().StoreSaveRam(movie.SaveRam);
     }
 }
示例#3
0
        public RecordMovie(
            IMainFormForTools mainForm,
            Config config,
            GameInfo game,
            IEmulator core,
            IMovieSession movieSession,
            FirmwareManager firmwareManager)
        {
            _mainForm        = mainForm;
            _config          = config;
            _game            = game;
            _emulator        = core;
            _movieSession    = movieSession;
            _firmwareManager = firmwareManager;
            InitializeComponent();
            Icon            = Properties.Resources.TAStudioIcon;
            BrowseBtn.Image = Properties.Resources.OpenFile;
            if (OSTailoredCode.IsUnixHost)
            {
                Load += (_, _) =>
                {
                    //HACK to make this usable on Linux. No clue why this Form in particular is so much worse, maybe the GroupBox? --yoshi
                    groupBox1.Height -= 24;
                    DefaultAuthorCheckBox.Location += new Size(0, 32);
                    var s = new Size(0, 40);
                    OK.Location     += s;
                    Cancel.Location += s;
                }
            }
            ;

            if (!_emulator.HasSavestates())
            {
                StartFromCombo.Items.Remove(
                    StartFromCombo.Items
                    .OfType <object>()
                    .First(i => i.ToString()
                           .ToLower() == "now"));
            }

            if (!_emulator.HasSaveRam())
            {
                StartFromCombo.Items.Remove(
                    StartFromCombo.Items
                    .OfType <object>()
                    .First(i => i.ToString()
                           .ToLower() == "saveram"));
            }
        }
示例#4
0
        public override void Attach(IEmulator emulator)
        {
            if (!emulator.HasSavestates())
            {
                throw new InvalidOperationException($"A core must be able to provide an {nameof(IStatable)} service");
            }

            if (!emulator.CanPollInput())
            {
                throw new InvalidOperationException($"A core must be able to provide an {nameof(IInputPollable)} service");
            }

            _inputPollable = emulator.AsInputPollable();

            if (StartsFromSavestate)
            {
                TasStateManager.Engage(BinarySavestate);
            }
            else
            {
                var ms = new MemoryStream();
                if (StartsFromSaveRam && emulator.HasSaveRam())
                {
                    emulator.AsSaveRam().StoreSaveRam(SaveRam !);
                }
                emulator.AsStatable().SaveStateBinary(new BinaryWriter(ms));
                TasStateManager.Engage(ms.ToArray());
            }

            base.Attach(emulator);

            foreach (var button in emulator.ControllerDefinition.BoolButtons)
            {
                _mnemonicCache[button] = Bk2MnemonicLookup.Lookup(button, emulator.SystemId);
            }
        }
示例#5
0
        public RecordMovie(IEmulator core)
        {
            InitializeComponent();

            Emulator = core;

            if (!Emulator.HasSavestates())
            {
                StartFromCombo.Items.Remove(
                    StartFromCombo.Items
                    .OfType <object>()
                    .First(i => i.ToString()
                           .ToLower() == "now"));
            }

            if (!Emulator.HasSaveRam())
            {
                StartFromCombo.Items.Remove(
                    StartFromCombo.Items
                    .OfType <object>()
                    .First(i => i.ToString()
                           .ToLower() == "saveram"));
            }
        }
示例#6
0
        public RecordMovie(
            IMainFormForTools mainForm,
            Config config,
            GameInfo game,
            IEmulator core,
            IMovieSession movieSession,
            FirmwareManager firmwareManager)
        {
            _mainForm        = mainForm;
            _config          = config;
            _game            = game;
            _emulator        = core;
            _movieSession    = movieSession;
            _firmwareManager = firmwareManager;
            InitializeComponent();
            Icon            = Properties.Resources.TAStudio_MultiSize;
            BrowseBtn.Image = Properties.Resources.OpenFile;

            if (!_emulator.HasSavestates())
            {
                StartFromCombo.Items.Remove(
                    StartFromCombo.Items
                    .OfType <object>()
                    .First(i => i.ToString()
                           .ToLower() == "now"));
            }

            if (!_emulator.HasSaveRam())
            {
                StartFromCombo.Items.Remove(
                    StartFromCombo.Items
                    .OfType <object>()
                    .First(i => i.ToString()
                           .ToLower() == "saveram"));
            }
        }
示例#7
0
        private void Ok_Click(object sender, EventArgs e)
        {
            var path = MakePath();

            if (!string.IsNullOrWhiteSpace(path))
            {
                var test = new FileInfo(path);
                if (test.Exists)
                {
                    var result = MessageBox.Show(path + " already exists, overwrite?", "Confirm overwrite", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
                    if (result == DialogResult.Cancel)
                    {
                        return;
                    }
                }

                var movieToRecord = MovieService.Get(path);

                var fileInfo = new FileInfo(path);
                if (!fileInfo.Exists)
                {
                    Directory.CreateDirectory(fileInfo.DirectoryName);
                }

                if (StartFromCombo.SelectedItem.ToString() == "Now" && Emulator.HasSavestates())
                {
                    var core = Emulator.AsStatable();

                    movieToRecord.StartsFromSavestate = true;
                    movieToRecord.StartsFromSaveRam   = false;

                    if (core.BinarySaveStatesPreferred)
                    {
                        movieToRecord.BinarySavestate = (byte[])core.SaveStateBinary().Clone();
                    }
                    else
                    {
                        using (var sw = new StringWriter())
                        {
                            core.SaveStateText(sw);
                            movieToRecord.TextSavestate = sw.ToString();
                        }
                    }

                    // TODO: do we want to support optionally not saving this?
                    if (true)
                    {
                        // hack: some IMovies eat the framebuffer, so don't bother with them
                        movieToRecord.SavestateFramebuffer = new int[0];
                        if (movieToRecord.SavestateFramebuffer != null && Emulator.HasVideoProvider())
                        {
                            movieToRecord.SavestateFramebuffer = (int[])Emulator.AsVideoProvider().GetVideoBuffer().Clone();
                        }
                    }
                }
                else if (StartFromCombo.SelectedItem.ToString() == "SaveRam" && Emulator.HasSaveRam())
                {
                    var core = Emulator.AsSaveRam();
                    movieToRecord.StartsFromSavestate = false;
                    movieToRecord.StartsFromSaveRam   = true;
                    movieToRecord.SaveRam             = core.CloneSaveRam();
                }

                movieToRecord.PopulateWithDefaultHeaderValues(AuthorBox.Text);
                movieToRecord.Save();
                GlobalWin.MainForm.StartNewMovie(movieToRecord, true);

                Global.Config.UseDefaultAuthor = DefaultAuthorCheckBox.Checked;
                if (DefaultAuthorCheckBox.Checked)
                {
                    Global.Config.DefaultAuthor = AuthorBox.Text;
                }

                Close();
            }
            else
            {
                MessageBox.Show("Please select a movie to record", "File selection error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
示例#8
0
        private void Ok_Click(object sender, EventArgs e)
        {
            var path = MakePath();

            if (!string.IsNullOrWhiteSpace(path))
            {
                var test = new FileInfo(path);
                if (test.Exists)
                {
                    var result = DialogController.ShowMessageBox2($"{path} already exists, overwrite?", "Confirm overwrite", EMsgBoxIcon.Warning, useOKCancel: true);
                    if (!result)
                    {
                        return;
                    }
                }

                var movieToRecord = _movieSession.Get(path);

                var fileInfo = new FileInfo(path);
                if (!fileInfo.Exists)
                {
                    Directory.CreateDirectory(fileInfo.DirectoryName);
                }

                if (StartFromCombo.SelectedItem.ToString() == "Now" && _emulator.HasSavestates())
                {
                    var core = _emulator.AsStatable();

                    movieToRecord.StartsFromSavestate = true;

                    if (_config.Savestates.Type == SaveStateType.Binary)
                    {
                        movieToRecord.BinarySavestate = core.CloneSavestate();
                    }
                    else
                    {
                        using var sw = new StringWriter();
                        core.SaveStateText(sw);
                        movieToRecord.TextSavestate = sw.ToString();
                    }

                    // TODO: do we want to support optionally not saving this?
                    movieToRecord.SavestateFramebuffer = Array.Empty <int>();
                    if (_emulator.HasVideoProvider())
                    {
                        movieToRecord.SavestateFramebuffer = (int[])_emulator.AsVideoProvider().GetVideoBuffer().Clone();
                    }
                }
                else if (StartFromCombo.SelectedItem.ToString() == "SaveRam" && _emulator.HasSaveRam())
                {
                    var core = _emulator.AsSaveRam();
                    movieToRecord.StartsFromSaveRam = true;
                    movieToRecord.SaveRam           = core.CloneSaveRam();
                }

                movieToRecord.PopulateWithDefaultHeaderValues(
                    _emulator,
                    _game,
                    _firmwareManager,
                    AuthorBox.Text ?? _config.DefaultAuthor);
                movieToRecord.Save();
                _mainForm.StartNewMovie(movieToRecord, true);

                _config.UseDefaultAuthor = DefaultAuthorCheckBox.Checked;
                if (DefaultAuthorCheckBox.Checked)
                {
                    _config.DefaultAuthor = AuthorBox.Text;
                }

                Close();
            }
            else
            {
                DialogController.ShowMessageBox("Please select a movie to record", "File selection error", EMsgBoxIcon.Error);
            }
        }