FPPS4/gui/game_edit.pas

312 lines
6.1 KiB
Plaintext

unit game_edit;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, ExtCtrls,
StdCtrls, Grids, Buttons,
LCLIntf,
ms_shell_hack,
game_info,
form_filler,
param_sfo_gui;
type
{ TfrmGameEditor }
TfrmGameEditor = class(TForm)
BtnExpGame: TSpeedButton;
BtnExpFw: TSpeedButton;
BtnGameOpen: TButton;
BtnOk: TButton;
BtnCancel: TButton;
EditPages: TPageControl;
Edt_GameInfo_Name: TEdit;
Edt_GameInfo_Exec: TEdit;
Edt_GameInfo_TitleId: TEdit;
Edt_GameInfo_Version: TEdit;
Edt_GameInfo_AppVer: TEdit;
Edt_MountList_game: TEdit;
Edt_MountList_firmware: TComboBox;
GridParamSfo: TStringGrid;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
PanelHalf: TPanel;
TabMain: TTabSheet;
TabFolders: TTabSheet;
TabParamSfo: TTabSheet;
procedure BtnExpFwClick(Sender: TObject);
procedure BtnExpGameClick(Sender: TObject);
procedure BtnGameOpenClick(Sender: TObject);
procedure BtnOkClick(Sender: TObject);
procedure BtnCancelClick(Sender: TObject);
procedure Edt_MountList_firmwareGetItems(Sender: TObject);
procedure Edt_MountList_gameExit(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormInit(UpdateTitle:Boolean);
procedure FormSave;
procedure LoadParamSfo(UpdateTitle:Boolean);
private
Fgame:RawByteString;
public
OnSave :TNotifyEvent;
FConfigInfo:TConfigInfo;
FItem :TGameItem;
FParamSfo :TParamSfoFile;
end;
var
frmGameEditor: TfrmGameEditor;
implementation
{$R *.lfm}
uses
TypInfo,
Rtti;
{ TfrmGameEditor }
function DoOpenDir(const Input,InitialDir:RawByteString):RawByteString;
var
d:TSelectDirectoryDialog;
Cookie:Pointer;
begin
Cookie:=RegisterDllHack;
Result:=Input;
d:=nil;
try
d:=TSelectDirectoryDialog.Create(nil);
d.InitialDir:=InitialDir;
d.Options:=[ofPathMustExist,ofEnableSizing,ofViewDetail];
if d.Execute then
begin
Result:=d.FileName;
end;
except
//
end;
FreeAndNil(d);
UnregisterDllHack(Cookie);
end;
procedure AddRow(Grid:TStringGrid;const name,value:RawByteString;obj:TObject);
var
i:Integer;
begin
i:=Grid.RowCount;
Grid.RowCount:=i+1;
Grid.Cells[0,i]:=name;
Grid.Cells[1,i]:=value;
Grid.Objects[0,i]:=obj;
end;
type
TGameFormData=class(TFormDataProvider)
procedure SetText(control:TComponent;const Text:RawByteString); override;
function GetText(control:TComponent):RawByteString; override;
end;
procedure TGameFormData.SetText(control:TComponent;const Text:RawByteString);
begin
if control.InheritsFrom(TControl) then
begin
TMyControl(control).Text:=Text;
end;
end;
function TGameFormData.GetText(control:TComponent):RawByteString;
begin
Result:='';
if control.InheritsFrom(TControl) then
begin
Result:=TMyControl(control).Text;
end;
end;
procedure TfrmGameEditor.FormInit(UpdateTitle:Boolean);
var
Provider:TGameFormData;
begin
EditPages.ActivePageIndex:=0;
Provider:=TGameFormData.Create;
FormLoad(Self,Provider,FItem);
Provider.Free;
//////
LoadParamSfo(UpdateTitle);
Show;
end;
procedure TfrmGameEditor.FormSave;
var
Provider:TGameFormData;
begin
Provider:=TGameFormData.Create;
form_filler.FormSave(Self,Provider,FItem);
Provider.Free;
end;
procedure TfrmGameEditor.LoadParamSfo(UpdateTitle:Boolean);
var
i:Integer;
V:RawByteString;
begin
V:=Edt_MountList_game.Text;
if (Fgame=V) then Exit;
FreeAndNil(FParamSfo);
FParamSfo:=LoadParamSfoFile(ExcludeTrailingPathDelimiter(V)+
DirectorySeparator+
'sce_sys'+
DirectorySeparator+
'param.sfo');
Fgame:=V;
GridParamSfo.Clear;
if (FParamSfo=nil) then
begin
Edt_GameInfo_TitleId.Text:='???';
Edt_GameInfo_Version.Text:='???';
Exit;
end;
if (Length(FParamSfo.params)=0) then Exit;
For i:=0 to High(FParamSfo.params) do
begin
if (FParamSfo.params[i].format=SFO_FORMAT_UINT32) then
begin
V:='0x'+HexStr(FParamSfo.params[i].GetUInt,8);
end else
begin
V:=Trim(FParamSfo.params[i].GetString);
end;
AddRow(GridParamSfo,FParamSfo.params[i].name,V,nil);
end;
GridParamSfo.AutoSizeColumn(0);
//
if not UpdateTitle then Exit;
V:=FParamSfo.GetString('TITLE');
Edt_GameInfo_Name.Text:=V;
V:=FParamSfo.GetString('TITLE_ID');
Edt_GameInfo_TitleId.Text:=V;
V:=FParamSfo.GetString('VERSION');
Edt_GameInfo_Version.Text:=V;
V:=FParamSfo.GetString('APP_VER');
Edt_GameInfo_AppVer.Text:=V;
end;
procedure TfrmGameEditor.Edt_MountList_gameExit(Sender: TObject);
begin
LoadParamSfo(True);
end;
procedure TfrmGameEditor.BtnGameOpenClick(Sender: TObject);
var
new:RawByteString;
begin
new:=DoOpenDir('',Edt_MountList_game.Text);
if (new='') then Exit;
Edt_MountList_game.Text:=new;
LoadParamSfo(True);
end;
procedure TfrmGameEditor.BtnExpGameClick(Sender: TObject);
begin
OpenDocument(Edt_MountList_game.Text);
end;
procedure TfrmGameEditor.BtnExpFwClick(Sender: TObject);
begin
OpenDocument(Edt_MountList_firmware.Text);
end;
procedure TfrmGameEditor.BtnOkClick(Sender: TObject);
begin
FormSave;
Hide;
if Assigned(OnSave) then
begin
OnSave(Self);
end;
Close;
end;
procedure TfrmGameEditor.BtnCancelClick(Sender: TObject);
begin
Close;
end;
procedure TfrmGameEditor.Edt_MountList_firmwareGetItems(Sender: TObject);
var
i,c:Integer;
S:RawByteString;
begin
if (FConfigInfo<>nil) then
begin
c:=FConfigInfo.MainInfo.FirmwareList.GetArrayCount;
if (c<>0) and (Edt_MountList_firmware.Items.Count<>c) then
begin
Edt_MountList_firmware.Items.Clear;
//preload
For i:=0 to c-1 do
begin
S:=FConfigInfo.MainInfo.FirmwareList.values[i];
Edt_MountList_firmware.Items.Add(S);
end;
end;
end;
end;
procedure TfrmGameEditor.FormClose(Sender:TObject;var CloseAction:TCloseAction);
begin
if (FItem<>nil) then
begin
if FItem.FLock then
begin
FItem.FLock:=False;
end else
begin
FreeAndNil(FItem);
end;
end;
//
FreeAndNil(FParamSfo);
//
CloseAction:=caFree;
end;
end.