Project1

标题: XAS如何用事件给角色赋予必杀技 [打印本页]

作者: funxlww    时间: 2018-6-7 14:47
标题: XAS如何用事件给角色赋予必杀技
RT,我想在游戏里用事件给角色赋予必杀技,而不是一开始就有,但是在脚本里并没有写出在事件内写什么才能这么干,我大概想要的效果就是使用事件中  高级-脚本  这里来给角色赋予必杀技,希望大家能帮到我,谢谢
  1. #==============================================================================
  2. # ■ +++ MOG - XAS OVERDRIVE (v1.0) +++
  3. #==============================================================================
  4. # By Moghunter
  5. # http://www.atelier-rgss.com
  6. #==============================================================================
  7. #  定义 XAS系统 的 必杀技.
  8. #===============================================================================
  9. module MOG_XAS_OVERDRIVE
  10.   #  Hud 的位置.
  11.   HUD_POSITION = [10,280]
  12.   # 条的位置.
  13.   METER_POS = [22,21]
  14.   # 等级的位置.
  15.   LEVEL_POS = [0,10]
  16.   # 火焰的位置
  17.   FIRE_POS = [0,10]
  18.   # 数字间距.
  19.   NUMBER_SPACE = -10
  20.   # 必杀技能条的动画速度
  21.   OVD_METER_FLOW_SPEED = 5
  22.   # 必杀技能的名字
  23.   OVERDRIVE_NAME = "Overdrive"  
  24.   # 最大愤怒的数值。
  25.   OVD_GAUGE_MAX = 100
  26.   # 设置必杀技能的最高等级
  27.   #
  28.   # INITIAL_OVDMAX_LEVEL = {A=>B, A=>B, A=>B,... }
  29.   # A - 角色ID .
  30.   # B - 等级
  31.   INITIAL_OVDMAX_LEVEL = {
  32.   10=>2  #Alice Level 2
  33.   }
  34.   #不可以删除下面的东西!
  35.   OVERDRIVE_ACTION = []
  36.   #如何设置必杀技能呢?
  37.   #
  38.   # OVERDRIVE_ACTION[A] = {B=>C, B=>C, B=>C,...}
  39.   #
  40.   # A - 表示角色的 ID
  41.   # B - 必杀技能的等级 ID
  42.   # C - 必杀技能的技能 ID
  43.   OVERDRIVE_ACTION[2] = {
  44.   1=>22,   #Mega Flare
  45.   2=>23    #Icicle Disaster
  46.   }
  47.   #OVERDRIVE_ACTION[2] = {1=>5, 2=>19 }
  48.   #OVERDRIVE_ACTION[3] = {1=>15, 2=>9 , 3=>19, 4=>95, 5=>39}
  49.   #OVERDRIVE_ACTION[4] = { }
  50.   
  51.   #Quantidade padrão ganho no medidor de overdrive ao acarretar dano no battler.
  52.   OVD_DEFAULT_GAIN = 3
  53.   # Definição especifica de overdrive ganho baseado na ID da skill.
  54.   #
  55.   # OVD_GAIN = { A=>B, A=>B, A=>B, ....}
  56.   # A - ID da skill.
  57.   # B - Valor do overdrive ganho.
  58.   OVD_GAIN = {
  59.   1=>3,
  60.   22=>0,
  61.   23=>0
  62.   }
  63.   # Definição dos botões que deverão ser pressionados simultaneamentes para
  64.   # ativar o overdrive.
  65.   # Defina como nil se quiser desativar o sistema de botão duplo.
  66.   #
  67.   # OVD_BUTTON_2 = nil
  68.   #
  69.   OVD_BUTTON_1 = Input::C
  70.   OVD_BUTTON_2 = Input::X
  71. end

  72. #===============================================================================
  73. # ■ Game Temp
  74. #===============================================================================
  75. class Game_Temp
  76.   
  77.   attr_accessor :pressed_ovd_button
  78.   #--------------------------------------------------------------------------
  79.   # ● Iinitialize
  80.   #--------------------------------------------------------------------------        
  81.   alias xas_ovd_initialize initialize
  82.   def initalize
  83.       @pressed_ovd_button = false
  84.       xas_ovd_initialize
  85.   end  
  86. end
  87. #===============================================================================
  88. # ■ Game Actor
  89. #===============================================================================
  90. class Game_Actor < Game_Battler
  91.   include MOG_XAS_OVERDRIVE
  92.   
  93.   attr_accessor :ovd_level
  94.   attr_accessor :ovd_maxlevel
  95.   attr_accessor :ovd_gauge
  96.   
  97.   #--------------------------------------------------------------------------
  98.   # ● Iinitialize
  99.   #--------------------------------------------------------------------------      
  100.   alias xas_ovd_initialize initialize
  101.   def initialize(actor_id)
  102.       xas_ovd_initialize(actor_id)
  103.       @ovd_level = 0
  104.       @ovd_maxlevel = 0
  105.       @ovd_gauge = 0
  106.       check_initial_ovd_level      
  107.   end  
  108.   
  109.   #--------------------------------------------------------------------------
  110.   # ● Check Initial Ovd Level
  111.   #--------------------------------------------------------------------------         
  112.   def check_initial_ovd_level  
  113.       initial_level = INITIAL_OVDMAX_LEVEL[@actor_id]
  114.       if initial_level != nil
  115.          @ovd_maxlevel = initial_level
  116.       end  
  117.   end  
  118.   
  119.   #--------------------------------------------------------------------------
  120.   # ● OVD Level
  121.   #--------------------------------------------------------------------------        
  122.   def ovd_level
  123.       n = [[@ovd_level , 0].max, @ovd_maxlevel].min
  124.       return n   
  125.   end  
  126.   
  127.   #--------------------------------------------------------------------------
  128.   # ● OVD MaxLevel
  129.   #--------------------------------------------------------------------------         
  130.   def ovd_maxlevel
  131.      return @ovd_maxlevel
  132.   end  
  133.   
  134.   #--------------------------------------------------------------------------
  135.   # ● OVD Gauge
  136.   #--------------------------------------------------------------------------            
  137.   def ovd_gauge
  138.       n = [[@ovd_gauge , 0].max, OVD_GAUGE_MAX].min
  139.       return n
  140.   end      
  141.    
  142.   #--------------------------------------------------------------------------
  143.   # ● Gain Ovd
  144.   #--------------------------------------------------------------------------              
  145.   def gain_ovd(value)
  146.       return unless can_gain_ovd?
  147.       @ovd_gauge += value
  148.       gain_ovd_level(1) if can_ovd_levelup?
  149.   end
  150.   
  151.   #--------------------------------------------------------------------------
  152.   # ● Gain Ovd Level
  153.   #--------------------------------------------------------------------------               
  154.   def gain_ovd_level(value)
  155.       @ovd_level += value
  156.       @ovd_gauge = 0
  157.       if @ovd_level >= @ovd_maxlevel   
  158.          @ovd_gauge = OVD_GAUGE_MAX   
  159.          @ovd_level = @ovd_maxlevel   
  160.       end   
  161.   end  
  162.   
  163.   #--------------------------------------------------------------------------
  164.   # ● Can Ovd Level UP
  165.   #--------------------------------------------------------------------------                  
  166.   def can_ovd_levelup?
  167.       return false if @hp == 0
  168.       return false if @ovd_gauge < OVD_GAUGE_MAX
  169.       return true
  170.   end
  171.   
  172.   #--------------------------------------------------------------------------
  173.   # ● Can Gain OVD
  174.   #--------------------------------------------------------------------------               
  175.   def can_gain_ovd?
  176.       return false if @ovd_level == @ovd_maxlevel
  177.       return false if @hp == 0
  178.       return false if @ovd_gauge == OVD_GAUGE_MAX
  179.       return true
  180.   end  
  181.   
  182. end

  183. #===============================================================================
  184. # ■ XRXS_BattlerAttachment
  185. #==============================================================================
  186. module XRXS_BattlerAttachment
  187.   
  188.   #--------------------------------------------------------------------------
  189.   # ● Action Effect
  190.   #--------------------------------------------------------------------------  
  191.   alias x_ovd_shoot_effect_after_damage shoot_effect_after_damage
  192.   def shoot_effect_after_damage(skill, bullet, user)
  193.       check_ovd_skill(skill, user)
  194.       x_ovd_shoot_effect_after_damage(skill, bullet, user)
  195.   end
  196.   
  197.   #--------------------------------------------------------------------------
  198.   # ● Check OVD Skill
  199.   #--------------------------------------------------------------------------   
  200.   def check_ovd_skill(skill, user)
  201.       return if self.battler.damage <= 0
  202.       ovd_point = MOG_XAS_OVERDRIVE::OVD_GAIN[skill.id]
  203.       ovd_point = MOG_XAS_OVERDRIVE::OVD_DEFAULT_GAIN  if ovd_point == nil      
  204.       if user.battler.is_a?(Game_Actor) and self.battler.is_a?(Game_Enemy) and not
  205.          self.battler.no_damage_pop
  206.          user.battler.gain_ovd(ovd_point)
  207.       elsif self.battler.is_a?(Game_Actor)
  208.          self.battler.gain_ovd(ovd_point)        
  209.       end           
  210.   end  
  211.   
  212.   #--------------------------------------------------------------------------
  213.   # ● Execute Attack Effect After Damage
  214.   #--------------------------------------------------------------------------      
  215.   alias x_ovd_execute_attack_effect_after_damage execute_attack_effect_after_damage
  216.   def execute_attack_effect_after_damage(attacker)
  217.       x_ovd_execute_attack_effect_after_damage(attacker)
  218.       check_ovd_attack(attacker)
  219.   end  
  220.   
  221.   #--------------------------------------------------------------------------
  222.   # ● Check Ovd Attack
  223.   #--------------------------------------------------------------------------        
  224.   def check_ovd_attack(attacker)
  225.       return if self.battler.damage <= 0
  226.       return if self.battler.is_a?(Game_Enemy)
  227.       ovd_point = MOG_XAS_OVERDRIVE::OVD_DEFAULT_GAIN  
  228.       self.battler.gain_ovd(ovd_point)         
  229.   end  
  230. end  


  231. #==============================================================================
  232. # ■ Game_Player
  233. #==============================================================================
  234. class Game_Player < Game_Character
  235.    include MOG_XAS_OVERDRIVE
  236.   #--------------------------------------------------------------------------
  237.   # ● Update Action Command
  238.   #--------------------------------------------------------------------------  
  239.   alias ovd_update_action_command update_action_command
  240.   def update_action_command
  241.       ovd_update_action_command
  242.       update_overdrive_button
  243.   end
  244.   
  245.   #--------------------------------------------------------------------------
  246.   # ● Update Overdrive Button
  247.   #--------------------------------------------------------------------------   
  248.   def update_overdrive_button
  249.       button_1 = OVD_BUTTON_1
  250.       button_2 = OVD_BUTTON_2
  251.       if button_1 == nil and button_2 == nil
  252.          return
  253.       elsif button_1 != nil and button_2 != nil
  254.          update_ovd_dual_button(button_1,button_2)   
  255.          return
  256.       else   
  257.          button = button_1
  258.          button = button_2 if button == nil
  259.          update_ovd_button(button)
  260.       end  
  261.   end  
  262.   
  263.   #--------------------------------------------------------------------------
  264.   # ● Update OVD Button
  265.   #--------------------------------------------------------------------------   
  266.   def update_ovd_button(button)
  267.       if Input.trigger?(button)
  268.          execute_overdrive_action
  269.          return
  270.       end
  271.       $game_temp.pressed_ovd_button = false
  272.   end
  273.   #--------------------------------------------------------------------------
  274.   # ● Update OVD Dual Button
  275.   #--------------------------------------------------------------------------   
  276.   def update_ovd_dual_button(button_1,button_2)   
  277.       if Input.press?(button_1) and Input.press?(button_2)
  278.          execute_overdrive_action
  279.          return
  280.        end
  281.        $game_temp.pressed_ovd_button = false  
  282.   end  
  283.   
  284.   #--------------------------------------------------------------------------
  285.   # ● Execute Overdrive Action
  286.   #--------------------------------------------------------------------------      
  287.   def execute_overdrive_action
  288.       return unless can_use_overdrive_command?
  289.       $game_temp.pressed_ovd_button = true
  290.       action_id = OVERDRIVE_ACTION[self.battler.id]
  291.       if action_id != nil and action_id[self.battler.ovd_level] != nil
  292.          self.shoot(action_id[self.battler.ovd_level])
  293.          self.battler.ovd_level = 0
  294.          self.battler.ovd_gauge = 0               
  295.       end
  296.   end  
  297.   
  298.   #--------------------------------------------------------------------------
  299.   # ● Can Use Overdrive Command
  300.   #--------------------------------------------------------------------------        
  301.   def can_use_overdrive_command?
  302.       return false if $game_system.command_enable == false
  303.       return false if $game_temp.pressed_ovd_button
  304.       return false if self.battler.shield
  305.       return false if self.battler.cast_action[4] > 0
  306.       return false if self.battler.ovd_level == 0
  307.       return true
  308.   end  
  309.   
  310. end  
  311. #==============================================================================
  312. # ■ Overdrive
  313. #==============================================================================
  314. class Overdrive
  315.   include MOG_XAS_OVERDRIVE
  316.    
  317.   #--------------------------------------------------------------------------
  318.   # ● Initialize  
  319.   #--------------------------------------------------------------------------  
  320.   def initialize
  321.       @actor = $game_party.members[0]
  322.       return if @actor == nil
  323.       create_layout
  324.       create_meter
  325.       create_level
  326.       create_fire
  327.   end
  328.    
  329.   #--------------------------------------------------------------------------
  330.   # ● Restart Hud
  331.   #--------------------------------------------------------------------------   
  332.   def restart_hud
  333.       dispose
  334.       initialize
  335.   end  
  336.   
  337.   #--------------------------------------------------------------------------
  338.   # ● Create Layout
  339.   #--------------------------------------------------------------------------   
  340.   def create_layout
  341.       @layout_sprite = Sprite.new
  342.       @layout_sprite.bitmap = Cache.system("XAS_Ovd_Layout")
  343.       @layout_sprite.z = 150
  344.       @layout_sprite.x = HUD_POSITION[0]
  345.       @layout_sprite.y = HUD_POSITION[1]
  346.   end
  347.   
  348.   #--------------------------------------------------------------------------
  349.   # ● Create Meter
  350.   #--------------------------------------------------------------------------      
  351.   def create_meter
  352.       @meter_flow = 0
  353.       @meter_image = Cache.system("XAS_Ovd_Meter")
  354.       @meter_range = @meter_image.width / 3
  355.       @meter_height = @meter_image.height / 2
  356.       @meter_sprite = Sprite.new
  357.       @meter_sprite.bitmap = Bitmap.new(@meter_image.width,@meter_image.height)
  358.       @meter_sprite.z = 151
  359.       @meter_sprite.x = HUD_POSITION[0] + METER_POS[0]
  360.       @meter_sprite.y = HUD_POSITION[1] + METER_POS[1]
  361.       update_gauge
  362.   end

  363.   #--------------------------------------------------------------------------
  364.   # ● Create Level
  365.   #--------------------------------------------------------------------------        
  366.   def create_level
  367.       @number_image = Cache.system("XAS_Ovd_Number")
  368.       @number_sprite = Sprite.new
  369.       @number_sprite.bitmap = Bitmap.new(@number_image.width,@number_image.height)
  370.       @number_sprite.z = 153
  371.       @number_sprite.y = HUD_POSITION[1] + LEVEL_POS[1]
  372.       @number_cw = @number_image.width / 10
  373.       @number_ch = @number_image.height  
  374.       @number_sc = @number_cw + NUMBER_SPACE
  375.       refresh_level
  376.   end
  377.   
  378.   #--------------------------------------------------------------------------
  379.   # ● Create Fire
  380.   #--------------------------------------------------------------------------         
  381.   def create_fire
  382.       @fire_flow = 0
  383.       @fire_flow_speed = 8
  384.       @fire_image = Cache.system("XAS_Ovd_Fire")
  385.       @fire_width = @fire_image.width / 4   
  386.       @fire_sprite = Sprite.new
  387.       @fire_sprite.bitmap = Bitmap.new(@fire_image.width,@fire_image.height)
  388.       @fire_sprite.z = 154
  389.       @fire_sprite.y = HUD_POSITION[1] + FIRE_POS[1]
  390.       @fire_sx = @fire_width
  391.       update_fire
  392.   end   
  393.   
  394.   #--------------------------------------------------------------------------
  395.   # ● Uppdate Fire
  396.   #--------------------------------------------------------------------------      
  397.   def update_fire
  398.       @fire_sprite.x = @meter_width + HUD_POSITION[0] + FIRE_POS[0] + @fire_sx
  399.       @fire_flow_speed += 1
  400.       return if  @fire_flow_speed < 8
  401.       @fire_sprite.bitmap.clear
  402.       @fire_flow_speed = 0
  403.       @fire_flow += 1
  404.       @fire_flow = 0 if @fire_flow > 3
  405.       src_rect_back = Rect.new(@fire_width * @fire_flow, 0,@fire_width, @fire_image.height)
  406.       @fire_sprite.bitmap.blt(0,0, @fire_image, src_rect_back)           
  407.   end
  408.   
  409.   #--------------------------------------------------------------------------
  410.   # ● Dispose
  411.   #--------------------------------------------------------------------------   
  412.   def dispose
  413.       return if @actor == nil
  414.       @layout_sprite.bitmap.dispose
  415.       @layout_sprite.dispose
  416.       @meter_sprite.bitmap.dispose
  417.       @meter_sprite.dispose
  418.       @meter_image.dispose
  419.       @number_sprite.bitmap.dispose
  420.       @number_sprite.dispose
  421.       @number_image.dispose
  422.       @fire_sprite.bitmap.dispose
  423.       @fire_sprite.dispose
  424.       @fire_image.dispose
  425.   end
  426.   
  427.   #--------------------------------------------------------------------------
  428.   # ● Update
  429.   #--------------------------------------------------------------------------      
  430.   def update
  431.       return if @actor == nil
  432.       refresh_level if can_refresh_level?
  433.       update_visible
  434.       update_gauge
  435.       update_fire
  436.   end
  437.   
  438.   #--------------------------------------------------------------------------
  439.   # ● Can Refresh Level
  440.   #--------------------------------------------------------------------------        
  441.   def can_refresh_level?
  442.        return true if @ovd_level_old != @actor.ovd_level
  443.        return true if @ovd_maxlevel_old != @actor.ovd_maxlevel
  444.        return false
  445.   end
  446.   #--------------------------------------------------------------------------
  447.   # ● Update Visible
  448.   #--------------------------------------------------------------------------      
  449.   def update_visible
  450.       vis = $game_system.enable_hud
  451.       vis = false if @actor.ovd_maxlevel == 0
  452.       @layout_sprite.visible = vis
  453.       @meter_sprite.visible = vis
  454.       @number_sprite.visible = vis
  455.       @fire_sprite.visible = vis
  456.   end  
  457.   
  458.   #--------------------------------------------------------------------------
  459.   # ● Refresh Level
  460.   #--------------------------------------------------------------------------         
  461.   def refresh_level
  462.       @ovd_level_old = @actor.ovd_level
  463.       @ovd_maxlevel_old = @actor.ovd_maxlevel
  464.       @number_sprite.bitmap.clear
  465.       number_text = @actor.ovd_level.abs.to_s.split(//)
  466.       for r in 0..number_text.size - 1
  467.          number_abs = number_text[r].to_i
  468.          src_rect = Rect.new(@number_cw * number_abs, 0, @number_cw, @number_ch)
  469.          @number_sprite.bitmap.blt(@number_sc *  r, 0, @number_image, src_rect)        
  470.       end      
  471.       vx =  ((@number_sc * number_text.size) / 2)
  472.       @number_sprite.x = HUD_POSITION[0] + LEVEL_POS[0] - vx
  473.   end  
  474.   
  475.   #--------------------------------------------------------------------------
  476.   # ● Update Gauge
  477.   #--------------------------------------------------------------------------        
  478.   def update_gauge
  479.       @meter_sprite.bitmap.clear
  480.       if @actor.ovd_level == @actor.ovd_maxlevel and
  481.          @actor.ovd_maxlevel > 0
  482.          @meter_width = @meter_range
  483.          @meter_ch = @meter_height
  484.       else   
  485.          @meter_width = @meter_range * @actor.ovd_gauge / OVD_GAUGE_MAX
  486.          @meter_ch = 0
  487.       end  
  488.       src_rect = Rect.new(@meter_flow, @meter_ch, @meter_width, @meter_height)
  489.       @meter_sprite.bitmap.blt(0,0, @meter_image, src_rect)
  490.       @meter_flow += OVD_METER_FLOW_SPEED  
  491.       if @meter_flow >= @meter_image.width - @meter_range
  492.          @meter_flow = 0  
  493.       end        
  494.   end  
  495.   
  496. end

  497. #==============================================================================
  498. # ■ Spriteset_Map
  499. #==============================================================================
  500. class Spriteset_Map
  501.   
  502.   #--------------------------------------------------------------------------
  503.   # ● initialize  
  504.   #--------------------------------------------------------------------------
  505.   alias xas_ovd_initialize initialize
  506.   def initialize  
  507.       @ovd = Overdrive.new
  508.       xas_ovd_initialize
  509.   end

  510.   #--------------------------------------------------------------------------
  511.   # ● dispose
  512.   #--------------------------------------------------------------------------
  513.   alias xas_ovd_dispose dispose
  514.   def dispose   
  515.       @ovd.dispose
  516.       xas_ovd_dispose
  517.   end

  518.   #--------------------------------------------------------------------------
  519.   # ● update   
  520.   #--------------------------------------------------------------------------
  521.   alias xas_ovd_update update
  522.   def update   
  523.       @ovd.update
  524.       xas_ovd_update
  525.   end
  526.   
  527.   #--------------------------------------------------------------------------
  528.   # ● Refresh Hud
  529.   #--------------------------------------------------------------------------  
  530.   alias xas_ovd_refresh_hud refresh_hud
  531.   def refresh_hud
  532.       xas_ovd_refresh_hud
  533.       @ovd.restart_hud
  534.   end   
  535.    
  536. end   

  537. $mog_rgss3_xas_overdrive = true
复制代码

作者: KB.Driver    时间: 2018-7-1 21:48
本帖最后由 KB.Driver 于 2018-7-1 21:50 编辑


在脚本关键执行部分加一局条件判断

比如在return if @actor == nil后面另起一行return if 条件
然后在事件里让条件成立就好了

比如加个
return if $game_switches[10] == false #10号开关关闭时无法使用技能
然后事件里再学会技能的地方控制开关10打开





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