Project1

标题: 求技能数量脚本 [打印本页]

作者: 269155856888    时间: 2016-7-10 14:23
标题: 求技能数量脚本
在论坛上搜过....可都是VX的...

SO,在这求个脚本

类似这样
↓↓↓
-------------------------------------------
十字斩                                          4/5      l  类似口袋妖怪技能系统
-----------------------------------↑-↑---
                                   技能所剩量↑  ↑技能极限量
作者: 陈大帅帅帅哥    时间: 2016-7-10 16:32
本帖最后由 陈大帅帅帅哥 于 2016-7-14 11:24 编辑

主站上有个xp的,不过有bug,所有同编号技能拥有统一的PP,下面是我自己修改过的
RUBY 代码复制
  1. class Game_Battler
  2.   attr_accessor :skills_pp                #卐 技能pp的数组
  3.   attr_accessor :skills                   #卐 特技
  4.   alias cdsssg_initialize initialize
  5.   def initialize
  6.     cdsssg_initialize
  7.     @skills_pp = []
  8.     @skills = []
  9.   end
  10.   def skill_can_use?(skill_id)
  11.     #卐 PP 不足的情况下不能使用
  12.     if self.skills_pp[self.skills.index(skill_id)] < 1
  13.       return false
  14.     end
  15.     # 战斗不能的情况下不能使用
  16.     if dead?
  17.       return false
  18.     end
  19.     # 沉默状态的情况下、物理特技以外的特技不能使用
  20.     if $data_skills[skill_id].atk_f == 0 and self.restriction == 1
  21.       return false
  22.     end
  23.     # 获取可以使用的时机
  24.     occasion = $data_skills[skill_id].occasion
  25.     # 战斗中的情况下
  26.     if $game_temp.in_battle
  27.       # [平时] 或者是 [战斗中] 可以使用
  28.       return (occasion == 0 or occasion == 1)
  29.     # 不是战斗中的情况下
  30.     else
  31.       # [平时] 或者是 [菜单中] 可以使用
  32.       return (occasion == 0 or occasion == 2)
  33.     end
  34.   end
  35. end
  36.  
  37.  
  38. class Game_Actor < Game_Battler
  39.   def setup(actor_id)
  40.     actor = $data_actors[actor_id]
  41.     @actor_id = actor_id
  42.     @name = actor.name
  43.     @character_name = actor.character_name
  44.     @character_hue = actor.character_hue
  45.     @battler_name = actor.battler_name
  46.     @battler_hue = actor.battler_hue
  47.     @class_id = actor.class_id
  48.     @weapon_id = actor.weapon_id
  49.     @armor1_id = actor.armor1_id
  50.     @armor2_id = actor.armor2_id
  51.     @armor3_id = actor.armor3_id
  52.     @armor4_id = actor.armor4_id
  53.     @level = actor.initial_level
  54.     @exp_list = Array.new(101)
  55.     make_exp_list
  56.     @exp = @exp_list[@level]
  57.     @skills = []
  58.     @hp = maxhp
  59.     @sp = maxsp
  60.     @states = []
  61.     @states_turn = {}
  62.     @maxhp_plus = 0
  63.     @maxsp_plus = 0
  64.     @str_plus = 0
  65.     @dex_plus = 0
  66.     @agi_plus = 0
  67.     @int_plus = 0
  68.     # 学会特技
  69.     for i in 1..@level
  70.       for j in $data_classes[@class_id].learnings
  71.         if j.level == i
  72.           learn_skill(j.skill_id)
  73.         end
  74.       end
  75.     end
  76.     # 刷新自动状态
  77.     update_auto_state(nil, $data_armors[@armor1_id])
  78.     update_auto_state(nil, $data_armors[@armor2_id])
  79.     update_auto_state(nil, $data_armors[@armor3_id])
  80.     update_auto_state(nil, $data_armors[@armor4_id])
  81.   end
  82.   def learn_skill(skill_id)
  83.     if skill_id > 0 and not skill_learn?(skill_id)
  84.       @skills_pp.push($data_skills[skill_id].sp_cost)
  85.       @skills.push(skill_id)
  86.       @skills.sort!
  87.     end
  88.   end
  89.   def forget_skill(skill_id)
  90.     @skills_pp.delete_at(@skills.index(skill_id))
  91.     @skills.delete(skill_id)
  92.   end
  93. end
  94.  
  95.  
  96. class Game_Enemy < Game_Battler
  97.   def actions
  98.     for i in $data_enemies[@enemy_id].actions
  99.       if i.kind == 1 and i.skill_id != 1
  100.         @skills_pp.push($data_skills[i.skill_id].sp_cost)
  101.         @skills.push(i.skill_id)
  102.       end
  103.     end
  104.     return $data_enemies[@enemy_id].actions
  105.   end
  106. end
  107.  
  108.  
  109. class Window_Skill < Window_Selectable
  110.   def draw_item(index)
  111.     skill = @data[index]
  112.     if @actor.skill_can_use?(skill.id)
  113.       self.contents.font.color = normal_color
  114.     else
  115.       self.contents.font.color = disabled_color
  116.     end
  117.     x = 4 + index % 2 * (288 + 32)
  118.     y = index / 2 * 32
  119.     rect = Rect.new(x, y, self.width / @column_max - 32, 32)
  120.     self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
  121.     bitmap = RPG::Cache.icon(skill.icon_name)
  122.     opacity = self.contents.font.color == normal_color ? 255 : 128
  123.     self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
  124.     self.contents.draw_text(x + 28, y, 204, 32, skill.name, 0)
  125.     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)
  126.   end
  127. end
  128.  
  129.  
  130. class Scene_Skill
  131.   def update_skill
  132.     # 按下 B 键的情况下
  133.     if Input.trigger?(Input::B)
  134.       # 演奏取消 SE
  135.       $game_system.se_play($data_system.cancel_se)
  136.       # 切换到菜单画面
  137.       $scene = Scene_Menu.new(1)
  138.       return
  139.     end
  140.     # 按下 C 键的情况下
  141.     if Input.trigger?(Input::C)
  142.       # 获取特技窗口现在选择的特技的数据
  143.       @skill = @skill_window.skill
  144.       # 不能使用的情况下
  145.       if @skill == nil or not @actor.skill_can_use?(@skill.id)
  146.         # 演奏冻结 SE
  147.         $game_system.se_play($data_system.buzzer_se)
  148.         return
  149.       end
  150.       # 演奏确定 SE
  151.       $game_system.se_play($data_system.decision_se)
  152.       # 效果范围是我方的情况下
  153.       if @skill.scope >= 3
  154.         # 激活目标窗口
  155.         @skill_window.active = false
  156.         @target_window.x = (@skill_window.index + 1) % 2 * 304
  157.         @target_window.visible = true
  158.         @target_window.active = true
  159.         # 设置效果范围 (单体/全体) 的对应光标位置
  160.         if @skill.scope == 4 || @skill.scope == 6
  161.           @target_window.index = -1
  162.         elsif @skill.scope == 7
  163.           @target_window.index = @actor_index - 10
  164.         else
  165.           @target_window.index = 0
  166.         end
  167.       # 效果在我方以外的情况下
  168.       else
  169.         # 公共事件 ID 有效的情况下
  170.         if @skill.common_event_id > 0
  171.           # 预约调用公共事件
  172.           $game_temp.common_event_id = @skill.common_event_id
  173.           # 演奏特技使用时的 SE
  174.           $game_system.se_play(@skill.menu_se)
  175.           #卐 消耗 PP
  176.           @actor.skills_pp[@actor.skills.index(@skill.id)] -= 1
  177.           # 再生成各窗口的内容
  178.           @status_window.refresh
  179.           @skill_window.refresh
  180.           @target_window.refresh
  181.           # 切换到地图画面
  182.           $scene = Scene_Map.new
  183.           return
  184.         end
  185.       end
  186.       return
  187.     end
  188.     # 按下 R 键的情况下
  189.     if Input.trigger?(Input::R)
  190.       # 演奏光标 SE
  191.       $game_system.se_play($data_system.cursor_se)
  192.       # 移至下一位角色
  193.       @actor_index += 1
  194.       @actor_index %= $game_party.actors.size
  195.       # 切换到别的特技画面
  196.       $scene = Scene_Skill.new(@actor_index)
  197.       return
  198.     end
  199.     # 按下 L 键的情况下
  200.     if Input.trigger?(Input::L)
  201.       # 演奏光标 SE
  202.       $game_system.se_play($data_system.cursor_se)
  203.       # 移至上一位角色
  204.       @actor_index += $game_party.actors.size - 1
  205.       @actor_index %= $game_party.actors.size
  206.       # 切换到别的特技画面
  207.       $scene = Scene_Skill.new(@actor_index)
  208.       return
  209.     end
  210.   end
  211.   def update_target
  212.     # 按下 B 键的情况下
  213.     if Input.trigger?(Input::B)
  214.       # 演奏取消 SE
  215.       $game_system.se_play($data_system.cancel_se)
  216.       # 删除目标窗口
  217.       @skill_window.active = true
  218.       @target_window.visible = false
  219.       @target_window.active = false
  220.       return
  221.     end
  222.     # 按下 C 键的情况下
  223.     if Input.trigger?(Input::C)
  224.       # 因为 PP 不足而无法使用的情况下
  225.       unless @actor.skill_can_use?(@skill.id)
  226.         # 演奏冻结 SE
  227.         $game_system.se_play($data_system.buzzer_se)
  228.         return
  229.       end
  230.       # 目标是全体的情况下
  231.       if @target_window.index == -1
  232.         # 对同伴全体应用特技使用效果
  233.         used = false
  234.         for i in $game_party.actors
  235.           used |= i.skill_effect(@actor, @skill)
  236.         end
  237.       end
  238.       # 目标是使用者的情况下
  239.       if @target_window.index <= -2
  240.         # 对目标角色应用特技的使用效果
  241.         target = $game_party.actors[@target_window.index + 10]
  242.         used = target.skill_effect(@actor, @skill)
  243.       end
  244.       # 目标是单体的情况下
  245.       if @target_window.index >= 0
  246.         # 对目标角色应用特技的使用效果
  247.         target = $game_party.actors[@target_window.index]
  248.         used = target.skill_effect(@actor, @skill)
  249.       end
  250.       # 使用特技的情况下
  251.       if used
  252.         # 演奏特技使用时的 SE
  253.         $game_system.se_play(@skill.menu_se)
  254.         # 消耗 PP
  255.         @actor.skills_pp[@actor.skills.index(@skill.id)] -= 1
  256.         # 再生成各窗口内容
  257.         @status_window.refresh
  258.         @skill_window.refresh
  259.         @target_window.refresh
  260.         # 全灭的情况下
  261.         if $game_party.all_dead?
  262.           # 切换到游戏结束画面
  263.           $scene = Scene_Gameover.new
  264.           return
  265.         end
  266.         # 公共事件 ID 有效的情况下
  267.         if @skill.common_event_id > 0
  268.           # 预约调用公共事件
  269.           $game_temp.common_event_id = @skill.common_event_id
  270.           # 切换到地图画面
  271.           $scene = Scene_Map.new
  272.           return
  273.         end
  274.       end
  275.       # 无法使用特技的情况下
  276.       unless used
  277.         # 演奏冻结 SE
  278.         $game_system.se_play($data_system.buzzer_se)
  279.       end
  280.       return
  281.     end
  282.   end
  283. end
  284.  
  285.  
  286. class Scene_Battle
  287.   def make_skill_action_result
  288.     # 获取特技
  289.     @skill = $data_skills[@active_battler.current_action.skill_id]
  290.     # 如果不是强制行动
  291.     unless @active_battler.current_action.forcing
  292.       # 因为 PP 耗尽而无法使用的情况下
  293.       unless @active_battler.skill_can_use?(@skill.id)
  294.         # 清除强制行动对像的战斗者
  295.         $game_temp.forcing_battler = nil
  296.         # 移至步骤 1
  297.         @phase4_step = 1
  298.         return
  299.       end
  300.     end
  301.     #卐 消耗 PP
  302.     @active_battler.skills_pp[@active_battler.skills.index(@skill.id)] -= 1
  303.     # 刷新状态窗口
  304.     @status_window.refresh
  305.     # 在帮助窗口显示特技名
  306.     @help_window.set_text(@skill.name, 1)
  307.     # 设置动画 ID
  308.     @animation1_id = @skill.animation1_id
  309.     @animation2_id = @skill.animation2_id
  310.     # 设置公共事件 ID
  311.     @common_event_id = @skill.common_event_id
  312.     # 设置对像侧战斗者
  313.     set_target_battlers(@skill.scope)
  314.     # 应用特技效果
  315.     for target in @target_battlers
  316.       target.skill_effect(@active_battler, @skill)
  317.     end
  318.   end
  319. end


