ディレクトリ構成



PS3のディレクトリ構成

/ ルート以下の構成
/dev_hdd0、/dev_bdvd、/dev_usb
以外のデータはFileManager、FTPで直接編集する場合は注意が必要

階層1 階層2 階層3 内容
dev_bdvd
dev_cf
dev_flash /
bdplayer /
bdjstack
SYS
data /
cert
dic
font
ps1emu
ps2emu ps2_emu.self ps2_gxemu.self ps2_softemu.self
pspemu /
sys
vsh /
etc
module
resource
dev_flash2 /
etc
dev_flash3
dev_hdd0 /
crash_report
drm
game
GAMES デフォルトのrogeroのバックアップ先
BLJMxxxxx
BLJSxxxxx
home /
0000001
0000002
mms
music
photo
savedata /
vmc PS2のセーブデータ
theme
tmp
video
vm/vm0 500MB
vsh
dev_hdd1
dev_ms
dev_ps2disc
dev_ps2disc1
dev_sd
dev_usb



/dev_hdd0/home

├ 00000001 //一人目のユーザー
 |  ├ savedata
 |  | ├ ゲームID // セーブデータ
 |  ├ trophy
 |  | ├ NPWRxxxxx_xx // トロフィーのゲームID
 |       ├ TROPCONF.SFM // トロフィーの設定
 |       ├ TROPUSR.DAT // トロフィーのユーザーデータ
 ├ 00000002 // 二人目のユーザー

セーブデータコピーして他人のデータのためロードできない場合
まず、新規でセーブデータを作成、FTPで対象のフォルダ(/dev_hdd0/home/ユーザID/savedata/ゲームID)に
PARAM.SFO以外のファイルを上書きで使用可能に


トロフィーデータ

  • TROPCONF.SFM
UTF-8を指定してテキストエディタで開くと、トロフィーの名前、説明が読めます。

<trophy id="000" hidden="yes" ttype="P" pid="-1">
id:トロフィーのID
hidden:隠しトロフィー、yes|no
ttype:トロフィーのタイプ、P|G|S|B
pid:不明 -1|000

  • TROPUSR.DAT
0x0370あたりから各トロフィーのタイプ(9から始まるデータがあるとズレる)
00 00 00 04 00 00 00 50 00 00 00 xx 00 00 00 00
00 00 00 xx 00 00 00 yy pp pp pp pp 00 00 00 00

xx:トロフィーのID
yy:トロフィーのタイプ(01:P、02:G、03:S、04:B)
pp:pid値


最後のトロフィーのタイプから400バイトくらい先から、各トロフィーのなにか
00 00 00 06 00 00 00 60 00 00 00 xx 00 00 00 00
00 00 00 xx 00 00 00 aa aa aa aa 00 00 00 00 00
00 yy yy yy yy yy yy yy 00 zz zz zz zz zz zz zz

xx:トロフィーのID
yy:獲得日時情報(hdd) yyyyMMddhhmmss → μsec
zz:獲得日時情報(server?) yyyyMMddhhmmssuu → μsec
aa:解除情報(00 00 00 00 | 01 00 01 10 | 01 00 00 10 | 01 00 00 20 etc.)
3byte目はPTrigger,4byte目は取得済みタイプ

  • TROPUSR.DATの構造
ビッグエンディアンです。
   struct TrophyType {
       int value1;
       int value2;
       int id1;
       int value3;
       int id2;
       int type;
       int pid;
       unsigned char unknown[0x44];
   };
   struct TrophyUnlock {
       int value1;
       int value2;
       int id1;
       int value3;
       int id2;
       unsigned char unlock[0x0C];
       unsigned char timestamp[0x10];
       unsigned char zero[0x40];
   };
   struct UnknownTrophyType1 {
       int value1;
       int value2;
       int id1;
       int value3;
       int id2;
       unsigned char unknown[0x4C];
   };
   struct UnknownTrophyType2 {
       int value1;
       int value2;
       int id1;
       int value3;
       int id2;
       unsigned char unknown[0x2C];
   };

   struct TrophyData {
       union {
           struct {
               unsigned char UnknownData01[0xDC];
               int TrophyMax;
               unsigned char UnknownData02[0x5C];
               int TrophyMax;
               unsigned char UnknownData03[0x1C];
               int UnknownTrophyMax;
               unsigned char UnknownData04[0x70];
               unsigned char UnknownCode[0x10];
               unsigned char UnknownData05[0x80];
               unsigned char TrophyGameId[0x18];
               int TrophyMax; 
               int hiddenTrophyMax;
               unsigned char UnknownData06[0x40];
               int PMax; 
               int GMax;
               int SMax; 
               int BMax;
               unsigned char UnknownData07[0xA0];
           };
           unsigned char Block01[0x0370];
       };

       UnknownTrophyType1 *UnknownTrophyTypes1; // 数はUnknownTrophyMax
       TrophyType *TrophyTypes; // 数はTrophyMax

       union {
           struct {
               int value1;
               int value2;
               unsigned char zero1[0x20];
               unsigned char UnknownTimeStamp01[0x08]; // 登録日時?
               unsigned char UnknownTimeStamp02[0x10];
               unsigned char zero2[0x10];
               unsigned char LatestTimeStamp[0x10];
               unsigned char zero3[0x20];
               int TrophyNum;
               unsigned char UnknownData08[0x0C];
               unsigned char UnlockInfo[0x08];
               unsigned char UnknownData09[0x48];
               int value3;
               int value4;
               unsigned char zero4[0x08];
               int TrophyCount; // TrophyNum + 1
               int PTriggerCount; // SUM(PTrigger) + 1
               unsigned char zero5[0x08];
               unsigned char UnknownTimeStamp03[0x08];
               unsigned char zero6[0x38];
           };
           unsigned char Block02[0x0140];
       };

       TrophyUnlock *TrophyUnlocks; // 数はTrophyMax

       UnknownTrophyType2 *UnknownTrophyTypes2; // 数はUnknownTrophyMax
   }