Project1

标题: 【脚本】使用物品习得技能 [打印本页]

作者: 芯☆淡茹水    时间: 2013-1-11 13:39
标题: 【脚本】使用物品习得技能
本帖最后由 芯☆淡茹水 于 2013-2-13 15:46 编辑

     一直在论坛上没找到使用物品习得技能的相关脚本,于是本人就搞出这么一个东东,以前看到的都是状态法学技能,那样的话在角色少技能少的情况下还比较好弄。但是如果角色有几十上百个(比如一些宠物比较多的),技能也有几十上百个的,那样的话写公共事件就会很累,很囧。下面这个东西花了本人大半天时间,再加上写这个教程,一天的时间就过去了~~(技术不过关,所以花那么久时间)。

该使用物品习得技能脚本的特点:
      1.实现多角色,多特技的学习技能效果。谁使用物品,谁习得技能。即使角色上百,特技上百都没有问题。
      2.如果使用的角色已有将要学习的技能,将不会再习得该技能。
      3.简单,只需要替换一段脚本即可。
      4.由于只是在原脚本基础上添加,无冲突。
═══════════════════════════════════════════════════════════════
方法:

★1.脚本的添加:在脚本 Scene_Item 第167行,原句:used = target.item_effect(@item)
                用下面这段脚本把这句替换掉。(注意格式)

   (下面这段脚本每句都加了注释,以方便新人理解。)


   代码如下:
  1.         #等级为光标选中的角色等级
  2.         level = $game_party.actors[@target_window.index].level
  3.         #如果所使用的物品id大于50
  4.         if @item.id > 50   #★注释【1】
  5.           #使用效果为对目标使用物品设置的效果
  6.           used = target.item_effect(@item)
  7.         #除此之外,如果等级小于60
  8.         elsif level < 60   #★注释【2】
  9.           #演奏冻结SE
  10.           $game_system.se_play($data_system.buzzer_se)
  11.         #除此之外,如果目标已领悟特技(特技ID为所使用的物品ID)
  12.         elsif target.skill_learn?(@item.id)
  13.           #演奏冻结SE
  14.           $game_system.se_play($data_system.buzzer_se)
  15.         #其它
  16.         else
  17.           #演奏物品使用时设置的SE
  18.           $game_system.se_play(@item.menu_se)
  19.           #使用效果为目标领悟特技(特技ID为所使用的物品ID)
  20.           used = target.learn_skill(@item.id)
  21.           # 使用的物品数减 1
  22.           $game_party.lose_item(@item.id, 1)
  23.         end
复制代码
★注释【1】:使用物品能够习得技能的物品ID限制。这里是50。也就是说,如果所使用的物品ID大于50,那么对使用对象的使用效果就是该物品在数据库里设置的效果,不会习得相对应的特技。反之,如果所使用的物品ID小于等于50,那么使用该物品后就会习得与物品ID相对应的特技。50可以改,如果需要比较多的话,可改成60,70,80,,,甚至几百,都没有问题。如果不想使用该物品习得特技的功能,把50改为0。

  ★注释【2】:使用了角色等级限制,这里是60,当等级小于60,不能习得技能。当等级大于等于60时,才能习得技能。60可以改为20,30,...70.80等,都可以。如果不需要等级限制,把60改为0。

  图例:



—————————————————————————————————————————————————————————


★2.数据库设置:
      物品的ID要与使用该物品习得的特技ID一致。比如:设置1号物品为:技能书【火球】,那么相对应的,1号特  技设置为技能:火球。以此类推,2号物品对应2号技能,3号物品对应3号技能,,,,,。使用1号物品,习得1号技能;使用2号物品,习得2号技能;使用3号物品,习得3号技能,,,,,,。
   设置物品的数量不能超出★注释【1】所设置的数值,超出后的物品使用,不能习得对应特技。如果有需要,   请 把★注释【1】的数值改大。

      物品的设置:效果范围:己方单体
      可能使用时:菜单中
      消耗:不消耗
      其它的随意。

