查看: 4732|回复: 19

[已经解决] 求技能数量脚本

[复制链接]
梦石
0
星屑
307
在线时间
275 小时
注册时间
2015-1-29
回帖
86
发表于 2016-7-10 14:23:44 | 显示全部楼层 |阅读模式

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

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

×
在论坛上搜过....可都是VX的...

SO,在这求个脚本

类似这样
↓↓↓
-------------------------------------------
十字斩                                          4/5      l  类似口袋妖怪技能系统
-----------------------------------↑-↑---
                                   技能所剩量↑  ↑技能极限量

评分

参与人数 1星屑 +35 收起 理由
RyanBern + 35 手动认可奖励

查看全部评分

梦石
0
星屑
4657
在线时间
1069 小时
注册时间
2013-3-28
回帖
309

开拓者

发表于 2016-7-10 16:32:16 | 显示全部楼层
本帖最后由 陈大帅帅帅哥 于 2016-7-14 11:24 编辑

主站上有个xp的,不过有bug,所有同编号技能拥有统一的PP,下面是我自己修改过的
[pre lang="ruby"]class Game_Battler
  attr_accessor :skills_pp                #卐 技能pp的数组
  attr_accessor :skills                   #卐 特技
  alias cdsssg_initialize initialize
  def initialize
    cdsssg_initialize
    @skills_pp = []
    @skills = []
  end
  def skill_can_use?(skill_id)
    #卐 PP 不足的情况下不能使用
    if self.skills_pp[self.skills.index(skill_id)] < 1
      return false
    end
    # 战斗不能的情况下不能使用
    if dead?
      return false
    end
    # 沉默状态的情况下、物理特技以外的特技不能使用
    if $data_skills[skill_id].atk_f == 0 and self.restriction == 1
      return false
    end
    # 获取可以使用的时机
    occasion = $data_skills[skill_id].occasion
    # 战斗中的情况下
    if $game_temp.in_battle
      # [平时] 或者是 [战斗中] 可以使用
      return (occasion == 0 or occasion == 1)
    # 不是战斗中的情况下
    else
      # [平时] 或者是 [菜单中] 可以使用
      return (occasion == 0 or occasion == 2)
    end
  end
end


class Game_Actor < Game_Battler
  def setup(actor_id)
    actor = $data_actors[actor_id]
    @actor_id = actor_id
    @name = actor.name
    @character_name = actor.character_name
    @character_hue = actor.character_hue
    @battler_name = actor.battler_name
    @battler_hue = actor.battler_hue
    @class_id = actor.class_id
    @weapon_id = actor.weapon_id
    @armor1_id = actor.armor1_id
    @armor2_id = actor.armor2_id
    @armor3_id = actor.armor3_id
    @armor4_id = actor.armor4_id
    @level = actor.initial_level
    @exp_list = Array.new(101)
    make_exp_list
    @exp = @exp_list[@level]
    @skills = []
    @hp = maxhp
    @sp = maxsp
    @states = []
    @states_turn = {}
    @maxhp_plus = 0
    @maxsp_plus = 0
    @str_plus = 0
    @dex_plus = 0
    @agi_plus = 0
    @int_plus = 0
    # 学会特技
    for i in 1..@level
      for j in $data_classes[@class_id].learnings
        if j.level == i
          learn_skill(j.skill_id)
        end
      end
    end
    # 刷新自动状态
    update_auto_state(nil, $data_armors[@armor1_id])
    update_auto_state(nil, $data_armors[@armor2_id])
    update_auto_state(nil, $data_armors[@armor3_id])
    update_auto_state(nil, $data_armors[@armor4_id])
  end
  def learn_skill(skill_id)
    if skill_id > 0 and not skill_learn?(skill_id)
      @skills_pp.push($data_skills[skill_id].sp_cost)
      @skills.push(skill_id)
      @skills.sort!
    end
  end
  def forget_skill(skill_id)
    @skills_pp.delete_at(@skills.index(skill_id))
    @skills.delete(skill_id)
  end
end


class Game_Enemy < Game_Battler
  def actions
    for i in $data_enemies[@enemy_id].actions
      if i.kind == 1 and i.skill_id != 1
        @skills_pp.push($data_skills[i.skill_id].sp_cost)
        @skills.push(i.skill_id)
      end
    end
    return $data_enemies[@enemy_id].actions
  end
end