已通过测试(呼,累死了,是从我的游戏里一点一点的挖出来的)
另外楼主是打算做口袋妖怪吗?
作者: 269155856888    时间: 2016-7-10 16:40
本帖最后由 269155856888 于 2016-7-10 16:42 编辑
陈大帅帅帅哥 发表于 2016-7-10 16:32
主站上有个xp的,不过有bug,所有同编号技能拥有统一的PP,下面是我自己修改过的


谢谢,不过好像有问题    脚本第143有错误

QQ截图20160710163854.png (9.27 KB, 下载次数: 4)

QQ截图20160710163854.png

作者: 陈大帅帅帅哥    时间: 2016-7-10 16:46
269155856888 发表于 2016-7-10 16:40
谢谢,不过好像有问题    脚本第143有错误

论坛的锅,改成@skill = @skill_window.skill
作者: 269155856888    时间: 2016-7-10 17:16
陈大帅帅帅哥 发表于 2016-7-10 16:46
论坛的锅,改成@skill = @skill_window.skill

弱弱的问一句怎么用?我不是太懂脚本,脚本里也没有明确说明
作者: 269155856888    时间: 2016-7-10 17:47
陈大帅帅帅哥 发表于 2016-7-10 16:32
主站上有个xp的,不过有bug,所有同编号技能拥有统一的PP,下面是我自己修改过的

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




