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

Project1

 找回密码
 注册会员
搜索
123
返回列表 发新帖
楼主: salvareless
打印 上一主题 下一主题

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

[复制链接]

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
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
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
24
 楼主| 发表于 2013-11-1 20:28:27 | 只看该作者
调试不出来= =求教怎么调用那三个参数。
回复 支持 反对

使用道具 举报

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
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在另一张帖子上给出的调用公式(我调用老是写不对)。

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

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-17 09:47

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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