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

Project1

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

[RMVA发布] 让技能像装备一样装备吧~技能SP系统

[复制链接]

Lv1.梦旅人 (暗夜天使)

永夜蟄居の玖瀨

梦石
0
星屑
71
在线时间
1018 小时
注册时间
2011-9-5
帖子
2813

开拓者贵宾

跳转到指定楼层
1
发表于 2015-2-9 17:44:42 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

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

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

x
本帖最后由 千葉玖濑 于 2015-2-9 17:44 编辑

◆ 技能SP点--让技能像装备一样装备吧~
看到了VX中KGC的技能CP制脚本,然后到KGC和6R找了好久都没找到ACE版本,就参照着KGCVX版的思路了弄了个技能SP的脚本~
功能:
让技能像装备一样装备,只有装备后的技能可以在战斗中使用。
技能可在备注设定消耗的SP,角色升级可增加SP,装备也可追加SP(或者扣除SP上限)。
可定义技能栏上限,这样即使SP再多也只能携带特定数目技能。

一点都不特别的使用技♂巧:
         SceneManager.call(Scene_SetBattleSkill) 呼出技能配置界面。
         在数据库技能备注中添加<CP X>
         若要让装备可以增加最大CP在装备备注中添加<最大CP X>
         若要让装备可以增加技能栏容量在备注中添加<技能栏追加 X>
         脚本内置在菜单中添加了“魔装”选项,不需要请删除脚本之后对Window_Menucommand和Scene_Menu的追加。
         关于其他对SP和技能栏的操作见范例或者注释(范例才没有卖萌呢)
