设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1192|回复: 2
打印 上一主题 下一主题

[已经解决] 如何附加状态后增加技能?状态消失后减少技能?

[复制链接]

Lv1.梦旅人

梦石
0
星屑
280
在线时间
3 小时
注册时间
2013-1-29
帖子
4
跳转到指定楼层
1
发表于 2013-6-7 22:24:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 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

Lv1.梦旅人

路人党员

梦石
0
星屑
52
在线时间
2276 小时
注册时间
2010-12-30
帖子
3225
2
发表于 2013-6-8 01:12:49 | 只看该作者
本帖最后由 英顺的马甲 于 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
复制代码

点评

脚本的15行发生了 ArgumentError。 comparison of Fixnum with Array failed 插入后进入状态,之后使用技能就出现了这个。  发表于 2013-6-8 08:10
本人擅长XP,如果有脚本或者Ruby方面的问题欢迎发电邮到[email protected]咨询,本人很少检查电邮所以不一定会及时回复,本人不会直接出手解决问题只会提供一个方向,所以谢绝伸手党
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
280
在线时间
3 小时
注册时间
2013-1-29
帖子
4
3
 楼主| 发表于 2013-6-8 08:06:57 | 只看该作者
英顺的马甲 发表于 2013-6-8 01:12
写了个脚本,直接插入拿去用便行==

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

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

QQ截图20130608075929.png

点评

可以正常使用了!万分感谢!  发表于 2013-6-8 12:16
顺便第九行改成output = @skills.clone  发表于 2013-6-8 11:28
抱歉,打错了,第十二行是output.push(skill)改成output.push(s)  发表于 2013-6-8 09:17
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-24 15:34

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表