Project1

标题: 怎么让装备自动添加一个随机的前缀 [打印本页]

作者: kingybk1976    时间: 2022-11-25 20:03
标题: 怎么让装备自动添加一个随机的前缀
请教:一件装备掉落时,随机附加一个前缀,比如一把武器:单手剑,掉落实际获得的是强力的单手剑或敏捷的单手剑,属性根据前缀来附加。

有没有什么方法或插件?
作者: apple5740    时间: 2022-11-25 21:31
本帖最后由 apple5740 于 2022-11-25 23:02 编辑

感觉这个问题跟你之前随机属性的问题有点类似。。

武器,装备这款我还没学习到,不过应该跟角色数据差不多。
所有同id的武器应该共用一条数据,这条数据被保存在 Weapons.json 中,可以通过$dataWeapons来查看。

实现的方式有很多种。。
我的理解是每出现一个新词条武器,就需要新建一个武器数据,并且写入 Weapons.json中


//按照武器的id生成一件复制的武器,比如使用 CreateWeapon(1)方法,在原版的Weapons.json数据下就可以生成一把剑。
//使用下面的方法时,请务必备份一次 data/Weapons.json 数据,以防万一。。
//不足之处:新档也可能会共享新生成的数据...

  1. var CreateWeapon = function(id){
  2.         if (!id) return;
  3.         var Weapon = JsonEx.makeDeepCopy($dataWeapons[id]);
  4.         Weapon.id = $dataWeapons.length;
  5.     //这里修改weapon的属性,比如生成一个攻击力+10的剑
  6.     //修改其他属性,或者名字什么的都可以写在这里,具体属性 可以通过控制台进行查看
  7.     // 随机 Math.floor(Math.random()*10 + 1)  随机出1-10的数值
  8.     Weapon.params[2] = 10;
  9.     //分割线
  10.         $dataWeapons[Weapon.id] = Weapon;
  11.         var fs = require('fs');
  12.         fs.writeFileSync( 'data/Weapons.json', JSON.stringify($dataWeapons));
  13. }
复制代码



作者: 小秋橙    时间: 2022-11-25 22:09
楼上这怎么还用fs去写文件了……我上次确实说过「要写入$dataWeapons」但不是写入文件。
DataManager.loadDatabase = function () {
    const test = this.isBattleTest() || this.isEventTest();
    const prefix = test ? "Test_" : "";
    for (const databaseFile of this._databaseFiles) {
        this.loadDataFile(databaseFile.name, prefix + databaseFile.src);
    }
    if (this.isEventTest()) {
        this.loadDataFile("$testEvent", prefix + "Event.json");
    }
}
DataManager.loadGame = function (savefileId) {
    const saveName = this.makeSavename(savefileId);
    return StorageManager.loadObject(saveName).then(contents => {
        this.createGameObjects();
        this.extractSaveContents(contents);
        this.correctDataErrors();
        return 0;
    });
}
首先我们看一下这两个函数,函数1是「启动游戏时执行一次」,会把data文件夹下面的所有json文件(地图除外)读一遍,保存在各个$dataXxx中。
函数2是「读取存档时执行一次」,会根据存档的内容把各个$gameXxx(比如变量和开关)设置好。
假设编号为n的武器「在一个周目中只能获取一件」,那么我们只要在获取前对$dataWeapons[n]的某些属性赋值。比如对name赋值来得到新的前缀,对params赋值来修改八项属性。
但是这样做有两个问题:一是关掉游戏重新启动以后,函数1会把你刚才辛辛苦苦设置好的值覆盖掉。二是如果返回标题然后读取另一个存档,则会把当前游戏进度中的值带到读档以后……
为了避免这两个问题,我们需要两点保证:
1. 修改过的值必须在存档时被一起保存,比如保存在开关、变量里。
2. 读取存档时需要先额外调用一次函数1将数据库恢复到初始状态,然后再根据上一点保证中的变量和开关对数据库进行调整。

示例的话,比如说我们有一个插件定义了下面的函数3,并且在读取存档时新增了一行:
DataManager.update = function () {
    if ($gameVariables.value(10) > 50) $dataWeapons[1].name = "修复的剑"; else $dataWeapons[1].name = "生锈的剑";
}
DataManager.loadGame = function (savefileId) {
    const saveName = this.makeSavename(savefileId);
    return StorageManager.loadObject(saveName).then(contents => {
        this.createGameObjects();
        this.extractSaveContents(contents);
        this.correctDataErrors();
        DataManager.loadDatabase(); // 新增的一行,重置数据库
        DataManager.update(); // 根据变量和开关等调整数据库
        return 0;
    });
}
然后在游戏中,什么时候需要把1号武器的名字从「生锈的剑」改成「修复的剑」,就什么时候把10号变量改成大于50的值,然后调用一次DataManager.update()让其生效。
作者: wxh811211    时间: 2022-11-29 08:17
GF的独立装备系统满足你的随机属性和前缀,后缀等一切.关键还对独立装备优化了.
作者: neethime    时间: 2023-4-9 21:27
wxh811211 发表于 2022-11-29 08:17
GF的独立装备系统满足你的随机属性和前缀,后缀等一切.关键还对独立装备优化了. ...

官方有独立装备系统吗 求详细




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