Project1

标题: 如何附加状态后增加技能?状态消失后减少技能? [打印本页]

作者: a553417917    时间: 2013-6-7 22:24
标题: 如何附加状态后增加技能?状态消失后减少技能?
本帖最后由 a553417917 于 2013-6-8 12:22 编辑

如题,主角获得XX状态后自动习得XX技能,状态消失后自动遗忘XX技能。可以的话请各位前辈发个工程上来,小弟不懂脚本,之前找到一个也不会用。
脚本:module State_Skill
  STATE_SKILL = [] if $data_skills.nil?
  $data_skills        = load_data("Data/Skills.rxdata") if $data_skills.nil?
  $data_states        = load_data("Data/States.rxdata") if $data_states.nil?
#---------------------------------------------------------
# @state_skill.push [狀態ID,技能ID]
# “*” + 状态名 == 技能名
#---------------------------------------------------------
  for i in 1...$data_states.size
    for i2 in 1...$data_skills.size
      if "*" + $data_states.name ==  $data_skills[i2].name
        STATE_SKILL.push [i,i2]
      end
    end
  end
end
#==============================================================================
# ■ Game_Battler (分割定义 2)
#------------------------------------------------------------------------------
#  处理战斗者的类。这个类作为 Game_Actor 类与 Game_Enemy 类的
# 超级类来使用。
#==============================================================================

class Game_Battler
  include State_Skill
  #--------------------------------------------------------------------------
  # ● 附加状态
  #     state_id : 状态 ID
  #     force    : 强制附加标志 (处理自动状态时使用)
  #--------------------------------------------------------------------------
  def add_state(state_id, force = false)
    # 无效状态的情况下
    if $data_states[state_id] == nil
      # 过程结束
      return
    end
    # 无法强制附加的情况下
    unless force
      # 已存在的状态循环
      for i in @states
        # 新的状态和已经存在的状态 (-) 同时包含的情况下、
        # 本状态不包含变化为新状态的状态变化 (-)
        # (ex : 战斗不能与附加中毒同时存在的场合)
        if $data_states.minus_state_set.include?(state_id) and
           not $data_states[state_id].minus_state_set.include?(i)
          # 过程结束
          return
        end
      end
    end
    # 无法附加本状态的情况下
    unless state?(state_id)
      # 状态 ID 追加到 @states 序列中
      @states.push(state_id)
      # 选项 [当作 HP 0 的状态] 有效的情况下
      if $data_states[state_id].zero_hp
        # HP 更改为 0
        @hp = 0
      end
      # 所有状态的循环
      for i in 1...$data_states.size
        # 状态变化 (+) 处理
        if $data_states[state_id].plus_state_set.include?(i)
          add_state(i)
        end
        # 状态变化 (-) 处理
        if $data_states[state_id].minus_state_set.include?(i)
          remove_state(i)
        end
      end
      # 按比例大的排序 (值相等的情况下按照强度排序)
      @states.sort! do |a, b|
        state_a = $data_states[a]
        state_b = $data_states
        if state_a.rating > state_b.rating
          -1
        elsif state_a.rating < state_b.rating
          +1
        elsif state_a.restriction > state_b.restriction
          -1
        elsif state_a.restriction < state_b.restriction
          +1
        else
          a <=> b
        end
      end
    end
    # 强制附加的场合
    if force
      # 设置为自然解除的最低回数 -1 (无效)
      @states_turn[state_id] = -1
    end
    # 不能强制附加的场合
    unless  @states_turn[state_id] == -1
      # 设置为自然解除的最低回数
      @states_turn[state_id] = $data_states[state_id].hold_turn
    end
    # 无法行动的场合
    unless movable?
      # 清除行动
      @current_action.clear
    end
    # 检查 HP 及 SP 的最大值
    @hp = [@hp, self.maxhp].min
    @sp = [@sp, self.maxsp].min
#---------------------------------
if self.is_a?(Game_Actor)
if STATE_SKILL.size > 0
    for i in STATE_SKILL
      if i[0] == state_id
        if i[1] != 0
          learn_skill(i[1])
          unless force
            @states.delete(state_id)
          end
        end
      end     
    end
  end
end
#---------------------------------
  end
  
  #--------------------------------------------------------------------------
  # ● 解除状态
  #     state_id : 状态 ID
  #     force    : 强制解除标志 (处理自动状态时使用)
  #--------------------------------------------------------------------------
  def remove_state(state_id, force = false)
    # 无法附加本状态的情况下
    if state?(state_id)
      # 被强制附加的状态、并不是强制解除的情况下
      if @states_turn[state_id] == -1 and not force
        # 过程结束
        return
      end
      # 现在的 HP 为 0 当作选项 [当作 HP 0 的状态]有效的场合
      if @hp == 0 and $data_states[state_id].zero_hp
        # 判断是否有另外的 [当作 HP 0 的状态]状态
        zero_hp = false
        for i in @states
          if i != state_id and $data_states.zero_hp
            zero_hp = true
          end
        end
        # 如果可以解除战斗不能、将 HP 更改为 1
        if zero_hp == false
          @hp = 1
        end
      end
      
      
       unless self.movable?
        # ステート ID を @states 配列および @states_turn ハッシュから削除
        @states.delete(state_id)
        @states_turn.delete(state_id)
        if self.movable?
          self.at = 0
        end
      else
        # ステート ID を @states 配列および @states_turn ハッシュから削除
        @states.delete(state_id)
        @states_turn.delete(state_id)
      end
      
      
      
      
      # 将状态 ID 从 @states 队列和 @states_turn hash 中删除
      #@states.delete(state_id)
      #@states_turn.delete(state_id)
    end
    # 检查 HP 及 SP 的最大值
    @hp = [@hp, self.maxhp].min
    @sp = [@sp, self.maxsp].min
#---------------------------------
if self.is_a?(Game_Actor)
if STATE_SKILL.size > 0
    for i in STATE_SKILL
      if i[0] == state_id
        if i[1] != 0
          forget_skill(i[1])
        end
      end     
    end
  end
end
#---------------------------------
end







end
作者: 英顺的马甲    时间: 2013-6-8 01:12
本帖最后由 英顺的马甲 于 2013-6-8 09:19 编辑

写了个脚本,直接插入拿去用便行==
  1. #===============================================================================
  2. # ● 状态附加特技
  3. #===============================================================================
  4. class Game_Actor
  5.   STATE_SKILLS = {}
  6.   # 设置方法:STATE_SKILLS[状态id] = [特技id]
  7.   STATE_SKILLS[1] = [1,2,3,4]
  8.   def skills
  9.     output = @skills
  10.     STATE_SKILLS.each do |state,skill|
  11.       skill.each{|s|
  12.         output.push(s) unless output.include?(s)
  13.       } if state?(state)
  14.     end
  15.     return output.sort
  16.   end
  17.   def skill_can_use?(skill_id)
  18.     return super
  19.   end
  20. end
复制代码

作者: a553417917    时间: 2013-6-8 08:06
英顺的马甲 发表于 2013-6-8 01:12
写了个脚本,直接插入拿去用便行==

插入后进入状态,之后使用技能就出现了这个。

QQ截图20130608075929.png (7.28 KB, 下载次数: 4)

QQ截图20130608075929.png





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