RUBY 代码复制
  1. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  2. #_/                ◆ 技能SP点--让技能像装备一样装备吧~
  3. #_/
  4. #_/  看到了VX中KGC的技能CP制脚本,然后到KGC和6R找了好久都没找到ACE版本,就参照着
  5. #_/  KGCVX版的思路移植了个技能SP的脚本~
  6. #_/  功能:
  7. #_/   让技能像装备一样装备,只有装备后的技能可以在战斗中使用。
  8. #_/   技能可在备注设定消耗的SP,角色升级可增加SP,装备也可追加SP(或者扣除SP上限)。
  9. #_/   可定义技能栏上限,这样即使SP再多也只能携带特定数目技能。
  10. #_/                                                            ---千叶玖濑
  11. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  12. #==============================================================================
  13. # ☆系统设置
  14. #==============================================================================
  15. module Skill_SP
  16.   # ◆ 技能栏最大空位
  17.   MAX_SKILLS = 7
  18.   # ◆ SP 的名字
  19.   VOCAB_SP   = "SP"
  20.   # ◆ SP 的简称
  21.   VOCAB_SP_A = "技"
  22.   # ◆ 在角色状态中显示SP数值(适合默认菜单)
  23.   SHOW_STATUS_SP = true
  24.   # ◆ 未设定消耗SP的技能,默认消耗的SP值。
  25.   DEFAULT_SP_COST = 1
  26.   # ◆ 人物升级所获得得SP值上限
  27.   SP_MAX = 25
  28.   # ◆ 人物SP值下限
  29.   SP_MIN = 0
  30.   # ◆ 本来的SP加上装备提供的SP上限
  31.   REVISED_SP_MAX = 25
  32.   # ◆ 经过装备扣除后的SP下限
  33.   REVISED_SP_MIN = 0
  34.   # ◆通用的SP最大值的计算公式
  35.   #   level代表角色当前等级
  36.   #   结果自动取整
  37.   SP_ABOUT_EXP = "level * 0.6 + 1.0"
  38.   # ◆ 对于特定角色角色最大SP计算公式
  39.   #   PERSONAL_SP_ABOUT_EXP[角色 ID] = "公式"
  40.   #   公式格式和最大值计算公式举例如下
  41.   PERSONAL_SP_ABOUT_EXP = [] # 此行不要改动
  42.   PERSONAL_SP_ABOUT_EXP[1] = "level * 1.0 - 10.0"
  43.   PERSONAL_SP_ABOUT_EXP[3] = "level * 1.0 + 5.0"
  44.   # ◆ 在技能装备栏中允许显示不可使用的技能
  45.   SHOW_UNUSABLE_SKILL    = true
  46.   # ◆ 新学习到的技能自动装备
  47.   AUTO_SET_NEW_SKILL     = true
  48.   # ◆ SP 最小值时的颜色
  49.   #  (数值为\C[n]表示的颜色)
  50.   GAUGE_START_COLOR = 13
  51.   # ◆ SP 最大值时的颜色
  52.   GAUGE_END_COLOR   = 5
  53.   # ◆ 菜单中进入技能SP的名称
  54.   VOCAB_MENU_SET_SKILL = "魔装"
  55.   # ◆ 未设定技能时显示的名称
  56.   BLANK_TEXT   = "-   空技能框   -"
  57.   # ◆ 技能解除时候显示的名称
  58.   RELEASE_TEXT = "( 解除技能 )"
  59. end
  60. #==============================================================================
  61. # ☆对于在数据库备注中的设定方法~
  62. #==============================================================================
  63. module Skill_SP
  64.   module Regexp
  65.     module BaseItem
  66.       # 最大SP增加:在装备栏备注中填写<最大SP X>或<MAXSP X>(X可为负数)
  67.       MAXSP_PLUS = /<(?:MAX|最大)SP\s*([\-\+]?\d+)>/
  68.       # 技能框增加:在装备栏备注中填写<技能栏追加 X>
  69.       BATTLE_SKILL_MAX = /<(?:BATTLE_SKILL_MAX|技能栏追加)\s*([\-\+]?\d+)>/i
  70.     end
  71.     module Skill
  72.       # 消费SP设定 :在技能备注中填写<SP X>
  73.       SP_COST = /<SP\s*(\d+)>/i
  74.     end
  75.   end
  76. end
  77. #==============================================================================
  78. ## ☆ Game_Interpreter----用事件脚本来获取SP的方法~
  79. #==============================================================================
  80. module Skill_SP
  81.   #--------------------------------------------------------------------------
  82.   # ○ 获得角色SP最大值
  83.   #     actor_id    : 角色编号
  84.   #     variable_id : SP赋值的变量号(不填则不代入)
  85.   #--------------------------------------------------------------------------
  86.   def get_actor_sp(actor_id, variable_id = 0)
  87.     value = $game_actors[actor_id].maxsp_plus
  88.     $game_variables[variable_id] = value if variable_id > 0
  89.     return value
  90.   end
  91.   #--------------------------------------------------------------------------
  92.   # ○ 变更角色SP最大值
  93.   #     actor_id : 角色编号
  94.   #     value    : 变更后的SP最大值
  95.   #--------------------------------------------------------------------------
  96.   def set_actor_sp(actor_id, value)
  97.     $game_actors[actor_id].maxsp_plus = value
  98.   end
  99.   #--------------------------------------------------------------------------
  100.   # ○ 角色最大SP增加
  101.   #     actor_id : 角色编号
  102.   #     value    : SP最大值增加量
  103.   #--------------------------------------------------------------------------
  104.   def gain_actor_sp(actor_id, value)
  105.     $game_actors[actor_id].maxsp_plus += value
  106.   end
  107.   #--------------------------------------------------------------------------
  108.   # ○ 技能栏最大数获得
  109.   #     actor_id : 角色编号
  110.   #     variable_id : 技能栏最大数赋值的变量号(不填则不代入)
  111.   #--------------------------------------------------------------------------
  112.   def get_battle_skill_max(actor_id, variable_id = 0)
  113.     value = $game_actors[actor_id].battle_skill_max
  114.     $game_variables[variable_id] = value if variable_id > 0
  115.     return value
  116.   end
  117.   #--------------------------------------------------------------------------
  118.   # ○ 技能栏最大数变更
  119.   #     actor_id : 角色ID
  120.   #     value    : 变更后的技能栏数目
  121.   #--------------------------------------------------------------------------
  122.   def set_battle_skill_max(actor_id, value = -1)
  123.     $game_actors[actor_id].battle_skill_max = value
  124.   end
  125.   #--------------------------------------------------------------------------
  126.   # ○ 确认某技能是否已装备
  127.   #     actor_id : 角色ID
  128.   #     skill_id : 技能ID
  129.   #--------------------------------------------------------------------------
  130.   def battle_skill_set?(actor_id, skill_id)
  131.     return $game_actors[actor_id].battle_skill_ids.include?(skill_id)
  132.   end
  133.   #--------------------------------------------------------------------------
  134.   # ○ 装备技能
  135.   #     actor_id : 角色编号
  136.   #     index    : 装备的技能栏位
  137.   #     skill_id : 技能ID(nil则为解除装备)
  138.   #--------------------------------------------------------------------------
  139.   def set_battle_skill(actor_id, index, skill_id = nil)
  140.     actor = $game_actors[actor_id]
  141.     if skill_id.is_a?(Integer)
  142.       # 装备
  143.       skill = $data_skills[skill_id]
  144.       return unless actor.battle_skill_settable?(index, skill)  # 无法装备
  145.       actor.set_battle_skill(index, skill)
  146.       actor.restore_battle_skill
  147.     else
  148.       # 解除
  149.       actor.remove_battle_skill(index)
  150.     end
  151.   end
  152.   #--------------------------------------------------------------------------
  153.   # ○ 直接装备某技能
  154.   #     actor_id : 角色编号
  155.   #     skill_id : 技能编号
  156.   #--------------------------------------------------------------------------
  157.   def add_battle_skill(actor_id, skill_id)
  158.     actor = $game_actors[actor_id]
  159.     skill = $data_skills[skill_id]
  160.     return if actor == nil || skill == nil
  161.     actor.add_battle_skill(skill)
  162.   end
  163.   #--------------------------------------------------------------------------
  164.   # ○ 卸下全部技能
  165.   #     actor_id : 角色编号
  166.   #--------------------------------------------------------------------------
  167.   def clear_battle_skill(actor_id)
  168.     $game_actors[actor_id].clear_battle_skill
  169.   end
  170.   end
  171.   class Game_Interpreter
  172.     include Skill_SP
  173.   end
  174. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
  175.  
  176.  
  177. #==============================================================================
  178. # ■ RPG::BaseItem
  179. #==============================================================================
  180.  
  181. class RPG::BaseItem
  182.   #--------------------------------------------------------------------------
  183.   # ○ 读取装备备注
  184.   #--------------------------------------------------------------------------
  185.   def create_skill_sp_system_cache
  186.     @__maxsp_plus = 0
  187.     @__battle_skill_max_plus = 0
  188.     self.note.each_line { |line|
  189.       case line
  190.       when Skill_SP::Regexp::BaseItem::MAXSP_PLUS
  191.         @__maxsp_plus += $1.to_i
  192.       when Skill_SP::Regexp::BaseItem::BATTLE_SKILL_MAX
  193.         @__battle_skill_max_plus += $1.to_i
  194.       end
  195.     }
  196.   end
  197.   #--------------------------------------------------------------------------
  198.   # ○ 最大 SP
  199.   #--------------------------------------------------------------------------
  200.   def maxsp_plus
  201.     create_skill_sp_system_cache if @__maxsp_plus == nil
  202.     return @__maxsp_plus
  203.   end
  204.   #--------------------------------------------------------------------------
  205.   # ○ 技能框追加
  206.   #--------------------------------------------------------------------------
  207.   def battle_skill_max_plus
  208.     create_skill_sp_system_cache if @__battle_skill_max_plus == nil
  209.     return @__battle_skill_max_plus
  210.   end
  211. end
  212. #==============================================================================
  213. # ■ RPG::Skill
  214. #==============================================================================
  215. class RPG::Skill < RPG::UsableItem
  216.   #--------------------------------------------------------------------------
  217.   # ○ 技能SP生成
  218.   #--------------------------------------------------------------------------
  219.   def create_skill_sp_system_cache
  220.     @__sp_cost = Skill_SP::DEFAULT_SP_COST
  221.     self.note.each_line { |line|
  222.       case line
  223.       when Skill_SP::Regexp::Skill::SP_COST
  224.         # 消费SP
  225.         @__sp_cost = $1.to_i
  226.       end
  227.     }
  228.   end
  229.   #--------------------------------------------------------------------------
  230.   # ○ 消費 SP
  231.   #--------------------------------------------------------------------------
  232.   def sp_cost
  233.     create_skill_sp_system_cache if @__sp_cost == nil
  234.     return @__sp_cost
  235.   end
  236. end
  237. #==============================================================================
  238. # ■ Vocab
  239. #==============================================================================
  240. module Vocab
  241.   #SP
  242.   def self.sp
  243.     return Skill_SP::VOCAB_SP
  244.   end
  245.   #SP略
  246.   def self.sp_a
  247.     return Skill_SP::VOCAB_SP_A
  248.   end
  249.   # 技能设定
  250.   def self.set_battle_skill
  251.     return Skill_SP::VOCAB_MENU_SET_SKILL
  252.   end
  253. end
  254. #==============================================================================
  255. # ■ Game_Battler
  256. #==============================================================================
  257.  
  258. class Game_Battler
  259.   #--------------------------------------------------------------------------
  260.   # ○ 战斗技能配置确定
  261.   #--------------------------------------------------------------------------
  262.   def battle_skill_set?(skill)
  263.     return true
  264.   end
  265. end
  266.  
  267. #==============================================================================
  268. # ■ Game_Actor
  269. #==============================================================================
  270.  
  271. class Game_Actor < Game_Battler
  272.   #--------------------------------------------------------------------------
  273.   # ● 实例变量
  274.   #--------------------------------------------------------------------------
  275.   attr_writer   :maxsp_plus               # 最大SP补正值
  276.   #--------------------------------------------------------------------------
  277.   # ○ MaxSP 取得
  278.   #--------------------------------------------------------------------------
  279.   def maxsp
  280.     about_exp = Skill_SP::PERSONAL_SP_ABOUT_EXP[self.id]
  281.     if about_exp == nil
  282.       about_exp = Skill_SP::SP_ABOUT_EXP
  283.     end
  284.     n = Integer(eval(about_exp))
  285.     n = [[n, sp_limit].min, Skill_SP::SP_MIN].max
  286.     n += maxsp_plus + maxsp_plus_equip
  287.     return [[n, revised_sp_limit].min, Skill_SP::REVISED_SP_MIN].max
  288.   end
  289.   #--------------------------------------------------------------------------
  290.   # ○ SP 取得
  291.   #--------------------------------------------------------------------------
  292.   def sp
  293.     return [maxsp - consumed_sp, 0].max
  294.   end
  295.   #--------------------------------------------------------------------------
  296.   # ○ SP 消耗量取得
  297.   #--------------------------------------------------------------------------
  298.   def consumed_sp
  299.     n = 0
  300.     battle_skills.compact.each { |skill| n += skill.sp_cost }
  301.     return n
  302.   end
  303.   #--------------------------------------------------------------------------
  304.   # ○ SP 上限取得
  305.   #--------------------------------------------------------------------------
  306.   def sp_limit
  307.     return Skill_SP::SP_MAX
  308.   end
  309.   #--------------------------------------------------------------------------
  310.   # ○ 补正后SP上限获得
  311.   #--------------------------------------------------------------------------
  312.   def revised_sp_limit
  313.     return Skill_SP::REVISED_SP_MAX
  314.   end
  315.   #--------------------------------------------------------------------------
  316.   # ○ 补正值获得
  317.   #--------------------------------------------------------------------------
  318.   def maxsp_plus
  319.     if @maxsp_plus == nil
  320.       if @own_sp != nil
  321.         @maxsp_plus = @own_sp
  322.         @own_sp = nil
  323.       else
  324.         @maxsp_plus = 0
  325.       end
  326.     end
  327.     return @maxsp_plus
  328.   end
  329.   #--------------------------------------------------------------------------
  330.   # ○ 装备补正
  331.   #--------------------------------------------------------------------------
  332.   def maxsp_plus_equip
  333.     n = 0
  334.     equips.compact.each { |item| n += item.maxsp_plus }
  335.     return n
  336.   end
  337.   #--------------------------------------------------------------------------
  338.   # ● 技能取得
  339.   #--------------------------------------------------------------------------
  340.   alias skills_SkillSP skills
  341.   def skills
  342.     return (skill_sp_restrict? ? restricted_skills : skills_SkillSP)
  343.   end
  344.   #--------------------------------------------------------------------------
  345.   # ○ 战斗测试
  346.   #--------------------------------------------------------------------------
  347.   def skill_sp_restrict?
  348.     if $game_party.in_battle
  349.     return true unless $BTEST
  350.     end
  351.     return false
  352.   end
  353.   #--------------------------------------------------------------------------
  354.   # ○ 技能限制
  355.   #--------------------------------------------------------------------------
  356.   def restricted_skills
  357.     # 战斗技能加入
  358.     result = battle_skills
  359.     result.sort! { |a, b| a.id <=> b.id }
  360.     return result
  361.   end
  362.   #--------------------------------------------------------------------------
  363.   # ○ 全部技能取得
  364.   #--------------------------------------------------------------------------
  365.   def all_skills
  366.     last_in_battle = $game_party.in_battle
  367.     $game_party.in_battle = false
  368.     result = skills_SkillSP
  369.     $game_party.in_battle = last_in_battle
  370.     return result
  371.   end
  372.   #--------------------------------------------------------------------------
  373.   # ○ 技能栏最大数取得
  374.   #--------------------------------------------------------------------------
  375.   def battle_skill_max
  376.     @battle_skill_max = -1 if @battle_skill_max == nil
  377.     n = (@battle_skill_max < 0 ?
  378.      Skill_SP::MAX_SKILLS : @battle_skill_max)
  379.     n += equipment_battle_skill_max_plus
  380.     return [n, 0].max
  381.   end
  382.   #--------------------------------------------------------------------------
  383.   # ○ 扩充技能栏
  384.   #--------------------------------------------------------------------------
  385.   def equipment_battle_skill_max_plus
  386.     n = 0
  387.     equips.compact.each { |item| n += item.battle_skill_max_plus }
  388.     return n
  389.   end
  390.   #--------------------------------------------------------------------------
  391.   # ○ 技能栏最大值设定
  392.   #--------------------------------------------------------------------------
  393.   def battle_skill_max=(value)
  394.     @battle_skill_max = value
  395.     if @battle_skills == nil
  396.       @battle_skills = []
  397.     else
  398.       @battle_skills = @battle_skills[0...value]
  399.     end
  400.   end
  401.   #--------------------------------------------------------------------------
  402.   # ○ 战斗使用技能ID
  403.   #--------------------------------------------------------------------------
  404.   def battle_skill_ids
  405.     @battle_skills = [] if @battle_skills == nil
  406.     return @battle_skills
  407.   end
  408.   #--------------------------------------------------------------------------
  409.   # ○ 战斗用技能取得
  410.   #--------------------------------------------------------------------------
  411.   def battle_skills
  412.     result = []
  413.     battle_skill_ids.each { |i|
  414.       next if i == nil           
  415.       result << $data_skills[i]
  416.     }
  417.     return result
  418.   end
  419.   #--------------------------------------------------------------------------
  420.   # ○ 战斗技能登陆
  421.   #     index : 位置
  422.   #     skill : 技能编号
  423.   #--------------------------------------------------------------------------
  424.   def set_battle_skill(index, skill)
  425.     if skill == nil
  426.       @battle_skills[index] = nil
  427.     else
  428.       return unless skill.is_a?(RPG::Skill)  
  429.       return if sp < skill.sp_cost           
  430.       @battle_skills[index] = skill.id
  431.     end
  432.   end
  433.   #--------------------------------------------------------------------------
  434.   # ○ 战斗技能追加
  435.   #     skill : 技能
  436.   #--------------------------------------------------------------------------
  437.   def add_battle_skill(skill)
  438.     return unless skill.is_a?(RPG::Skill)  
  439.     skills = battle_skill_ids
  440.     return if skills.include?(skill.id)   
  441.     return if sp < skill.sp_cost           
  442.     battle_skill_max.times { |i|
  443.       if skills[i] == nil
  444.         set_battle_skill(i, skill)
  445.         break
  446.       end
  447.     }
  448.     restore_battle_skill
  449.   end
  450.   #--------------------------------------------------------------------------
  451.   # ○ 战斗技能解除
  452.   #     index : 位置
  453.   #--------------------------------------------------------------------------
  454.   def remove_battle_skill(index)
  455.     @battle_skills[index] = nil
  456.   end
  457.   #--------------------------------------------------------------------------
  458.   # ○ 战斗技能全部解除
  459.   #--------------------------------------------------------------------------
  460.   def clear_battle_skill
  461.     @battle_skills = []
  462.   end
  463.   #--------------------------------------------------------------------------
  464.   # ○ 技能能否设置判定
  465.   #     index : 位置
  466.   #     skill : 技能
  467.   #--------------------------------------------------------------------------
  468.   def battle_skill_settable?(index, skill)
  469.     return false if battle_skill_max <= index  # 超出范围
  470.     return true  if skill == nil               # 解除技能
  471.     return false if battle_skill_ids.include?(skill.id)  #已经设定
  472.     skill_id = battle_skill_ids[index]
  473.     curr_skill = (skill_id != nil ? $data_skills[skill_id] : nil)
  474.     offset = (curr_skill != nil ? curr_skill.sp_cost : 0)
  475.     return false if self.sp < (skill.sp_cost - offset)  # SP 不足
  476.     return true
  477.   end
  478.   #--------------------------------------------------------------------------
  479.   # ○ 战斗技能存储
  480.   #--------------------------------------------------------------------------
  481.   def restore_battle_skill
  482.     result = battle_skill_ids.clone
  483.     usable_skills = all_skills
  484.     result.each_with_index { |n, i|
  485.       next if n == nil
  486.       # 未学习的情况
  487.       if (usable_skills.find { |s| s.id == n }) == nil
  488.         result[i] = nil
  489.       end
  490.     }
  491.     @battle_skills = result[0...battle_skill_max]
  492.     # SP不足的时候排除
  493.     (battle_skill_max - 1).downto(0) { |i|
  494.       @battle_skills[i] = nil if maxsp - consumed_sp < 0
  495.     }
  496.   end
  497.   #--------------------------------------------------------------------------
  498.   # ● 换装备的时候
  499.   #     equip_type : 装备部位
  500.   #     item       : 道具
  501.   #     test       : 在战斗测试中
  502.   #--------------------------------------------------------------------------
  503.   alias change_equip_SkillSP change_equip
  504.   def change_equip(equip_type, item, test = false)
  505.     change_equip_SkillSP(equip_type, item)
  506.       restore_battle_skill
  507.   end
  508.   #--------------------------------------------------------------------------
  509.   # ● 装备丢弃时
  510.   #--------------------------------------------------------------------------
  511.   alias discard_equip_SkillSP discard_equip
  512.   def discard_equip(item)
  513.     discard_equip__SkillSP(item)
  514.      restore_battle_skill
  515.   end
  516.   #--------------------------------------------------------------------------
  517.   # ● 经验变更
  518.   #--------------------------------------------------------------------------
  519.   alias change_exp_SP change_exp
  520.   def change_exp(exp, show)
  521.     last_in_battle = $game_party.in_battle
  522.     $game_party.in_battle = false
  523.  
  524.     change_exp_SP(exp, show)
  525.  
  526.     $game_party.in_battle = last_in_battle
  527.   end
  528.   if Skill_SP::AUTO_SET_NEW_SKILL
  529.    alias learn_skill_SP learn_skill
  530.   def learn_skill(skill_id)
  531.     learn_skill_SP(skill_id)
  532.     add_battle_skill($data_skills[skill_id])
  533.   end
  534.   end  
  535.   #--------------------------------------------------------------------------
  536.   # ● 技能遗忘
  537.   #--------------------------------------------------------------------------
  538.   alias forget_skill_SkillSP forget_skill
  539.   def forget_skill(skill_id)
  540.     # 忘れるスキルを戦闘用スキルから削除
  541.     battle_skill_ids.each_with_index { |s, i|
  542.       remove_battle_skill(i) if s == skill_id
  543.     }
  544.     forget_skill_SkillSP(skill_id)
  545.   end
  546.   #--------------------------------------------------------------------------
  547.   # ● 判定技能是否装备
  548.   #--------------------------------------------------------------------------
  549.   def battle_skill_set?(skill)
  550.     return false unless skill.is_a?(RPG::Skill)
  551.     return battle_skill_ids.include?(skill.id)
  552.   end
  553. end
  554.  
  555. #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
  556.  
  557. #==============================================================================
  558. # ■ Window_Base
  559. #==============================================================================
  560.  
  561. class Window_Base < Window
  562.   #--------------------------------------------------------------------------
  563.   # ○ SP颜色取得
  564.   #--------------------------------------------------------------------------
  565.   def sp_color(actor)
  566.     return knockout_color if actor.maxsp > 0 && actor.sp == 0
  567.     return normal_color
  568.   end
  569.   #--------------------------------------------------------------------------
  570.   # ○ SP渐变色1
  571.   #--------------------------------------------------------------------------
  572.   def sp_gauge_color1
  573.     color = Skill_SP::GAUGE_START_COLOR
  574.     return (color.is_a?(Integer) ? text_color(color) : color)
  575.   end
  576.   #--------------------------------------------------------------------------
  577.   # ○ SP渐变色2
  578.   #--------------------------------------------------------------------------
  579.   def sp_gauge_color2
  580.     color = Skill_SP::GAUGE_END_COLOR
  581.     return (color.is_a?(Integer) ? text_color(color) : color)
  582.   end
  583.   #--------------------------------------------------------------------------
  584.   # ○ SP描绘
  585.   #--------------------------------------------------------------------------
  586.   def draw_actor_sp(actor, x, y, width = 120)
  587.     draw_actor_sp_gauge(actor, x, y, width)
  588.     self.contents.font.color = system_color
  589.     self.contents.draw_text(x, y, 30, 24, Vocab::sp_a)
  590.     self.contents.font.color = sp_color(actor)
  591.     xr = x + width
  592.     if width < 120
  593.       self.contents.draw_text(xr - 40, y, 40, 24, actor.sp, 2)
  594.     else
  595.       self.contents.draw_text(xr - 90, y, 40, 24, actor.sp, 2)
  596.       self.contents.font.color = normal_color
  597.       self.contents.draw_text(xr - 50, y, 10, 24, "/", 2)
  598.       self.contents.draw_text(xr - 40, y, 40, 24, actor.maxsp, 2)
  599.     end
  600.     self.contents.font.color = normal_color
  601.   end
  602.   #--------------------------------------------------------------------------
  603.   # ○ SP条描绘
  604.   #--------------------------------------------------------------------------
  605.   def draw_actor_sp_gauge(actor, x, y, width = 120)
  606.     gw = width * actor.sp / [actor.maxsp, 1].max
  607.     gs1 = sp_gauge_color1
  608.     gs2 = sp_gauge_color2
  609.     self.contents.fill_rect(x, y + 24 - 8, width, 6, gauge_back_color)
  610.     self.contents.gradient_fill_rect(x, y + 24 - 8, gw, 6, gs1, gs2)
  611.   end
  612. end
  613. #==============================================================================
  614. # ■ Window_Status
  615. #==============================================================================
  616.  
  617. if Skill_SP::SHOW_STATUS_SP
  618. class Window_Status < Window_Selectable
  619.   #--------------------------------------------------------------------------
  620.   # ● 绘制基本信息
  621.   #--------------------------------------------------------------------------
  622.   alias draw_basic_info_SkillSP draw_basic_info
  623.   def draw_basic_info(x, y)
  624.     draw_basic_info_SkillSP(x, y)
  625.     draw_actor_sp(@actor, x, y + 24 * 4)
  626.   end
  627. end
  628. end
  629. #==============================================================================
  630. # □ Window_BattleSkillStatus
  631. #------------------------------------------------------------------------------
  632. #   显示基本信息的窗口
  633. #==============================================================================
  634.  
  635. class Window_BattleSkillStatus < Window_Base
  636.   #--------------------------------------------------------------------------
  637.   # ● 初始化
  638.   #--------------------------------------------------------------------------
  639.   def initialize(x, y, actor)
  640.     super(x, y, Graphics.width, 24 + 32)
  641.     @actor = actor
  642.     refresh
  643.   end
  644.   #--------------------------------------------------------------------------
  645.   # ● 刷新
  646.   #--------------------------------------------------------------------------
  647.   def refresh
  648.     self.contents.clear
  649.     draw_actor_name(@actor, 4, 0)
  650.     draw_actor_level(@actor, 140, 0)
  651.     draw_actor_sp(@actor, 240, 0)
  652.   end
  653. end
  654. #==============================================================================
  655. # □ Window_BattleSkillSlot
  656. #------------------------------------------------------------------------------
  657. #   已装备的技能窗口。
  658. #==============================================================================
  659.  
  660. class Window_BattleSkillSlot < Window_Selectable
  661.   #--------------------------------------------------------------------------
  662.   # ● 初始化
  663.   #--------------------------------------------------------------------------
  664.   def initialize(x, y, width, height, actor)
  665.     super(x, y, width, height)
  666.     @actor = actor
  667.     @data = []
  668.     self.index = 0
  669.     self.active = false
  670.     refresh
  671.   end
  672.   #--------------------------------------------------------------------------
  673.   # ○ 获取最大值
  674.   #--------------------------------------------------------------------------
  675.   def item_max
  676.     @data ? @data.size : 1
  677.   end
  678.   #--------------------------------------------------------------------------
  679.   # ○ 获取技能
  680.   #--------------------------------------------------------------------------
  681.   def skill
  682.     return @data[self.index]
  683.   end
  684.   #--------------------------------------------------------------------------
  685.   # ● 刷新
  686.   #--------------------------------------------------------------------------
  687.   def refresh
  688.     @data=[]
  689.         skill_ids = @actor.battle_skill_ids
  690.     @actor.battle_skill_max.times { |i|
  691.       if skill_ids[i] != nil
  692.         @data << $data_skills[skill_ids[i]]
  693.       else
  694.         @data << nil
  695.       end
  696.     }
  697.     create_contents
  698.     draw_all_items
  699.   end
  700.   #--------------------------------------------------------------------------
  701.   # ○ 绘制内容
  702.   #--------------------------------------------------------------------------
  703.   def draw_item(index)
  704.     rect = item_rect(index)
  705.     self.contents.clear_rect(rect)
  706.     skill = @data[index]
  707.     if skill != nil
  708.       rect.width -= 4
  709.       draw_item_name(skill, rect.x, rect.y)
  710.       self.contents.draw_text(rect, skill.sp_cost, 2)
  711.     else
  712.       self.contents.draw_text(rect, Skill_SP::BLANK_TEXT, 1)
  713.     end
  714.   end
  715.   #--------------------------------------------------------------------------
  716.   # ● 更新帮助窗口
  717.   #--------------------------------------------------------------------------
  718.   def update_help
  719.     @help_window.set_text(skill == nil ? "" : skill.description)
  720.   end
  721. end
  722. #==============================================================================
  723. # □ Window_BattleSkillList
  724. #------------------------------------------------------------------------------
  725. #   右侧显示技能列表的窗口。
  726. #==============================================================================
  727.  
  728. class Window_BattleSkillList < Window_Selectable
  729.   #--------------------------------------------------------------------------
  730.   # ● 定义实例变量
  731.   #--------------------------------------------------------------------------
  732.   attr_accessor :slot_index               # 技能栏编号
  733.   #--------------------------------------------------------------------------
  734.   # ● 初始化对象
  735.   #--------------------------------------------------------------------------
  736.   def initialize(x, y, width, height, actor)
  737.     super(x, y, width, height)
  738.     @actor = actor
  739.     @slot_index = 0
  740.     @data = []
  741.     self.index = 0
  742.     self.active = false
  743.     refresh
  744.   end
  745.   #--------------------------------------------------------------------------
  746.   # ○ 技能取得
  747.   #--------------------------------------------------------------------------
  748.   def skill
  749.     return @data[self.index]
  750.   end
  751.   #--------------------------------------------------------------------------
  752.   # ○ 最大技能数取得
  753.   #--------------------------------------------------------------------------
  754.   def item_max
  755.     @data ? @data.size : 1
  756.   end
  757.   #--------------------------------------------------------------------------
  758.   # ○ 显示技能列表
  759.   #--------------------------------------------------------------------------
  760.   def make_item_list
  761.     @data = [nil]
  762.     @actor.all_skills.each { |skill|
  763.       @data.push(skill) if selectable?(skill)
  764.     }
  765.   end
  766.   #--------------------------------------------------------------------------
  767.   # ● 刷新
  768.   #--------------------------------------------------------------------------
  769.   def refresh
  770.     make_item_list
  771.     create_contents
  772.     draw_all_items
  773.   end
  774.   #--------------------------------------------------------------------------
  775.   # ○ 技能可否选择判定
  776.   #--------------------------------------------------------------------------
  777.   def selectable?(skill)
  778.     return false if skill == nil
  779.     return true if skill.battle_ok?
  780.     if Skill_SP::SHOW_UNUSABLE_SKILL && skill.occasion == 3
  781.       return true
  782.     end
  783.     return false
  784.   end
  785.   #--------------------------------------------------------------------------
  786.   # ○ 绘制项目
  787.   #--------------------------------------------------------------------------
  788.   def draw_item(index)
  789.     rect = item_rect(index)
  790.     self.contents.clear_rect(rect)
  791.     skill = @data[index]
  792.     if skill != nil
  793.       rect.width -= 4
  794.       enabled = @actor.battle_skill_settable?(@slot_index, skill)
  795.       draw_item_name(skill, rect.x, rect.y, enabled)
  796.       self.contents.draw_text(rect, skill.sp_cost, 2)
  797.     else
  798.       self.contents.draw_text(rect, Skill_SP::RELEASE_TEXT, 1)
  799.     end
  800.   end
  801.   #--------------------------------------------------------------------------
  802.   # ● 更新帮助窗口
  803.   #--------------------------------------------------------------------------
  804.   def update_help
  805.     @help_window.set_text(skill == nil ? "" : skill.description)
  806.   end
  807. end
  808. #==============================================================================
  809. # □ Scene_SetBattleSkill
  810. #------------------------------------------------------------------------------
  811. #   技能设定的场景。
  812. #==============================================================================
  813.  
  814. class Scene_SetBattleSkill < Scene_MenuBase
  815.   #--------------------------------------------------------------------------
  816.   # ● 初始化
  817.   #--------------------------------------------------------------------------
  818.   def initialize(actor_index = 0, menu_index = 0)
  819.     @actor_index = actor_index
  820.     @menu_index = menu_index
  821.   end
  822.   #--------------------------------------------------------------------------
  823.   # ● 开始处理
  824.   #--------------------------------------------------------------------------
  825.   def start
  826.     super
  827.     create_background
  828.     @actor = $game_party.menu_actor
  829.     create_windows
  830.   end
  831.   #--------------------------------------------------------------------------
  832.   # ○ 创建窗口
  833.   #--------------------------------------------------------------------------
  834.   def create_windows
  835.     @help_window = Window_Help.new
  836.     dy = @help_window.height
  837.     @status_window = Window_BattleSkillStatus.new(0, dy, @actor)
  838.  
  839.     dy += @status_window.height
  840.     @slot_window = Window_BattleSkillSlot.new(
  841.       0,
  842.       dy,
  843.       Graphics.width / 2,
  844.       Graphics.height - dy,
  845.       @actor)
  846.     @slot_window.help_window = @help_window
  847.     @slot_window.active = true
  848.  
  849.     @list_window = Window_BattleSkillList.new(
  850.       Graphics.width - @slot_window.width,
  851.       dy,
  852.       Graphics.width - @slot_window.width,
  853.       Graphics.height - dy,
  854.       @actor)
  855.     @list_window.help_window = @help_window
  856.   end
  857.   #--------------------------------------------------------------------------
  858.   # ● 结束处理
  859.   #--------------------------------------------------------------------------
  860.   def terminate
  861.     super
  862.     @help_window.dispose
  863.     @status_window.dispose
  864.     @slot_window.dispose
  865.     @list_window.dispose
  866.   end
  867.   #--------------------------------------------------------------------------
  868.   # ● 更新
  869.   #--------------------------------------------------------------------------
  870.   def update
  871.     super
  872.     if @slot_window.active
  873.       update_slot
  874.     elsif @list_window.active
  875.       update_list
  876.     end
  877.   end
  878.   #--------------------------------------------------------------------------
  879.   # ○ 刷新窗口
  880.   #--------------------------------------------------------------------------
  881.   def refresh_window
  882.     @status_window.refresh
  883.     @slot_window.refresh
  884.     @list_window.refresh
  885.   end
  886.   #--------------------------------------------------------------------------
  887.   # ○ 左侧窗口更新
  888.   #--------------------------------------------------------------------------
  889.   def update_slot
  890.     if @last_slot_index != @slot_window.index
  891.       @list_window.slot_index = @slot_window.index
  892.       @list_window.refresh
  893.       @last_slot_index = @slot_window.index
  894.     end
  895.     if Input.trigger?(Input::A)
  896.       Sound.play_ok
  897.       @actor.remove_battle_skill(@slot_window.index)
  898.       refresh_window
  899.     elsif Input.trigger?(Input::B)
  900.       Sound.play_cancel
  901.       SceneManager.return
  902.     elsif Input.trigger?(Input::C)
  903.       Sound.play_ok
  904.       # 切换活动窗口
  905.       @slot_window.active = false
  906.       @list_window.active = true
  907.     end
  908.   end
  909.   #--------------------------------------------------------------------------
  910.   # ○ 右侧窗口更新
  911.   #--------------------------------------------------------------------------
  912.   def update_list
  913.     if Input.trigger?(Input::B)
  914.       Sound.play_cancel
  915.       # 切换活动窗口
  916.       @slot_window.active = true
  917.       @list_window.active = false
  918.     elsif Input.trigger?(Input::C)
  919.       skill = @list_window.skill
  920.       # 无法设置的场合
  921.       unless @actor.battle_skill_settable?(@slot_window.index, skill)
  922.         Sound.play_buzzer
  923.         return
  924.       end
  925.       Sound.play_ok
  926.       set_skill(@slot_window.index, skill)
  927.       @slot_window.active = true
  928.       @list_window.active = false
  929.     end
  930.   end
  931.   #--------------------------------------------------------------------------
  932.   # ○ 设置技能
  933.   #--------------------------------------------------------------------------
  934.   def set_skill(index, skill)
  935.     @actor.remove_battle_skill(index)
  936.     if skill != nil
  937.       @actor.set_battle_skill(index, skill)
  938.     end
  939.     refresh_window
  940.   end
  941. end
  942. #==============================================================================
  943. # ■ Window_MenuCommand
  944. #------------------------------------------------------------------------------
  945. #  菜单画面中显示指令的窗口
  946. #==============================================================================
  947.  
  948. class Window_MenuCommand < Window_Command
  949.   alias add_main_commands_kunase add_main_commands
  950.   def add_main_commands
  951.     add_main_commands_kunase
  952.     add_command(Skill_SP::VOCAB_MENU_SET_SKILL, :skillsp, main_commands_enabled)
  953.   end
  954. end
  955. #==============================================================================
  956. # ■ Scene_Menu
  957. #------------------------------------------------------------------------------
  958. #  菜单画面
  959. #==============================================================================
  960. class Scene_Menu < Scene_MenuBase
  961.   alias create_command_window_kunase create_command_window
  962.   def create_command_window
  963.     create_command_window_kunase
  964.     @command_window.set_handler(:skillsp,     method(:command_personal))
  965.   end
  966.   def on_personal_ok
  967.     case @command_window.current_symbol
  968.     when :skill
  969.       SceneManager.call(Scene_Skill)
  970.     when :equip
  971.       SceneManager.call(Scene_Equip)
  972.     when :status
  973.       SceneManager.call(Scene_Status)
  974.     when :skillsp
  975.       SceneManager.call(Scene_SetBattleSkill)
  976.       end
  977.     end
  978.   end
  979. #==============================================================================
  980. # ■ Game_Unit
  981. #------------------------------------------------------------------------------
  982. #  管理游戏单位的类。是 Game_Party 和 Game_Troop 类的父类。
  983. #==============================================================================
  984. class Game_Unit
  985.   #--------------------------------------------------------------------------
  986.   # ● 定义实例变量
  987.   #--------------------------------------------------------------------------
  988.   attr_accessor   :in_battle                # 战斗中的标志
  989. end

