rlm@1: // MovieCreate.cpp : implementation file rlm@1: // rlm@1: rlm@1: #include "stdafx.h" rlm@1: #include "resource.h" rlm@1: #include "MovieCreate.h" rlm@1: #include "MainWnd.h" rlm@1: #include "FileDlg.h" rlm@1: #include "WinResUtil.h" rlm@1: #include "WinMiscUtil.h" rlm@1: #include "VBA.h" rlm@1: rlm@1: #include "../NLS.h" rlm@1: #include "../common/Util.h" rlm@1: #include "../common/movie.h" rlm@1: #include "../gba/GBAGlobals.h" rlm@1: #include "../gb/gbGlobals.h" rlm@1: rlm@1: extern u32 myROM[]; rlm@1: rlm@1: #define GBC_CAPABLE ((gbRom[0x143] & 0x80) != 0) rlm@1: #define SGB_CAPABLE (gbRom[0x146] == 0x03) rlm@1: rlm@1: // MovieCreate dialog rlm@1: rlm@1: IMPLEMENT_DYNAMIC(MovieCreate, CDialog) rlm@1: MovieCreate::MovieCreate(CWnd *pParent /*=NULL*/) rlm@1: : CDialog(MovieCreate::IDD, pParent) rlm@1: { rlm@1: //{{AFX_DATA_INIT(MovieCreate) rlm@1: m_startOption = 2; // "from start" as default rlm@1: m_systemOption = systemCartridgeType == 0 ? 0 : (GBC_CAPABLE ? 1 : (SGB_CAPABLE ? 2 : 3)); // GBA, GBC, SGB, or GB rlm@1: m_biosOption = systemCartridgeType == 0 ? (useBios ? 2 : 1) : 0; // none for non-GBA, or introless and based on settings rlm@1: //}}AFX_DATA_INIT rlm@1: } rlm@1: rlm@1: MovieCreate::~MovieCreate() rlm@1: {} rlm@1: rlm@1: BOOL MovieCreate::OnInitDialog() rlm@1: { rlm@1: CDialog::OnInitDialog(); rlm@1: rlm@1: GetDlgItem(IDC_REC_GBA)->EnableWindow(systemCartridgeType == 0); rlm@1: GetDlgItem(IDC_REC_GBC)->EnableWindow(systemCartridgeType != 0 && GBC_CAPABLE); rlm@1: GetDlgItem(IDC_REC_SGB)->EnableWindow(systemCartridgeType != 0 && SGB_CAPABLE); rlm@1: GetDlgItem(IDC_REC_GB)->EnableWindow(systemCartridgeType != 0); rlm@1: rlm@1: GetDlgItem(IDC_REC_NOBIOS)->EnableWindow(systemCartridgeType != 0); rlm@1: GetDlgItem(IDC_REC_EMUBIOS)->EnableWindow(systemCartridgeType == 0); rlm@1: GetDlgItem(IDC_REC_GBABIOS)->EnableWindow(systemCartridgeType == 0); rlm@1: GetDlgItem(IDC_REC_GBABIOSINTRO)->EnableWindow(systemCartridgeType == 0); rlm@1: rlm@1: CheckRadioButton(IDC_REC_NOBIOS, IDC_REC_GBABIOSINTRO, IDC_REC_NOBIOS + m_biosOption); rlm@1: rlm@1: m_editFilename.LimitText(_MAX_PATH); rlm@1: m_editAuthor.LimitText(MOVIE_METADATA_AUTHOR_SIZE); rlm@1: m_editDescription.LimitText(MOVIE_METADATA_SIZE - MOVIE_METADATA_AUTHOR_SIZE); rlm@1: rlm@1: // convert the ROM filename into a default movie name rlm@1: CString movieName = winGetDestFilename(theApp.gameFilename, IDS_MOVIE_DIR, ".vbm"); rlm@1: rlm@1: GetDlgItem(IDC_MOVIE_FILENAME)->SetWindowText(movieName); rlm@1: rlm@1: // scroll to show the rightmost side of the movie filename rlm@1: ((CEdit *)GetDlgItem(IDC_MOVIE_FILENAME))->SetSel((DWORD)(movieName.GetLength() - 1), FALSE); rlm@1: rlm@1: return TRUE; // return TRUE unless you set the focus to a control rlm@1: // EXCEPTION: OCX Property Pages should return FALSE rlm@1: } rlm@1: rlm@1: void MovieCreate::DoDataExchange(CDataExchange *pDX) rlm@1: { rlm@1: CDialog::DoDataExchange(pDX); rlm@1: //{{AFX_DATA_MAP(MovieCreate) rlm@1: DDX_Radio(pDX, IDC_RECNOW, m_startOption); rlm@1: DDX_Radio(pDX, IDC_REC_GBA, m_systemOption); rlm@1: /// done manually DDX_Radio(pDX, IDC_REC_NOBIOS, m_biosOption); rlm@1: DDX_Control(pDX, IDC_EDIT_AUTHOR, m_editAuthor); rlm@1: DDX_Control(pDX, IDC_EDIT_DESCRIPTION, m_editDescription); rlm@1: DDX_Control(pDX, IDC_MOVIE_FILENAME, m_editFilename); rlm@1: //}}AFX_DATA_MAP rlm@1: } rlm@1: rlm@1: BEGIN_MESSAGE_MAP(MovieCreate, CDialog) rlm@1: ON_BN_CLICKED(IDOK, OnBnClickedOk) rlm@1: ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel) rlm@1: ON_BN_CLICKED(IDC_BROWSE, OnBnClickedBrowse) rlm@1: ON_BN_CLICKED(IDC_RECSTART, OnBnClickedRecstart) rlm@1: ON_BN_CLICKED(IDC_RECRESET, OnBnClickedRecreset) rlm@1: ON_BN_CLICKED(IDC_RECNOW, OnBnClickedRecnow) rlm@1: ON_BN_CLICKED(IDC_REC_GBA, OnBnClickedRecGba) rlm@1: ON_BN_CLICKED(IDC_REC_GBC, OnBnClickedRecGbc) rlm@1: ON_BN_CLICKED(IDC_REC_SGB, OnBnClickedRecSgb) rlm@1: ON_BN_CLICKED(IDC_REC_GB, OnBnClickedRecGb) rlm@1: ON_BN_CLICKED(IDC_REC_NOBIOS, OnBnClickedRecNobios) rlm@1: ON_BN_CLICKED(IDC_REC_EMUBIOS, OnBnClickedRecEmubios) rlm@1: ON_BN_CLICKED(IDC_REC_GBABIOS, OnBnClickedRecGbabios) rlm@1: ON_BN_CLICKED(IDC_REC_GBABIOSINTRO, OnBnClickedRecGbabiosintro) rlm@1: END_MESSAGE_MAP() rlm@1: rlm@1: // MovieCreate message handlers rlm@1: rlm@1: void MovieCreate::OnBnClickedBrowse() rlm@1: { rlm@1: theApp.winCheckFullscreen(); rlm@1: rlm@1: LPCTSTR exts[] = { ".vbm", NULL }; rlm@1: rlm@1: CString filter = winResLoadFilter(IDS_FILTER_MOVIE); rlm@1: CString title = winResLoadString(IDS_SELECT_MOVIE_NAME); rlm@1: rlm@1: CString movieName = winGetDestFilename(theApp.gameFilename, IDS_MOVIE_DIR, exts[0]); rlm@1: CString movieDir = winGetDestDir(IDS_MOVIE_DIR); rlm@1: rlm@1: FileDlg dlg(this, movieName, filter, 1, "VBM", exts, movieDir, title, true); rlm@1: rlm@1: if (dlg.DoModal() == IDCANCEL) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: movieName = dlg.GetPathName(); rlm@1: rlm@1: GetDlgItem(IDC_MOVIE_FILENAME)->SetWindowText(movieName); rlm@1: rlm@1: // scroll to show the rightmost side of the movie filename rlm@1: ((CEdit *)GetDlgItem(IDC_MOVIE_FILENAME))->SetSel((DWORD)(movieName.GetLength() - 1), FALSE); rlm@1: } rlm@1: rlm@1: void MovieCreate::OnBnClickedOk() rlm@1: { rlm@1: // has to be done before creating the movie rlm@1: bool useBiosFile = false; rlm@1: bool skipBiosFile = false; rlm@1: rlm@1: if (m_biosOption == 1) rlm@1: { rlm@1: useBiosFile = false; rlm@1: } rlm@1: else if (m_biosOption == 2) rlm@1: { rlm@1: useBiosFile = true; rlm@1: skipBiosFile = true; rlm@1: } rlm@1: else if (m_biosOption == 3) rlm@1: { rlm@1: useBiosFile = true; rlm@1: skipBiosFile = false; rlm@1: } rlm@1: rlm@1: extern bool systemLoadBIOS(const char *biosFileName, bool useBiosFile); rlm@1: if (!systemLoadBIOS(theApp.biosFileName, useBiosFile)) rlm@1: { rlm@1: if (m_biosOption > 1) rlm@1: { rlm@1: systemMessage(0, "Invalid GBA BIOS file!"); rlm@1: return; rlm@1: } rlm@1: } rlm@1: rlm@1: theApp.useBiosFile = useBiosFile; rlm@1: if (useBiosFile) rlm@1: theApp.skipBiosFile = skipBiosFile; rlm@1: rlm@1: int startFlags = 0, controllerFlags = 0, typeFlags = 0; rlm@1: rlm@1: if (m_startOption == 0) rlm@1: startFlags |= MOVIE_START_FROM_SNAPSHOT; rlm@1: else if (m_startOption == 1) rlm@1: startFlags |= MOVIE_START_FROM_SRAM; rlm@1: //else rlm@1: // startFlags = 0; // no SRAM or snapshot rlm@1: rlm@1: if (m_systemOption == 0) rlm@1: { rlm@1: typeFlags |= MOVIE_TYPE_GBA; rlm@1: gbEmulatorType = 4; rlm@1: } rlm@1: else if (m_systemOption == 1) rlm@1: { rlm@1: typeFlags |= MOVIE_TYPE_GBC; rlm@1: gbEmulatorType = 1; rlm@1: } rlm@1: else if (m_systemOption == 2) rlm@1: { rlm@1: typeFlags |= MOVIE_TYPE_SGB; rlm@1: gbEmulatorType = 2; rlm@1: } rlm@1: else rlm@1: { rlm@1: gbEmulatorType = 3; // plain old GB rlm@1: } rlm@1: rlm@1: controllerFlags |= MOVIE_CONTROLLER(0); rlm@1: if (typeFlags & MOVIE_TYPE_SGB) rlm@1: { rlm@1: // XXX FIXME - the code for multiple controllers must be broken somehow rlm@1: // (it crashes strangely during FreezeToStream in SGB games) rlm@1: rlm@1: // SGB games are free to request controllers while running, so we have to assume it needs all 4 rlm@1: /// controllerFlags |= MOVIE_CONTROLLER(1) | MOVIE_CONTROLLER(2) | MOVIE_CONTROLLER(3); rlm@1: } rlm@1: rlm@1: // get author and movie info from the edit fields: rlm@1: char info [MOVIE_METADATA_SIZE], buffer [MOVIE_METADATA_SIZE]; rlm@1: rlm@1: GetDlgItem(IDC_EDIT_AUTHOR)->GetWindowText(buffer, MOVIE_METADATA_AUTHOR_SIZE); rlm@1: strncpy(info, buffer, MOVIE_METADATA_AUTHOR_SIZE); rlm@1: info[MOVIE_METADATA_AUTHOR_SIZE - 1] = '\0'; rlm@1: rlm@1: GetDlgItem(IDC_EDIT_DESCRIPTION)->GetWindowText(buffer, MOVIE_METADATA_SIZE - MOVIE_METADATA_AUTHOR_SIZE); rlm@1: strncpy(info + MOVIE_METADATA_AUTHOR_SIZE, buffer, MOVIE_METADATA_SIZE - MOVIE_METADATA_AUTHOR_SIZE); rlm@1: info[MOVIE_METADATA_SIZE - 1] = '\0'; rlm@1: rlm@1: if (memLagTempEnabled && systemCartridgeType == 0) rlm@1: { rlm@1: // lag reduction is off -- if the user didn't turn it off, silently turn it back on, otherwise ask rlm@1: int ans = !memLagEnabled ? IDYES : AfxGetApp()->m_pMainWnd->MessageBox( rlm@1: "Lag reduction is currently OFF.\nIt is recommended that you turn this ON for recording.\nWould you like to turn it on now?", rlm@1: "Warning", rlm@1: MB_YESNOCANCEL | MB_ICONWARNING); rlm@1: switch (ans) rlm@1: { rlm@1: case IDYES: rlm@1: extern void SetPrefetchHack(bool); rlm@1: SetPrefetchHack(true); rlm@1: break; rlm@1: case IDNO: rlm@1: break; rlm@1: case IDCANCEL: rlm@1: return; rlm@1: } rlm@1: } rlm@1: rlm@1: CString movieName; rlm@1: GetDlgItem(IDC_MOVIE_FILENAME)->GetWindowText(movieName); rlm@1: rlm@1: // actually make the movie file: rlm@1: int code = VBAMovieCreate(movieName, info, startFlags, controllerFlags, typeFlags); rlm@1: rlm@1: if (code != MOVIE_SUCCESS) rlm@1: { rlm@1: systemMessage(0, "Failed to create movie %s", (const char *)movieName); rlm@1: return; rlm@1: } rlm@1: rlm@1: OnOK(); rlm@1: } rlm@1: rlm@1: void MovieCreate::OnBnClickedCancel() rlm@1: { rlm@1: OnCancel(); rlm@1: } rlm@1: rlm@1: void MovieCreate::OnBnClickedRecstart() rlm@1: { rlm@1: m_startOption = 2; rlm@1: if (systemCartridgeType == 0) rlm@1: { rlm@1: GetDlgItem(IDC_REC_EMUBIOS)->EnableWindow(TRUE); rlm@1: GetDlgItem(IDC_REC_GBABIOSINTRO)->EnableWindow(TRUE); rlm@1: } rlm@1: else rlm@1: { rlm@1: GetDlgItem(IDC_REC_GBC)->EnableWindow(GBC_CAPABLE); rlm@1: GetDlgItem(IDC_REC_SGB)->EnableWindow(SGB_CAPABLE); rlm@1: GetDlgItem(IDC_REC_GB)->EnableWindow(TRUE); rlm@1: } rlm@1: } rlm@1: rlm@1: void MovieCreate::OnBnClickedRecreset() rlm@1: { rlm@1: m_startOption = 1; rlm@1: if (systemCartridgeType == 0) rlm@1: { rlm@1: GetDlgItem(IDC_REC_EMUBIOS)->EnableWindow(TRUE); rlm@1: GetDlgItem(IDC_REC_GBABIOSINTRO)->EnableWindow(TRUE); rlm@1: } rlm@1: else rlm@1: { rlm@1: GetDlgItem(IDC_REC_GBC)->EnableWindow(GBC_CAPABLE); rlm@1: GetDlgItem(IDC_REC_SGB)->EnableWindow(SGB_CAPABLE); rlm@1: GetDlgItem(IDC_REC_GB)->EnableWindow(TRUE); rlm@1: } rlm@1: } rlm@1: rlm@1: void MovieCreate::OnBnClickedRecnow() rlm@1: { rlm@1: m_startOption = 0; rlm@1: rlm@1: // starting from emulator bios file from a snapshot made while playing with GBA bios file won't work rlm@1: if (systemCartridgeType == 0 && useBios) rlm@1: { rlm@1: if (m_biosOption == 1) rlm@1: { rlm@1: OnBnClickedRecGbabios(); rlm@1: CheckRadioButton(IDC_REC_NOBIOS, IDC_REC_GBABIOSINTRO, IDC_REC_NOBIOS + m_biosOption); rlm@1: } rlm@1: GetDlgItem(IDC_REC_EMUBIOS)->EnableWindow(FALSE); rlm@1: } rlm@1: rlm@1: // "with intro" distinction makes no sense when continuing from snapshot rlm@1: if (systemCartridgeType == 0) rlm@1: { rlm@1: if (m_biosOption == 3) rlm@1: { rlm@1: OnBnClickedRecGbabios(); rlm@1: CheckRadioButton(IDC_REC_NOBIOS, IDC_REC_GBABIOSINTRO, IDC_REC_NOBIOS + m_biosOption); rlm@1: } rlm@1: GetDlgItem(IDC_REC_GBABIOSINTRO)->EnableWindow(FALSE); rlm@1: } rlm@1: rlm@1: // can't switch systems while recording from snapshot! rlm@1: if (systemCartridgeType != 0) rlm@1: { rlm@1: int curSystemOption = (gbCgbMode == 1 ? 1 : (gbSgbMode == 1 ? 2 : 3)); // GBC, SGB, or GB rlm@1: GetDlgItem(IDC_REC_GBC)->EnableWindow(curSystemOption == 1); rlm@1: GetDlgItem(IDC_REC_SGB)->EnableWindow(curSystemOption == 2); rlm@1: GetDlgItem(IDC_REC_GB)->EnableWindow(curSystemOption == 3); rlm@1: m_systemOption = curSystemOption; rlm@1: CheckRadioButton(IDC_REC_GBA, IDC_REC_GB, IDC_REC_GBA + m_systemOption); rlm@1: } rlm@1: } rlm@1: rlm@1: void MovieCreate::OnBnClickedRecGba() rlm@1: { rlm@1: m_systemOption = 0; rlm@1: } rlm@1: rlm@1: void MovieCreate::OnBnClickedRecGbc() rlm@1: { rlm@1: m_systemOption = 1; rlm@1: } rlm@1: rlm@1: void MovieCreate::OnBnClickedRecSgb() rlm@1: { rlm@1: m_systemOption = 2; rlm@1: } rlm@1: rlm@1: void MovieCreate::OnBnClickedRecGb() rlm@1: { rlm@1: m_systemOption = 3; rlm@1: } rlm@1: rlm@1: void MovieCreate::OnBnClickedRecNobios() rlm@1: { rlm@1: m_biosOption = 0; rlm@1: } rlm@1: rlm@1: void MovieCreate::OnBnClickedRecEmubios() rlm@1: { rlm@1: m_biosOption = 1; rlm@1: } rlm@1: rlm@1: void MovieCreate::OnBnClickedRecGbabios() rlm@1: { rlm@1: if (utilCheckBIOS(theApp.biosFileName, 4)) rlm@1: m_biosOption = 2; rlm@1: else rlm@1: { rlm@1: ((MainWnd *)theApp.m_pMainWnd)->OnOptionsEmulatorSelectbiosfile(); rlm@1: if (utilCheckBIOS(theApp.biosFileName, 4)) rlm@1: m_biosOption = 2; rlm@1: else rlm@1: { rlm@1: systemMessage(0, "This option requires a valid GBA BIOS file."); rlm@1: CheckRadioButton(IDC_REC_NOBIOS, IDC_REC_GBABIOSINTRO, IDC_REC_EMUBIOS); rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void MovieCreate::OnBnClickedRecGbabiosintro() rlm@1: { rlm@1: if (utilCheckBIOS(theApp.biosFileName, 4)) rlm@1: m_biosOption = 3; rlm@1: else rlm@1: { rlm@1: ((MainWnd *)theApp.m_pMainWnd)->OnOptionsEmulatorSelectbiosfile(); rlm@1: if (utilCheckBIOS(theApp.biosFileName, 4)) rlm@1: m_biosOption = 3; rlm@1: else rlm@1: { rlm@1: systemMessage(0, "This option requires a valid GBA BIOS file."); rlm@1: CheckRadioButton(IDC_REC_NOBIOS, IDC_REC_GBABIOSINTRO, IDC_REC_EMUBIOS); rlm@1: } rlm@1: } rlm@1: } rlm@1: