From a8ef2f72cec9813a08ae814b1630641ef86a7fed Mon Sep 17 00:00:00 2001 From: ansstuff Date: Mon, 6 Feb 2012 16:57:46 +0000 Subject: [PATCH] * refined Recording, now can safely record commands (Power, Reset, Insert, Switch) * new Lua scripts: SoundDisplay.lua, TrackNoise.lua --- output/luaScripts/SoundDisplay.lua | 57 +++++++++++++ .../luaScripts/taseditor/InvertSelection.lua | 2 +- output/luaScripts/taseditor/Swap1P2P.lua | 1 + output/luaScripts/taseditor/TrackNoise.lua | 79 ++++++++++++++++++ src/driver.h | 2 +- src/drivers/win/taseditor.cpp | 7 ++ src/drivers/win/taseditor.h | 2 + src/drivers/win/taseditor/playback.cpp | 18 +++- src/drivers/win/taseditor/playback.h | 1 + src/drivers/win/taseditor/recorder.cpp | 9 ++ src/drivers/win/taseditor/snapshot.cpp | 5 ++ src/drivers/win/taseditor/snapshot.h | 1 + .../win/taseditor/taseditor_config.cpp | 4 +- src/drivers/win/taseditor/taseditor_lua.cpp | 2 + .../win/taseditor/taseditor_window.cpp | 3 +- src/drivers/win/window.cpp | 2 + src/fceu.cpp | 20 +++-- src/input.cpp | 30 ++++--- src/movie.cpp | 39 +++++---- vc/Help/fceux.hnd | Bin 1409024 -> 1413120 bytes 20 files changed, 240 insertions(+), 44 deletions(-) create mode 100644 output/luaScripts/SoundDisplay.lua create mode 100644 output/luaScripts/taseditor/TrackNoise.lua diff --git a/output/luaScripts/SoundDisplay.lua b/output/luaScripts/SoundDisplay.lua new file mode 100644 index 00000000..3cde7070 --- /dev/null +++ b/output/luaScripts/SoundDisplay.lua @@ -0,0 +1,57 @@ +--------------------------------------------------------------------------- +-- Display Sound Channels data +--------------------------------------------------------------------------- +-- Showcases following functions: +-- * sound.get() +--------------------------------------------------------------------------- +-- Usage: +-- The script allows you to observe raw data of 5 sound channels. +-- Analysing such info you can notice some regularities in how +-- the data oscillates/changes when ingame music plays. +-- Then you can write scripts similar to \taseditor\TrackNoise.lua +-- to facilitate synchronous dances in TAS movies. +--------------------------------------------------------------------------- + +function everyframe() + snd = sound.get(); + + gui.text(0, 8, "Square 1:"); + gui.text(0, 16, snd.rp2a03.square1.volume); + gui.text(0, 24, snd.rp2a03.square1.frequency); + gui.text(0, 32, snd.rp2a03.square1.midikey); + gui.text(0, 40, snd.rp2a03.square1.duty); + gui.text(0, 48, snd.rp2a03.square1.regs.frequency); + + gui.text(128, 8, "Square 2:"); + gui.text(128, 16, snd.rp2a03.square2.volume); + gui.text(128, 24, snd.rp2a03.square2.frequency); + gui.text(128, 32, snd.rp2a03.square2.midikey); + gui.text(128, 40, snd.rp2a03.square2.duty); + gui.text(128, 48, snd.rp2a03.square2.regs.frequency); + + gui.text(0, 64, "Triangle:"); + gui.text(0, 72, snd.rp2a03.triangle.volume); + gui.text(0, 80, snd.rp2a03.triangle.frequency); + gui.text(0, 88, snd.rp2a03.triangle.midikey); + gui.text(0, 96, snd.rp2a03.triangle.regs.frequency); + + gui.text(128, 64, "Noise:"); + gui.text(128, 72, snd.rp2a03.noise.volume); + gui.text(128, 80, tostring(snd.rp2a03.noise.short)); + gui.text(128, 88, snd.rp2a03.noise.frequency); + gui.text(128, 96, snd.rp2a03.noise.midikey); + gui.text(128, 104, snd.rp2a03.noise.regs.frequency); + + gui.text(0, 120, "DPCM:"); + gui.text(0, 128, snd.rp2a03.dpcm.volume); + gui.text(0, 136, snd.rp2a03.dpcm.frequency); + gui.text(0, 144, snd.rp2a03.dpcm.midikey); + gui.text(0, 152, snd.rp2a03.dpcm.dmcaddress); + gui.text(0, 160, snd.rp2a03.dpcm.dmcsize); + gui.text(0, 168, tostring(snd.rp2a03.dpcm.dmcloop)); + gui.text(0, 176, snd.rp2a03.dpcm.dmcseed); + gui.text(0, 184, snd.rp2a03.dpcm.regs.frequency); +end + +emu.registerafter(everyframe); + diff --git a/output/luaScripts/taseditor/InvertSelection.lua b/output/luaScripts/taseditor/InvertSelection.lua index 4fa4745a..16d30ad8 100644 --- a/output/luaScripts/taseditor/InvertSelection.lua +++ b/output/luaScripts/taseditor/InvertSelection.lua @@ -34,7 +34,7 @@ function invert_selection() end if (selection_table ~= nil) then - -- Substract current selection from new selection set + -- Substract old selection from new selection set for i = #old_sel, 1, -1 do selected_frame = old_sel[i]; -- we're taking advantage of the fact that "old_sel" is sorted in ascending order diff --git a/output/luaScripts/taseditor/Swap1P2P.lua b/output/luaScripts/taseditor/Swap1P2P.lua index 85315959..186259b6 100644 --- a/output/luaScripts/taseditor/Swap1P2P.lua +++ b/output/luaScripts/taseditor/Swap1P2P.lua @@ -13,6 +13,7 @@ -- Run the script, unpause emulation (or simply Frame Advance once). -- Now you can select several frames of input data and then -- press "Run function" button to swap inputs of 1P and 2P. +-- You can easily modify the script to swap any other joypads. --------------------------------------------------------------------------- function swap() diff --git a/output/luaScripts/taseditor/TrackNoise.lua b/output/luaScripts/taseditor/TrackNoise.lua new file mode 100644 index 00000000..6fcd52fc --- /dev/null +++ b/output/luaScripts/taseditor/TrackNoise.lua @@ -0,0 +1,79 @@ +--------------------------------------------------------------------------- +-- Tracking Noise channel volume peaks +--------------------------------------------------------------------------- +-- Showcases following functions: +-- * sound.get() +-- * taseditor.markedframe() +-- * taseditor.getmarker() +-- * taseditor.setmarker() +-- * taseditor.getnote() +-- * taseditor.setnote() +--------------------------------------------------------------------------- +-- Usage: +-- Run the script, unpause emulation. +-- When the "Auto function" checkbox is checked, the script will +-- automatically create Markers on various frames according to ingame music. +-- These Markers should help you see music patterns, +-- so you can adjust input precisely creating nice Tool-Assisted dances. +-- +-- This script uses Noise channel volume as an indicator for setting Markers, +-- but it's possible to use any other property of sound channels +-- as a factor to decide whether to set Marker on current frame. +-- +-- The script was tested on Super Mario Bros, Megaman and Duck Tales. +-- You may want to see it in slow-mo. Use -/= hotkeys to change emulation speed. +-- +-- To create customized script for your game, first use SoundDisplay.lua +-- to collect and analyse statistics about ingame music. Then choose +-- which channel you want to sync your input to. Finally, change this script +-- so that Markers will be created using new set of rules. +--------------------------------------------------------------------------- + +NOISE_VOL_FACTOR = 3.0; + +function track_changes() + if (taseditor.engaged()) then + current_frame = movie.framecount(); + if (last_frame ~= current_frame) then + -- Playback has moved + -- Get current value of indicator for current_frame + snd = sound.get(); + indicator = NOISE_VOL_FACTOR * snd.rp2a03.noise.volume; + -- If Playback moved 1 frame forward, this was probably Frame Advance + if (last_frame == current_frame - 1) then + -- Looks like we advanced one frame from the last time + -- Decide whether to set Marker + if (indicator >= 1 and last_frame_indicator_value == 0) then + -- this was a peak in volume! ____/\____ + -- Set Marker and show frequency of noise+triangle in its Note + SetSoundMarker(current_frame - 1, "Sound: " .. (snd.rp2a03.noise.regs.frequency + snd.rp2a03.triangle.regs.frequency)); + end + end + last_frame = current_frame; + last_frame_indicator_value = indicator; + end + end +end + +function SetSoundMarker(frame, new_note) + if (taseditor.markedframe(frame)) then + -- this frame is already marked + old_note = taseditor.getnote(taseditor.getmarker(frame)); + -- check if the Note of the Marker already contains new_note text + if (string.find(old_note, new_note) == nil) then + -- append new_note text to the Marker's Note + taseditor.setnote(taseditor.getmarker(frame), old_note .. " " .. new_note); + end + else + -- this frame isn't marked + -- create new Marker here + new_marker = taseditor.setmarker(frame); + taseditor.setnote(new_marker, new_note); + end +end + +last_frame = 0; +last_frame_indicator_value = 0; + +taseditor.registerauto(track_changes); + diff --git a/src/driver.h b/src/driver.h index aed91bac..5920c6b0 100644 --- a/src/driver.h +++ b/src/driver.h @@ -336,7 +336,7 @@ enum EFCEUI FCEUI_STOPMOVIE, FCEUI_RECORDMOVIE, FCEUI_PLAYMOVIE, FCEUI_OPENGAME, FCEUI_CLOSEGAME, FCEUI_TASEDITOR, - FCEUI_RESET, FCEUI_POWER,FCEUI_PLAYFROMBEGINNING + FCEUI_RESET, FCEUI_POWER, FCEUI_PLAYFROMBEGINNING, FCEUI_EJECT_DISK, FCEUI_SWITCH_DISK }; //checks whether an EFCEUI is valid right now diff --git a/src/drivers/win/taseditor.cpp b/src/drivers/win/taseditor.cpp index 8b8ffb06..faa2c07d 100644 --- a/src/drivers/win/taseditor.cpp +++ b/src/drivers/win/taseditor.cpp @@ -717,3 +717,10 @@ void ClearTaseditorInput() JoystickClearBackgroundAccessBit(JOYBACKACCESS_TASEDITOR); } +// this getter contains formula to decide whether to record or replay movie +bool TaseditorIsRecording() +{ + if (movie_readonly || turbo || playback.pause_frame > currFrameCounter) + return false; // replay + return true; // record +} \ No newline at end of file diff --git a/src/drivers/win/taseditor.h b/src/drivers/win/taseditor.h index 149f50ea..a837f0a8 100644 --- a/src/drivers/win/taseditor.h +++ b/src/drivers/win/taseditor.h @@ -28,3 +28,5 @@ void SetInputType(MovieData& md, int new_input_type); void SetTaseditorInput(); void ClearTaseditorInput(); + +bool TaseditorIsRecording(); diff --git a/src/drivers/win/taseditor/playback.cpp b/src/drivers/win/taseditor/playback.cpp index 50a859c8..c4cb2ed3 100644 --- a/src/drivers/win/taseditor/playback.cpp +++ b/src/drivers/win/taseditor/playback.cpp @@ -120,9 +120,10 @@ void PLAYBACK::update() bookmarks.RedrawChangedBookmarks(lastCursor); list.RedrawRow(currFrameCounter); bookmarks.RedrawChangedBookmarks(currFrameCounter); - // enforce redrawing now lastCursor = currFrameCounter; - UpdateWindow(list.hwndList); + if (taseditor_config.follow_playback && !turbo) + // enforce redrawing now + UpdateWindow(list.hwndList); // lazy update of "Playback's Marker text" int current_marker = markers_manager.GetMarkerUp(currFrameCounter); if (shown_marker != current_marker) @@ -380,6 +381,19 @@ void PLAYBACK::SetProgressbar(int a, int b) { SendMessage(hwndProgressbar, PBM_SETPOS, PROGRESSBAR_WIDTH * a / b, 0); } +void PLAYBACK::ClickOnProgressbar() +{ + // delete lost_position pointer (green arrow) + if (lost_position_frame) + { + int temp = lost_position_frame - 1; + lost_position_frame = 0; + list.RedrawRow(temp); + } + // and stop seeking + if (pause_frame) + SeekingStop(); +} // ------------------------------------------------------------------------- LRESULT APIENTRY UpperMarkerEditWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { diff --git a/src/drivers/win/taseditor/playback.h b/src/drivers/win/taseditor/playback.h index d204c2b1..32c0c70c 100644 --- a/src/drivers/win/taseditor/playback.h +++ b/src/drivers/win/taseditor/playback.h @@ -38,6 +38,7 @@ public: int GetFlashingPauseFrame(); void SetProgressbar(int a, int b); + void ClickOnProgressbar(); bool JumpToFrame(int index); diff --git a/src/drivers/win/taseditor/recorder.cpp b/src/drivers/win/taseditor/recorder.cpp index f1eb23af..c0c20545 100644 --- a/src/drivers/win/taseditor/recorder.cpp +++ b/src/drivers/win/taseditor/recorder.cpp @@ -220,6 +220,15 @@ void RECORDER::InputChanged() list.SetHeaderColumnLight(COLUMN_JOYPAD1_A + joy * NUM_JOYPAD_BUTTONS + button, HEADER_LIGHT_MAX); } } + + if (!changes_made) + { + // check if new commands were recorded + if (currMovieData.records[currFrameCounter].commands != history.GetCurrentSnapshot().GetCommandsInfo(currFrameCounter)) + changes_made = true; + } + + // register changes if (changes_made) { history.RegisterRecording(currFrameCounter); diff --git a/src/drivers/win/taseditor/snapshot.cpp b/src/drivers/win/taseditor/snapshot.cpp index f26ad9cd..02fc6aa1 100644 --- a/src/drivers/win/taseditor/snapshot.cpp +++ b/src/drivers/win/taseditor/snapshot.cpp @@ -470,6 +470,11 @@ int SNAPSHOT::GetJoystickInfo(int frame, int joy) } return 0; } +int SNAPSHOT::GetCommandsInfo(int frame) +{ + if (frame < 0 || frame >= size) return 0; + return commands[frame]; +} void SNAPSHOT::insertFrames(int at, int frames) { diff --git a/src/drivers/win/taseditor/snapshot.h b/src/drivers/win/taseditor/snapshot.h index cef56f90..7bf471d5 100644 --- a/src/drivers/win/taseditor/snapshot.h +++ b/src/drivers/win/taseditor/snapshot.h @@ -36,6 +36,7 @@ public: int findFirstChange(MovieData& md, int start = 0, int end = -1); int GetJoystickInfo(int frame, int joy); + int GetCommandsInfo(int frame); void insertFrames(int at, int frames); void eraseFrame(int frame); diff --git a/src/drivers/win/taseditor/taseditor_config.cpp b/src/drivers/win/taseditor/taseditor_config.cpp index 5f267c00..18849ae6 100644 --- a/src/drivers/win/taseditor/taseditor_config.cpp +++ b/src/drivers/win/taseditor/taseditor_config.cpp @@ -11,8 +11,8 @@ TASEDITOR_CONFIG::TASEDITOR_CONFIG() wndheight = 0; findnote_wndx = 0; findnote_wndy = 0; - follow_playback = true; - turbo_seek = true; + follow_playback = false; + turbo_seek = false; show_lag_frames = true; show_markers = true; show_branch_screenshots = true; diff --git a/src/drivers/win/taseditor/taseditor_lua.cpp b/src/drivers/win/taseditor/taseditor_lua.cpp index daf9808f..b66cab91 100644 --- a/src/drivers/win/taseditor/taseditor_lua.cpp +++ b/src/drivers/win/taseditor/taseditor_lua.cpp @@ -116,6 +116,7 @@ int TASEDITOR_LUA::setmarker(int frame) // new marker was created - register changes in TAS Editor history.RegisterMarkersChange(MODTYPE_LUA_MARKER_SET, frame); selection.must_find_current_marker = playback.must_find_current_marker = true; + list.RedrawRow(frame); list.SetHeaderColumnLight(COLUMN_FRAMENUM, HEADER_LIGHT_MAX); } } @@ -135,6 +136,7 @@ void TASEDITOR_LUA::clearmarker(int frame) // marker was deleted - register changes in TAS Editor history.RegisterMarkersChange(MODTYPE_LUA_MARKER_UNSET, frame); selection.must_find_current_marker = playback.must_find_current_marker = true; + list.RedrawRow(frame); list.SetHeaderColumnLight(COLUMN_FRAMENUM, HEADER_LIGHT_MAX); } } diff --git a/src/drivers/win/taseditor/taseditor_window.cpp b/src/drivers/win/taseditor/taseditor_window.cpp index 6ce759ff..916e19b6 100644 --- a/src/drivers/win/taseditor/taseditor_window.cpp +++ b/src/drivers/win/taseditor/taseditor_window.cpp @@ -1105,8 +1105,7 @@ BOOL CALLBACK WndprocTasEditor(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP taseditor_window.UpdateCheckedItems(); break; case IDC_PROGRESS_BUTTON: - // click on progressbar - stop seeking - if (playback.pause_frame) playback.SeekingStop(); + playback.ClickOnProgressbar(); break; case IDC_BRANCHES_BUTTON: // click on "Bookmarks/Branches" - switch "View Tree of branches" diff --git a/src/drivers/win/window.cpp b/src/drivers/win/window.cpp index de326467..91d14ff3 100644 --- a/src/drivers/win/window.cpp +++ b/src/drivers/win/window.cpp @@ -2275,6 +2275,8 @@ adelikat: Outsourced this to a remappable hotkey UpdateMenuHotkeys(); EnableMenuItem(fceumenu,MENU_RESET,MF_BYCOMMAND | (FCEU_IsValidUI(FCEUI_RESET)?MF_ENABLED:MF_GRAYED)); EnableMenuItem(fceumenu,MENU_POWER,MF_BYCOMMAND | (FCEU_IsValidUI(FCEUI_POWER)?MF_ENABLED:MF_GRAYED)); + EnableMenuItem(fceumenu,MENU_EJECT_DISK,MF_BYCOMMAND | (FCEU_IsValidUI(FCEUI_EJECT_DISK)?MF_ENABLED:MF_GRAYED)); + EnableMenuItem(fceumenu,MENU_SWITCH_DISK,MF_BYCOMMAND | (FCEU_IsValidUI(FCEUI_SWITCH_DISK)?MF_ENABLED:MF_GRAYED)); EnableMenuItem(fceumenu,MENU_TASEDITOR,MF_BYCOMMAND | (FCEU_IsValidUI(FCEUI_TASEDITOR)?MF_ENABLED:MF_GRAYED)); EnableMenuItem(fceumenu,MENU_CLOSE_FILE,MF_BYCOMMAND | (FCEU_IsValidUI(FCEUI_CLOSEGAME) && GameInfo ?MF_ENABLED:MF_GRAYED)); EnableMenuItem(fceumenu,MENU_RECENT_FILES,MF_BYCOMMAND | ((FCEU_IsValidUI(FCEUI_OPENGAME) && HasRecentFiles()) ?MF_ENABLED:MF_GRAYED)); //adelikat - added && recent_files, otherwise this line prevents recent from ever being gray when TAS Editor is not engaged diff --git a/src/fceu.cpp b/src/fceu.cpp index ccace72f..333485df 100644 --- a/src/fceu.cpp +++ b/src/fceu.cpp @@ -55,6 +55,8 @@ #include "drivers/win/taseditor/greenzone.h" extern GREENZONE greenzone; + +extern bool TaseditorIsRecording(); #endif #include @@ -740,6 +742,8 @@ void ResetNES(void) // clear back baffer extern uint8 *XBackBuf; memset(XBackBuf,0,256*256); + + FCEU_DispMessage("Reset", 0); } void FCEU_MemoryRand(uint8 *ptr, uint32 size) @@ -813,6 +817,7 @@ void PowerNES(void) #ifdef WIN32 Update_RAM_Search(); // Update_RAM_Watch() is also called. #endif + FCEU_DispMessage("Power on", 0); } void FCEU_ResetVidSys(void) @@ -1031,25 +1036,28 @@ bool FCEU_IsValidUI(EFCEUI ui) break; case FCEUI_STOPMOVIE: - case FCEUI_PLAYFROMBEGINNING: return (FCEUMOV_Mode(MOVIEMODE_PLAY|MOVIEMODE_RECORD|MOVIEMODE_FINISHED)); + case FCEUI_PLAYFROMBEGINNING: + return (FCEUMOV_Mode(MOVIEMODE_PLAY|MOVIEMODE_RECORD|MOVIEMODE_TASEDITOR|MOVIEMODE_FINISHED)); + case FCEUI_STOPAVI: return FCEUI_AviIsRecording(); case FCEUI_TASEDITOR: if(!GameInfo) return false; - if(FCEUMOV_Mode(MOVIEMODE_TASEDITOR)) return false; + if(FCEUMOV_Mode(MOVIEMODE_TASEDITOR)) return false; // can't run two TAS Editors break; case FCEUI_RESET: - if(!GameInfo) return false; - if(FCEUMOV_Mode(MOVIEMODE_FINISHED|MOVIEMODE_TASEDITOR|MOVIEMODE_PLAY)) return false; - break; - case FCEUI_POWER: + case FCEUI_EJECT_DISK: + case FCEUI_SWITCH_DISK: if(!GameInfo) return false; if(FCEUMOV_Mode(MOVIEMODE_RECORD)) return true; +#ifdef WIN32 + if(FCEUMOV_Mode(MOVIEMODE_TASEDITOR) && TaseditorIsRecording()) return true; +#endif if(!FCEUMOV_Mode(MOVIEMODE_INACTIVE)) return false; break; diff --git a/src/input.cpp b/src/input.cpp index 510bb58a..791aec5f 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -553,23 +553,31 @@ void FCEU_QSimpleCommand(int cmd) FCEUNET_SendCommand(cmd, 0); else { - FCEU_DoSimpleCommand(cmd); - if(FCEUMOV_Mode(MOVIEMODE_RECORD)) + if(!FCEUMOV_Mode(MOVIEMODE_TASEDITOR)) // TAS Editor will do the command himself + FCEU_DoSimpleCommand(cmd); + if(FCEUMOV_Mode(MOVIEMODE_RECORD|MOVIEMODE_TASEDITOR)) FCEUMOV_AddCommand(cmd); } } void FCEUI_FDSSelect(void) { + if(!FCEU_IsValidUI(FCEUI_SWITCH_DISK)) + return; + + FCEU_DispMessage("Command: Switch disk side", 0); FCEU_QSimpleCommand(FCEUNPCMD_FDSSELECT); } void FCEUI_FDSInsert(void) { + if(!FCEU_IsValidUI(FCEUI_EJECT_DISK)) + return; + + FCEU_DispMessage("Command: Insert/Eject disk", 0); FCEU_QSimpleCommand(FCEUNPCMD_FDSINSERT); } - void FCEUI_VSUniToggleDIP(int w) { FCEU_QSimpleCommand(FCEUNPCMD_VSUNIDIP0 + w); @@ -593,9 +601,10 @@ void FCEUI_ResetNES(void) { if(!FCEU_IsValidUI(FCEUI_RESET)) return; + + FCEU_DispMessage("Command: Soft reset", 0); FCEU_QSimpleCommand(FCEUNPCMD_RESET); ResetFrameCounter(); - FCEU_DispMessage("Soft reset", 0); } //Powers off the NES @@ -603,9 +612,10 @@ void FCEUI_PowerNES(void) { if(!FCEU_IsValidUI(FCEUI_POWER)) return; + + FCEU_DispMessage("Command: Power switch", 0); FCEU_QSimpleCommand(FCEUNPCMD_POWER); ResetFrameCounter(); - FCEU_DispMessage("Power switch", 0); } const char* FCEUI_CommandTypeNames[]= @@ -663,8 +673,8 @@ static void TaseditorRestorePlayback(void); struct EMUCMDTABLE FCEUI_CommandTable[]= { - { EMUCMD_POWER, EMUCMDTYPE_MISC, FCEUI_PowerNES, 0, 0, "Power", 0 }, - { EMUCMD_RESET, EMUCMDTYPE_MISC, FCEUI_ResetNES, 0, 0, "Reset", 0 }, + { EMUCMD_POWER, EMUCMDTYPE_MISC, FCEUI_PowerNES, 0, 0, "Power", EMUCMDFLAG_TASEDITOR }, + { EMUCMD_RESET, EMUCMDTYPE_MISC, FCEUI_ResetNES, 0, 0, "Reset", EMUCMDFLAG_TASEDITOR }, { EMUCMD_PAUSE, EMUCMDTYPE_MISC, FCEUI_ToggleEmulationPause, 0, 0, "Pause", EMUCMDFLAG_TASEDITOR }, { EMUCMD_FRAME_ADVANCE, EMUCMDTYPE_MISC, FCEUI_FrameAdvance, FCEUI_FrameAdvanceEnd, 0, "Frame Advance", EMUCMDFLAG_TASEDITOR }, { EMUCMD_SCREENSHOT, EMUCMDTYPE_MISC, FCEUI_SaveSnapshot, 0, 0, "Screenshot", EMUCMDFLAG_TASEDITOR }, @@ -737,8 +747,8 @@ struct EMUCMDTABLE FCEUI_CommandTable[]= { EMUCMD_AVI_RECORD_AS, EMUCMDTYPE_AVI, FCEUD_AviRecordTo, 0, 0, "Record AVI As...", 0 }, { EMUCMD_AVI_STOP, EMUCMDTYPE_AVI, FCEUD_AviStop, 0, 0, "Stop AVI", 0 }, - { EMUCMD_FDS_EJECT_INSERT, EMUCMDTYPE_FDS, FCEUI_FDSInsert, 0, 0, "Eject or Insert FDS Disk", 0 }, - { EMUCMD_FDS_SIDE_SELECT, EMUCMDTYPE_FDS, FCEUI_FDSSelect, 0, 0, "Switch FDS Disk Side", 0 }, + { EMUCMD_FDS_EJECT_INSERT, EMUCMDTYPE_FDS, FCEUI_FDSInsert, 0, 0, "Eject or Insert FDS Disk", EMUCMDFLAG_TASEDITOR }, + { EMUCMD_FDS_SIDE_SELECT, EMUCMDTYPE_FDS, FCEUI_FDSSelect, 0, 0, "Switch FDS Disk Side", EMUCMDFLAG_TASEDITOR }, { EMUCMD_VSUNI_COIN, EMUCMDTYPE_VSUNI, FCEUI_VSUniCoin, 0, 0, "Insert Coin", 0 }, { EMUCMD_VSUNI_TOGGLE_DIP_0, EMUCMDTYPE_VSUNI, CommandToggleDip, 0, 0, "Toggle Dipswitch 0", 0 }, @@ -759,7 +769,7 @@ struct EMUCMDTABLE FCEUI_CommandTable[]= { EMUCMD_MISC_DISPLAY_BG_TOGGLE, EMUCMDTYPE_MISC, BackgroundDisplayToggle, 0, 0, "Toggle Background Display", 0 }, { EMUCMD_MISC_DISPLAY_OBJ_TOGGLE, EMUCMDTYPE_MISC, ObjectDisplayToggle, 0, 0, "Toggle Object Display", 0 }, { EMUCMD_MISC_DISPLAY_LAGCOUNTER_TOGGLE,EMUCMDTYPE_MISC, LagCounterToggle, 0, 0, "Lag Counter Toggle", EMUCMDFLAG_TASEDITOR }, - { EMUCMD_MISC_OPENTASEDITOR, EMUCMDTYPE_TOOL, LaunchTasEditor, 0, 0, "Open TAS Editor", 0}, + { EMUCMD_MISC_OPENTASEDITOR, EMUCMDTYPE_TOOL, LaunchTasEditor, 0, 0, "Open TAS Editor", 0}, { EMUCMD_TOOL_OPENMEMORYWATCH, EMUCMDTYPE_TOOL, LaunchMemoryWatch,0, 0, "Open Memory Watch", EMUCMDFLAG_TASEDITOR }, { EMUCMD_TOOL_OPENCHEATS, EMUCMDTYPE_TOOL, LaunchCheats, 0, 0, "Open Cheats", 0}, { EMUCMD_TOOL_OPENDEBUGGER, EMUCMDTYPE_TOOL, LaunchDebugger, 0, 0, "Open Debugger", 0}, diff --git a/src/movie.cpp b/src/movie.cpp index 570fe008..76c26b93 100644 --- a/src/movie.cpp +++ b/src/movie.cpp @@ -44,6 +44,8 @@ extern void AddRecentMovieFile(const char *filename); #include "./drivers/win/taseditor/recorder.h" extern PLAYBACK playback; extern RECORDER recorder; + +extern bool TaseditorIsRecording(); #endif using namespace std; @@ -984,27 +986,27 @@ void FCEUMOV_AddInputState() currMovieData.insertEmpty(-1, 2 + currFrameCounter - (int)currMovieData.records.size()); MovieRecord* mr = &currMovieData.records[currFrameCounter]; - if(movie_readonly || turbo || playback.pause_frame > currFrameCounter) + if(TaseditorIsRecording()) { - // replay buttons - if(mr->command_reset()) - ResetNES(); - if(mr->command_fds_insert()) - FCEU_FDSInsert(); - if(mr->command_fds_select()) - FCEU_FDSSelect(); - joyports[0].load(mr); - joyports[1].load(mr); - } else - { - // record buttons + // record commands and buttons + mr->commands |= _currCommand; joyports[0].log(mr); joyports[1].log(mr); recorder.InputChanged(); - // return data from movie to joyports in case Recorder changed it (for example, by applying Superimpose) - joyports[0].load(mr); - joyports[1].load(mr); + // replay buttons even when Recording - return data from movie to joyports in case Recorder changed it (for example, by applying Superimpose) } + // replay buttons + joyports[0].load(mr); + joyports[1].load(mr); + // replay commands + if(mr->command_power()) + PowerNES(); + if(mr->command_reset()) + ResetNES(); + if(mr->command_fds_insert()) + FCEU_FDSInsert(); + if(mr->command_fds_select()) + FCEU_FDSSelect(); _currCommand = 0; } else #endif @@ -1022,13 +1024,10 @@ void FCEUMOV_AddInputState() //reset and power cycle if necessary if(mr->command_power()) PowerNES(); - if(mr->command_reset()) ResetNES(); - if(mr->command_fds_insert()) FCEU_FDSInsert(); - if(mr->command_fds_select()) FCEU_FDSSelect(); @@ -1083,7 +1082,7 @@ void FCEUMOV_AddInputState() void FCEUMOV_AddCommand(int cmd) { // do nothing if not recording a movie - if(movieMode != MOVIEMODE_RECORD) + if(movieMode != MOVIEMODE_RECORD && movieMode != MOVIEMODE_TASEDITOR) return; //NOTE: EMOVIECMD matches FCEUNPCMD_RESET and FCEUNPCMD_POWER diff --git a/vc/Help/fceux.hnd b/vc/Help/fceux.hnd index 191d793ce83ec102b73d51ac5dc0f5de04fcbf5f..eb8b927aa06cc40e78ee2e36a139e415b4f3f01e 100644 GIT binary patch delta 782 zcmXYvT}V_x6vt<-ch{Y9ukN+IYI&_yA5zfDb=9b_H7YbLKT^vuxJh7v*}6sq1+Aes z1W9elDL?Y2CWMGvkO!ees)q!FvZ!0JuHf?mRh&YBOu891EtKj(jDLZP~lRo9!U zln_Ge2_g58#J;Q|TGDQG8nn}pI*pj8hCH^D&I+|#P8DTe6Wn6@I@6))1{+Yo*2_|) zo768OHpGs^A`YN_Ci%-ykf_K2GKdTz!^nMP1hJ3@$S5*~j3W;bf%M~4C-AEx#Iato)(+!$;k21AUo&SA?F# zU3a?p73f}Ny%hICD?tAp)ogh!*$%mSXJ8b@(>KzNi((&75kDtoyYT08JNUhPUJ;S~Hmu6qsHy?|Kvb)xg4c+5 ze$4@f!JbhYHm}VR>8DsS_!?QXdzH31YQ7Hi>Zpa4R|#Cmr}1SxhPJlup%nB+Z7ojn zc}1WJzhq&H_J)du%WMd&0J}yf49(MTxNTqyXd?-!g}DDbQbhKUUBruLKG{unkOJZ( Jh2hr0l7F57+s^<1 delta 822 zcmXZaT}TvB6ae6v+1YXK-Q96^y(3$0+u}=Bx`I(rnNFc1`L|kb5{4I|SMeqGtH-ZC?R~Q?B~qZ!}oH}FNd4SrZbuJjiQjNC~60( zR}>{YSh81jdu6{=`=!<|eNUu*w_L4-!7Ez9lOo@S1&_|=nP4^;At=fBy}zitI`I>O z{TG}S#PGw|`ce>0AC@)JI=YlV)93+zx3)r>G~JT=NjROs2K zGk7=@u%T;Q1Tl0iu&zSa8OMbA>j49Iji1Ruu9}T=yA)5{|m>mdk zEPu=@yrd?SFTJFtAz|b95n*b$h42bNXw(+d&RFt$ovyyq0kuk;MDLT*F(gh)biT|^<<%o4ZOcm#Xq z#0?c=-&n0Tv=!xVZ)o=$&A_!K5!S$+Gz^&AZF5*IwoHtzh|*l+Hk20k=6#`g@Tbx; zusFi2a89RN7n>89PrWr