WIP Gecko(ocarina) code support: There are a bunch code types that need coding/fixing/cleanup, but many codes should be functional. The game properties and "Cheats Manager"(formally Action Replay Manager) dialogs now have a "Gecko Codes" tab to view/enable/disable codes. Currently, you must click "Edit Config" and manually add your codes to the [Gecko] inifile section of your gameinis for them to be displayed.(same format as the AR codes) I'm going to add Add/Edit dialogs similar to the AR codes and support codes with modifiers. I added the new files to scons as best as I could without testing :p.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5930 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
@@ -20,6 +20,7 @@
|
||||
#include "ActionReplay.h"
|
||||
#include "Core.h"
|
||||
#include "ConfigManager.h"
|
||||
#include "VolumeHandler.h"
|
||||
#include "ISOProperties.h"
|
||||
#include "HW/Memmap.h"
|
||||
|
||||
@@ -43,6 +44,17 @@ wxCheatsWindow::wxCheatsWindow(wxWindow* const parent)
|
||||
// Load Data
|
||||
Load_ARCodes();
|
||||
|
||||
// Load Gecko Codes :/
|
||||
{
|
||||
const DiscIO::IVolume* const vol = VolumeHandler::GetVolume();
|
||||
if (vol)
|
||||
{
|
||||
m_gameini_path = std::string(File::GetUserPath(D_GAMECONFIG_IDX)) + vol->GetUniqueID() + ".ini";
|
||||
m_gameini.Load(m_gameini_path);
|
||||
m_geckocode_panel->LoadCodes(m_gameini);
|
||||
}
|
||||
}
|
||||
|
||||
Center();
|
||||
Show();
|
||||
}
|
||||
@@ -64,9 +76,6 @@ void wxCheatsWindow::Init_ChildControls()
|
||||
|
||||
m_Label_Codename = new wxStaticText(m_Tab_Cheats, wxID_ANY, _T("Name: "), wxDefaultPosition, wxDefaultSize);
|
||||
m_GroupBox_Info = new wxStaticBox(m_Tab_Cheats, wxID_ANY, _T("Code Info"), wxDefaultPosition, wxDefaultSize);
|
||||
|
||||
wxButton* const button_applycodes = new wxButton(m_Tab_Cheats, wxID_ANY, _T("Apply Changes"), wxDefaultPosition, wxDefaultSize);
|
||||
_connect_macro_(button_applycodes, wxCheatsWindow::OnEvent_ButtonUpdateCodes_Press, wxEVT_COMMAND_BUTTON_CLICKED, this);
|
||||
|
||||
m_Label_NumCodes = new wxStaticText(m_Tab_Cheats, wxID_ANY, _T("Number Of Codes: "), wxDefaultPosition, wxDefaultSize);
|
||||
m_ListBox_CodesList = new wxListBox(m_Tab_Cheats, wxID_ANY, wxDefaultPosition, wxSize(120, 150), 0, 0, wxLB_HSCROLL);
|
||||
@@ -76,13 +85,9 @@ void wxCheatsWindow::Init_ChildControls()
|
||||
sGroupBoxInfo->Add(m_Label_NumCodes, 0, wxALL, 5);
|
||||
sGroupBoxInfo->Add(m_ListBox_CodesList, 1, wxALL, 5);
|
||||
|
||||
wxBoxSizer* sB1 = new wxBoxSizer(wxVERTICAL);
|
||||
sB1->Add(button_applycodes, 0, wxALL | wxEXPAND, 5);
|
||||
sB1->Add(sGroupBoxInfo, 1, wxALL, 5);
|
||||
|
||||
wxBoxSizer* sizer_tab_cheats = new wxBoxSizer(wxHORIZONTAL);
|
||||
sizer_tab_cheats->Add(m_CheckListBox_CheatsList, 1, wxEXPAND | wxTOP | wxBOTTOM | wxLEFT, 10);
|
||||
sizer_tab_cheats->Add(sB1, 0, wxALIGN_LEFT | wxEXPAND | wxALL, 5);
|
||||
sizer_tab_cheats->Add(sGroupBoxInfo, 0, wxALIGN_LEFT | wxEXPAND | wxALL, 5);
|
||||
|
||||
m_Tab_Cheats->SetSizerAndFit(sizer_tab_cheats);
|
||||
|
||||
@@ -112,14 +117,19 @@ void wxCheatsWindow::Init_ChildControls()
|
||||
m_Tab_Log->SetSizerAndFit(sTabLog);
|
||||
|
||||
// Add Tabs to Notebook
|
||||
m_Notebook_Main->AddPage(m_Tab_Cheats, _T("Codes List"));
|
||||
m_Notebook_Main->AddPage(m_Tab_Cheats, _T("AR Codes"));
|
||||
m_geckocode_panel = new Gecko::CodeConfigPanel(m_Notebook_Main);
|
||||
m_Notebook_Main->AddPage(m_geckocode_panel, wxT("Gecko Codes"));
|
||||
m_Notebook_Main->AddPage(tab_cheat_search, _T("Cheat Search"));
|
||||
m_Notebook_Main->AddPage(m_Tab_Log, _T("Logging"));
|
||||
|
||||
// Button Strip
|
||||
wxButton* const button_apply = new wxButton(panel, wxID_ANY, _T("Apply"), wxDefaultPosition, wxDefaultSize);
|
||||
_connect_macro_(button_apply, wxCheatsWindow::OnEvent_ApplyChanges_Press, wxEVT_COMMAND_BUTTON_CLICKED, this);
|
||||
wxButton* const button_close = new wxButton(panel, wxID_ANY, _T("Close"), wxDefaultPosition, wxDefaultSize);
|
||||
_connect_macro_(button_close, wxCheatsWindow::OnEvent_ButtonClose_Press, wxEVT_COMMAND_BUTTON_CLICKED, this);
|
||||
wxBoxSizer* sButtons = new wxBoxSizer(wxHORIZONTAL);
|
||||
sButtons->Add(button_apply, 1, wxRIGHT, 5);
|
||||
sButtons->Add(button_close, 1, 0, 0);
|
||||
|
||||
wxBoxSizer* const sMain = new wxBoxSizer(wxVERTICAL);
|
||||
@@ -280,12 +290,23 @@ void wxCheatsWindow::OnEvent_CheatsList_ItemToggled(wxCommandEvent& WXUNUSED (ev
|
||||
}
|
||||
}
|
||||
|
||||
void wxCheatsWindow::OnEvent_ButtonUpdateCodes_Press(wxCommandEvent& WXUNUSED (event))
|
||||
void wxCheatsWindow::OnEvent_ApplyChanges_Press(wxCommandEvent& WXUNUSED (event))
|
||||
{
|
||||
// Appply AR Code changes
|
||||
for (size_t i = 0; i < indexList.size(); i++)
|
||||
{
|
||||
ActionReplay::SetARCode_IsActive(m_CheckListBox_CheatsList->IsChecked(indexList[i].uiIndex), indexList[i].index);
|
||||
}
|
||||
|
||||
// Apply Gecko Code changes
|
||||
Gecko::SetActiveCodes(m_geckocode_panel->GetCodes());
|
||||
|
||||
// save gameini, with changed gecko codes
|
||||
if (m_gameini_path.size())
|
||||
{
|
||||
Gecko::SaveCodes(m_gameini, m_geckocode_panel->GetCodes());
|
||||
m_gameini.Save(m_gameini_path);
|
||||
}
|
||||
}
|
||||
|
||||
void wxCheatsWindow::OnEvent_ButtonUpdateLog_Press(wxCommandEvent& WXUNUSED (event))
|
||||
|
||||
@@ -36,6 +36,8 @@
|
||||
|
||||
#include "ActionReplay.h"
|
||||
|
||||
#include "GeckoCodeDiag.h"
|
||||
|
||||
#include "Filesystem.h"
|
||||
#include "IniFile.h"
|
||||
|
||||
@@ -143,6 +145,10 @@ class wxCheatsWindow : public wxFrame
|
||||
|
||||
std::vector<ARCodeIndex> indexList;
|
||||
|
||||
Gecko::CodeConfigPanel *m_geckocode_panel;
|
||||
IniFile m_gameini;
|
||||
std::string m_gameini_path;
|
||||
|
||||
void Init_ChildControls();
|
||||
|
||||
void Load_ARCodes();
|
||||
@@ -156,8 +162,8 @@ class wxCheatsWindow : public wxFrame
|
||||
void OnEvent_CheatsList_ItemSelected(wxCommandEvent& event);
|
||||
void OnEvent_CheatsList_ItemToggled(wxCommandEvent& event);
|
||||
|
||||
// $ Update Active Codes Button
|
||||
void OnEvent_ButtonUpdateCodes_Press(wxCommandEvent& event);
|
||||
// $ Apply Changes Button
|
||||
void OnEvent_ApplyChanges_Press(wxCommandEvent& event);
|
||||
|
||||
// $ Update Log Button
|
||||
void OnEvent_ButtonUpdateLog_Press(wxCommandEvent& event);
|
||||
|
||||
@@ -186,7 +186,7 @@ void CFrame::CreateMenu()
|
||||
toolsMenu->Append(IDM_LUA, _T("New &Lua Console"));
|
||||
toolsMenu->Append(IDM_MEMCARD, _T("&Memcard Manager (GC)"));
|
||||
toolsMenu->Append(IDM_IMPORTSAVE, _T("Wii Save Import"));
|
||||
toolsMenu->Append(IDM_CHEATS, _T("Action &Replay Manager"));
|
||||
toolsMenu->Append(IDM_CHEATS, _T("&Cheats Manager"));
|
||||
|
||||
toolsMenu->Append(IDM_NETPLAY, _T("Start &NetPlay"));
|
||||
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
|
||||
#include "GeckoCodeDiag.h"
|
||||
|
||||
#define _connect_macro_(b, f, c, s) (b)->Connect(wxID_ANY, (c), wxCommandEventHandler(f), (wxObject*)0, (wxEvtHandler*)s)
|
||||
|
||||
namespace Gecko
|
||||
{
|
||||
|
||||
static const wxString wxstr_name(wxT("Name: ")),
|
||||
wxstr_description(wxT("Description: ")),
|
||||
wxstr_creator(wxT("Creator: "));
|
||||
|
||||
CodeConfigPanel::CodeConfigPanel(wxWindow* const parent)
|
||||
: wxPanel(parent, -1, wxDefaultPosition, wxDefaultSize)
|
||||
{
|
||||
m_listbox_gcodes = new wxCheckListBox(this, -1, wxDefaultPosition, wxDefaultSize);
|
||||
_connect_macro_(m_listbox_gcodes, CodeConfigPanel::UpdateInfoBox, wxEVT_COMMAND_LISTBOX_SELECTED, this);
|
||||
_connect_macro_(m_listbox_gcodes, CodeConfigPanel::ToggleCode, wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, this);
|
||||
|
||||
m_infobox.label_name = new wxStaticText(this, -1, wxstr_name);
|
||||
m_infobox.label_creator = new wxStaticText(this, -1, wxstr_creator);
|
||||
m_infobox.label_description = new wxStaticText(this, -1, wxstr_description);
|
||||
m_infobox.listbox_codes = new wxListBox(this, -1, wxDefaultPosition, wxSize(-1, 64));
|
||||
|
||||
// TODO: buttons to add/edit codes
|
||||
|
||||
// sizers
|
||||
wxBoxSizer* const sizer_infobox = new wxBoxSizer(wxVERTICAL);
|
||||
sizer_infobox->Add(m_infobox.label_name, 0, wxLEFT | wxBOTTOM, 5);
|
||||
sizer_infobox->Add(m_infobox.label_creator, 0, wxLEFT | wxBOTTOM, 5);
|
||||
sizer_infobox->Add(m_infobox.label_description, 0, wxLEFT | wxBOTTOM, 5);
|
||||
sizer_infobox->Add(m_infobox.listbox_codes, 0, wxLEFT | wxBOTTOM, 5);
|
||||
|
||||
//wxBoxSizer* const sizer_horz = new wxBoxSizer(wxHORIZONTAL);
|
||||
//sizer_horz->Add(sizer_infobox, 1, 0);
|
||||
|
||||
// silly
|
||||
//if (show_apply_button)
|
||||
//{
|
||||
// wxButton* const btn_apply = new wxButton(this, -1, wxT("Apply Changes"), wxDefaultPosition, wxSize(128, -1));
|
||||
// _connect_macro_(btn_apply, CodeConfigPanel::ApplyChanges, wxEVT_COMMAND_BUTTON_CLICKED, this);
|
||||
// sizer_horz->Add(btn_apply, 0, wxALIGN_RIGHT | wxALIGN_BOTTOM);
|
||||
//}
|
||||
|
||||
wxBoxSizer* const sizer_main = new wxBoxSizer(wxVERTICAL);
|
||||
sizer_main->Add(m_listbox_gcodes, 1, wxALL | wxEXPAND, 5);
|
||||
sizer_main->Add(sizer_infobox, 0, wxALL | wxEXPAND, 5);
|
||||
|
||||
SetSizerAndFit(sizer_main);
|
||||
}
|
||||
|
||||
void CodeConfigPanel::LoadCodes(const IniFile& inifile)
|
||||
{
|
||||
m_gcodes.clear();
|
||||
Gecko::LoadCodes(inifile, m_gcodes);
|
||||
|
||||
m_listbox_gcodes->Clear();
|
||||
// add the codes to the listbox
|
||||
std::vector<GeckoCode>::const_iterator
|
||||
gcodes_iter = m_gcodes.begin(),
|
||||
gcodes_end = m_gcodes.end();
|
||||
for (; gcodes_iter!=gcodes_end; ++gcodes_iter)
|
||||
{
|
||||
m_listbox_gcodes->Append(wxString::FromAscii(gcodes_iter->name.c_str()));
|
||||
if (gcodes_iter->enabled)
|
||||
m_listbox_gcodes->Check(m_listbox_gcodes->GetCount()-1, true);
|
||||
}
|
||||
|
||||
wxCommandEvent evt;
|
||||
UpdateInfoBox(evt);
|
||||
}
|
||||
|
||||
void CodeConfigPanel::ToggleCode(wxCommandEvent& evt)
|
||||
{
|
||||
const int sel = evt.GetInt(); // this right?
|
||||
if (sel > -1)
|
||||
m_gcodes[sel].enabled = m_listbox_gcodes->IsChecked(sel);
|
||||
}
|
||||
|
||||
void CodeConfigPanel::UpdateInfoBox(wxCommandEvent&)
|
||||
{
|
||||
m_infobox.listbox_codes->Clear();
|
||||
const int sel = m_listbox_gcodes->GetSelection();
|
||||
|
||||
if (sel > -1)
|
||||
{
|
||||
m_infobox.label_name->SetLabel(wxstr_name + wxString::FromAscii(m_gcodes[sel].name.c_str()));
|
||||
m_infobox.label_description->SetLabel(wxstr_description + wxString::FromAscii(m_gcodes[sel].description.c_str()));
|
||||
m_infobox.label_creator->SetLabel(wxstr_creator + wxString::FromAscii(m_gcodes[sel].creator.c_str()));
|
||||
|
||||
// add codes to info listbox
|
||||
std::vector<GeckoCode::Code>::const_iterator
|
||||
codes_iter = m_gcodes[sel].codes.begin(),
|
||||
codes_end = m_gcodes[sel].codes.end();
|
||||
for (; codes_iter!=codes_end; ++codes_iter)
|
||||
m_infobox.listbox_codes->Append(wxString::Format(wxT("%08X %08X"), codes_iter->address, codes_iter->data));
|
||||
}
|
||||
else
|
||||
{
|
||||
m_infobox.label_name->SetLabel(wxstr_name);
|
||||
m_infobox.label_description->SetLabel(wxstr_description);
|
||||
m_infobox.label_creator->SetLabel(wxstr_creator);
|
||||
}
|
||||
}
|
||||
|
||||
void CodeConfigPanel::ApplyChanges(wxCommandEvent&)
|
||||
{
|
||||
Gecko::SetActiveCodes(m_gcodes);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
|
||||
#ifndef __GECKOCODEDIAG_h__
|
||||
#define __GECKOCODEDIAG_h__
|
||||
|
||||
#include "GeckoCode.h"
|
||||
#include "GeckoCodeConfig.h"
|
||||
|
||||
#include "wx/wx.h"
|
||||
|
||||
namespace Gecko
|
||||
{
|
||||
|
||||
|
||||
class CodeConfigPanel : public wxPanel
|
||||
{
|
||||
public:
|
||||
CodeConfigPanel(wxWindow* const parent);
|
||||
|
||||
|
||||
void LoadCodes(const IniFile& inifile);
|
||||
const std::vector<GeckoCode>& GetCodes() const { return m_gcodes; }
|
||||
|
||||
protected:
|
||||
void UpdateInfoBox(wxCommandEvent&);
|
||||
void ToggleCode(wxCommandEvent& evt);
|
||||
void ApplyChanges(wxCommandEvent&);
|
||||
|
||||
private:
|
||||
std::vector<GeckoCode> m_gcodes;
|
||||
|
||||
// wxwidgets stuff
|
||||
wxCheckListBox *m_listbox_gcodes;
|
||||
struct
|
||||
{
|
||||
wxStaticText *label_name, *label_description, *label_creator;
|
||||
wxListBox *listbox_codes;
|
||||
} m_infobox;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -24,6 +24,7 @@
|
||||
#include "ISOProperties.h"
|
||||
#include "PatchAddEdit.h"
|
||||
#include "ARCodeAddEdit.h"
|
||||
#include "GeckoCodeDiag.h"
|
||||
#include "ConfigManager.h"
|
||||
#include "StringUtil.h"
|
||||
|
||||
@@ -268,6 +269,8 @@ void CISOProperties::CreateGUIControls(bool IsWad)
|
||||
m_Notebook->AddPage(m_PatchPage, _("Patches"));
|
||||
m_CheatPage = new wxPanel(m_Notebook, ID_ARCODE_PAGE, wxDefaultPosition, wxDefaultSize);
|
||||
m_Notebook->AddPage(m_CheatPage, _("AR Codes"));
|
||||
m_geckocode_panel = new Gecko::CodeConfigPanel(m_Notebook);
|
||||
m_Notebook->AddPage(m_geckocode_panel, wxT("Gecko Codes"));
|
||||
m_Information = new wxPanel(m_Notebook, ID_INFORMATION, wxDefaultPosition, wxDefaultSize);
|
||||
m_Notebook->AddPage(m_Information, _("Info"));
|
||||
m_Filesystem = new wxPanel(m_Notebook, ID_FILESYSTEM, wxDefaultPosition, wxDefaultSize);
|
||||
@@ -879,6 +882,7 @@ void CISOProperties::LoadGameConfig()
|
||||
|
||||
PatchList_Load();
|
||||
ActionReplayList_Load();
|
||||
m_geckocode_panel->LoadCodes(GameIni);
|
||||
}
|
||||
|
||||
bool CISOProperties::SaveGameConfig()
|
||||
@@ -966,6 +970,7 @@ bool CISOProperties::SaveGameConfig()
|
||||
|
||||
PatchList_Save();
|
||||
ActionReplayList_Save();
|
||||
Gecko::SaveCodes(GameIni, m_geckocode_panel->GetCodes());
|
||||
|
||||
return GameIni.Save(GameIniFile.c_str());
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
#include "IniFile.h"
|
||||
#include "PatchEngine.h"
|
||||
#include "ActionReplay.h"
|
||||
#include "GeckoCodeDiag.h"
|
||||
|
||||
class CISOProperties : public wxDialog
|
||||
{
|
||||
@@ -145,6 +146,8 @@ class CISOProperties : public wxDialog
|
||||
wxTreeItemId RootId;
|
||||
wxImageList *m_iconList;
|
||||
|
||||
Gecko::CodeConfigPanel *m_geckocode_panel;
|
||||
|
||||
enum
|
||||
{
|
||||
ID_CLOSE = 1000,
|
||||
|
||||
@@ -23,6 +23,7 @@ if env['HAVE_WX']:
|
||||
files += [
|
||||
'AboutDolphin.cpp',
|
||||
'ARCodeAddEdit.cpp',
|
||||
'GeckoCodeDiag.cpp',
|
||||
'ConfigMain.cpp',
|
||||
'Frame.cpp',
|
||||
'FrameAui.cpp',
|
||||
|
||||
Reference in New Issue
Block a user