技能SP系统.zip (1.44 MB, 下载次数: 568)

评分

参与人数 1星屑 +5 收起 理由
zjd540921697 + 5 精品文章

查看全部评分


Lv3.寻梦者

梦石
0
星屑
1379
在线时间
266 小时
注册时间
2017-2-18
帖子
101

开拓者

15
发表于 2017-7-13 16:03:16 | 只看该作者
可不可以让某个技能不受技能SP的影响,一直存在,无法拆卸?因为是用这个系统做一个赛尔号同人,设定4个技能栏,但是无法更换的第五技能就不能使用了……试过在角色那里增加添加技能的特性,试过在战斗中附加一个带有添加技能特性的状态,第五技能依旧无法使用……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
100
在线时间
72 小时
注册时间
2016-7-13
帖子
109
14
发表于 2016-7-18 13:37:31 | 只看该作者
看了之后,我觉得我还是安安静静的当个小虫吧,不过我还是想努力学这个脚本,我觉得逻辑没问题的话肯定能学好,虽说我是个业余的......

点评

加油w  发表于 2016-10-9 20:00
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
173
在线时间
192 小时
注册时间
2011-3-13
帖子
48
13
发表于 2015-4-16 00:24:09 | 只看该作者
{:2_276:}
请问...有没有办法能够隐藏一些特定的技能不在装备技能的界面出现
或者直接隐藏一个技能类型
因为用了被动技能的脚本
或者让被动技能也变成装备才能生效(

点评

改一下battleslot可以让部分技能不显示的  发表于 2015-5-14 12:39
设定一下窗口显示的部分就行了……最近比较忙没时间弄这个  发表于 2015-5-14 12:38
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
595
在线时间
161 小时
注册时间
2010-9-22
帖子
15
12
发表于 2015-4-1 16:47:54 | 只看该作者
赞一个,正好想做没有职业可以自由组合技能的{:2_268:}
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
444 小时
注册时间
2011-1-3
帖子
151

开拓者

11
发表于 2015-3-23 17:15:25 | 只看该作者
这玩意不就是スキルCP制 - KGC_SkillCPSystem ◆ VX Ace的脚本吗。
连界面都一模一样。

点评

VXACE我没找到才写的啊。。当时求了好久  发表于 2015-5-14 12:36
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
207 小时
注册时间
2011-8-24
帖子
21
10
发表于 2015-3-23 12:19:37 | 只看该作者
怎么让某些技能 固定无法卸下  ?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
16 小时
注册时间
2010-6-29
帖子
241
9
发表于 2015-3-23 08:52:09 | 只看该作者
这个拿来做武侠游戏的内功系统不错……
[img]http://rpg.blue/data/attachment/forum/201008/11/105320eudv222d7jgvg24p.gif[img]
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

8
发表于 2015-2-10 16:23:46 | 只看该作者
本帖最后由 chd114 于 2015-2-10 00:11 编辑
chd114 发表于 2015-2-9 05:37
我已经解决了这里的问题,要去掉两个的其中一个,整合成就可以了


这个问题出现的BUG(详见点评)明白了···因为装上技能以后右侧光标还在显示,再次移动过去也是在那个位置,如果技能已经全部装备就会出现不存在的选项也能下掉技能的情况···
  1. #--------------------------------------------------------------------------
  2.   # ○ 右侧窗口更新
  3.   #--------------------------------------------------------------------------
  4.   def update_list
  5.     if Input.trigger?(Input::B)
  6.       Sound.play_cancel
  7.       # 切换活动窗口
  8.       @slot_window.active = true
  9.       @list_window.active = false
  10.     elsif Input.trigger?(Input::C)
  11.       skill = @list_window.skill
  12.       return if skill==nil and @list_window.index>0#加上我
  13.       # 无法设置的场合
  14.       unless @actor.battle_skill_settable?(@slot_window.index, skill)
  15.         Sound.play_buzzer
  16.         return
  17.       end
  18.       Sound.play_ok
  19.       set_skill(@slot_window.index, skill)
  20.       @slot_window.active = true
  21.       @list_window.active = false
  22.     end
  23.   end
复制代码
加一句return if skill==nil and @list_window.index>0可以解决掉不存在的选项也能移除技能的BUG,但是光标还是会显示在那···所以这解决方法有点不合理···@VIPArcher 有什么好的解决办法吗?
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

7
发表于 2015-2-9 23:07:29 | 只看该作者
cjlzbb 发表于 2015-2-9 05:49
以前有看过个VA的版本,不是6R上的,是日文的。已找到,不知道还有没有前置脚本。给楼主做个参考吧

#===== ...

能翻译一下这具体功能有哪些吗。。。
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-1 13:27

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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