作者: 269155856888    时间: 2016-7-10 17:47
陈大帅帅帅哥 发表于 2016-7-10 16:32
主站上有个xp的,不过有bug,所有同编号技能拥有统一的PP,下面是我自己修改过的


效果是达到了,可.....好像不能显示技能还剩多少{:2_270:}
作者: 陈大帅帅帅哥    时间: 2016-7-10 20:21
标题: 咦这是什么,原来回复也可以加标题
本帖最后由 陈大帅帅帅哥 于 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值
作者: 269155856888    时间: 2016-7-11 10:53
本帖最后由 269155856888 于 2016-7-11 10:59 编辑

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

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


问题↓
其他的效果是达到了,技能数量是5,用了还是5....       能发个范例么?

QQ截图20160711105042.png (380.98 KB, 下载次数: 7)

QQ截图20160711105042.png

QQ截图20160711105055.png (363.55 KB, 下载次数: 7)

QQ截图20160711105055.png

QQ截图20160711105112.png (392.17 KB, 下载次数: 8)

QQ截图20160711105112.png

作者: 陈大帅帅帅哥    时间: 2016-7-11 11:42
269155856888 发表于 2016-7-11 10:53
问题↓
其他的效果是达到了,技能数量是5,用了还是5....       能发个范例么? ...

