查看: 2599|回复: 5

[已经解决] 如何设置一个状态普攻耗SP?

[复制链接]
梦石
0
星屑
3181
在线时间
1439 小时
注册时间
2009-7-27
回帖
1187
发表于 2019-2-6 05:23:15 | 显示全部楼层 |阅读模式

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

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

×
就是附加了这个状态之后普攻会耗自己定的SP量,当SP低于我设置的量之后改变战斗图或者减个状态什么的,请问该如何实现?

博客:我的博客
梦石
10
星屑
39550
在线时间
1919 小时
注册时间
2010-11-14
回帖
3214

R考场第七期纪念奖

发表于 2019-2-6 14:06:36 | 显示全部楼层
[pre lang="ruby"]#==============================================================================
# ■ 附加状态后 普通攻击消耗SP
#------------------------------------------------------------------------------
#  使用方法:在状态名字里写[SP消费 xxx]来使用
#   例: 毒[SP消费 50]    => 每次普通攻击消耗50SP
#        沉默[SP消费 50%] => 每次普通攻击消耗一半SP
#   备注:有多个状态时,优先计算百分比扣除,再计算定值扣除。
#         多个百分比扣除会取最大百分比。
#==============================================================================

class RPG::State
  
  REG_SP_COST_STATE = /\[SP消费[ ]*(\d+%?)\]/i
  
  alias name_for_sp_cost_state name
  def name
    name_for_sp_cost_state.gsub(REG_SP_COST_STATE, '')
  end

  def sp_cost_state?
    name_for_sp_cost_state =~ REG_SP_COST_STATE
  end
  
  def sp_cost_percentage?
    (name_for_sp_cost_state =~ REG_SP_COST_STATE) ? $1.include?("%") : false
  end
  
  def sp_cost
    (name_for_sp_cost_state =~ REG_SP_COST_STATE) ? $1.gsub("%", '').to_i : 0
  end
  
end

class Scene_Battle
  #--------------------------------------------------------------------------
  # ● 生成基本行动结果
  #--------------------------------------------------------------------------
  alias make_basic_action_result_for_sp_cost make_basic_action_result
  def make_basic_action_result
    # 攻击的情况下
    if @active_battler.current_action.basic == 0
      # 消耗 SP
      sp_cost_states = @active_battler.states.map{|i|$data_states}.select{|s|s.sp_cost_state?}
      if !sp_cost_states.empty?
        # 百分比消耗
        sp_percentage_states = sp_cost_states.select{|s|s.sp_cost_percentage?}
        if !sp_percentage_states.empty?
          max_cost_percentage = sp_percentage_states.sort_by{|s|s.sp_cost}.first.sp_cost
          max_cost_percentage = [max_cost_percentage.to_i, 100].min
          @active_battler.sp = @active_battler.sp * (100 - max_cost_percentage) / 100
        end
        # 固定值消耗
        sp_states = sp_cost_states - sp_percentage_states
        if !sp_states.empty?
          @active_battler.sp -= sp_states.collect{|s|s.sp_cost}.inject{|s,n|s+n}
        end        
      end
    end
    make_basic_action_result_for_sp_cost
  end
end[/pre]

自己写了两个小时,新建工程测试通过。
Project1.zip (199.14 KB, 下载次数: 82)

点评

我不明白无法普通攻击有什么好处,只是请教一下  发表于 2019-2-7 18:41
谢谢,就是这个效果。但是有没有办法实现SP不足以消耗时无法普通攻击?  发表于 2019-2-6 22:53

评分

参与人数 1星屑 +150 赞 +1 收起 理由
RyanBern + 150 + 1 认可答案

查看全部评分

用头画头像,用脚写脚本
回复

使用道具 举报

梦石
10
星屑
39550
在线时间
1919 小时
注册时间
2010-11-14
回帖
3214

R考场第七期纪念奖

发表于 2019-2-7 19:49:07 | 显示全部楼层
谢谢,就是这个效果。但是有没有办法实现SP不足以消耗时无法普通攻击?


