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

Project1

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

[已经解决] 求教双持角色平砍时分别计算左右手伤害的脚本

[复制链接]

Lv2.观梦者

梦石
0
星屑
642
在线时间
165 小时
注册时间
2012-4-18
帖子
264
跳转到指定楼层
1
发表于 2013-10-29 18:14:11 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
本帖最后由 salvareless 于 2013-11-2 00:24 编辑

如题,求一个能让双持角色只在普通攻击时分别计算左手的武器伤害和右手的武器伤害的脚本。

虽然自己想来想觉得略有一些不太现实,但是迫于盗贼职业平砍比技能还牛,又不能改技能(这样会使其他职业渣成shi,牵一发动全身啊= =苦逼),于是只好上开伸手了。

厄,还有就是只是平砍的时候分别计算,技能的时候还是用正常的数据计算。

求各方大神相助。

我,永月极圣(Salvareless)章告所有看见这张帖子的人,在以下楼层我对tan12345一直以来多有冒犯,再次请求tan12345海涵。

本脚本想要实现的功能已经在tan12345,和喵呜喵5的帮助下完成,脚本和伤害公式以及注意事项在后面我就不提前了,请需要的人去后面观看。

Lv2.观梦者

梦石
0
星屑
642
在线时间
165 小时
注册时间
2012-4-18
帖子
264
来自 23楼
 楼主| 发表于 2013-11-1 15:37:56 | 只看该作者
本帖最后由 salvareless 于 2013-11-2 01:40 编辑

测试完毕,可以实现左右手分别用两个公式计算伤害,主手攻击显示主手的武器图标和武器攻击动画。实际的脚本如下:
  1. #本脚本来自于66rpg的tan12345

  2. class Game_Actor < Game_Battler
  3.   def attack_skill_id
  4.     case @class_id
  5.     when 3#假设职业id=3代表盗贼职业,就是双持武器的职业
  6.       return 340#将双持武器的职业的普通攻击替换成340号技能
  7.     else
  8.       return 1#否则为1号
  9.     end
  10.   end
  11. end
  12. class Scene_Battle < Scene_Base
  13.   #--------------------------------------------------------------------------
  14.   # ● Use Item
  15.   #--------------------------------------------------------------------------  
  16.   alias aaa use_item
  17.   def use_item
  18.     check_aaa_targets
  19.     aaa
  20.     execute_aaa_actions
  21.   end
  22.   #--------------------------------------------------------------------------
  23.   # ● 检查左手刀的对象(就是获取右手刀的攻击对象id)。
  24.   #--------------------------------------------------------------------------
  25.   def check_aaa_targets
  26.     return if @subject == nil
  27.     targets = @subject.current_action.make_targets.compact      
  28.     return if targets == nil
  29.     if @subject.current_action.item.scope == 1 or#其实只要这一行即可,下面的7、10、11是我自己的脚本需要,没改动是因为他不影响你的脚本
  30.        @subject.current_action.item.scope == 7 or
  31.        @subject.current_action.item.scope == 10 or
  32.        @subject.current_action.item.scope == 11
  33.        @pre_target = targets[0]
  34.        @pre_target_hp = @pre_target.hp
  35.     else   
  36.        @pre_target = nil
  37.        @pre_target_hp = nil
  38.     end  
  39.   end
  40.   #--------------------------------------------------------------------------
  41.   # ● 判定是否可执行左手刀
  42.   #--------------------------------------------------------------------------
  43.   def execute_aaa_actions
  44.     if @pre_target != nil
  45.       return if @pre_target.dead?
  46.       return if !@pre_target.result.hit? and @pre_target.hp == @pre_target_hp
  47.     end
  48.     action_id = 341 if @subject.current_action.item.is_a?(RPG::Skill) and @subject.current_action.item.id == 340#如果上一次的行动动作是技能341(就是右手刀攻击),那么发动340号技能。
  49.     action_id = 342 if @pre_target.dead?
  50.     return if action_id == nil or action_id < 1 #否则直接返回。
  51.     @subject.input.set_skill(action_id)
  52.     execute_action
  53.   end  
  54. end
