From e0e0f72d2f0fa5c5c53a2d1c3924bf41e941c648 Mon Sep 17 00:00:00 2001 From: ansstuff Date: Mon, 12 Sep 2011 12:23:48 +0000 Subject: [PATCH] * saving and loading tweakCount in .tas and fm2 * Added string "Tweak Count" to Replay loading dialog * Tasedit: View - "Show Tweak count" * Tasedit: rewrote project save/load functions * Tasedit: fixed old bug caused by not initializing input ports * Tasedit: checking movie fourscore flag when creating/opening project; only show columns for pads 3 and 4 if fourscore is attached --- src/drawing.cpp | 2 +- src/drivers/win/config.cpp | 2 + src/drivers/win/input.cpp | 6 +- src/drivers/win/replay.cpp | 3 + src/drivers/win/res.rc | 131 +++++++++------ src/drivers/win/resource.h | 8 +- src/drivers/win/tasedit.cpp | 161 ++++++++++++------ src/drivers/win/tasedit.h | 6 +- src/drivers/win/taseditlib/taseditproj.cpp | 13 +- src/input.cpp | 2 +- src/movie.cpp | 187 +++++++++++---------- src/movie.h | 10 +- 12 files changed, 324 insertions(+), 207 deletions(-) diff --git a/src/drawing.cpp b/src/drawing.cpp index 9c3a2bea..79b82dff 100644 --- a/src/drawing.cpp +++ b/src/drawing.cpp @@ -420,7 +420,7 @@ void DrawTextTransWH(uint8 *dest, uint32 width, uint8 *textmsg, uint8 fgcolor, i wid = JoedCharWidth(*textmsg); int newx = x+wid; - if(newx >= width) { x=beginx; y+=8; } + if(newx >= (int)width) { x=beginx; y+=8; } for(int ny=0; ny<7; ++ny) { diff --git a/src/drivers/win/config.cpp b/src/drivers/win/config.cpp index e7ad4e57..82d3d67d 100644 --- a/src/drivers/win/config.cpp +++ b/src/drivers/win/config.cpp @@ -69,6 +69,7 @@ extern bool fullSaveStateLoads; extern int frameSkipAmt; extern bool TASEdit_follow_playback; extern bool TASEdit_show_lag_frames; +extern bool TASEdit_show_tweak_count; //window positions and sizes: extern int ChtPosX,ChtPosY; @@ -286,6 +287,7 @@ static CFGSTRUCT fceuconfig[] = { AC(DesynchAutoFire), AC(TASEdit_follow_playback), AC(TASEdit_show_lag_frames), + AC(TASEdit_show_tweak_count), AC(lagCounterDisplay), AC(oldInputDisplay), AC(movieSubtitles), diff --git a/src/drivers/win/input.cpp b/src/drivers/win/input.cpp index f5eaf2df..eaa8956d 100644 --- a/src/drivers/win/input.cpp +++ b/src/drivers/win/input.cpp @@ -463,10 +463,12 @@ void InitInputPorts(bool fourscore) int attrib; - if(fourscore) { + if(fourscore) + { FCEUI_SetInput(0,SI_GAMEPAD,&JSreturn,0); FCEUI_SetInput(1,SI_GAMEPAD,&JSreturn,0); - } else { + } else + { for(int i=0;i<2;i++) { attrib=0; diff --git a/src/drivers/win/replay.cpp b/src/drivers/win/replay.cpp index 0b5a49ea..62fe399e 100644 --- a/src/drivers/win/replay.cpp +++ b/src/drivers/win/replay.cpp @@ -177,6 +177,8 @@ void UpdateReplayDialog(HWND hwndDlg) sprintf(tmp, "%u", (unsigned)info.rerecord_count); SetWindowTextA(GetDlgItem(hwndDlg,IDC_LABEL_UNDOCOUNT), tmp); // rerecord + sprintf(tmp, "%u", (unsigned)info.tweak_count); + SetWindowTextA(GetDlgItem(hwndDlg,IDC_LABEL_TWEAKCOUNT), tmp); SendDlgItemMessage(hwndDlg,IDC_CHECK_READONLY,BM_SETCHECK,(replayReadOnlySetting ? BST_CHECKED : BST_UNCHECKED), 0); @@ -271,6 +273,7 @@ void UpdateReplayDialog(HWND hwndDlg) SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_LENGTH),""); SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_FRAMES),""); SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_UNDOCOUNT),""); + SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_TWEAKCOUNT),""); SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMUSED),""); SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMCHECKSUM),""); SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_RECORDEDFROM),""); diff --git a/src/drivers/win/res.rc b/src/drivers/win/res.rc index ae72cd95..f538a873 100644 --- a/src/drivers/win/res.rc +++ b/src/drivers/win/res.rc @@ -12,13 +12,11 @@ #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// Neutral resources +// Нейтральный resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU) -#ifdef _WIN32 LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL -#pragma code_page(1252) -#endif //_WIN32 +#pragma code_page(1251) ///////////////////////////////////////////////////////////////////////////// // @@ -35,7 +33,7 @@ ICON_2 ICON "res/ICON_2.ico" // Menu // -FCEUMENU MENU +FCEUMENU MENU BEGIN POPUP "&File" BEGIN @@ -213,7 +211,7 @@ BEGIN END END -TASEDITMENU MENU +TASEDITMENU MENU BEGIN POPUP "&File" BEGIN @@ -246,9 +244,10 @@ BEGIN END POPUP "&View" BEGIN - MENUITEM "Show &lag frames", ID_VIEW_SHOW_LAG_FRAMES + MENUITEM "Highlight &lag frames", ID_VIEW_SHOW_LAG_FRAMES + MENUITEM "Show T&weak count", ID_VIEW_SHOW_TWEAK_COUNT MENUITEM SEPARATOR - MENUITEM "&Follow playback", ID_VIEW_FOLLOW_PLAYBACK + MENUITEM "&Follow playback", ID_VIEW_FOLLOW_PLAYBACK END POPUP "&Help" BEGIN @@ -256,7 +255,7 @@ BEGIN END END -MEMVIEWMENU MENU +MEMVIEWMENU MENU BEGIN POPUP "&File" BEGIN @@ -299,7 +298,7 @@ BEGIN END END -MEMWATCHMENU MENU +MEMWATCHMENU MENU BEGIN POPUP "&File " BEGIN @@ -326,7 +325,7 @@ BEGIN END END -TASEDITCONTEXTMENUS MENU +TASEDITCONTEXTMENUS MENU BEGIN POPUP "Stray" BEGIN @@ -349,7 +348,7 @@ BEGIN END END -FCEUCONTEXTMENUS MENU +FCEUCONTEXTMENUS MENU BEGIN POPUP "Game+Movie+readonly" BEGIN @@ -410,7 +409,7 @@ BEGIN END END -RAMWATCH_MENU MENU +RAMWATCH_MENU MENU BEGIN POPUP "File" BEGIN @@ -439,7 +438,7 @@ BEGIN END END -CHEATCONTEXTMENUS MENU +CHEATCONTEXTMENUS MENU BEGIN POPUP "CheatListPopup" BEGIN @@ -450,7 +449,7 @@ BEGIN END END -DEBUGCONTEXTMENUS MENU +DEBUGCONTEXTMENUS MENU BEGIN POPUP "DebugListPopup" BEGIN @@ -458,7 +457,7 @@ BEGIN END END -LUAWINDOW_MENU MENU +LUAWINDOW_MENU MENU BEGIN POPUP "Console" BEGIN @@ -518,7 +517,7 @@ BEGIN LTEXT "Avi Output",IDC_STATIC,10,208,34,8 END -DWBDIALOG DIALOG 33, 99, 250, 56 +DWBDIALOG DIALOG 33, 99, 250, 56 STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "DWB!" FONT 8, "MS Sans Serif" @@ -528,7 +527,7 @@ BEGIN PUSHBUTTON "Close",BTN_CLOSE,188,33,50,14 END -FKBDIALOG DIALOG 13, 72, 402, 194 +FKBDIALOG DIALOG 13, 72, 402, 194 STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Family Keyboard Configuration" FONT 8, "MS Sans Serif" @@ -708,7 +707,7 @@ BEGIN "Button",BS_AUTOCHECKBOX,174,18,142,12 END -MAHJONGDIALOG DIALOG 65510, 106, 340, 110 +MAHJONGDIALOG DIALOG 65510, 106, 340, 110 STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "mahjong" FONT 8, "MS Sans Serif" @@ -809,7 +808,7 @@ BEGIN CTEXT "Tint",65463,123,34,85,8 END -POWERPADDIALOG DIALOG 30, 123, 131, 119 +POWERPADDIALOG DIALOG 30, 123, 131, 119 STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Power Pad Configuration" FONT 8, "MS Sans Serif" @@ -830,7 +829,7 @@ BEGIN PUSHBUTTON "12",311,91,59,16,12 END -QUIZKINGDIALOG DIALOG 30, 123, 160, 74 +QUIZKINGDIALOG DIALOG 30, 123, 160, 74 STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "quiz king" FONT 8, "MS Sans Serif" @@ -1296,41 +1295,43 @@ BEGIN RTEXT "Author:",65502,18,43,34,10,SS_CENTERIMAGE | NOT WS_GROUP,WS_EX_RIGHT END -IDD_REPLAYINP DIALOGEX 0, 0, 300, 218 +IDD_REPLAYINP DIALOGEX 0, 0, 300, 215 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Play Movie" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - DEFPUSHBUTTON "OK",1,193,192,50,14 - GROUPBOX "",65497,3,0,293,183 + DEFPUSHBUTTON "OK",1,187,197,50,14 + GROUPBOX "",65497,3,0,293,192 RTEXT "File:",65498,8,11,24,10,SS_CENTERIMAGE | NOT WS_GROUP COMBOBOX IDC_COMBO_FILENAME,35,10,257,128,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Cancel",2,247,192,50,14 + PUSHBUTTON "Cancel",2,241,197,50,14 RTEXT "Length:",64397,10,67,59,8 RTEXT "Frames:",65496,10,78,59,8 RTEXT "Record Count:",65495,10,89,59,8 - RTEXT "ROM Used:",65493,10,111,59,8 - RTEXT "ROM Checksum:",65492,10,121,59,8 - RTEXT "Recorded From:",65491,10,100,59,8 - RTEXT "Emulator Used:",65490,10,143,59,8 - RTEXT "Current ROM Sum:",65489,8,132,61,8 + RTEXT "ROM Used:",65493,10,122,59,8 + RTEXT "ROM Checksum:",65492,10,133,59,8 + RTEXT "Recorded From:",65491,10,111,59,8 + RTEXT "Emulator Used:",65490,10,155,59,8 + RTEXT "Current ROM Sum:",65489,8,144,61,8 CONTROL "Pause movie at frame",IDC_CHECK_STOPMOVIE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,49,83,10 EDITTEXT IDC_EDIT_STOPFRAME,103,47,35,12,ES_AUTOHSCROLL | ES_NUMBER GROUPBOX "Parameters",IDC_STATIC,13,25,278,40 PUSHBUTTON "Metadata...",IDC_BUTTON_METADATA,239,71,50,14 - EDITTEXT IDC_LABEL_EMULATORUSED,76,143,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - EDITTEXT IDC_LABEL_CURRCHECKSUM,76,132,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - EDITTEXT IDC_LABEL_ROMCHECKSUM,76,122,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - EDITTEXT IDC_LABEL_ROMUSED,76,111,187,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - EDITTEXT IDC_LABEL_RECORDEDFROM,76,100,123,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP + EDITTEXT IDC_LABEL_EMULATORUSED,76,155,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP + EDITTEXT IDC_LABEL_CURRCHECKSUM,76,144,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP + EDITTEXT IDC_LABEL_ROMCHECKSUM,76,133,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP + EDITTEXT IDC_LABEL_ROMUSED,76,122,187,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP + EDITTEXT IDC_LABEL_RECORDEDFROM,76,111,123,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP CONTROL "Open &Read-Only",IDC_CHECK_READONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,36,69,10 EDITTEXT IDC_LABEL_UNDOCOUNT,76,89,59,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP EDITTEXT IDC_LABEL_FRAMES,76,78,59,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP EDITTEXT IDC_LABEL_LENGTH,76,67,59,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - RTEXT "Pal:",65494,10,153,59,8 - EDITTEXT IDC_LABEL_PALUSED,76,153,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - RTEXT "New PPU:",65499,10,164,59,8 - EDITTEXT IDC_LABEL_NEWPPUUSED,76,164,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP + RTEXT "Pal:",65494,10,166,59,8 + EDITTEXT IDC_LABEL_PALUSED,76,166,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP + RTEXT "New PPU:",65499,10,177,59,8 + EDITTEXT IDC_LABEL_NEWPPUUSED,76,177,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP + RTEXT "Tweak Count:",65500,10,100,59,8 + EDITTEXT IDC_LABEL_TWEAKCOUNT,76,100,59,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP END TASEDIT DIALOGEX 0, 0, 474, 383 @@ -1686,7 +1687,7 @@ BEGIN PUSHBUTTON "&Cancel",IDCANCEL,120,80,50,14 END -IDD_PROMPT DIALOG 0, 0, 186, 68 +IDD_PROMPT DIALOG 0, 0, 186, 68 STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Input Prompt" FONT 8, "Ms Shell Dlg 2" @@ -1703,7 +1704,7 @@ END // #ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO +GUIDELINES DESIGNINFO BEGIN "DIRCONFIG", DIALOG BEGIN @@ -1712,6 +1713,18 @@ BEGIN TOPMARGIN, 8 END + "DWBDIALOG", DIALOG + BEGIN + END + + "FKBDIALOG", DIALOG + BEGIN + END + + "GAMEPADDIALOG", DIALOG + BEGIN + END + "GUICONFIG", DIALOG BEGIN LEFTMARGIN, 10 @@ -1728,6 +1741,14 @@ BEGIN BOTTOMMARGIN, 191 END + "MAHJONGDIALOG", DIALOG + BEGIN + END + + "MAPINPUT", DIALOG + BEGIN + END + "MESSAGELOG", DIALOG BEGIN BOTTOMMARGIN, 184 @@ -1773,6 +1794,10 @@ BEGIN BOTTOMMARGIN, 208 END + "DWBDIALOGSIMPLE", DIALOG + BEGIN + END + "MEMWATCH", DIALOG BEGIN RIGHTMARGIN, 260 @@ -1791,6 +1816,10 @@ BEGIN BOTTOMMARGIN, 121 END + "GGCONV", DIALOG + BEGIN + END + "MONITOR", DIALOG BEGIN LEFTMARGIN, 7 @@ -1814,7 +1843,7 @@ BEGIN "IDD_REPLAYINP", DIALOG BEGIN - BOTTOMMARGIN, 214 + BOTTOMMARGIN, 211 END "TASEDIT", DIALOG @@ -1841,6 +1870,10 @@ BEGIN BOTTOMMARGIN, 66 END + "CDLOGGER", DIALOG + BEGIN + END + "ARCHIVECHOOSERDIALOG", DIALOG BEGIN LEFTMARGIN, 7 @@ -1875,18 +1908,16 @@ BEGIN END #endif // APSTUDIO_INVOKED -#endif // Neutral resources +#endif // Нейтральный resources ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources +// Английский (США) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) -#endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // @@ -1909,7 +1940,7 @@ END // #ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO +GUIDELINES DESIGNINFO BEGIN "IDD_REPLAY_METADATA", DIALOG BEGIN @@ -1951,7 +1982,7 @@ END // Accelerator // -IDR_ACCELERATOR1 ACCELERATORS +IDR_ACCELERATOR1 ACCELERATORS BEGIN "B", ACCEL_CTRL_B, VIRTKEY, CONTROL, NOINVERT VK_DELETE, ACCEL_CTRL_DELETE, VIRTKEY, CONTROL, NOINVERT @@ -1965,7 +1996,7 @@ BEGIN "W", ACCEL_CTRL_W, VIRTKEY, CONTROL, NOINVERT END -IDR_RWACCELERATOR ACCELERATORS +IDR_RWACCELERATOR ACCELERATORS BEGIN "N", RAMMENU_FILE_NEW, VIRTKEY, CONTROL "O", RAMMENU_FILE_OPEN, VIRTKEY, CONTROL @@ -1986,7 +2017,7 @@ END // IDB_TE_ARROW BITMAP "res/te_arrow.bmp" -#endif // English (U.S.) resources +#endif // Английский (США) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/src/drivers/win/resource.h b/src/drivers/win/resource.h index 09ffb911..6879fff4 100644 --- a/src/drivers/win/resource.h +++ b/src/drivers/win/resource.h @@ -261,6 +261,7 @@ #define IDC_LABEL_NEWPPUUSED 310 #define MENU_PAL 311 #define IDC_DEBUGGER_VAL_SPR 311 +#define IDC_LABEL_TWEAKCOUNT 311 #define IDC_DEBUGGER_BOOKMARK 312 #define MENU_DIRECTORIES 320 #define MENU_INPUT 321 @@ -807,8 +808,9 @@ #define IDC_C_WATCH_Separa 40416 #define ID_GAME_USECONFIG 40417 #define FCEUX_CONTEXT_GUICONFIG 40418 -#define ID_VIEW_FOLLOW_PLAYBACK 40419 -#define ID_VIEW_SHOW_LAG_FRAMES 40420 +#define ID_VIEW_FOLLOW_PLAYBACK 40419 +#define ID_VIEW_SHOW_LAG_FRAMES 40420 +#define ID_VIEW_SHOW_TWEAK_COUNT 40421 #define IDC_DEBUGGER_ICONTRAY 55535 #define MW_ValueLabel2 65423 #define MW_ValueLabel1 65426 @@ -818,7 +820,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 160 -#define _APS_NEXT_COMMAND_VALUE 40421 +#define _APS_NEXT_COMMAND_VALUE 40422 #define _APS_NEXT_CONTROL_VALUE 1261 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/src/drivers/win/tasedit.cpp b/src/drivers/win/tasedit.cpp index 0cb5b9a4..6bc339d0 100644 --- a/src/drivers/win/tasedit.cpp +++ b/src/drivers/win/tasedit.cpp @@ -24,14 +24,16 @@ using namespace std; int TasEdit_wndx, TasEdit_wndy; bool TASEdit_follow_playback = true; bool TASEdit_show_lag_frames = true; +bool TASEdit_show_tweak_count = false; string tasedithelp = "{16CDE0C4-02B0-4A60-A88D-076319909A4D}"; //Name of TASEdit Help page +char buttonNames[NUM_JOYPAD_BUTTONS][2] = {"A", "B", "S", "T", "U", "D", "L", "R"}; HWND hwndTasEdit = 0; static HMENU hmenu, hrmenu; static int lastCursor; -static HWND hwndList, hwndHeader; +static HWND hwndList, hwndHeader, hwndTweakCount; static WNDPROC hwndHeader_oldWndproc, hwndList_oldWndProc; typedef std::set TSelectionFrames; @@ -169,8 +171,32 @@ static LONG CustomDraw(NMLVCUSTOMDRAW* msg) } } -void CreateProject(MovieData data) +void EnterTasEdit() { + if (movieMode == MOVIEMODE_INACTIVE) + { + FCEUI_StopMovie(); + CreateCleanMovie(); + //reset the rom + poweron(true); + currFrameCounter = 0; + } + else + { + //use current movie to create a new project + FCEUI_StopMovie(); + } + // pause the emulator and enter tasedit mode + FCEUI_SetEmulationPaused(1); + movieMode = MOVIEMODE_TASEDIT; + currMovieData.TryDumpIncremental(); + FCEU_DispMessage("Tasedit engaged",0); +} +void ExitTasEdit() +{ + movieMode = MOVIEMODE_INACTIVE; + FCEU_DispMessage("Tasedit disengaged",0); + CreateCleanMovie(); } // called from the rest of the emulator when things happen and the tasedit should change to reflect it @@ -224,6 +250,10 @@ void RedrawList() { InvalidateRect(hwndList,0,FALSE); } +void RedrawTasedit() +{ + InvalidateRect(hwndTasEdit,0,FALSE); +} enum ECONTEXTMENU { @@ -273,14 +303,6 @@ void RightClick(LPNMITEMACTIVATE info) RightClickMenu(info); } -void LockGreenZone(int newstart) -{ - for (int i=1; i after+1) @@ -288,7 +310,7 @@ void InvalidateGreenZone(int after) currMovieData.greenZoneCount = after+1; // increase tweakCount currMovieData.tweakCount++; - InvalidateRect(hwndTasEdit,0,FALSE); + RedrawTasedit(); if (currFrameCounter >= currMovieData.greenZoneCount) JumpToFrame(currMovieData.greenZoneCount-1); } @@ -354,7 +376,11 @@ void DoubleClick(LPNMITEMACTIVATE info) return; //if the icon or frame columns were double clicked: - if(info->iSubItem == COLUMN_ARROW || info->iSubItem == COLUMN_FRAMENUM || info->iSubItem == COLUMN_FRAMENUM2) + if(info->iSubItem == COLUMN_ARROW) + { + // set bookmark (of current bookmark slot) here + + } else if(info->iSubItem == COLUMN_FRAMENUM || info->iSubItem == COLUMN_FRAMENUM2) { JumpToFrame(index); } @@ -794,8 +820,28 @@ static void InitDialog() ListView_InsertColumn(hwndList, colidx++, &lvc); // pads columns lvc.cx = 20; - char buttonNames[NUM_JOYPAD_BUTTONS][2] = {"A", "B", "S", "T", "U", "D", "L", "R"}; - for (int joy = 0; joy < NUM_JOYPADS; ++joy) + // add pads 1 and 2 + for (int joy = 0; joy < 2; ++joy) + { + for (int btn = 0; btn < NUM_JOYPAD_BUTTONS; ++btn) + { + lvc.pszText = buttonNames[btn]; + ListView_InsertColumn(hwndList, colidx++, &lvc); + } + } + // add pads 3 and 4 and frame_number2 + if (currMovieData.fourscore) AddFourscoreColumns(); + + //the initial update + UpdateTasEdit(); +} +void AddFourscoreColumns() +{ + LVCOLUMN lvc; + lvc.mask = LVCF_WIDTH | LVCF_TEXT; + lvc.cx = 20; + int colidx = COLUMN_JOYPAD3_A; + for (int joy = 0; joy < 2; ++joy) { for (int btn = 0; btn < NUM_JOYPAD_BUTTONS; ++btn) { @@ -807,10 +853,13 @@ static void InitDialog() lvc.cx = 92; lvc.pszText = "Frame#"; ListView_InsertColumn(hwndList, colidx++, &lvc); - //----------------------------- - - //the initial update - UpdateTasEdit(); +} +void RemoveFourscoreColumns() +{ + for (int i = COLUMN_FRAMENUM2; i >= COLUMN_JOYPAD3_A; --i) + { + ListView_DeleteColumn (hwndList, i); + } } bool CheckSaveChanges() @@ -821,23 +870,20 @@ bool CheckSaveChanges() void KillTasEdit() { - if (!CheckSaveChanges()) - return; + if (!CheckSaveChanges()) return; DestroyWindow(hwndTasEdit); hwndTasEdit = 0; - turbo=false; - FCEUMOV_ExitTasEdit(); + turbo = false; + ExitTasEdit(); } //Creates a new TASEdit Project static void NewProject() { -//determine if current project changed -//if so, ask to save changes -//close current project - - if (!CheckSaveChanges()) - return; + //determine if current project changed + //if so, ask to save changes + //close current project + if (!CheckSaveChanges()) return; //TODO: close current project instance, create a new one with a non-parameterized constructor } @@ -871,7 +917,8 @@ static void OpenProject() string initdir = FCEU_GetPath(FCEUMKF_MOVIE); ofn.lpstrInitialDir=initdir.c_str(); - if(GetOpenFileName(&ofn)){ //If it is a valid filename + if(GetOpenFileName(&ofn)) //If it is a valid filename + { std::string tempstr = nameo; //Make a temporary string for filename char drv[512], dir[512], name[512], ext[512]; //For getting the filename! if(tempstr.rfind(".tas") == std::string::npos) //If they haven't put ".tas" after it @@ -887,13 +934,21 @@ static void OpenProject() filename.append(ext); //Stick extension back on... project.SetProjectFile(filename); //And update the project's filename. } - project.SetProjectName(GetRomName()); //Set the project's name to the ROM name + //Set the project's name to the ROM name + project.SetProjectName(GetRomName()); + //Set the fm2 name std::string thisfm2name = project.GetProjectName(); - thisfm2name.append(".fm2"); //Setup the fm2 name - project.SetFM2Name(thisfm2name); //Set the project's fm2 name + thisfm2name.append(".fm2"); + project.SetFM2Name(thisfm2name); + // load project and change number of listview columns if needed + bool last_fourscore = currMovieData.fourscore; project.LoadProject(project.GetProjectFile()); + if (last_fourscore && !currMovieData.fourscore) + RemoveFourscoreColumns(); + else if (!last_fourscore && currMovieData.fourscore) + AddFourscoreColumns(); + FollowPlayback(); } - } // Saves current project @@ -997,7 +1052,7 @@ static void Truncate() currMovieData.truncateAt(frame+1); InvalidateGreenZone(frame); - currMovieData.TryDumpIncremental(); + //currMovieData.TryDumpIncremental(); UpdateTasEdit(); } @@ -1051,8 +1106,12 @@ BOOL CALLBACK WndprocTasEdit(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar case WM_PAINT: { char temp[128]; - sprintf(temp,"TweakCount: %d\n",currMovieData.tweakCount); - SetWindowText(GetDlgItem(hwndDlg,IDC_TWEAKCOUNT),temp); + if (TASEdit_show_tweak_count) + sprintf(temp,"Tweak count: %d\n",currMovieData.tweakCount); + else + sprintf(temp,""); + SetWindowText(hwndTweakCount,temp); + RedrawTasedit(); } break; case WM_INITDIALOG: @@ -1061,6 +1120,7 @@ BOOL CALLBACK WndprocTasEdit(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar SetWindowPos(hwndDlg,0,TasEdit_wndx,TasEdit_wndy,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER); hwndList = GetDlgItem(hwndDlg,IDC_LIST1); + hwndTweakCount = GetDlgItem(hwndDlg,IDC_TWEAKCOUNT); InitDialog(); break; @@ -1272,11 +1332,18 @@ BOOL CALLBACK WndprocTasEdit(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar FollowPlayback(); break; case ID_VIEW_SHOW_LAG_FRAMES: - //switch "Show lag frames" flag + //switch "Highlight lag frames" flag TASEdit_show_lag_frames ^= 1; CheckMenuItem(hmenu, ID_VIEW_SHOW_LAG_FRAMES, TASEdit_show_lag_frames?MF_CHECKED : MF_UNCHECKED); RedrawList(); break; + case ID_VIEW_SHOW_TWEAK_COUNT: + //switch "Show Tweak count" flag + TASEdit_show_tweak_count ^= 1; + CheckMenuItem(hmenu, ID_VIEW_SHOW_TWEAK_COUNT, TASEdit_show_tweak_count?MF_CHECKED : MF_UNCHECKED); + + //RedrawList(); + break; } break; @@ -1300,23 +1367,23 @@ void FollowPlayback() void DoTasEdit() { - if(!FCEU_IsValidUI(FCEUI_TASEDIT)) - return; + if(!FCEU_IsValidUI(FCEUI_TASEDIT)) return; lastCursor = -1; - if(!hwndTasEdit) - hwndTasEdit = CreateDialog(fceu_hInstance,"TASEDIT",hAppWnd,WndprocTasEdit); - hmenu = GetMenu(hwndTasEdit); - hrmenu = LoadMenu(fceu_hInstance,"TASEDITCONTEXTMENUS"); - // check option ticks - CheckMenuItem(hmenu, ID_VIEW_FOLLOW_PLAYBACK, TASEdit_follow_playback?MF_CHECKED : MF_UNCHECKED); - CheckMenuItem(hmenu, ID_VIEW_SHOW_LAG_FRAMES, TASEdit_show_lag_frames?MF_CHECKED : MF_UNCHECKED); + EnterTasEdit(); + if(!hwndTasEdit) hwndTasEdit = CreateDialog(fceu_hInstance,"TASEDIT",hAppWnd,WndprocTasEdit); if(hwndTasEdit) { KeyboardSetBackgroundAccessBit(KEYBACKACCESS_TASEDIT); JoystickSetBackgroundAccessBit(JOYBACKACCESS_TASEDIT); - FCEUMOV_EnterTasEdit(); + hmenu = GetMenu(hwndTasEdit); + hrmenu = LoadMenu(fceu_hInstance,"TASEDITCONTEXTMENUS"); + // check option ticks + CheckMenuItem(hmenu, ID_VIEW_FOLLOW_PLAYBACK, TASEdit_follow_playback?MF_CHECKED : MF_UNCHECKED); + CheckMenuItem(hmenu, ID_VIEW_SHOW_LAG_FRAMES, TASEdit_show_lag_frames?MF_CHECKED : MF_UNCHECKED); + CheckMenuItem(hmenu, ID_VIEW_SHOW_TWEAK_COUNT, TASEdit_show_tweak_count?MF_CHECKED : MF_UNCHECKED); + SetWindowPos(hwndTasEdit,HWND_TOP,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); } } diff --git a/src/drivers/win/tasedit.h b/src/drivers/win/tasedit.h index a9f4691c..2b79c1a9 100644 --- a/src/drivers/win/tasedit.h +++ b/src/drivers/win/tasedit.h @@ -39,6 +39,7 @@ #define COLUMN_JOYPAD4_L 32 #define COLUMN_JOYPAD4_R 33 #define COLUMN_FRAMENUM2 34 + // listview colors #define NORMAL_FRAMENUM_COLOR 0xFFFFFF #define CUR_FRAMENUM_COLOR 0xFCF1CE @@ -56,8 +57,11 @@ // ----------------------------- void DoTasEdit(); void UpdateTasEdit(); -void CreateProject(MovieData data); void InvalidateGreenZone(int after); bool JumpToFrame(int index); int FindBeginningOfGreenZone(int starting_index); void FollowPlayback(); +void AddFourscoreColumns(); +void RemoveFourscoreColumns(); +void EnterTasEdit(); +void ExitTasEdit(); diff --git a/src/drivers/win/taseditlib/taseditproj.cpp b/src/drivers/win/taseditlib/taseditproj.cpp index e7629793..4b1da021 100644 --- a/src/drivers/win/taseditlib/taseditproj.cpp +++ b/src/drivers/win/taseditlib/taseditproj.cpp @@ -86,12 +86,13 @@ bool TASEDIT_PROJECT::LoadProject(std::string PFN) char branchname; branchname = ifs.fgetc(); // TODO: Add main branch name. - currMovieData.loadGreenzone(&ifs, true); - - poweron(true); - currFrameCounter = currMovieData.greenZoneCount; - currMovieData.TryDumpIncremental(); - + currMovieData.clearGreenzone(); + if (!currMovieData.loadGreenzone(&ifs, true)) + { + // there was some error while loading greenzone - reset playback to frame 0 + poweron(true); + currFrameCounter = 0; + } changed=false; return true; } diff --git a/src/input.cpp b/src/input.cpp index b7f105cf..f15da8f2 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -652,7 +652,7 @@ struct EMUCMDTABLE FCEUI_CommandTable[]= { EMUCMD_PAUSE, EMUCMDTYPE_MISC, FCEUI_ToggleEmulationPause, 0, 0, "Pause", EMUCMDFLAG_TASEDIT }, { EMUCMD_FRAME_ADVANCE, EMUCMDTYPE_MISC, FCEUI_FrameAdvance, FCEUI_FrameAdvanceEnd, 0, "Frame Advance", EMUCMDFLAG_TASEDIT }, { EMUCMD_SCREENSHOT, EMUCMDTYPE_MISC, FCEUI_SaveSnapshot, 0, 0, "Screenshot", EMUCMDFLAG_TASEDIT }, - { EMUCMD_HIDE_MENU_TOGGLE, EMUCMDTYPE_MISC, FCEUD_HideMenuToggle, 0, 0, "Hide Menu Toggle", EMUCMDFLAG_TASEDIT }, + { EMUCMD_HIDE_MENU_TOGGLE, EMUCMDTYPE_MISC, FCEUD_HideMenuToggle, 0, 0, "Hide Menu Toggle", 0 }, { EMUCMD_EXIT, EMUCMDTYPE_MISC, FCEUI_DoExit, 0, 0, "Exit", 0}, { EMUCMD_SPEED_SLOWEST, EMUCMDTYPE_SPEED, CommandEmulationSpeed, 0, 0, "Slowest Speed", EMUCMDFLAG_TASEDIT }, { EMUCMD_SPEED_SLOWER, EMUCMDTYPE_SPEED, CommandEmulationSpeed, 0, 0, "Speed Down", EMUCMDFLAG_TASEDIT }, diff --git a/src/movie.cpp b/src/movie.cpp index 842219e1..eeb0240a 100644 --- a/src/movie.cpp +++ b/src/movie.cpp @@ -390,10 +390,10 @@ MovieData::MovieData() , palFlag(false) , PPUflag(false) , rerecordCount(0) + , tweakCount(0) , binaryFlag(false) , greenZoneCount(0) , microphone(false) - , tweakCount(0) { memset(&romChecksum,0,sizeof(MD5DATA)); } @@ -416,6 +416,8 @@ void MovieData::installValue(std::string& key, std::string& val) installInt(val,emuVersion); else if(key == "rerecordCount") installInt(val,rerecordCount); + else if(key == "tweakCount") + installInt(val,tweakCount); else if(key == "palFlag") installBool(val,palFlag); else if(key == "romFilename") @@ -462,6 +464,7 @@ int MovieData::dump(EMUFILE *os, bool binary) os->fprintf("version %d\n", version); os->fprintf("emuVersion %d\n", emuVersion); os->fprintf("rerecordCount %d\n", rerecordCount); + os->fprintf("tweakCount %d\n", tweakCount); os->fprintf("palFlag %d\n" , (palFlag?1:0) ); os->fprintf("romFilename %s\n" , romFilename.c_str() ); os->fprintf("romChecksum %s\n" , BytesToString(romChecksum.data,MD5DATA::size).c_str() ); @@ -471,8 +474,8 @@ int MovieData::dump(EMUFILE *os, bool binary) os->fprintf("port0 %d\n" , ports[0] ); os->fprintf("port1 %d\n" , ports[1] ); os->fprintf("port2 %d\n" , ports[2] ); - os->fprintf("FDS %d\n" , isFDS?1:0 ); - os->fprintf("NewPPU %d\n" , newppu?1:0 ); + os->fprintf("FDS %d\n" , fds?1:0 ); + os->fprintf("NewPPU %d\n" , PPUflag?1:0 ); for(uint32 i=0;ifprintf("comment %s\n" , wcstombs(comments[i]).c_str() ); @@ -504,47 +507,89 @@ int MovieData::dump(EMUFILE *os, bool binary) return end-start; } +void MovieData::clearGreenzone() +{ + int size = currMovieData.savestates.size(); + for (int i = 1; i < size; ++i) + { + currMovieData.savestates[i].clear(); + } + greenZoneCount = 1; + currMovieData.frames_flags.resize(1); + // reset lua_colorings + // reset monitorings + +} + int MovieData::dumpGreenzone(EMUFILE *os, bool binary) { + // save savestates int start = os->ftell(); int frame, size; - for (int i=0; i<(int)savestates.size(); ++i) + write32le(greenZoneCount, os); + for (frame = 0; frame < greenZoneCount; ++frame) { - if (savestates[i].empty()) - continue; - frame=i; - size=savestates[i].size(); + if (savestates[frame].empty()) continue; write32le(frame, os); + size = savestates[frame].size(); write32le(size, os); + // write savestate + os->fwrite(&savestates[frame][0], size); + // write frames_flags + os->fwrite(&frames_flags[frame], 1); + // write lua_colorings + // write monitorings - os->fwrite(&savestates[i][0], size); } - frame=-1; - size=currMovieData.greenZoneCount; - write32le(frame, os); - write32le(size, os); - - int end= os->ftell(); + // write -1 as eof for greenzone + write32le(-1, os); + // finally write playback cursor position + write32le(currFrameCounter, os); + int end = os->ftell(); return end-start; } -int MovieData::loadGreenzone(EMUFILE *is, bool binary) +bool MovieData::loadGreenzone(EMUFILE *is, bool binary) { - int frame, size; - while(1) + clearGreenzone(); + int frame = 0, prev_frame = 0, size = 0; + if (read32le((uint32 *)&size, is)) { - if (!read32le((uint32 *)&frame, is)) {size=0; break;} - if (!read32le((uint32 *)&size, is)) {size=0; break;} - if (frame==-1) break; - int pos = is->ftell(); - FCEUSS_LoadFP(is, SSLOADPARAM_NOBACKUP); - storeTasSavestate(frame, Z_DEFAULT_COMPRESSION); - is->fseek(pos+size,SEEK_SET); - } - greenZoneCount=size; + greenZoneCount = size; + frames_flags.resize(size); + savestates.resize(size); + while(1) + { + if (!read32le((uint32 *)&frame, is)) break; + if (frame == -1) break; + if (!read32le((uint32 *)&size, is)) break; - return 1; + if ((int)savestates.size() <= frame) savestates.resize(frame+1); + // load savestate + savestates[frame].resize(size); + if ((int)is->fread((char*)&savestates[frame][0],size) < size) break; + // load frames_flags + if ((int)is->fread(&frames_flags[frame],1) != 1) break; + // load lua_colorings + // load monitorings + + prev_frame = frame; + } + greenZoneCount = prev_frame+1; // cut greenZoneCount to last good frame + if (frame == -1) + { + // everything went fine - load savestate at cursor position + if (read32le((uint32 *)&currFrameCounter, is) && currMovieData.loadTasSavestate(currFrameCounter)) + { + return true; + } + } else + { + // there was some error while reading greenzone + } + } + return false; } @@ -636,6 +681,8 @@ bool LoadFM2(MovieData& movieData, EMUFILE* fp, int size, bool stopAfterHeader) std::string a("length"), b("-1"); // Non-TAS projects consume until EOF movieData.installValue(a, b); + std::string a1("tweakCount"), b1("0"); + movieData.installValue(a1, b1); //first, look for an fcm signature char fcmbuf[3]; @@ -824,59 +871,23 @@ void poweron(bool shouldDisableBatteryLoading) disableBatteryLoading = 0; } - - -void FCEUMOV_EnterTasEdit() +void CreateCleanMovie() { - //If no movie, start a new project, currMovieData will serve as the "main branch" file, so give it a filename and save that into the project - //Dump all header info int ot the project file - - //Else use the currentmovie to create a new project - - //BIG TODO: Why is this tasedit stuff in movie.cpp? Let's movie it out, it is win32 only anyway - if (movieMode == MOVIEMODE_INACTIVE) - { - //stop any current movie activity - FCEUI_StopMovie(); - //clear the current movie - currFrameCounter = 0; - currMovieData = MovieData(); - currMovieData.guid.newGuid(); - currMovieData.palFlag = FCEUI_GetCurrentVidSystem(0,0)!=0; - currMovieData.romChecksum = GameInfo->MD5; - currMovieData.romFilename = FileBase; - - //reset the rom - poweron(false); - } - else - { - FCEUI_StopMovie(); - currMovieData.greenZoneCount=currFrameCounter; - } - - //todo - think about this - //ResetInputTypes(); - //todo - maybe this instead - //FCEUD_SetInput(currMovieData.fourscore,currMovieData.microphone,(ESI)currMovieData.ports[0],(ESI)currMovieData.ports[1],(ESIFC)currMovieData.ports[2]); - -#ifdef WIN32 - CreateProject(currMovieData); -#endif - - FCEUI_SetEmulationPaused(1); //pause the emulator - - //and enter tasedit mode - movieMode = MOVIEMODE_TASEDIT; - currMovieData.TryDumpIncremental(); - FCEU_DispMessage("Tasedit engaged",0); -} - -void FCEUMOV_ExitTasEdit() -{ - movieMode = MOVIEMODE_INACTIVE; - FCEU_DispMessage("Tasedit disengaged",0); currMovieData = MovieData(); + currMovieData.palFlag = FCEUI_GetCurrentVidSystem(0,0)!=0; + currMovieData.romFilename = FileBase; + currMovieData.romChecksum = GameInfo->MD5; + currMovieData.guid.newGuid(); + currMovieData.fourscore = FCEUI_GetInputFourscore(); + currMovieData.microphone = FCEUI_GetInputMicrophone(); + //currMovieData.ports[0] = InputType[0]; + //currMovieData.ports[1] = InputType[1]; + //currMovieData.ports[2] = InputType[2]; + currMovieData.ports[0] = joyports[0].type; + currMovieData.ports[1] = joyports[1].type; + currMovieData.ports[2] = portFC.type; + currMovieData.fds = isFDS; + currMovieData.PPUflag = (newppu != 0); } bool FCEUMOV_FromPoweron() @@ -985,8 +996,7 @@ bool FCEUI_LoadMovie(const char *fname, bool _read_only, bool tasedit, int _paus { currFrameCounter = 0; pauseframe = _pauseframe; - - currMovieData.TryDumpIncremental(); + //currMovieData.TryDumpIncremental(); } else { @@ -1045,19 +1055,9 @@ void FCEUI_SaveMovie(const char *fname, EMOVIE_FLAG flags, std::wstring author) currFrameCounter = 0; LagCounterReset(); - - currMovieData = MovieData(); - currMovieData.guid.newGuid(); - + CreateCleanMovie(); if(author != L"") currMovieData.comments.push_back(L"author " + author); - currMovieData.palFlag = FCEUI_GetCurrentVidSystem(0,0)!=0; - currMovieData.romChecksum = GameInfo->MD5; - currMovieData.romFilename = FileBase; - currMovieData.fourscore = FCEUI_GetInputFourscore(); - currMovieData.microphone = FCEUI_GetInputMicrophone(); - currMovieData.ports[0] = joyports[0].type; - currMovieData.ports[1] = joyports[1].type; - currMovieData.ports[2] = portFC.type; + if(flags & MOVIE_FLAG_FROM_POWERON) { @@ -1635,6 +1635,7 @@ bool FCEUI_MovieGetInfo(FCEUFILE* fp, MOVIE_INFO& info, bool skipFrameCount) info.emu_version_used = md.emuVersion; info.name_of_rom_used = md.romFilename; info.rerecord_count = md.rerecordCount; + info.tweak_count = md.tweakCount; info.comments = md.comments; info.subtitles = md.subtitles; diff --git a/src/movie.h b/src/movie.h index 7f13a134..e664fc69 100644 --- a/src/movie.h +++ b/src/movie.h @@ -13,6 +13,8 @@ #include "utils/guid.h" #include "utils/md5.h" +extern int InputType[3]; + struct FCEUFILE; enum EMOVIE_FLAG @@ -39,6 +41,7 @@ typedef struct int movie_version; // version of the movie format in the file uint32 num_frames; uint32 rerecord_count; + uint32 tweak_count; bool poweron, pal, nosynchack, ppuflag; bool reset; //mbg 6/21/08 - this flag isnt used anymore.. but maybe one day we can scan it out of the first record in the movie file uint32 emu_version_used; // 9813 = 0.98.13 @@ -90,10 +93,10 @@ bool FCEUMOV_ReadState(EMUFILE* is, uint32 size); void FCEUMOV_PreLoad(); bool FCEUMOV_PostLoad(); -void FCEUMOV_EnterTasEdit(); -void FCEUMOV_ExitTasEdit(); bool FCEUMOV_FromPoweron(); +void CreateCleanMovie(); + class MovieData; class MovieRecord { @@ -231,8 +234,9 @@ public: void truncateAt(int frame); void installValue(std::string& key, std::string& val); int dump(EMUFILE* os, bool binary); + void clearGreenzone(); int dumpGreenzone(EMUFILE *os, bool binary); - int loadGreenzone(EMUFILE *is, bool binary); + bool loadGreenzone(EMUFILE *is, bool binary); void clearRecordRange(int start, int len); void insertEmpty(int at, int frames);