————————————————————————————————————————————————————————


◆注意:如果脚本修改后无效果,1.查看添加的脚本的格式,可参照图例。
                              2.查看数据库设置是否正确。
                              3.查看自己工程的外挂脚本,有无 Scene_Item 的场景。如果有,同样把外挂脚本 Scene_Item 场景里也改掉。

═══════════════════════════════════════════════════════════════════
     以上的一些说明,方法,注意事项已非常详细,相信大家都看得懂吧!如果还有疑问,请留言。

     此为精简版的物品习得技能,其实还可以添加很多东西。比如在 Scene_Item 场景里再加入 Window_Message 。当学习技能失败,弹出对话框,显示“60级以后才能学习技能”。或者“学习失败,已有该技能。”来提示玩家。而不是只出现错误提示音。
═══════════════════════════════════════════════════════════════════


      刚刚加进去一个简单的对话框提示功能,加入后的代码如下:
  1.         level = $game_party.actors[@target_window.index].level
  2.         if @item.id > 50   
  3.           used = target.item_effect(@item)
  4.         elsif level < 60   
  5.           $game_system.se_play($data_system.buzzer_se)
  6.           $game_temp.common_event_id = 1
  7.           $scene = Scene_Map.new
  8.         elsif target.skill_learn?(@item.id)
  9.           $game_system.se_play($data_system.buzzer_se)
  10.           $game_temp.common_event_id = 2
  11.           $scene = Scene_Map.new
  12.         else
  13.           $game_system.se_play(@item.menu_se)
  14.           used = target.learn_skill(@item.id)
  15.           $game_party.lose_item(@item.id, 1)
  16.           $game_temp.common_event_id = 3
  17.           $scene = Scene_Map.new
  18.         end
复制代码
—————————————————————————————————————————————————————————
  在学习特技失败或成功后,加入激活公共事件,上面脚本里的1,2,3就是关联的公共事件ID,公共事件ID可改。
对应的公共事件里面只设置显示文章。比如等级小于60级的情况下,激活公共事件1,公共事件1显示文章“60
级以后才能学习技能!”。已有要学习的技能情况下,激活公共事件2,公共事件2显示文章“学习失败,已
有该技能!”。学会了特技的情况下,激活公共事件3,公共事件3显示文章“习得了新技能!”。
  由于 Scene_Item 里没有对话框,并且不能激活事件。所以激活公共事件后,切换到地图画面。

另:如果有同学需要VA的,请回复。其实可依照上面的思路在VA里改,VA有很多术语和XP不一样,但大部分还是差不多的。
════════════════════════════════════════════════════════════════════
作者: 芯☆淡茹水    时间: 2013-1-13 13:10
  这个是用物品习得技能本人已改成外挂脚本,方便超级新手是用!

