Project1

标题: 【★】如何在与指定敌群的战斗中禁用特定道具? [打印本页]

作者: 迷糊的安安    时间: 2012-10-9 22:44
标题: 【★】如何在与指定敌群的战斗中禁用特定道具?
本帖最后由 迷糊的安安 于 2012-10-25 10:57 编辑

本问题为【Ace推荐问答计划】活动问题。
详情请点击:http://rpg.blue/forum.php?mod=viewthread&tid=251118

基本要求:通过战斗事件设置,将特定消耗物品在与特定敌群的战斗中变为不可使用,物品说明变更为类似"受到邪恶力量的影响,你无法使用任何回复道具。"的说明性文字。战斗之后复原。

进阶要求:通过在战斗事件的第一行写上类似这样的注释【DisableItem(1,2,3,8)#DisableSkill(26,27,28,29,30)#Reason"受到邪恶力量的影响,你无法使用任何回复道具或法术。"】来实现这样的功能——物品编号为1、2、3、8的物品显示为灰色不可使用、技能编号为26、27、28、29、30的技能显示为灰色不可使用,将光标移动到被禁用的道具或者法术上时,画面上方显示浮动窗口提示”受到邪恶力量的影响,你无法使用任何回复道具或法术。“

进阶要求的实现格式不一定要拘泥于通过战斗事件注释,只要实现类似这样的功能即可。dsu_plus_rewardpost_czw
作者: hcm    时间: 2012-10-15 12:49
本帖最后由 hcm 于 2012-10-20 23:33 编辑

这个的话我一般会用交换物品的方法,
反正只有特定战斗,那一定是事件的而不是暗雷,
就在战斗前的事件用多个变量获取回复物品的数量,全部减去,
再得到同等数量(变量用刚才的)的不可用同名不同序号的物品(说明为“受到邪恶力量的影响,你无法使用任何回复道具或法术”),
战斗后再换回。
禁用法术直接施加禁用技能(但这样技能说明不变)的状态,战斗结束消除。
(或者用遗忘真技能学会不可用技能,战斗后换回的方法,假技能说明为“受到……法术”)

1.png (18.32 KB, 下载次数: 37)

1.png

2.png (18.64 KB, 下载次数: 40)

2.png

作者: 怪蜀黍    时间: 2012-10-20 14:07
先给范例链接:http://pan.baidu.com/share/link?shareid=88540&uk=875076719
实现要求:特定消耗物品和魔法在与特定敌群的战斗中变为不可使用。
使用方法:敌群注释(必须把注释写在敌群事件的第一页,写在其它页无效)。比如范例中的敌群1史莱姆*2注释如下:

如果需要设定与某敌群的战斗禁止使用某些物品或魔法,那么:
(1)注释的第一行必须写<禁止恢复>
(2)注释的第二行DisableItem等号后面的中括号写上需要禁止使用的物品ID,比如禁止1至4号物品就写[1,2,3,4],不能写成[1..4]。
(3)注释的第三行DisableSkill等号后面的中括号写上需要禁止使用的技能ID,比如禁止26至30号物品就写[26,27,28,29,30],不能写成[26..30]。
(4)注释的第四行Reason等号后面的中括号写上需要禁止使用的物品或技能的帮助说明(说明无需加引号" ")。若这行写不完,第五行还可以接着写。
按要求截图:
与恢复技能禁止的敌群战斗

与普通敌群战斗

