Project1

标题: 【真的很难么】【如何将状态时间的计算改到回合结束?】 [打印本页]

作者: huihui99    时间: 2013-11-29 20:53
标题: 【真的很难么】【如何将状态时间的计算改到回合结束?】
本帖最后由 huihui99 于 2013-12-4 23:19 编辑

好像也可以RT(你够
好吧,具体来说是这么一回事,VX自带的状态里的那个“经过X回合后以Y%几率解除”一条,在实际游戏时是在附加有状态的目标每次行动的时候进行一次判定,时间没到就减时间,到了就开始算概率判断是否解除。这个设定本身其实还是挺科学的(确保目标无论在何时受到状态加成,也无论一回合进行了多少次行动,状态的持续时间都一定是相同的),问题出在VX事件中的强制战斗行动上
由于强制战斗行动相当于是让目标进行了一次额外的行动,因此状态的持续时间同样会扣减,当然,如果这次战斗行动只是单纯地进行了一次攻击,那状态也算得到了利用并没有啥亏的。可是实际设计中不免会需要用到“没有实际意义的技能→触发公共事件处理东西→强制战斗行动触发真正的攻击”这样的模式来实现一些特殊的技能效果,这样的技能在实战中看起就像一次行动,但其实它却是一个两段式的行动,于是状态的持续事件也被扣除了两回合。如果这种技能用的比较多,一个原本能持续5回合的状态,可能仅仅过去3回合就已经消失了(而且第三回合的时候,状态甚至在你的攻击发出之前就没了),此外,对于携带有“持续伤害”项目的状态,因为伤害是回合结束时结算而状态却是每次行动都减少持续时间,也很可能导致频繁的二段行动让持续伤害状态快速消失的问题
综上,现在需要的是改变脚本里对于状态持续时间的判定,对所有的对象的状态都放在回合结束时进行一次统一的判定,也就是无论当回合做出了多少次行动,都只在回合结束时将持续时间减一回合,或是判断状态失去。这样可以有效地防止强制战斗行动让持续时间缩短的问题,当然,不可避免的是在回合中进行多次攻击的话,等于变相地延长了状态的持续时间,不过对于玩家来说,这种伪延长应该比莫名其妙地缩短好理解的多,作为一个小技巧也无不可
作者: huihui99    时间: 2013-11-30 20:54
24小时经过,稍顶一下
作者: huihui99    时间: 2013-12-4 12:14
4天经过,稍顶一下
这个感觉应该不算难吧
作者: 耀眼的毛玉    时间: 2013-12-7 10:18
我觉得可以用技能连发来实现……我现在就是用的技能连发……
class Scene_Battle < Scene_Base
  def execute_action_skill
    skill = @active_battler.action.skill   
    ####################################################3
   
    skill = @active_battler.action.skill
    $skill_animation = {}
    for i in [1]
      name = skill.name
      if $name_skill.split(/,/)[0]
        if $name_skill != nil
          kill = $name_skill.split(/X/)[1]
          if kill == nil or kill == ""
            kill = 1
          end
          #p kill
          #p name
        end
      end
      @animation_times = 1
      @animation_times += $skill_animation[skill.id] if $skill_animation.keys.include?(skill.id)
      for ii in 1..kill.to_i
      ####################################################3333
        text = @active_battler.name + skill.message1
        @message_window.add_instant_text(text)
        unless skill.message2.empty?
          wait(10)
          @message_window.add_instant_text(skill.message2)
        end
        targets = @active_battler.action.make_targets
        
        if @animation_times > 0
          display_animation(targets, skill.animation_id)
          @animation_times -= 1
        end
        
        @active_battler.mp -= @active_battler.calc_mp_cost(skill)
        $game_temp.common_event_id = skill.common_event_id
        for target in targets
          target.skill_effect(@active_battler, skill)
          display_action_effects(target, skill)
        end
        @message_window.clear
      end
      if $game_variables[183] >= 1                   #技能连发用变量
        skill = $data_skills[skill.id+1]
        $game_variables[183] -= 1
        @active_battler.action.set_skill(skill.id)
        redo
      end
    end
    if @active_battler.re_damage > 0 and target.hp > 0 and @active_battler.hp > 0
      @active_battler.hp -= @active_battler.re_damage
      @message_window.add_instant_text(target.name + '发动了反击!')
      if $game_variables[181] == 2  #高速战斗
        wait(30)
      else
        wait(40)
      end
      @message_window.add_instant_text(@active_battler.name + '受到了' + @active_battler.re_damage.to_s + '点伤害!')
      if @active_battler.actor?
        Sound.play_actor_damage
        $game_troop.screen.start_shake(5, 5, 10)
      else
        Sound.play_enemy_damage
        @active_battler.blink = true
      end
      if $game_variables[181] == 2  #高速战斗
        wait(40)
      else
        wait(50)
      end
    end
  end
end
module RPG
    class Skill

      def name
        $name_skill = @name
        name = @name.split(/,X/)[0]

        return name != nil ? name : ""

      end
    end
end

这个是我在别人基础上改的的技能连发+多段伤害的脚本,你取需要的部分就行
作者: 耀眼的毛玉    时间: 2013-12-7 10:43
因为不清楚你是否对脚本比较熟悉所以我帮你把需要的部分取下来好了
这个是技能连发+多段伤害的合体脚本
用法:
我设的控制技能连发的变量是183号变量,你可以自己更改
在Game_Battler的 def make_obj_damage_value(user, obj)的最后一个end前面加上如下内容
   $game_variables[183] += X if obj.is_a?(RPG::Skill) and obj.id == Y
Y代表你说的“无意义技能”的编号,X代表你想让它接下来再放几个技能(这里默认你在skill数据库中把接下来要放的技能放在第一个技能后面)
另外附带的多段伤害技能,用法就是把数据库中技能的名字后面加上",X段数"就行了,我懒得把它拆出来所以权当附赠

class Scene_Battle < Scene_Base
  def execute_action_skill   
    skill = @active_battler.action.skill
    $skill_animation = {}
    for i in [1]
      name = skill.name
      if $name_skill.split(/,/)[0]
        if $name_skill != nil
          kill = $name_skill.split(/X/)[1]
          if kill == nil or kill == ""
            kill = 1
          end
        end
      end
      @animation_times = 1
      @animation_times += $skill_animation[skill.id] if $skill_animation.keys.include?(skill.id)
      for ii in 1..kill.to_i
      ####################################################3333
        text = @active_battler.name + skill.message1
        @message_window.add_instant_text(text)
        unless skill.message2.empty?
          wait(10)
          @message_window.add_instant_text(skill.message2)
        end
        targets = @active_battler.action.make_targets
        
        if @animation_times > 0
          display_animation(targets, skill.animation_id)
          @animation_times -= 1
        end
        
        @active_battler.mp -= @active_battler.calc_mp_cost(skill)
        $game_temp.common_event_id = skill.common_event_id
        for target in targets
          target.skill_effect(@active_battler, skill)
          display_action_effects(target, skill)
        end
        @message_window.clear
      end
      if $game_variables[183] >= 1                   #技能连发用变量
        skill = $data_skills[skill.id+1]
        $game_variables[183] -= 1
        @active_battler.action.set_skill(skill.id)
        redo
      end
    end
  end
end
module RPG
    class Skill

      def name
        $name_skill = @name
        name = @name.split(/,X/)[0]
        return name != nil ? name : ""
      end
    end
end
作者: huihui99    时间: 2013-12-7 16:56
本帖最后由 huihui99 于 2013-12-7 17:03 编辑
耀眼的毛玉 发表于 2013-12-7 10:18
我觉得可以用技能连发来实现……我现在就是用的技能连发……
class Scene_Battle < Scene_Base
  def execu ...


多谢帮助,但是这和我所问的问题完全无关
我知道您是希望可以用其他方式制作技能来回避这一问题,但必须说的是,状态持续时间在什么时候进行判定,表现出的效果差异非常大,影响到的游戏效果很多,技能会出问题只是一个最显著的例子,但并不是重做技能就可以解决所有问题,这一脚本对于实际问题并没有太大的意义。因此,我现在需要的还是将状态持续时间的计算移动到回合结束时而非行动时,其他的取巧方式或多或少会造成各种偏差
不过不管怎么说,还是感谢您的热心帮助

技能连发不能解决的一个典型例子:
这个连发能做到的仅仅是在发动技能后引发多段技能,但如果在战斗中因各种需要,直接使用强制战斗行动进行新的行动而没有通过技能,那么状态持续时间还是被正常消耗了
这同样只是例子,其他类似的问题还有很多

(PS:话说,虽然咱不是很懂脚本,但是这问题真有那么难么……
作者: fux2    时间: 2013-12-7 17:11
如果你是默认系统的话,Scene_Battle的746行就是处理自动状态的地方。
你将这一行移动到777行和778行之间。(放到回合结束处理
然后把810行开始的remove_states_auto定义改成如下内容。
  1.   def remove_states_auto
  2.     $game_party.members.each do |i|
  3.       last_st = i.states
  4.       i.remove_states_auto
  5.       if i.states != last_st
  6.         wait(5)
  7.         display_state_changes(i)
  8.         wait(30)
  9.         @message_window.clear
  10.       end
  11.     end
  12.   end
复制代码

作者: huihui99    时间: 2013-12-7 17:26
本帖最后由 huihui99 于 2013-12-7 17:28 编辑
fux2 发表于 2013-12-7 17:11
如果你是默认系统的话,Scene_Battle的746行就是处理自动状态的地方。
你将这一行移动到777行和778行之间。 ...


不对似乎咱理解有误,稍等一下
作者: fux2    时间: 2013-12-7 17:27
huihui99 发表于 2013-12-7 17:26
依样进行后,在开战斗时提示778行报错
这边基本上是用默认系统的,但是加装了一个XP风格战斗的脚本,为防 ...

传个最简工程我帮你改改吧,你可能哪里弄错了。
作者: huihui99    时间: 2013-12-7 17:30
好了,没问题了,刚才确实是咱脑抽了(
多谢帮助,目前为止测试正常




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