class Window_Skill < Window_Selectable
  def draw_item(index)
    skill = @data[index]
    if @actor.skill_can_use?(skill.id)
      self.contents.font.color = normal_color
    else
      self.contents.font.color = disabled_color
    end
    x = 4 + index % 2 * (288 + 32)
    y = index / 2 * 32
    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(skill.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(x + 28, y, 204, 32, skill.name, 0)
    self.contents.draw_text(x + 166, y, 112, 32, "PP:" + @actor.skills_pp[@actor.skills.index(skill.id)].to_s + "/" + skill.sp_cost.to_s, 2)
  end
end


class Scene_Skill
  def update_skill
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 切换到菜单画面
      $scene = Scene_Menu.new(1)
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 获取特技窗口现在选择的特技的数据
      @skill = @skill_window.skill
      # 不能使用的情况下
      if @skill == nil or not @actor.skill_can_use?(@skill.id)
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 效果范围是我方的情况下
      if @skill.scope >= 3
        # 激活目标窗口
        @skill_window.active = false
        @target_window.x = (@skill_window.index + 1) % 2 * 304
        @target_window.visible = true
        @target_window.active = true
        # 设置效果范围 (单体/全体) 的对应光标位置
        if @skill.scope == 4 || @skill.scope == 6
          @target_window.index = -1
        elsif @skill.scope == 7
          @target_window.index = @actor_index - 10
        else
          @target_window.index = 0
        end
      # 效果在我方以外的情况下
      else
        # 公共事件 ID 有效的情况下
        if @skill.common_event_id > 0
          # 预约调用公共事件
          $game_temp.common_event_id = @skill.common_event_id
          # 演奏特技使用时的 SE
          $game_system.se_play(@skill.menu_se)
          #卐 消耗 PP
          @actor.skills_pp[@actor.skills.index(@skill.id)] -= 1
          # 再生成各窗口的内容
          @status_window.refresh
          @skill_window.refresh
          @target_window.refresh
          # 切换到地图画面
          $scene = Scene_Map.new
          return
        end
      end
      return
    end
    # 按下 R 键的情况下
    if Input.trigger?(Input::R)
      # 演奏光标 SE
      $game_system.se_play($data_system.cursor_se)
      # 移至下一位角色
      @actor_index += 1
      @actor_index %= $game_party.actors.size
      # 切换到别的特技画面
      $scene = Scene_Skill.new(@actor_index)
      return
    end
    # 按下 L 键的情况下
    if Input.trigger?(Input::L)
      # 演奏光标 SE
      $game_system.se_play($data_system.cursor_se)
      # 移至上一位角色
      @actor_index += $game_party.actors.size - 1
      @actor_index %= $game_party.actors.size
      # 切换到别的特技画面
      $scene = Scene_Skill.new(@actor_index)
      return
    end
  end
  def update_target
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 删除目标窗口
      @skill_window.active = true
      @target_window.visible = false
      @target_window.active = false
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 因为 PP 不足而无法使用的情况下
      unless @actor.skill_can_use?(@skill.id)
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 目标是全体的情况下
      if @target_window.index == -1
        # 对同伴全体应用特技使用效果
        used = false
        for i in $game_party.actors
          used |= i.skill_effect(@actor, @skill)
        end
      end
      # 目标是使用者的情况下
      if @target_window.index <= -2
        # 对目标角色应用特技的使用效果
        target = $game_party.actors[@target_window.index + 10]
        used = target.skill_effect(@actor, @skill)
      end
      # 目标是单体的情况下
      if @target_window.index >= 0
        # 对目标角色应用特技的使用效果
        target = $game_party.actors[@target_window.index]
        used = target.skill_effect(@actor, @skill)
      end
      # 使用特技的情况下
      if used
        # 演奏特技使用时的 SE
        $game_system.se_play(@skill.menu_se)
        # 消耗 PP
        @actor.skills_pp[@actor.skills.index(@skill.id)] -= 1
        # 再生成各窗口内容
        @status_window.refresh
        @skill_window.refresh
        @target_window.refresh
        # 全灭的情况下
        if $game_party.all_dead?
          # 切换到游戏结束画面
          $scene = Scene_Gameover.new
          return
        end
        # 公共事件 ID 有效的情况下
        if @skill.common_event_id > 0
          # 预约调用公共事件
          $game_temp.common_event_id = @skill.common_event_id
          # 切换到地图画面
          $scene = Scene_Map.new
          return
        end
      end
      # 无法使用特技的情况下
      unless used
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
      end
      return
    end
  end
end


class Scene_Battle
  def make_skill_action_result
    # 获取特技
    @skill = $data_skills[@active_battler.current_action.skill_id]
    # 如果不是强制行动
    unless @active_battler.current_action.forcing
      # 因为 PP 耗尽而无法使用的情况下
      unless @active_battler.skill_can_use?(@skill.id)
        # 清除强制行动对像的战斗者
        $game_temp.forcing_battler = nil
        # 移至步骤 1
        @phase4_step = 1
        return
      end
    end
    #卐 消耗 PP
    @active_battler.skills_pp[@active_battler.skills.index(@skill.id)] -= 1
    # 刷新状态窗口
    @status_window.refresh
    # 在帮助窗口显示特技名
    @help_window.set_text(@skill.name, 1)
    # 设置动画 ID
    @animation1_id = @skill.animation1_id
    @animation2_id = @skill.animation2_id
    # 设置公共事件 ID
    @common_event_id = @skill.common_event_id
    # 设置对像侧战斗者
    set_target_battlers(@skill.scope)
    # 应用特技效果
    for target in @target_battlers
      target.skill_effect(@active_battler, @skill)
    end
  end
end[/pre]

已通过测试(呼,累死了,是从我的游戏里一点一点的挖出来的)
另外楼主是打算做口袋妖怪吗?

评分

参与人数 2星屑 +215 收起 理由
RyanBern + 200 认可答案
269155856888 + 15 认可答案

查看全部评分

回复 1 0

使用道具 举报

梦石
0
星屑
307
在线时间
275 小时
注册时间
2015-1-29
回帖
86
 楼主| 发表于 2016-7-10 16:40:59 | 显示全部楼层
本帖最后由 269155856888 于 2016-7-10 16:42 编辑
陈大帅帅帅哥 发表于 2016-7-10 16:32
主站上有个xp的,不过有bug,所有同编号技能拥有统一的PP,下面是我自己修改过的


谢谢,不过好像有问题    脚本第143有错误
QQ截图20160710163854.png
回复

使用道具 举报

梦石
0
星屑
4657
在线时间
1069 小时
注册时间
2013-3-28
回帖
309

开拓者

发表于 2016-7-10 16:46:26 | 显示全部楼层
269155856888 发表于 2016-7-10 16:40
谢谢,不过好像有问题    脚本第143有错误

论坛的锅,改成@skill = @skill_window.skill
回复

使用道具 举报

梦石
0
星屑
307
在线时间
275 小时
注册时间
2015-1-29
回帖
86
 楼主| 发表于 2016-7-10 17:16:35 | 显示全部楼层
陈大帅帅帅哥 发表于 2016-7-10 16:46
论坛的锅,改成@skill = @skill_window.skill

弱弱的问一句怎么用?我不是太懂脚本,脚本里也没有明确说明

点评

没有时间了,明天再写给你  发表于 2016-7-10 17:30
每个技能的sp就是总pp,回复pp的话我得研究一下  发表于 2016-7-10 17:18
回复

使用道具 举报

梦石
0
星屑
307
在线时间
275 小时
注册时间
2015-1-29
回帖
86
 楼主| 发表于 2016-7-10 17:47:03 | 显示全部楼层
陈大帅帅帅哥 发表于 2016-7-10 16:32
主站上有个xp的,不过有bug,所有同编号技能拥有统一的PP,下面是我自己修改过的

效果是达到了,可.....好像不能显示技能还剩多少?



回复

使用道具 举报

梦石
0
星屑
307
在线时间
275 小时
注册时间
2015-1-29
回帖
86
 楼主| 发表于 2016-7-10 17:47:40 | 显示全部楼层
陈大帅帅帅哥 发表于 2016-7-10 16:32
主站上有个xp的,不过有bug,所有同编号技能拥有统一的PP,下面是我自己修改过的


效果是达到了,可.....好像不能显示技能还剩多少{:2_270:}
回复

使用道具 举报

梦石
0
星屑
4657
在线时间
1069 小时
注册时间
2013-3-28
回帖
309

开拓者

发表于 2016-7-10 20:21:07 | 显示全部楼层

咦这是什么,原来回复也可以加标题

本帖最后由 陈大帅帅帅哥 于 2016-7-10 22:20 编辑
269155856888 发表于 2016-7-10 17:47
效果是达到了,可.....好像不能显示技能还剩多少?


我实验的时候可以,能不能发一下效果图

另:回复PP方法已完成,在我的脚本的Game_Battler下加入
  1.   #--------------------------------------------------------------------------
  2.   # 卐 回复技能PP
  3.   #--------------------------------------------------------------------------
  4.   def recover_skills_pp
  5.     for i in 0..skills.size-1
  6.       @skills_pp[i] = $data_skills[@skills[i]].sp_cost
  7.     end
  8.   end
  9.   #--------------------------------------------------------------------------
  10.   # 卐 全回复
  11.   #--------------------------------------------------------------------------
  12.   def recover_all
  13.     @hp = maxhp
  14.     @sp = maxsp
  15.     for i in @states.clone
  16.       remove_state(i)
  17.     end
  18.     recover_skills_pp
  19.   end
复制代码


然后在事件中用
for actor in $game_party.actors
  actor.recover_skills_pp
end
就可以完全回复所有人的PP值
回复

使用道具 举报

梦石
0
星屑
307
在线时间
275 小时
注册时间
2015-1-29
回帖
86
 楼主| 发表于 2016-7-11 10:53:22 | 显示全部楼层
本帖最后由 269155856888 于 2016-7-11 10:59 编辑

陈大帅帅帅哥 发表于 2016-7-10 20:21
我实验的时候可以,能不能发一下效果图

另:回复PP方法已完成,在我的脚本的Game_Battler下加入


问题↓
其他的效果是达到了,技能数量是5,用了还是5....       能发个范例么?
QQ截图20160711105042.png
QQ截图20160711105055.png
QQ截图20160711105112.png
回复

使用道具 举报

梦石
0
星屑
4657
在线时间
1069 小时
注册时间
2013-3-28
回帖
309

开拓者

发表于 2016-7-11 11:42:34 | 显示全部楼层
269155856888 发表于 2016-7-11 10:53
问题↓
其他的效果是达到了,技能数量是5,用了还是5....       能发个范例么? ...

你这个好像完全没有用到我的脚本吧,能不能发一下你的工程,我看看是哪里有问题
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部