脚本:
  1. #==============================================================================
  2. #★使用物品习得特技
  3. #-------------------------------------------------------------------------------
  4. #  by:  芯☆淡茹水
  5. #==============================================================================
  6. #==============================================================================
  7. #◆使用方法:
  8. #     复制该脚本,插入到 Main 前。
  9. #==============================================================================
  10. #设置说明:
  11. #------------------------------------------------------------------------------
  12. #XItem =   使用物品能够习得技能的物品ID限制。假如是50。也就是说,如果所用
  13. #的物品ID大于50,那么对使用对象的使用效果就是该物品在数据库里设置的效果,不
  14. #会习得相对应的特技。反之,如果所使用的物品ID小于等于50,那么使用该物品后就会
  15. #习得与物品ID相对应的特技。50可以改,如果需要比较多的话,可改成60,70,80,,,
  16. #甚至几百,都没有问题。如果不想使用该物品习得特技的功能,把50设为0。
  17. #------------------------------------------------------------------------------
  18. #Xlevel=  使用了角色等级限制,假如是60,当等级小于60,不能习得技能。当等级
  19. #大于等于60时,才能习得技能。60可以改为20,30,...70.80等,都可以。如果不需要
  20. #等级限制,把60设为0。
  21. #==============================================================================
  22. #◆数据库设置:
  23. #  物品的ID要与使用该物品习得的特技ID一致。比如:设置1号物品为:技能书【火球】,
  24. #那么相对应的,1号特技设置为技能:火球。以此类推,2号物品对应2号技能,3号物品
  25. #对应3号技能,,,,,。使用1号物品,习得1号技能;使用2号物品,习得2号技能;
  26. #使用3号物品,习得3号技能,,,,,,。设置物品的数量不能超出XItem = 所设置
  27. #的数值,超出后的物品使用,不能习得对应特技。如果有需要,请把XItem = 的数值
  28. #改大。
  29. #------------------------------------------------------------------------------
  30. #◆物品的设置:
  31. #    效果范围:己方单体
  32. #    可能使用时:菜单中
  33. #    消耗:不消耗
  34. #    其它的随意。
  35. #==============================================================================
  36. #◆公共事件设置:
  37. #  当技能学习失败或成功后,就需要显示文章来提示玩家。所设置的公共事件里只显示
  38. #文章,来提示玩家。(等号后面输入公共事件ID)
  39. #Event1 =   对应等级不够,学习失败后显示文章的公共事件。
  40. #Event2 =   对应学习角色已有的技能,而学习失败后显示文章的公共事件。
  41. #Event3 =   对应学习成功后显示文章的公共事件。
  42. #==============================================================================
  43. module Skill_clg             #
  44. #◆◆◆设 置:               #
  45. XItem = 50                   #       ◆条件分歧:如果你是高手。
  46. Xlevel = 60                  #           ◆上面的说明 = 废话。
  47. Event1 = 1                   #         ◆除此以外的场合
  48. Event2 = 2                   #           ◆上面的说明请仔细阅读。
  49. Event3 = 3                   #       ◆分歧结束
  50. end                          #
  51. #==============================================================================
  52. class Scene_Item
  53.   def update_target
  54.     if Input.trigger?(Input::B)
  55.       $game_system.se_play($data_system.cancel_se)
  56.       unless $game_party.item_can_use?(@item.id)
  57.         @item_window.refresh
  58.       end
  59.       @item_window.active = true
  60.       @target_window.visible = false
  61.       @target_window.active = false
  62.       return
  63.     end
  64.     if Input.trigger?(Input::C)
  65.       if $game_party.item_number(@item.id) == 0
  66.         $game_system.se_play($data_system.buzzer_se)
  67.         return
  68.       end
  69.       if @target_window.index == -1
  70.         used = false
  71.         for i in $game_party.actors
  72.           used |= i.item_effect(@item)
  73.         end
  74.       end
  75.       if @target_window.index >= 0
  76.         target = $game_party.actors[@target_window.index]
  77.         level = $game_party.actors[@target_window.index].level
  78.         if @item.id > Skill_clg::XItem  
  79.           used = target.item_effect(@item)
  80.         elsif level < Skill_clg::Xlevel   
  81.           $game_system.se_play($data_system.buzzer_se)
  82.           $game_temp.common_event_id = Skill_clg::Event1
  83.           $scene = Scene_Map.new
  84.         elsif target.skill_learn?(@item.id)
  85.           $game_system.se_play($data_system.buzzer_se)
  86.           $game_temp.common_event_id = Skill_clg::Event1
  87.           $scene = Scene_Map.new
  88.         else
  89.           $game_system.se_play(@item.menu_se)
  90.           used = target.learn_skill(@item.id)
  91.           $game_party.lose_item(@item.id, 1)
  92.           @item_window.draw_item(@item_window.index)
  93.           $game_temp.common_event_id = Skill_clg::Event3
  94.           $scene = Scene_Map.new
  95.         end
  96.       end
  97.       if used
  98.         $game_system.se_play(@item.menu_se)
  99.         if @item.consumable
  100.           $game_party.lose_item(@item.id, 1)
  101.           @item_window.draw_item(@item_window.index)
  102.         end
  103.         @target_window.refresh
  104.         if $game_party.all_dead?
  105.           $scene = Scene_Gameover.new
  106.           return
  107.         end
  108.         if @item.common_event_id > 0
  109.           $game_temp.common_event_id = @item.common_event_id
  110.           $scene = Scene_Map.new
  111.           return
  112.         end
  113.       end
  114.       unless used
  115.         $game_system.se_play($data_system.buzzer_se)
  116.       end
  117.       return
  118.     end
  119.   end
  120. end
