Project1

标题: 能不能让这个转轮血条的血条在选择道具目标时停止滚动? [打印本页]

作者: 605533120    时间: 2016-3-5 12:13
标题: 能不能让这个转轮血条的血条在选择道具目标时停止滚动?
https://rpg.blue/thread-281095-1-1.html
↑大概就是这个帖子,

配合着RTAB-CP和脸图战斗使用时在选择道具目标的时候如果有人HP为0挂了的话就会跳错,
所以能不能在选择道具目标的时候暂停血条的滚动?

RUBY 代码复制
  1. #================================================================
  2. #                   转轮血条
  3. #
  4. #                  章半仙制作
  5. #================================================================
  6. =begin
  7. 1.03版
  8.  
  9.   修正默认系统失效的问题
  10.  
  11. 1.02版
  12.  
  13.   增加与XAS系统的兼容
  14.  
  15.   修正整队后的显示问题
  16.  
  17.   修正事件注解中的一些笔误
  18.  
  19.   修正与YEA::BATTLE脸图战斗系统共用时的一些显示问题
  20.  
  21. 1.01版
  22.  
  23. 修正一处方法名写错导致的bug - -b
  24.  
  25. 1.00版更新说明
  26.  
  27. 滚动的计时单位改为帧数,增加更为通俗易懂的转轮速度设置
  28.  
  29. 增加致命伤害时,显示特别信息和播放特别音效的功能
  30.  
  31. 增加预览血条的显示,使损血更为直观
  32.  
  33. 增加更改回血速度和瞬间回血等的事件指令
  34.  
  35. 增加RollBarManager方便整合到自己的系统
  36.  
  37. 增加了各种兼容性检测以保证和其他脚本共同工作,代价是代码的可读性更加诡异了- -b
  38.  
  39. 增加兼容模式,此状态下可以解决大部分血条的显示问题,但效率比较坑爹
  40.  
  41. 增加与YEA::BATTLE脸图战斗系统的兼容
  42.  
  43. 解决部分窗口状态刷新不及时的问题
  44.  
  45. 原本的线程替换为纤程应该可以解决一些战场中途死亡造成的诡异问题- -b
  46.  
  47.  
  48. ps:报错的童鞋最好提供冲突工程链接以便排错...
  49.  
  50.     为了最佳的兼容性,建议把脚本插在main以前的最后一个位置
  51.     
  52. =end
  53.  
  54. module RollBar
  55. VERSION = 1.03
  56. #转轮的速度
  57. ROLL_SPEED = 1
  58. #对hp、mp和tp转轮速度的分别设置
  59. ROLL_SPEED_FOR_HP = ROLL_SPEED
  60. ROLL_SPEED_FOR_MP = ROLL_SPEED
  61. ROLL_SPEED_FOR_TP = ROLL_SPEED
  62. #每次转轮扣的血(新版建议修改ROLL_SPEED)
  63. ROLL_UNIT = 0.5
  64. #每次转轮花的帧数,数值加大可以增加fps,不过血条显示会变得不流畅(新版建议修改ROLL_SPEED)
  65. ROLL_TIME = 2           
  66. #受到致命的攻击时显示的信息(不需要的话设为nil)
  67. KILL_MSG = {
  68.      :hp => "快要不行了",
  69.      :mp => nil,
  70.      :tp => nil
  71.      }
  72. #受到致命的攻击时播放的音效(设为数字时播放系统声音,设为字符串时指定路径的音效,设为nil时不播放)
  73. KILL_SOUND = {
  74.      :hp => "audio/se/Collapse2.ogg",
  75.      :mp => nil,
  76.      :tp => nil
  77.      }
  78. #是否开启预览条,有预览条可以更清晰的表明损血的状况
  79. PRE_BAR_ENABLE = true
  80. #预览条的颜色设置,只有开启PRE_BAR_ENABLE才有效,颜色格式为Color.new(R,G,B,A),R代表红色值,G代表绿色值,B代表蓝色值,A代表透明值
  81. #受到伤害时的预览条颜色,第一个颜色为渐变初始值,第二个为结束值,设为nil则采用默认色彩
  82. PRE_BAR_COLOR_DAMAGE = {
  83.      :hp => [Color.new(200,0,0),Color.new(255,0,0)],
  84.      :mp => [Color.new(200,0,0),Color.new(255,0,0)],
  85.      :tp => [Color.new(200,0,0),Color.new(255,0,0)]
  86.     }
  87. #恢复时的预览条颜色
  88. PRE_BAR_COLOR_RECOVER = {
  89.      :hp => [Color.new(0,150,0),Color.new(0,200,0)],
  90.      :mp => [Color.new(0,150,0),Color.new(0,200,0)],
  91.      :tp => [Color.new(0,150,0),Color.new(0,200,0)]
  92.      }
  93. #如果需要战斗结束时停止血条的滚动并抛弃伤害的话设为true
  94. STOP_ROLL_AND_CLEAR_DAMGE_WHEN_BATTLE_END = true
  95. #如果需要战斗结束时停止血条的滚动并结算的话设为true
  96. STOP_ROLL_AND_EVAL_DAMGE_WHEN_BATTLE_END = false
  97. #如果读档时需要继续存档之前的滚动状态的话设为true
  98. RESUME_ROLL_WHEN_LOAD = true
  99. #如果血条不显示时就同时暂停血条的滚动(如果你想在对话时停止血条的话就设为true)
  100. PAUSE_ROLL_WHEN_WINDOW_INVISIBLE = false
  101.  
  102. #兼容模式,可以解决一些血条显示上的问题,效率比较坑爹- -b
  103. SLOW_MODE_ENABLE = false
  104.  
  105. module RollBarFunc
  106.    #事件脚本接口列表(在事件的脚本框中输入以下内容即可达到相应效果)
  107.  
  108.    #  速度式回血(值,速度,角色id)
  109.    #  效果:以特定的速度回血
  110.    #  参数表:值  数值型 要加的血
  111.    #         速度 数值型   为0时无视滚动直接加血
  112.    #         角色id 数值型 0或负数时则指代队伍中的id
  113.    #                       例如-1时就指代队伍中的第二个人
  114.    #  使用范例:(注意全半角- -b)
  115.    #      速度式回血(100,2,1)
  116.    def recover_hp_with_speed(val,speed,actor_id=0)
  117.      get_actor(actor_id).send(:hp=,get_actor(actor_id).hp+val,speed)
  118.    end
  119.    #  速度式扣血(值,速度,角色id)
  120.    #  效果:以特定的速度扣血
  121.    #  参数表:值  数值型
  122.    #         速度 数值型   
  123.    #         角色id 数值型
  124.    def damage_hp_with_speed(val,speed,actor_id=0)
  125.      recover_hp_with_speed(-val,speed,actor_id)
  126.    end
  127.    #  直接回血(值,角色id)
  128.    #  效果:无视滚动直接回血
  129.    #  参数表:值  数值型
  130.    #         角色id 数值型
  131.    def recover_hp_straight(val,actor_id=0)
  132.      get_actor(actor_id).will_hp = nil
  133.      recover_hp_with_speed(val,0,actor_id)
  134.    end
  135.    #  直接扣血(值,角色id)
  136.    #  效果:无视滚动直接扣血
  137.    #  参数表:值  数值型
  138.    #         角色id 数值型   
  139.    def damage_hp_straight(val,actor_id=0)
  140.      recover_hp_straight(-val,actor_id)
  141.    end   
  142.    #  速度式回魔(值,速度,角色id)
  143.    #  效果:以特定的速度回魔
  144.    #  参数表:值  数值型
  145.    #         速度 数值型   
  146.    #         角色id 数值型
  147.    def recover_mp_with_speed(val,speed,actor_id=0)
  148.      get_actor(actor_id).send(:mp=,get_actor(actor_id).mp+val,speed)
  149.    end
  150.    #  速度式扣魔(值,速度,角色id)
  151.    #  效果:以特定的速度扣魔
  152.    #  参数表:值  数值型
  153.    #         速度 数值型   
  154.    #         角色id 数值型
  155.    def damage_mp_with_speed(val,speed,actor_id=0)
  156.      recover_mp_with_speed(-val,speed,actor_id)
  157.    end
  158.    #  直接回魔(值,角色id)
  159.    #  效果:无视滚动直接回魔
  160.    #  参数表:值  数值型
  161.    #         角色id 数值型
  162.    def recover_mp_straight(val,actor_id=0)
  163.      get_actor(actor_id).will_mp = nil
  164.      recover_mp_with_speed(val,0,actor_id)
  165.    end
  166.    #  直接扣魔(值,角色id)
  167.    #  效果:无视滚动直接扣魔
  168.    #  参数表:值  数值型
  169.    #         角色id 数值型   
  170.    def damage_mp_straight(val,actor_id=0)
  171.      drecover_mp_straight(-val,actor_id)
  172.    end   
  173.  
  174.    #  瞬间全恢复(角色序列)
  175.    #  效果:无视滚动回满血蓝
  176.    #  参数表:角色序列 数值型  角色在队伍中的序列
  177.    #                          -1代表全体队员,可省略
  178.    #  使用范例:
  179.    #  瞬间全恢复
  180.    def all_recover_straight(index=-1)
  181.      get_party(index) do |i|
  182.        i.will_hp = nil;i.send(:hp=,i.mhp,0)
  183.        i.will_mp = nil;i.send(:mp=,i.mmp,0)
  184.        i.will_tp = nil;i.send(:tp=,i.max_tp,0)
  185.      end
  186.    end
  187.    #  设置滚动暂停标志(角色序列,血条类型,标志)
  188.    #  效果:暂停相应角色的血条滚动(暂停状态下减血不会立即显示但会计入)
  189.    #  参数表:角色序列 数值型  角色在队伍中的序列
  190.    #                          -1代表全体队员,可省略
  191.    #         血条类型  :hp  #=>对应hp条
  192.    #                   :mp  #=>对应mp条  
  193.    #                   :tp  #=>对应tp条
  194.    #         标志 布尔型 决定是暂停还是继续
  195.    #  使用范例:
  196.    #      设置滚动暂停标志(-1,:mp,true)
  197.  
  198.    def set_roll_pause_flag(index=-1,type=:hp,flag=true)
  199.      get_party(index) do |i|
  200.        case type
  201.        when :hp
  202.          i.hp_rollbar_pause = flag
  203.        when :mp
  204.          i.mp_rollbar_pause = flag
  205.        when :tp
  206.          i.tp_rollbar_pause = flag
  207.        end
  208.      end
  209.    end
  210.    #  暂停滚动
  211.    #  效果:暂停所有的滚动中的血条
  212.    #  参数表:无
  213.    #  使用范例:
  214.    #      暂停滚动
  215.    #      显示文章 : 因为我在说话就给你们休息一下
  216.    #      恢复滚动
  217.    def pause_roll
  218.      set_roll_pause_flag(-1,:hp,true)
  219.      set_roll_pause_flag(-1,:mp,true)
  220.      set_roll_pause_flag(-1,:tp,true)
  221.    end
  222.    #  恢复滚动
  223.    #  效果:恢复所有的滚动中的血条
  224.    #  参数表:无
  225.    def resume_roll
  226.      set_roll_pause_flag(-1,:hp,false)
  227.      set_roll_pause_flag(-1,:mp,false)
  228.      set_roll_pause_flag(-1,:tp,false)
  229.    end
  230.    #  清除伤害(角色序列,血条类型)
  231.    #  效果:让某个角色当前滚动的血条不再滚动
  232.    #  参数表:角色序列 数值型  角色在队伍中的序列
  233.    #                          -1代表全体队员,可省略
  234.    #         血条类型  :hp  #=>对应hp条
  235.    #                   :mp  #=>对应mp条  
  236.    #                   :tp  #=>对应tp条
  237.    def clear_roll_damage(index=-1,type=:hp)
  238.      get_party(index) do |i|
  239.        case type
  240.        when :hp
  241.          i.will_hp = i.hp
  242.        when :mp
  243.          i.will_mp = i.mp
  244.        when :tp
  245.          i.will_tp = i.tp
  246.        end
  247.      end
  248.    end
  249.    #  清除所有伤害(角色序列)
  250.    #  效果:让某个角色当前滚动的所有血条不再滚动
  251.    #  参数表:角色序列 数值型  角色在队伍中的序列
  252.    #                          -1代表全体队员,可省略
  253.    def clear_all_roll_damage(index=-1)
  254.      clear_roll_damage(-1,:hp)
  255.      clear_roll_damage(-1,:mp)
  256.      clear_roll_damage(-1,:tp)
  257.    end   
  258.    #  结算伤害(角色序列,血条类型)
  259.    #  效果:让某个角色当前滚动的血条直接到达目标血量
  260.    #  参数表:角色序列 数值型  角色在队伍中的序列
  261.    #                          -1代表全体队员,可省略
  262.    #         血条类型  :hp  #=>对应hp条
  263.    #                   :mp  #=>对应mp条  
  264.    #                   :tp  #=>对应tp条
  265.    def eval_roll_damage(index=-1,type=:hp)
  266.      get_party(index) do |i|
  267.        case type
  268.        when :hp
  269.          huaka = i.will_hp;i.will_hp = nil;i.send(:hp=,huaka,0)
  270.        when :mp
  271.          huaka = i.will_mp;i.will_mp = nil;i.send(:mp=,huaka,0)
  272.        when :tp
  273.          huaka = i.will_tp;i.will_tp = nil;i.send(:tp=,huaka,0)
  274.        end
  275.      end
  276.    end
  277.    #  结算所有伤害(角色序列,血条类型)
  278.    #  效果:让某个角色当前滚动的血条不再滚动
  279.    #  参数表:角色序列 数值型  角色在队伍中的序列
  280.    #                          -1代表全体队员,可省略
  281.    #         血条类型  :hp  #=>对应hp条
  282.    #                   :mp  #=>对应mp条  
  283.    #                   :tp  #=>对应tp条
  284.    def eval_all_roll_damage(index=-1)
  285.      eval_roll_damage(-1,:hp)
  286.      eval_roll_damage(-1,:mp)
  287.      eval_roll_damage(-1,:tp)
  288.    end   
  289.    #  改变角色滚动速度(速度,角色id,血条类型)
  290.    #  效果:改变对应角色id的相应血条的滚动速度(正在滚动的血条速度不变)
  291.    #  参数表:速度 数值型   为0时无视滚动直接加血
  292.    #                       为负数时可以让以后的一切扣血变为加血
  293.    #         角色id 数值型                       
  294.    #         血条类型  :hp  #=>对应hp条
  295.    #                   :mp  #=>对应mp条  
  296.    #                   :tp  #=>对应tp条
  297.    #  使用范例:
  298.    #      改变角色滚动速度(2,1,:hp)
  299.    #      增减hp : 全体队友, +100
  300.    #      恢复角色滚动速度(1,:hp)
  301.    def change_roll_speed_for_actor(speed,actor_id=0,type=:hp)
  302.      case type
  303.      when :hp
  304.        get_actor(actor_id).hp_rollbar_speed = speed
  305.      when :mp
  306.        get_actor(actor_id).mp_rollbar_speed = speed
  307.      when :tp
  308.        get_actor(actor_id).tp_rollbar_speed = speed
  309.      end
  310.    end
  311.    #  恢复角色滚动速度(角色id,血条类型)
  312.    #  效果:恢复对应角色id的相应血条的滚动速度
  313.    #  参数表:角色id 数值型
  314.    #          血条类型  :hp  #=>对应hp条
  315.    #                   :mp  #=>对应mp条  
  316.    #                   :tp  #=>对应tp条
  317.    def recover_roll_speed_for_actor(actor_id=0,type=:hp)
  318.      change_roll_speed_for_actor(nil,actor_id,type)
  319.    end
  320.    def get_actor(actor_id)
  321.      actor_id > 0 ? $game_actors[actor_id] : $game_party.members[actor_id.abs]
  322.    end
  323.    def get_party(index)
  324.      party = index == -1 ? $game_party.members : [$game_party.members[index]]
  325.      party.each{|i|yield i}
  326.    end
  327.    #速查表- -b
  328.    alias 速度式回血 recover_hp_with_speed
  329.    alias 速度式扣血 damage_hp_with_speed
  330.    alias 直接回血 recover_hp_straight
  331.    alias 直接扣血 damage_hp_straight   
  332.    alias 速度式回魔 recover_mp_with_speed
  333.    alias 速度式扣魔 damage_mp_with_speed
  334.    alias 直接回魔 recover_mp_straight
  335.    alias 直接扣魔 damage_mp_straight
  336.    alias 瞬间全恢复 all_recover_straight
  337.    alias 设置滚动暂停标志 set_roll_pause_flag
  338.    alias 暂停滚动 pause_roll
  339.    alias 恢复滚动 resume_roll
  340.    alias 暂停滚动 pause_roll
  341.    alias 清除伤害 clear_roll_damage
  342.    alias 清除所有伤害 clear_all_roll_damage
  343.    alias 结算伤害 eval_roll_damage
  344.    alias 结算所有伤害 eval_all_roll_damage
  345.    alias 改变角色滚动速度 change_roll_speed_for_actor
  346.    alias 恢复角色滚动速度 recover_roll_speed_for_actor
  347. end
  348. module RollBarManager
  349.   class << self
  350.     def init
  351.       @roll_bar_missions = []
  352.       @roll_bar_visible_missions = []
  353.       @roll_bar_windows = []
  354.       @huaka_classes = {}
  355.       @default_rollbar_speed = {:hp => RollBar::ROLL_SPEED_FOR_HP,
  356.                                 :mp => RollBar::ROLL_SPEED_FOR_MP,
  357.                                 :tp => RollBar::ROLL_SPEED_FOR_TP
  358.       }
  359.     end
  360.      #sample:
  361.      #roll_bar_item RollBarActor, :hp
  362.      #@hp,@will_hp,@hp_rollbar_speed,@hp_rollbar_pause
  363.      def roll_bar_item(actor_class,item,
  364.                                   max_name="m"+item.to_s,
  365.                                   will_name="will_"+item.to_s,
  366.                                   speed_name=item.to_s+"_rollbar_speed",
  367.                                   pause_name=item.to_s+"_rollbar_pause")
  368.       method_name = huaka_name = item.to_s + "="
  369.       each_huaka_class(actor_class) do
  370.        attr_writer speed_name
  371.        attr_accessor pause_name
  372.        attr_accessor will_name
  373.        define_huaka_method method_name do |val,speed=self.send(speed_name)|
  374.          return unless val
  375.          now_p = instance_variable_get("@"+item.to_s)
  376.          will_p = instance_variable_get("@"+will_name)
  377.          instance_variable_set("@"+will_name,will_p = now_p) unless will_p
  378.          huaka_p = val - now_p        
  379.          return if huaka_p == 0
  380.          roll_unit = (speed == 0) ? huaka_p : ROLL_UNIT * speed
  381.          huaka_p = - huaka_p if speed < 0
  382.          rec = huaka_p > 0
  383.          roll_unit = - roll_unit if rec ^ (speed > 0)
  384.          instance_variable_set("@"+will_name,[[will_p+huaka_p,send(max_name)].min, 0].max.round)
  385.          RollBarManager.reg_roll_bar_mission huaka_fiber = Fiber.new {
  386.          (huaka_p / roll_unit).round.abs.times do
  387.            will_p = instance_variable_get("@"+will_name)
  388.            now_p = instance_variable_get("@"+item.to_s)
  389.            break if will_p == now_p || (will_p > now_p) ^ rec
  390.            Fiber.yield while instance_variable_get("@"+pause_name)
  391.            instance_variable_set("@"+item.to_s,[[now_p+roll_unit.round,send(max_name)].min, 0].max.round)
  392.            refresh
  393.            Fiber.yield
  394.          end
  395.          RollBarManager.unreg_roll_bar_mission(huaka_fiber)
  396.          }
  397.        end
  398.        define_method speed_name do
  399.         huaka = instance_variable_get("@"+speed_name)
  400.         huaka ? huaka : RollBarManager.default_rollbar_speed[item]
  401.        end
  402.      end
  403.     end
  404.      #sample:
  405.      #draw_roll_bar RollBarVisibleObject, :hp
  406.      #hook_metod: draw_actor_hp , draw_gauge
  407.      #callback_method: hp_bar_flag , hp_pre_bar_args , hp_clear_args
  408.     def draw_roll_bar(window_class,type,
  409.                                    bar_method="draw_actor_"+type.to_s,
  410.                                    pre_bar_method=:draw_gauge,
  411.                                    slow_mode=false,
  412.                                    pre_repeat_method=:def_pre_repeat,
  413.                                    bar_flag_method=type.to_s+"_bar_flag",
  414.                                    pre_bar_args_method=type.to_s+"_pre_bar_args",
  415.                                    clear_args_method=type.to_s+"_clear_args",
  416.                                    contents_method=false)
  417.        bar_method = bar_method.to_s
  418.        pre_bar_method = PRE_BAR_ENABLE ? pre_bar_method.to_s : false
  419.        define_huaka_method_for_classes(window_class,bar_method) do |*args|
  420.         fiber = Fiber.new {
  421.           until disposed?
  422.             break unless RollBarManager.roll_bar_visible_missions.include? fiber
  423.             flag ||= false
  424.             huaka_flag = bar_flag_method ? send(bar_flag_method,*args) : true
  425.             if !huaka_flag || flag == huaka_flag
  426.               Fiber.yield !close? && visible
  427.               next
  428.             end
  429.             flag = bar_flag_method ? send(bar_flag_method,*args) : true
  430.             clear_args = clear_args_method ? send(clear_args_method,*args) : args[1,4]
  431.             x,y,width,height = *clear_args
  432.             huaka_bitmap ||= save_bitmap(x,y,width,height) if slow_mode
  433.             contents.clear_rect(x,y,width,height)
  434.             load_bitmap(x,y,huaka_bitmap) if slow_mode
  435.             if pre_bar_method
  436.              define_singleton_method pre_bar_method do |*a|
  437.                super(*a)
  438.                pre_bar_args = send(pre_bar_args_method,*args)
  439.                return unless pre_bar_args
  440.                rate = pre_bar_args[0]
  441.                color = pre_bar_args[1] ? PRE_BAR_COLOR_DAMAGE[type] : PRE_BAR_COLOR_RECOVER[type]
  442.                x = a[0] + (a[2] * [rate,a[3]].min).round
  443.                y = a[1] + line_height - 8
  444.                width = (a[2] * ([rate,a[3]].max - [rate,a[3]].min)).round
  445.                color1 = color[0] ? color[0] : a[4]
  446.                color2 = color[1] ? color[1] : a[5]
  447.                contents.gradient_fill_rect(x, y, width, 6, color1,color2)
  448.              end
  449.             end
  450.             call_meta_method(bar_method,*args)
  451.             if pre_bar_method
  452.              (class << self;self;end).send(:remove_method,pre_bar_method)
  453.             end
  454.             Fiber.yield !close? && visible
  455.           end  
  456.           huaka_bitmap.dispose if slow_mode && huaka_bitmap
  457.           @roll_bars_pre_repeat.delete fiber
  458.           RollBarManager.unreg_roll_bar_visible_mission(fiber)
  459.          }
  460.         @roll_bars_pre_repeat ||= {}
  461.         pre_repeat = send(:def_pre_repeat,*args)
  462.         @roll_bars_pre_repeat.each_pair do |f,p|
  463.           RollBarManager.unreg_roll_bar_visible_mission(f) if pre_repeat == p
  464.         end
  465.         @roll_bars_pre_repeat[fiber] = pre_repeat
  466.         RollBarManager.reg_roll_bar_visible_mission fiber
  467.         fiber.resume
  468.        end  
  469.     end
  470.     def reg_roll_bar_mission(fiber)
  471.       @roll_bar_missions.push fiber unless @roll_bar_missions.include? fiber
  472.     end
  473.     def unreg_roll_bar_mission(fiber)
  474.       @roll_bar_missions.delete fiber
  475.     end
  476.     def reg_roll_bar_visible_mission(fiber)
  477.       @roll_bar_visible_missions.push fiber unless @roll_bar_missions.include? fiber
  478.     end
  479.     def unreg_roll_bar_visible_mission(fiber)
  480.       @roll_bar_visible_missions.delete fiber
  481.     end
  482.     def find_huaka_class(klass)
  483.       return klass if @huaka_classes.has_value?(klass)
  484.       unless @huaka_classes[klass]
  485.         return klass if klass.name == ""
  486.         @huaka_classes[klass] = Class.new(klass)
  487.         klass_name = klass.name.split("::")
  488.         const_name = klass_name.pop
  489.         nesting = klass_name.empty? ? Object : eval(klass_name.join("::"))
  490.         nesting.const_set(const_name,@huaka_classes[klass])
  491.       end
  492.       @huaka_classes[klass]
  493.     end
  494.     def each_huaka_class(type,&def_proc)
  495.       ObjectSpace.each_object(Class) do |i|
  496.         next if !i.include?(type)
  497.         huaka_class = find_huaka_class(i)
  498.         def huaka_class.define_huaka_method(method_name,&proc)
  499.           RollBarManager.define_huaka_method(self,method_name,&proc)
  500.         end
  501.         huaka_class.module_eval &def_proc
  502.       end
  503.     end
  504.     def define_huaka_method_for_classes(type,method_name,&proc)
  505.       ObjectSpace.each_object(Class) do |i|
  506.         next if !i.include?(type)
  507.         define_huaka_method(i,method_name,&proc)
  508.       end
  509.     end
  510.     def define_huaka_method(klass,method_name,&proc)
  511.       klass = find_huaka_class(klass)
  512.       unless klass.method_defined? :call_meta_method
  513.         klass.send(:define_method,:call_meta_method) do |method_name,*args|
  514.           RollBarManager.call_meta_method(self,method_name,*args)
  515.         end
  516.       end
  517.       klass.send(:define_method,method_name,&proc)
  518.     end
  519.     def call_meta_method(object,method_name,*args)
  520.       klass = ::Object.instance_method(:class).bind(object).call
  521.       @huaka_classes.key(klass).instance_method(method_name).bind(object).call(*args)
  522.     end
  523.     attr_reader   :roll_bar_missions
  524.     attr_reader   :roll_bar_visible_missions
  525.     attr_accessor :default_rollbar_speed
  526.   end
  527. end
  528. module RollBarActor
  529.    def self.included(klass)
  530.      RollBarManager.roll_bar_item self, :hp,:mhp
  531.      RollBarManager.roll_bar_item self, :mp,:mmp
  532.      RollBarManager.roll_bar_item self, :tp,:max_tp
  533.    end
  534. end
  535. module RollBarScene
  536.    def self.included(klass)
  537.       RollBarManager.define_huaka_method_for_classes(self,:refresh_status){}
  538.       RollBarManager.define_huaka_method_for_classes(self,:update_basic) do
  539.          super()
  540.          @frame_count ||=0   
  541.          @frame_count += 1        
  542.          return unless @frame_count > ROLL_TIME
  543.          @frame_count = 0
  544.          for i in RollBarManager.roll_bar_visible_missions
  545.           needroll |= i.resume
  546.         end
  547.          if PAUSE_ROLL_WHEN_WINDOW_INVISIBLE
  548.            return unless needroll
  549.          end
  550.          for i in RollBarManager.roll_bar_missions
  551.           i.resume
  552.          end
  553.          if is_a?(Scene_Battle) && BattleManager.actor
  554.           if BattleManager.actor.input.nil?
  555.            BattleManager.actor.make_actions
  556.            next_command
  557.           end
  558.         end
  559.       end
  560.       RollBarManager.define_huaka_method_for_classes(self,:terminate) do
  561.         super()
  562.         case self
  563.         when Scene_Battle
  564.         if STOP_ROLL_AND_CLEAR_DAMGE_WHEN_BATTLE_END
  565.           clear_all_roll_damage
  566.         elsif STOP_ROLL_AND_EVAL_DAMGE_WHEN_BATTLE_END
  567.           eval_all_roll_damage
  568.         end
  569.         when Scene_Load
  570.         if RESUME_ROLL_WHEN_LOAD
  571.           get_party(-1) do |i|
  572.            will_hp = i.will_hp
  573.            will_mp = i.will_mp
  574.            will_tp = i.will_tp
  575.            (i.will_hp = nil;i.hp = will_hp) if will_hp
  576.            (i.will_mp = nil;i.mp = will_mp) if will_mp
  577.            (i.will_tp = nil;i.tp = will_tp) if will_tp
  578.           end
  579.          end
  580.         end
  581.       end
  582.     end
  583. end
  584. module RollBarVisibleObject
  585.    def self.included(klass)
  586.     RollBarManager.draw_roll_bar self, :hp, :draw_actor_hp, :draw_gauge, SLOW_MODE_ENABLE || defined? YEA::BATTLE
  587.     RollBarManager.draw_roll_bar self, :mp, :draw_actor_mp, :draw_gauge ,SLOW_MODE_ENABLE || defined? YEA::BATTLE
  588.     RollBarManager.draw_roll_bar self, :tp, :draw_actor_tp, :draw_gauge, SLOW_MODE_ENABLE || defined? YEA::BATTLE
  589.     RollBarManager.draw_roll_bar self, :name, :draw_actor_name, false, SLOW_MODE_ENABLE || defined? YEA::BATTLE
  590.     RollBarManager.draw_roll_bar self, :state,:draw_actor_icons, false, SLOW_MODE_ENABLE || defined? YEA::BATTLE
  591.     if defined? YEA::BATTLE
  592.      RollBarManager.draw_roll_bar self, :yea_action,:draw_actor_action,false,true
  593.     end
  594.   end
  595.   def save_bitmap(x, y, width,height=line_height)
  596.     bitmap = Bitmap.new(width,height)
  597.     rect = Rect.new(x, y, width,height)
  598.     bitmap.blt(0, 0, contents, rect)
  599.     bitmap
  600.   end
  601.   def load_bitmap(x,y,bitmap)
  602.     rect = Rect.new(0, 0, bitmap.width,bitmap.height)
  603.     contents.blt(x, y,bitmap, rect)
  604.   end
  605.   #callback系列
  606.   def hp_bar_flag(actor, x, y, width=124)
  607.     actor.hp
  608.   end
  609.   def mp_bar_flag(actor, x, y, width=124)
  610.     actor.mp
  611.   end
  612.   def tp_bar_flag(actor, x, y, width=124)
  613.     actor.tp
  614.   end
  615.   def name_bar_flag(actor, x, y, width=112)
  616.     [actor.hp == 0,(actor.hp < actor.mhp / 4)]
  617.   end
  618.   def state_bar_flag(actor, x, y, width=96)
  619.     return false if actor.is_a?(Game_Enemy) && actor.dead?
  620.     actor.state_icons | actor.buff_icons
  621.   end
  622.   def hp_clear_args(actor, x, y, width=124)
  623.     if defined? YEA::BATTLE
  624.       if SceneManager.scene_is?(Scene_Battle)
  625.        contents.font.size = YEA::BATTLE::BATTLESTATUS_TEXT_FONT_SIZE
  626.       end
  627.     end
  628.     [x, y, width, line_height]
  629.   end
  630.   alias mp_clear_args hp_clear_args
  631.   alias tp_clear_args hp_clear_args
  632.   def name_clear_args(actor, x, y, width=112)
  633.     if defined? YEA::BATTLE
  634.       if SceneManager.scene_is?(Scene_Battle)
  635.        (x += 24;width -= 24)
  636.       end
  637.     end
  638.     [x, y, width, line_height]
  639.   end
  640.   def state_clear_args(actor, x, y, width=96)
  641.     [x, y, width, line_height]
  642.   end
  643.   def hp_pre_bar_args(actor, x, y, width=124)
  644.      return false if actor.will_hp.nil?
  645.      return false if actor.will_hp == actor.hp
  646.      [actor.will_hp.to_f / actor.mhp,actor.will_hp < actor.hp]
  647.   end
  648.   def mp_pre_bar_args(actor, x, y, width=124)
  649.      return false if actor.will_mp.nil?
  650.      return false if actor.will_mp == actor.mp
  651.      [actor.will_mp.to_f / actor.mmp,actor.will_mp < actor.mp]
  652.   end
  653.    def tp_pre_bar_args(actor, x, y, width=124)
  654.      return false if actor.will_tp.nil?
  655.      return false if actor.will_tp == actor.tp
  656.      [actor.will_tp.to_f / actor.max_tp,actor.will_tp < actor.tp]
  657.    end
  658.    def def_pre_repeat(actor, x, y, width=96)
  659.      [x,y,width]
  660.    end
  661.    if defined? YEA::BATTLE
  662.     def yea_action_bar_flag(actor, dx, dy)
  663.       action_icon(actor)
  664.     end
  665.     def yea_action_clear_args(actor, dx, dy)
  666.       [dx, dy, 24, 24]
  667.     end
  668.    end
  669. end
  670.  
  671. module RollBarActionResult
  672.  
  673.   def kill?(type=:hp)
  674.     case type
  675.     when :hp
  676.     return false unless @battler.will_hp
  677.     @hp_damage > 0 && @battler.will_hp <= 0
  678.     when :mp
  679.     return false unless @battler.will_mp
  680.     @mp_damage > 0 && @battler.will_mp <= 0
  681.     when :tp
  682.     return false unless @battler.will_tp
  683.     @tp_damage > 0 && @battler.will_tp <= 0
  684.     end   
  685.   end
  686. end
  687. module RollBarBattleLog
  688.    def self.included(klass)
  689.      KILL_MSG.each_pair do |sym,msg|
  690.       method_name = "display_" + sym.to_s + "_damage"
  691.       RollBarManager.define_huaka_method_for_classes(self,method_name) do |target, item|
  692.        super(target, item)
  693.        return unless target.is_a?(Game_Actor)
  694.        return unless target.result.kill?(sym)
  695.        add_text(target.name+msg) unless msg.nil?
  696.        if KILL_SOUND[sym].is_a?(Integer)
  697.         Sound.play_system_sound(KILL_SOUND[sym])
  698.        elsif KILL_SOUND[sym].is_a?(String)
  699.         Audio.se_play(KILL_SOUND[sym])
  700.        end
  701.        wait unless msg.nil?
  702.      end  
  703.    end
  704.   end
  705. end
  706. RollBarManager.init
  707. end
  708. class Game_Interpreter
  709.   include RollBar
  710.   include RollBarFunc
  711. end
  712. class Window_Base
  713.   include RollBar
  714.   include RollBarVisibleObject
  715. end
  716. class Game_Actor
  717. include RollBar
  718. include RollBarActor
  719. end
  720. class Scene_Base
  721.   include RollBar
  722.   include RollBarFunc
  723.   include RollBarScene
  724. end
  725. class Game_ActionResult
  726.   include RollBar
  727.   include RollBarActionResult
  728. end
  729. class Window_BattleLog
  730.   include RollBar
  731.   include RollBarBattleLog
  732. end
  733. if defined? XAS_SYSTEM
  734.   class Active_Hud
  735.    include RollBar
  736.    RollBarManager.define_huaka_method(self,:hp_flow_update) do
  737.     super()
  738.     if @actor.will_hp && @actor.hp != @actor.will_hp
  739.      will_hp_width = @hp_range * @actor.will_hp / @actor.mhp
  740.      color = @actor.will_hp < @actor.hp ? PRE_BAR_COLOR_DAMAGE[:hp] : PRE_BAR_COLOR_RECOVER[:hp]
  741.      color1 = color[0] ? color[0] : @hp_sprite.bitmap.get_pixel(0, 0)
  742.      color2 = color[1] ? color[1] : @hp_sprite.bitmap.get_pixel(0, 0)
  743.      width = [@hp_width,will_hp_width].max - [@hp_width,will_hp_width].min
  744.      @hp_sprite.bitmap.gradient_fill_rect([@hp_width,will_hp_width].min, 0, width, @hp_height, color1,color2)
  745.     end
  746.    end
  747.    RollBarManager.define_huaka_method(self,:sp_flow_update) do
  748.     super()
  749.     if @actor.will_mp && @actor.mp != @actor.will_mp
  750.      will_sp_width = @sp_range * @actor.will_mp / @actor.mmp
  751.      color = @actor.will_mp < @actor.mp ? PRE_BAR_COLOR_DAMAGE[:mp] : PRE_BAR_COLOR_RECOVER[:mp]
  752.      color1 = color[0] ? color[0] : @sp_sprite.bitmap.get_pixel(0, 0)
  753.      color2 = color[1] ? color[1] : @sp_sprite.bitmap.get_pixel(0, 0)
  754.      width = [@sp_width,will_sp_width].max - [@sp_width,will_sp_width].min
  755.      @sp_sprite.bitmap.gradient_fill_rect([@sp_width,will_sp_width].min, 0, width, @sp_height, color1,color2)
  756.     end
  757.    end
  758. end
  759. end





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