复制代码
另外需要将下列代码插入SideViewバトラー設定代码页的  def skill_action 方法中

  1.     when 340
  2.       return "双持平砍主手"  #装备栏1号
  3.     when 341
  4.       return "双持平砍副手"  #装备栏2号

复制代码
同时需要将如下代码插入SideViewアクション設定脚本页的  FULLACTION = { }的末端,要插在花括号里面,这一段可能存在脚本被汉化过的问题,请使用者根据普通攻击的定义段自行修改。

  1.   "双持平砍主手"    => ["敵前移動","コラプス禁止","個別開始","武器振りR","対象アニメ武器WT","死亡確認"],
  2.   "双持平砍副手"    => ["武器振りL","死亡確認","対象アニメ武器LWT","個別終了","コラプス禁止解除","次の行動者へ","座標リセットカーブ"],

复制代码
测试BUG,如果第一刀砍死怪物会出现滞留原地的情况。
解决方案,再设置一个技能(空白技能),并修改第一部分代码为:怪物死亡则发动342号技能。同时在第二代码增设342号技能的返回值为“回到原点”,在第三部分设置("回到原点"   =>["個別終了","コラプス禁止解除","次の行動者へ","座標リセットカーブ"],)
另有在伤害公式中调用装备栏1号和2号装备的攻击力的代码未解决。尝试中,尝试好了我会发上来的。这里已改,做出退让接受这个bug。

尝试完毕改善第一刀砍死怪物后不回到原位的BUG,已经修改上述三个脚本。第342号技能需要设为生命值伤害,但是公式写为0(不知道为什么= =)。

至于主手和副手的伤害公式(之前的公式还是存在逻辑问题,必须再调用角色在没有装备和状态下的攻击力,这里暂且叫做原本攻击):
主手(340号技能):(主手攻击+原本攻击)/(主手攻击+原本攻击+副手攻击)*a.atk*(1-b.def/(b.def+b.luk*4+400))    这是护甲减免的部分(1-b.def/(b.def+b.luk*4+400))。
副手(341号技能):(副手攻击+原本攻击)/(主手攻击+原本攻击+副手攻击)*a.atk*(1-b.def/(b.def+b.luk*4+400))

于是乎主手攻击,副手攻击,原本攻击这三个的代码是什么啊,真心要弄死人,找疯了都= =用装备栏ID吧,两手的ID都是0 ,苦逼。
原本攻击都还好,如果只用一个双持职业就可以用他自己的成长算出来。(我设的luk是等于角色等级的,因为怪物没有等级,这样方便统一计算公式。然后原本攻击力就可以这样写,原本攻击=(10+7*a.luk))


经过测试发现脚本会在角色死亡的时候报错,“input没有值”。经过调试发现是return if @pre_target.dead?这一行引起的一种奇怪的BUG,要么接受这个BUG(这怎么能接受啊胃),要么接受在第一刀砍死怪后不回到原本位置,相比之下,还是选择后者吧。于是重新改了最后结论

点评

伤害公式中调用装备栏1号和2号装备的攻击力的代码,你可以从http://bbs.66rpg.com/thread-307316-1-4.html找灵感,也可以从获取角色能力那里入手。我倒是有想法了  发表于 2013-11-1 16:04
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
642
在线时间
165 小时
注册时间
2012-4-18
帖子
264
来自 26楼
 楼主| 发表于 2013-11-2 00:08:43 | 只看该作者
本帖最后由 salvareless 于 2013-11-2 01:04 编辑

自己脚本基本功太差换来换去也没换出正确的组合。于是去求教了,感谢喵呜喵5给出的调用代码:a.equips[0].params[2]。之前自己弄的时候不是少个s就是用错小括号的。
于是公式如下。

主手:a.atk*(1-b.def/(b.def+b.luk*4+400))*(a.equips[0].params[2]+a.luk*7+10)/(a.equips[0].params[2]+a.luk*7+10+a.equips[1].params[2])
副手:a.atk*(1-b.def/(b.def+b.luk*4+400))*(a.equips[1].params[2]+a.luk*7+10)/(a.equips[0].params[2]+a.luk*7+10+a.equips[1].params[2])

