本帖最后由 开关关 于 2020-6-3 08:41 编辑
测试前把 save\achievements.rpgsave 删掉就可以了。
这个插件也提供了插件指令 実績リセット ,用于重置所有成就。
在大约428行的地方,有这样一段代码。它的作用是写入存档。
AchievementManager.prototype.save = function () { if (!Achievement.settings.useGlobalSave) return; // [多重起動対応] 旧データとの差異があったら吸収する var oldData = this._loadAchievements(); for (var i = 0; i < this._items.length; ++i) { this._achievements[i] = (oldData[i] || this._achievements[i]); // Kgg:这里逻辑有问题 } StorageManager.save(Achievement.saveSlotID, JSON.stringify({ achievements: this._achievements })); };
AchievementManager.prototype.save = function () {
if (!Achievement.settings.useGlobalSave) return;
// [多重起動対応] 旧データとの差異があったら吸収する
var oldData = this._loadAchievements();
for (var i = 0; i < this._items.length; ++i) {
this._achievements[i] = (oldData[i] || this._achievements[i]); // Kgg:这里逻辑有问题
}
StorageManager.save(Achievement.saveSlotID, JSON.stringify({
achievements: this._achievements
}));
};
这段代码标注出的那一行逻辑有问题,它的意思是,当原存档中i号成就已解锁时,就保留原存档的成就,否则写入新存档的成就。但是这个逻辑存在缺陷,如果原存档中i号成就已解锁而新存档的i号成就是未解锁,它依然会保留原存档。
改进后的代码如下。其实就改了一行。
AchievementManager.prototype.save = function () { if (!Achievement.settings.useGlobalSave) return; // [多重起動対応] 旧データとの差異があったら吸収する var oldData = this._loadAchievements(); for (var i = 0; i < this._items.length; ++i) { // this._achievements[i] = (oldData[i] || this._achievements[i]); // Kgg:这里逻辑有问题 // this._achievements[i] = (oldData[i] ? oldData[i] && this._achievements[i] : this._achievements[i]); this._achievements[i] = (this._achievements[i]);//Kgg:这行与上面被注释掉的那行效果相同,可以选一个使用。作者之所以搞出这个错误,似乎是为了兼容另一个插件“多重起動”,因此上面那行保留了oldData(虽然不知道意义何在)。但是仍然可能有不可预知的bug。 } StorageManager.save(Achievement.saveSlotID, JSON.stringify({ achievements: this._achievements })); };
AchievementManager.prototype.save = function () {
if (!Achievement.settings.useGlobalSave) return;
// [多重起動対応] 旧データとの差異があったら吸収する
var oldData = this._loadAchievements();
for (var i = 0; i < this._items.length; ++i) {
// this._achievements[i] = (oldData[i] || this._achievements[i]); // Kgg:这里逻辑有问题
// this._achievements[i] = (oldData[i] ? oldData[i] && this._achievements[i] : this._achievements[i]);
this._achievements[i] = (this._achievements[i]);//Kgg:这行与上面被注释掉的那行效果相同,可以选一个使用。作者之所以搞出这个错误,似乎是为了兼容另一个插件“多重起動”,因此上面那行保留了oldData(虽然不知道意义何在)。但是仍然可能有不可预知的bug。
}
StorageManager.save(Achievement.saveSlotID, JSON.stringify({
achievements: this._achievements
}));
};
现在逻辑变成了,无论如何写入新存档。简单粗暴地解决了问题。 |