ZenHAX

Free Game Research Forum | Official QuickBMS support | twitter @zenhax | SSL HTTPS://zenhax.com
It is currently Thu Nov 21, 2019 1:35 am

All times are UTC




Post new topic  Reply to topic  [ 1 post ] 
Author Message
PostPosted: Sun Nov 03, 2019 8:34 pm 

Joined: Sun Oct 13, 2019 7:19 pm
Posts: 6
So, I found the password and data structure used by Lumines Remastered save files and decided to share the details since there's little to no documentation about this game file formats. I checked this with the game version 1.04 for PC but the console ports are very likely to use the same format:

  • The game uses Easy Save 2 plugin to handle its save file
  • The game uses the plugin's built-in encryption (from a quick look seems to be based on AES-128) and the password used is RsALO31A0D58eRwnh5e8L1nQvrXIke
  • The actual content written to/read from the save file as well as the order which the variables are read/written are important when using Easy Save 2. Lumines Remastered stores the following variables, on the following order:
Code:
float playTime;
long totalScore;
uint basicHiScore;
uint basicBestLevel;
uint basicBestClearTime;
uint endlessHiScore;
uint endlessBestLevel;
uint shuffleBestLevel;
uint shuffleHiScore;
uint SkinEditHiScore;
uint timeAttack60HiScore;
uint timeAttack180HiScore;
uint timeAttack300HiScore;
uint playedSkinNum[];                  // array length: 40
uint vscpuBossNum;
uint vscpuNum;
uint vs2pWinNum;
uint vs2pLoseNum;
uint oneTimelineMaxDeleteSquareNum;
uint oneTimelineBestScore;
uint maxCombo;
uint chainBlockMaxConnectBlockNum;
uint allDeletedBonusNum;
uint uniColorBonusNum;
string currentAvaterId;
string skinEditPlayList;
bool unLockAvater[];                   // array length: 44
bool unLockSkin[];                     // array length: 40
bool unLockTips[];                     // array length: 0
bool unLockEndressMode;
bool unLockShuffleMode;
bool puzzleClearList[];                // array length: 100
int puzzleTime[];                      // array length: 100
bool missionClearList[];               // array length: 50
int missionTime[];                     // array length: 50
int scoreRanking[0][];                 // array length: 10
int scoreRanking[1][];                 // array length: 10
int scoreRanking[2][];                 // array length: 10
int scoreRanking[3][];                 // array length: 10
int scoreRanking[4][];                 // array length: 10
int scoreRanking[5][];                 // array length: 10
int scoreRanking[6][];                 // array length: 10
int scoreRanking[7][];                 // array length: 10
string scoreRankingName[0][];          // array length: 10
string scoreRankingName[1][];          // array length: 10
string scoreRankingName[2][];          // array length: 10
string scoreRankingName[3][];          // array length: 10
string scoreRankingName[4][];          // array length: 10
string scoreRankingName[5][];          // array length: 10
string scoreRankingName[6][];          // array length: 10
string scoreRankingName[7][];          // array length: 10
uint vsCPUClearNum;
uint maxVsCPUClearTime;
uint minVsCPUClearTime;

// enum ControllType {None, A, B, C}
// enum VibrationSettingType {PLAY = 2, RHYTHM = 4, ON = 8, LR = 16}
ControllType joyOne;   
ControllType joyDual;
ControllType fullKey;
VibrationSettingType controllorVibType;
VibrationSettingType transVibType;

float seVolume;
float bgmVolume;
string lang;
bool generalFlag[];                    // array length: 200
bool isUseInterface;
bool isScoreBonus;
int vibrationPower;
int tranceVibrationPower;
uint drawMonitorNum;

// enum ScreenType {WINDOW, FULL_SCREEN, BORDERLESS}
// enum ResolationType {TYPE_1280_720, TYPE_1280_768, TYPE_1280_800, TYPE_1280_960,
//                      TYPE_1280_1024, TYPE_1360_768, TYPE_1366_768, TYPE_1600_900,
//                      TYPE_1600_1024, TYPE_1680_1050, TYPE_1920_1080, TYPE_1920_1200,
//                      TYPE_2560_1080, TYPE_2560_1440, TYPE_3840_2160, MAX}
ScreenType screenType; 
ResolationType resolationType;

bool Vsync;
uint brightnessSetting;
int player1KeyBindControllerList[];    // array length: 10
int player1KeyBindPrimary[];           // array length: 10
int player1KeyBindSecondary[];         // array length: 10


I didn't dig too deep on Easy Save 2 source code, but it should be easy to write a standalone app to handle Lumines Remastered save files, if there's interest. Since I was too lazy, I instead created an empty Unity project, imported Easy Save 2 to the project and used the plugin directly, which also works but it's a bit overkill...


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 1 post ] 

All times are UTC


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Powered by phpBB® Forum Software © phpBB Limited