Project1

标题: 关于成就插件:実績プラグインさん脚本使用的问题 求助! [打印本页]

作者: 初学者ax    时间: 2020-6-2 19:55
标题: 关于成就插件:実績プラグインさん脚本使用的问题 求助!
插件:https://torigoya.hatenadiary.jp/entry/achievement_mv

这个插件里实现了成就系统,更新公告里写了有成就删除的功能(介绍里没写)
打开看了一下,可以用指令 実績削除 来删除成就



试了一下发现一个问题,只能删除“所有成就里最后一个成就”,不知道这个情况怎么造成的,有没有高手解决一下,感谢!!!

Torigoya_Achievement.zip

8.15 KB, 下载次数: 50


作者: shmily0725    时间: 2020-6-3 00:03
我有用过这个插件
但还真的没用过这个功能
好奇是什么情况需要用到这个功能
作者: 初学者ax    时间: 2020-6-3 00:55
shmily0725 发表于 2020-6-3 00:03
我有用过这个插件
但还真的没用过这个功能
好奇是什么情况需要用到这个功能 ...

主要是测试游戏的时候,因为是全局储存成就嘛,有什么改动之类的看能不能正常解锁,方便测试,全部重置成就也有些麻烦
作者: moonyoulove    时间: 2020-6-3 07:26
你是不是看錯指令了
作者: 开关关    时间: 2020-6-3 07:59
本帖最后由 开关关 于 2020-6-3 08:41 编辑

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




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1