更新了代码,增加了SP不足时无法普通攻击的效果。
[pre lang="ruby"]#==============================================================================
# ■ 附加状态后 普通攻击消耗SP
#------------------------------------------------------------------------------
#  使用方法:在状态名字里写[SP消费 xxx]来使用
#   例: 毒[SP消费 50]    => 每次普通攻击消耗50SP
#        沉默[SP消费 50%] => 每次普通攻击消耗一半SP
#   备注:有多个状态时,优先计算百分比扣除,再计算定值扣除。
#         多个百分比扣除会取最大百分比。
#==============================================================================

class RPG::State
  
  SP_COST_FORBID_ATTACK = true
  # SP不足时,是否导致无法普通攻击
  
  REG_SP_COST_STATE = /\[SP消费[ ]*(\d+%?)\]/i
  # 不要编辑这个
  
  alias name_for_sp_cost_state name
  def name
    name_for_sp_cost_state.gsub(REG_SP_COST_STATE, '')
  end

  def sp_cost_state?
    name_for_sp_cost_state =~ REG_SP_COST_STATE
  end
  
  def sp_cost_percentage?
    (name_for_sp_cost_state =~ REG_SP_COST_STATE) ? $1.include?("%") : false
  end
  
  def sp_cost
    (name_for_sp_cost_state =~ REG_SP_COST_STATE) ? $1.gsub("%", '').to_i : 0
  end
  
end

module Sound
  def self.play_buzzer
    $game_system.se_play($data_system.buzzer_se)
  end
end

class Game_Actor
  def attack_sp_enough?
    return true if !RPG::State::SP_COST_FORBID_ATTACK
    return true if !@states.map{|i|$data_states}.any?{|s|s.sp_cost_state?}
    @sp >= attack_sp_cost
  end
  
  def attack_sp_cost
    cost = 0
    sp_cost_states = @states.map{|i|$data_states}.select{|s|s.sp_cost_state?}
    return cost if sp_cost_states.empty?
    # 百分比消耗
    sp_percentage_states = sp_cost_states.select{|s|s.sp_cost_percentage?}
    if !sp_percentage_states.empty?
      max_cost_percentage = sp_percentage_states.sort_by{|s|s.sp_cost}.first.sp_cost
      max_cost_percentage = [max_cost_percentage.to_i, 100].min
      cost += @sp * (100 - max_cost_percentage) / 100
    end
    # 固定值消耗
    sp_states = sp_cost_states - sp_percentage_states
    if !sp_states.empty?
      cost += sp_states.collect{|s|s.sp_cost}.inject{|s,n|s+n}
    end
    return cost
  end
end

class Scene_Battle
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  alias cld99_update update
  def update
    if @actor_command_window && @active_battler && @active_battler.is_a?(Game_Actor)
      if !@active_battler.attack_sp_enough?
        @actor_command_window.disable_item(0)
      else
        @actor_command_window.refresh
      end
    end
    cld99_update
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (角色命令回合 : 基本命令)
  #--------------------------------------------------------------------------
  alias cld99_update_phase3_basic_command update_phase3_basic_command
  def update_phase3_basic_command
    if Input.trigger?(Input::C)
      if @actor_command_window.index == 0 #攻击
        return Sound.play_buzzer if !@active_battler.attack_sp_enough?
      end
    end
    cld99_update_phase3_basic_command
  end
  #--------------------------------------------------------------------------
  # ● 生成基本行动结果
  #--------------------------------------------------------------------------
  alias make_basic_action_result_for_sp_cost make_basic_action_result
  def make_basic_action_result
    # 攻击的情况下
    if @active_battler.current_action.basic == 0
      @active_battler.sp -= @active_battler.attack_sp_cost if @active_battler.is_a?(Game_Actor)
    end
    make_basic_action_result_for_sp_cost
  end
end
[/pre]
2.gif

点评

谢谢,爱你(づ ̄3 ̄)づ╭❤~  发表于 2019-2-7 19:58
用头画头像,用脚写脚本
回复 2 0

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部