公式中的a.luk*7+10,实在只有一个双持职业的情况下,对他的无装备无状态下的攻击力进行计算的式子。10是基础数,7是每一个等级的成长率。
另外为了避免写不下,可以在Game_BattlerBase脚本页的“● 各种能力值的简易访问方法”那部分最下端事先写好如下结构:
  1. def lat    #主手
  2.   equips[0].params[2]
  3. end
  4. def rat   #副手
  5.   equips[1].params[2]
  6. end
复制代码
然后将公式改写为:
主手:a.atk*(1-b.def/(b.def+b.luk*4+400))*(a.lat+a.luk*7+10)/(a.lat+a.luk*7+10+a.rat)
副手:a.atk*(1-b.def/(b.def+b.luk*4+400))*(a.rat+a.luk*7+10)/(a.lat+a.luk*7+10+a.rat)

并没有什么改变只是为了缩短公式防止写不下。特别说明要使用这个公式需要知道这个是用护甲值按比例减免伤害def/(b.def+b.luk*4+400),同时由于怪物没有等级就用怪物的幸运值代替了等级,所以在给怪物设幸运值的时候要额外注意。

然后到这里,这个脚本就全部结束了。
感谢tan12345不计前嫌给出的可行脚本,以及喵呜喵5在另一张帖子上给出的调用公式(我调用老是写不对)。

之前的公式逻辑顺序有误,已经更正。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
491
在线时间
339 小时
注册时间
2010-12-15
帖子
926

开拓者

25
发表于 2013-11-1 22:47:46 | 只看该作者
1.回答问题的人不欠你钱
2.回答问题的人都是来帮你的
3.请结贴
回复 支持 0 反对 1

使用道具 举报

Lv2.观梦者

梦石
0
星屑
642
在线时间
165 小时
注册时间
2012-4-18
帖子
264
24
 楼主| 发表于 2013-11-1 20:28:27 | 只看该作者
调试不出来= =求教怎么调用那三个参数。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3298
在线时间
1120 小时
注册时间
2009-4-15
帖子
815
22
发表于 2013-11-1 14:49:46 | 只看该作者
salvareless 发表于 2013-11-1 14:29
非常感谢tan1235不计前嫌给出可行脚本。

按照你的方法,我想应该会发生如下情况:

我测试过了和默认SideView的结合(原先的想法是默认系统可以,所以没考虑到和SideView的结合),显示出来的效果是走到怪前,一刀(确实没考虑武器图标),怪没死,退回去半路都不到,再走到怪前,又一刀。你如果要结合你那个帖子里说的话,我再研究研究,之前没考虑到和SideView的结合。

评分

参与人数 1梦石 +1 收起 理由
Sion + 1 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
642
在线时间
165 小时
注册时间
2012-4-18
帖子
264
21
 楼主| 发表于 2013-11-1 14:29:53 | 只看该作者
非常感谢tan1235不计前嫌给出可行脚本。

按照你的方法,我想应该会发生如下情况:
走到怪面前,左手砍一刀,关没死,退回去。再走到怪面前,右手砍一刀,这里的砍一刀出来的武器图标依然是左手武器的图标,再退回去。
我想应该可以结合我在那个帖子里说道的,从新定义340和341为两个新的技能动画类型。然后将如下代码添加到合适部分,已达到较为完美的效果。
然后还是定义动画
    when 340
      return "双持平砍左"
    when 341
      return "双持平砍右"

然后定义
"双持平砍左"        => ["敵前移動","コラプス禁止","個別開始","武器振りL","対象アニメ武器LWT","死亡確認",]       #左手砍了不回原位,除非砍死了
"双持平砍右"        => ["武器振りR","対象アニメ武器WT","個別終了","コラプス禁止解除","次の行動者へ","座標リセットカーブ" ]       #右手砍了再回原位

具体会出现什么问题,等我吃了饭测试下再行讨论,不然我的午饭就喂猫蓝,麻痹死猫在咬老子手办,先这样了。

点评