你这个好像完全没有用到我的脚本吧,能不能发一下你的工程,我看看是哪里有问题
作者: 269155856888    时间: 2016-7-11 12:22
陈大帅帅帅哥 发表于 2016-7-11 11:42
你这个好像完全没有用到我的脚本吧,能不能发一下你的工程,我看看是哪里有问题 ...

http://pan.baidu.com/s/1i5HbB5z
作者: 陈大帅帅帅哥    时间: 2016-7-11 12:59
本帖最后由 陈大帅帅帅哥 于 2016-7-11 13:07 编辑
269155856888 发表于 2016-7-11 12:22
http://pan.baidu.com/s/1i5HbB5z


……你根本没有用我的那个脚本,请把我发的脚本插入到main前

另外,删掉你的物品美化脚本的class Window_Skill下面的
RUBY 代码复制
  1. self.contents.draw_text(x + 232, y, 48, 32, skill.sp_cost.to_s, 2)

改成
RUBY 代码复制
  1. 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)

作者: 269155856888    时间: 2016-7-11 19:37
本帖最后由 269155856888 于 2016-7-11 19:42 编辑
陈大帅帅帅哥 发表于 2016-7-11 12:59
……你根本没有用我的那个脚本,请把我发的脚本插入到main前

另外,删掉你的物品美化脚本的class Window ...


不好意思..发错了......    效果达到了↓

QQ图片20160711194156.png (356.44 KB, 下载次数: 19)

QQ图片20160711194156.png

作者: 269155856888    时间: 2016-7-11 19:44
陈大帅帅帅哥 发表于 2016-7-11 12:59
……你根本没有用我的那个脚本,请把我发的脚本插入到main前

另外,删掉你的物品美化脚本的class Window ...

谢谢你的细心帮忙{:2_249:},问题解决了......Good person!
作者: 陈大帅帅帅哥    时间: 2016-7-11 21:54
269155856888 发表于 2016-7-11 19:44
谢谢你的细心帮忙,问题解决了......Good person!

毕竟大家都是做口袋的同好嘛
作者: 269155856888    时间: 2016-7-13 23:02
本帖最后由 269155856888 于 2016-7-13 23:06 编辑
陈大帅帅帅哥 发表于 2016-7-11 21:54
毕竟大家都是做口袋的同好嘛


脚本有bug,无法在菜单使用.......用你的脚本做了很多技能后发现bug,顿时崩溃{:2_277:} {:2_271:} .........(额....不知道还能不能回复
作者: 陈大帅帅帅哥    时间: 2016-7-14 11:18
本帖最后由 陈大帅帅帅哥 于 2016-7-14 11:25 编辑
269155856888 发表于 2016-7-13 23:02
脚本有bug,无法在菜单使用.......用你的脚本做了很多技能后发现bug,顿时崩溃  ..... ...


不好意思,我的疏忽,请把176行改成@actor.skills_pp[@actor.skills.index(@skill.id)] -= 1
还有255行改成@actor.skills_pp[@actor.skills.index(@skill.id)] -= 1
作者: 269155856888    时间: 2016-7-14 12:41
陈大帅帅帅哥 发表于 2016-7-14 11:18
不好意思,我的疏忽,请把176行改成@actor.skills_pp[@actor.skills.index(@skill.id)] -= 1
还有255行改 ...

大好人




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