复制代码

作者: 清远    时间: 2013-2-13 02:22
这么好用的脚本,居然没有人回复
必须要感谢楼主,无偿的贡献,多谢了
作者: 紫英晓狼1130    时间: 2013-2-13 07:53
感谢楼主了,应该很好用!
作者: zh1181890942    时间: 2013-2-13 08:43
刚来的新手,进来看看
作者: 壮哉我大喵星人    时间: 2013-2-23 17:44
同样是刚来的新手,看看
作者: guoyq1988    时间: 2013-3-14 08:03
芯☆淡茹水 发表于 2013-1-13 13:10
这个是用物品习得技能本人已改成外挂脚本,方便超级新手是用!

脚本: ...


你帮我整合的那个工程,加上这个脚本,就这样了
需要修改哪里?

作者: 芯☆淡茹水    时间: 2013-3-15 00:36
guoyq1988 发表于 2013-3-14 08:03
你帮我整合的那个工程,加上这个脚本,就这样了
需要修改哪里?

   可能你脚本复制错了,复制2L的那个
作者: guoyq1988    时间: 2013-3-15 12:24
芯☆淡茹水 发表于 2013-3-15 00:36
可能你脚本复制错了,复制2L的那个

就是复制2L的脚本
跟没有设置公共事件有关系么?
作者: Zhangjiaxing1    时间: 2013-3-15 16:30
那个最终等级应该怎么写,比如说我设置了一本经验书,但某些角色的最终等级不一样,如果到了最终等级则使用经验书无效,
就是if target.level < “最终等级” 那个最终等级的脚本应该怎么写
作者: 轩辕大将军    时间: 2013-3-15 18:02
编辑一个公共事件不就好了吗???
作者: Zhangjiaxing1    时间: 2013-3-16 08:26
如果最终等级都是99的话,就可以这样写
target = $game_party.actors[@target_window.index]
  if @item.id == 201 and target.level < 99 #6100经验卷
     target.exp += 6100
     used = true
   else
     used = target.item_effect(@item)
   end
但是如果最终等级不一样的话,我尝试过用
if @item.id == 201 and target.level < target.final_level
但是会出错
作者: stevenrock    时间: 2013-3-16 13:45
好帅气的脚本,很想收录起来呢……
作者: pokemonjs    时间: 2013-3-16 18:29
新人捧场,另外,请问这是做什么的???
作者: 你最珍贵    时间: 2013-3-16 19:33
嗯,很方便。  先收藏起来
作者: 9994949kevin    时间: 2013-3-30 20:17
唉,习惯了用 状态 + 公共事件来做的 悄悄路过……
作者: qwertqq2013    时间: 2014-1-23 11:15
看样子是回合制用的吧,能够在即时战斗中用就好了
作者: xiaojiahuo3    时间: 2014-2-19 16:01
找了这么久,终于找到了……谢过楼主!
作者: 馊咖啡    时间: 2014-2-23 19:41
太棒了,我找了很久了,梦寐以求啊!
但是求改成VA的呗?
作者: 韦氏三公子    时间: 2015-2-15 07:37
感谢楼主
作者: 资深萝莉控    时间: 2016-1-19 16:18
求改va版本的,谢谢楼主
作者: yang1zhi    时间: 2016-1-31 10:24
缺少个功能。
设置某些技能为某些角色的特定技能,只有那些角色使用后才可学习,其他人使用后没用。




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