查看: 2412|回复: 3

[原创发布] vs插件使用教程 (4.14更新状态计数,看完立省8美元)

[复制链接]
梦石
0
星屑
6808
在线时间
461 小时
注册时间
2012-2-19
回帖
37
发表于 2023-4-12 19:07:57 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 sundeshuo 于 2023-4-14 12:57 编辑

虽说是vs插件教程,但是实际上具体的效果的代码还是要自己写
所以这其实是一个简单的rm js基础教程~
自己其实也是萌新如果有说错的地方,请大佬们指点。
1.溅射:
先来做一个简单的让你的攻击带有溅射效果的装备
需要用到vs的战斗核心插件,yep跟gf插件也有相同的功能,替换对应的tag即可;
使用的是这里的功能
2U95_%~4I202~KCNK921NH4.png
这个功能在yep的状态核心中,在gf的战斗插入效果中
这个功能可以让你角色或者怪物行动的各个阶段,插入js代码
在vs里一些与状态有关的,比如状态被添加/移除时等等的tag在vs状态核心里。

这里我用的是‘在伤害执行后,并且是使用者’这个tag
<JS Post-Damage as User>
...
</JS Post-Damage as User>
既然是溅射,那么我们就要吧受到溅射的目标找出来
这里可以用rm本身的方法把它找出来
battler.friendsUnit()方法与battler.opponentsUnit()方法
前者可以找到对象的友方,后者是敌方
但是这两个方法返回的是
$gameParty 跟 $gameTroop
这两个变量大概理解为玩家的队伍跟怪物的队伍,它里面保存的东西很多;
然后在使用aliveMembers()方法,看意思就能知道是活着的成员
他会返回一个数组,数组里装的就是队伍里所有在战斗中且活着的成员。
它具体是怎么实现的可以去rmmz_objects.js文件搜索对应的方法看到。
这样我们就可以声明一个变量把它保存下来
const members = target.friendsUnit().aliveMembers();
这里的target是你这次行动的目标。
这样我们就把要收到伤害的目标找出来了
然后我们对所有目标挨个扣血就可以了。
扣血可以使用battler.gainHp(value)
扣血之后,还要吧这个造成的伤害数字显示出来
battler.startDamagePopup()
之后清空
battler.clearResult()
这些都了解了,就可以做这件装备了
数据库编辑好其他属性以后,再备注栏里添加
[pre lang="JavaScript"]<JS Post-Damage as User>
//先把原本的伤害弹出
target.startDamagePopup();
target.clearResult();
//把受到溅射的目标保存
const members = target.friendsUnit().aliveMembers();
//写一个伤害公式,可以用的变量有user:使用者;target:目标;value:对目标造成的伤害
//Math.floor()是取整数
const dam = Math.floor(伤害公式)
//用循环数组中的所有目标挨个扣血,of前面的member可以换别的名字
for(let member of members) {
        //这里if一下判断是不是目标本身,如果是则跳过
        if(member !== target) {
                member.gainHp(-dam);
                member.startDamagePopup();
                member.clearResult();
        }
}
</JS Post-Damage as User>[/pre]
这样一件让你的攻击附带溅射效果的武器就做好了
这么写的话群体攻击每个怪物受到的伤害都会溅射,如果想要只有单体生效可以
if(this.isForOne()) {

}
判定一下是否是单体技能;
治疗也会生效,如果不想生效可以
if(!this.isRecover()) {

}
排除掉治疗;
if套太多有点乱?
可以将所有条件通过&&连接起来,只有当所有条件都满足时才会执行

2.状态计数
状态计数
不同于状态回合计数,这个计数是独立的,显示在状态图标的下方居中位置,如图所示

这个计数不会随着回合进行而改变,显示的内容只取决于你所设置的内容;
同时这个计数也不限与数字,字符串一样可以显示
在官方的说明中可以看到使用方法:

battler.getStateDisplay(stateId) 是获取xx状态的计数;
battler.setStateDisplay(stateId, value) 是将xx状态的计数设置为value;
battler.clearStateDisplay(stateId) 是将xx状态的计数清空;

vs有这样一个插件售价8美元,效果是做出抵挡伤害的护盾效果

这个效果我们是用状态计数功能就可以实现,实际上这个插件应该也是用这个功能实现的,
但是插件混淆过,所以具体看不到,但是应该是,只是用这个插件可以使用tag简单实现。
但是免费的更香对不对
写好一个技能,效果是添加状态,这里状态id假设为114514
备注:
[pre lang="JavaScript"]//这个tag是添加状态的时候执行
<JS On Add State>
//设计一个护盾值的公式,这里能用的变量有user、target、origin(状态来源)、state(这个状态本身)、stateId(这个状态的id)
const barrier = 你的公式//例子:user.mhp * 0.2;
//将算好护盾值保存到状态计数,因为我们设置的状态就是这个状态本身,所以114514写stateId也是可以的
target.setStateDisplay(114514, barrier);
</JS On Add State>

//因为是护盾,所以要在在受到伤害前判定,同时你挨打所以要作为target,使用这个tag
<JS Post-Damage as Target>
/*vs的那个插件有很多种护盾,只不过是if的条件不一样,
这里就拿魔法护盾举个例子吧,判定的方法是Action.isMagical();
注意前面的Action,因为这个方法是定义在Game_Action中的,只能对’行动‘使用,
你放一次技能或者用一次物品,完整的过程就是一次行动,而user、target都是战斗者,
你如果用user.isMagical()是会报错的。
在这几个行动相关的tag里面this的指向的就是这次行动*/
//判断是否是魔法攻击
if(this.isMagical()) {
        //获取剩余的护盾值
        let barrier = getStateDisplay(114514);
        //在这个tag里value可以直接用,是即将造成的伤害
        //判断护盾值够不够抵消本次伤害
        if(barrier >= value) {
                //如果剩余护盾值足够,计算剩余护盾值
                barrier = barrier - value;
                //设置剩余护盾值
                target.setStateDisplay(114514, barrier);
                //将伤害设置为0
                value = 0;
        }
        //否则
        else {
                //计算护盾抵消后的剩余伤害
                value = value - barrier;
                //剩余护盾为零
                target.setStateDisplay(114514, 0);
        }
}
</JS Post-Damage as Target>[/pre]
这只是一个使用状态计数的例子,实际上这么做护盾的话是有可能,被后面执行的
影响value的其他插入效果改变,并不完美

未完待续...
梦石
0
星屑
538
在线时间
53 小时
注册时间
2023-3-4
回帖
16
发表于 2023-4-13 13:39:41 | 显示全部楼层
支持大佬,希望多来点VS插件使用心得
回复

使用道具 举报

梦石
0
星屑
538
在线时间
53 小时
注册时间
2023-3-4
回帖
16
发表于 2023-4-18 01:26:36 | 显示全部楼层
都是干货,很有帮助。
请教大佬个问题
target.startDamagePopup();
target.clearResult();
这两个函数确实可以弹出伤害,但是好像就没法正常调用受伤动作了,打过去只有伤害弹出,受伤对应的动作和音效都消失了
回复

使用道具 举报

梦石
0
星屑
1669
在线时间
230 小时
注册时间
2018-12-9
回帖
131
发表于 2023-4-22 11:35:26 | 显示全部楼层
感谢楼主的辛劳
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部