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