设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2196|回复: 5
打印 上一主题 下一主题

[有事请教] 怎么让装备自动添加一个随机的前缀

[复制链接]

Lv3.寻梦者

梦石
0
星屑
2625
在线时间
366 小时
注册时间
2021-9-20
帖子
110
跳转到指定楼层
1
发表于 2022-11-25 20:03:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
请教:一件装备掉落时,随机附加一个前缀,比如一把武器:单手剑,掉落实际获得的是强力的单手剑或敏捷的单手剑,属性根据前缀来附加。

有没有什么方法或插件?

Lv3.寻梦者

梦石
0
星屑
1606
在线时间
220 小时
注册时间
2022-2-3
帖子
160
2
发表于 2022-11-25 21:31:03 | 只看该作者
本帖最后由 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. }
复制代码


我的联系方式Q: 1127808900
欢迎一起讨论任何问题
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7289
在线时间
475 小时
注册时间
2021-12-4
帖子
514
3
发表于 2022-11-25 22:09:33 | 只看该作者
楼上这怎么还用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()让其生效。
回复 支持 1 反对 0

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1746
在线时间
253 小时
注册时间
2020-9-15
帖子
115
4
发表于 2022-11-29 08:17:27 | 只看该作者
GF的独立装备系统满足你的随机属性和前缀,后缀等一切.关键还对独立装备优化了.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
85
在线时间
17 小时
注册时间
2023-3-30
帖子
5
5
发表于 2023-4-9 21:27:13 | 只看该作者
wxh811211 发表于 2022-11-29 08:17
GF的独立装备系统满足你的随机属性和前缀,后缀等一切.关键还对独立装备优化了. ...

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

点评

GF是一位插件作者的昵称, 并非"官方"的意思  发表于 2023-4-10 08:54
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-23 02:24

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表