恢复物品禁止的截图类似,这里由于篇幅的原因省略。
按要求上脚本:
脚本注释得很详细,特别适合新手们学习
  1. #==============================================================================
  2. # ■ Game_Troop
  3. #------------------------------------------------------------------------------
  4. #  管理敌群和战斗相关资料的类,也可执行如战斗事件管理之类的功能。
  5. #   本类的实例请参考 $game_troop 。
  6. #==============================================================================

  7. class Game_Troop < Game_Unit
  8.   attr_reader   :troop_id               # 敌群ID
  9. end  

  10. #==============================================================================
  11. # ■ Game_BattlerBase
  12. #------------------------------------------------------------------------------
  13. #  管理战斗者的类。主要含有能力值计算的方法。Game_Battler 类的父类。
  14. #==============================================================================

  15. class Game_BattlerBase
  16.   #--------------------------------------------------------------------------
  17.   # ● 判定技能/使用物品是否可用  再定义
  18.   #--------------------------------------------------------------------------
  19.   def usable?(item)
  20.     return false if special_troop_cannot_recover(item)[0]  # 添加
  21.     return skill_conditions_met?(item) if item.is_a?(RPG::Skill)
  22.     return item_conditions_met?(item)  if item.is_a?(RPG::Item)
  23.     return false
  24.   end
  25.   #--------------------------------------------------------------------------
  26.   # ● 敌群注释的读取  新定义
  27.   #--------------------------------------------------------------------------
  28.   def special_troop_cannot_recover(item)
  29.     item_id = []                        # 数组初始化
  30.     skill_id = []                       # 数组初始化
  31.     message = []                        # 数组初始化
  32.     if SceneManager.scene_is?(Scene_Battle)  # 战斗中
  33.       troop_page = $data_troops[$game_troop.troop_id].pages[0] # 只判定第一事件页
  34.       if troop_page.list[0].code == 108 and troop_page.list[0].parameters == ["<禁止恢复>"]
  35.         if troop_page.list[1].parameters[0].split(/=/)[0] == "DisableItem"
  36.           item_id = eval(troop_page.list[1].parameters[0].split(/=/)[1]) # 读取物品禁止列表
  37.         end
  38.         if troop_page.list[2].parameters[0].split(/=/)[0] == "DisableSkill"
  39.           skill_id = eval(troop_page.list[2].parameters[0].split(/=/)[1])# 读取技能禁止列表
  40.         end
  41.         if troop_page.list[3].parameters[0].split(/=/)[0] == "Reason"
  42.           message = troop_page.list[3].parameters[0].split(/=/)[1]+      # 读取禁止时的帮助文本
  43.             troop_page.list[4].parameters[0]
  44.         end
  45.       end
  46.       case item
  47.       when RPG::Item
  48.         return [true, item_id, message] if item_id.include?(item.id) # 物品情况下返回特定值
  49.       when RPG::Skill
  50.         return [true, skill_id, message] if skill_id.include?(item.id) # 技能情况下返回特定值
  51.       end
  52.     end
  53.     return [false, [], ""] # 无注释情况下返回特定值
  54.   end  
  55. end  

  56. #==============================================================================
  57. # ■ Window_BattleItem
  58. #------------------------------------------------------------------------------
  59. #  战斗画面中,选择“使用物品”的窗口。
  60. #==============================================================================

  61. class Window_BattleItem < Window_ItemList
  62.   #--------------------------------------------------------------------------
  63.   # ● 查询使用列表中是否含有此物品  再定义
  64.   #--------------------------------------------------------------------------
  65.   def include?(item)
  66.     return true if item.is_a?(RPG::Item) # 显示所有物品列表
  67.   end
  68. end  

  69. #==============================================================================
  70. # ■ Window_Help
  71. #------------------------------------------------------------------------------
  72. #  显示特技和物品等的说明、以及角色状态的窗口
  73. #==============================================================================

  74. class Window_Help < Window_Base
  75.   #--------------------------------------------------------------------------
  76.   # ● 设置物品  再定义
  77.   #     item : 技能、物品等
  78.   #--------------------------------------------------------------------------
  79.   def set_item(item)
  80.     set_text(item ? item.description : "")
  81.     text = Game_BattlerBase.new.special_troop_cannot_recover(item)[2]
  82.     text.insert(21, "\n") if text != ""  # 在第21个字符插入换行
  83.     set_text(item ? text : "") if text != ""
  84.   end
  85. end  
  86.   
复制代码

作者: 迷糊的安安    时间: 2012-10-25 10:39
protosssonny 发表于 2012-10-20 14:07
先给范例链接:http://pan.baidu.com/share/link?shareid=88540&uk=875076719
实现要求:特定消耗物品和魔 ...

啊啦 不好意思久等了……

功能实现很不错,字符处理有细微的问题。
如果用类似\c[6]之类手动定义了第一行文字的颜色,则第二行字不显示。且玩家不能手动\n。
不过把那个21改改也是可以满足大部分时候的需求的。不用第二行。

总体来说非常好!




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