mirror of https://github.com/red-prig/fpPS4.git
312 lines
6.1 KiB
Plaintext
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.
|
|
|