[PC] Lumines Remastered save file format

Reading, editing and everything related to the files created by games to contain savegames and configurations
mbc07
Posts: 12
Joined: Sun Oct 13, 2019 7:19 pm

[PC] Lumines Remastered save file format

Post by mbc07 »

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: Select all

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...