恩恩,貌似就是这样改。  发表于 2013-11-1 14:52
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3298
在线时间
1120 小时
注册时间
2009-4-15
帖子
815
20
发表于 2013-11-1 14:15:21 | 只看该作者
第一,你用了SideView脚本,如果要结合这个脚本,需要一点小改动:SideView的设定里有一个地方叫二刀流设定(就是双持武器,翻译成日语叫二刀流),这个二刀流的设定最后执行的是二刀左,找到二刀左的设定,设置内容为空"二刀左"=> [],之所以这样做,是因为SideView会2次攻击,每次攻击以总攻击力计算,把二刀左设定去掉,是因为我的思路是双持武器的攻击伤害既然区分,干脆就以2个技能方式区分,这样设定伤害也灵活。
第二,15楼给你的第二个脚本是根据职业ID划分普通攻击用的,我看了你的给我的连接,那个缺乏灵活性,我怕你还有别的双持武器的职业,所以我给你第二个脚本可以多次判定不同职业。
第三,你准备好2个平砍技能(左手平砍和右手平砍,我这里假设是340是右手平砍,341是左手平砍),当然,如果你有多个职业是双持武器的,你想区分开各个职业的伤害,就多准备X*2个平砍技能吧。340号技能和341号技能的分开,也是为了更灵活的设定右手刀伤害和左手刀伤害。
第四,脚本,脚本是MOG给我的灵感,这个脚本基于他给的脚本改的。
  1. class Scene_Battle < Scene_Base
  2.   #--------------------------------------------------------------------------
  3.   # ● Use Item
  4.   #--------------------------------------------------------------------------  
  5.   alias aaa use_item
  6.   def use_item
  7.     check_aaa_targets
  8.     aaa
  9.     execute_aaa_actions
  10.   end
  11.   #--------------------------------------------------------------------------
  12.   # ● 检查左手刀的对象(就是获取右手刀的攻击对象id)。
  13.   #--------------------------------------------------------------------------
  14.   def check_aaa_targets
  15.     return if @subject == nil
  16.     targets = @subject.current_action.make_targets.compact      
  17.     return if targets == nil
  18.     if @subject.current_action.item.scope == 1 or#其实只要这一行即可,下面的7、10、11是我自己的脚本需要,没改动是因为他不影响你的脚本
  19.        @subject.current_action.item.scope == 7 or
  20.        @subject.current_action.item.scope == 10 or
  21.        @subject.current_action.item.scope == 11
  22.        @pre_target = targets[0]
  23.        @pre_target_hp = @pre_target.hp
  24.     else   
  25.        @pre_target = nil
  26.        @pre_target_hp = nil
  27.     end  
  28.   end
  29.   #--------------------------------------------------------------------------
  30.   # ● 判定是否可执行左手刀
  31.   #--------------------------------------------------------------------------
  32.   def execute_aaa_actions
  33.     if @pre_target != nil
  34.        return if @pre_target.dead?
  35.        return if !@pre_target.result.hit? and @pre_target.hp == @pre_target_hp
  36.     end
  37.     action_id = 341 if @subject.current_action.item.is_a?(RPG::Skill) and @subject.current_action.item.id == 340 #如果上一次的行动动作是技能341(就是右手刀攻击),那么发动340号技能。
  38.     return if action_id == nil or action_id < 1 #否则直接返回。
  39.     @subject.input.set_skill(action_id)
  40.     execute_action
  41.   end  
  42. end
复制代码
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
642
在线时间
165 小时
注册时间
2012-4-18
帖子
264
19
 楼主| 发表于 2013-11-1 13:50:18 | 只看该作者
tan12345。既然您展现出了你真正的水平,我收回之前对你的一切不敬,并郑重向你道歉。我,永月极圣(Salvareless)章告所有看见这张帖子的人,我对您(tan12345)一直以来多有冒犯,敬请您海涵。

关于你提出的两种解决方法。我在同一时间在另一张求教帖里面虽然想出了类似的方法,但并没有写出具体代码,在此非常感谢你给出的具体代码,谢谢。
http://rpg.blue/thread-313180-1-1.html

关于附加状态之后伤害公式BUG的问题,我认为可以用下面的公式来解决。
return (1-左手武器攻击/总攻击)*总攻击*(1-护甲减免) if a.dual_wield?;总攻击力*(1-护甲减免)
不知道对不对,如还有BUG敬请指教。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-15 23:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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