Project1

标题: 【★】如何能让怪物也能使用物品? [打印本页]

作者: 迷糊的安安    时间: 2012-10-8 17:22
标题: 【★】如何能让怪物也能使用物品?
本帖最后由 迷糊的安安 于 2012-10-25 10:57 编辑

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

实现要求:通过在敌人备注里写上<EnemyItem x,y>,来实现怪物在战斗中会使用ID为x的物品,最大使用y次。
当战斗胜利后,怪物如果在战斗中使用物品不足y次,则剩余次数的物品x作为战利品掉落给玩家,如果已经达到y次,则不掉落物品x。
与怪物原有物品掉落不冲突。dsu_plus_rewardpost_czw
作者: feizhaodan    时间: 2012-10-8 18:40
你某没有接口肿么办(大雾
作者: 怪蜀黍    时间: 2012-10-16 15:23
基本功能:使敌人会使用恢复类物品。敌人每使用一次恢复类物品,其死亡后掉落该物品的数量都将减少一个。
目前只支持同一敌人使用同一种恢复类物品。
范例下载地址:http://pan.baidu.com/share/link?shareid=86199&uk=875076719

实现方法:假象设计
敌人虽然被描述“使用物品”,而实际上并不是使用物品,而是使用技能。敌人使用物品只是一个假象。

使用方法:
1、新技能设计
(1)比如范例中的127和128号技能,分别命名为回复剂强回复剂,消耗MP一定要设计成0,因为使用物品是不消耗MP的。体力恢复值多少什么的按照物品回复剂和强回复剂的恢复能力来设计。
(2)最关键的一点——技能的备注栏一定要写上:
关联物品=XX
比如127号技能的备注:关联物品=1,表明使用127号技能会影响到1号物品(也就是回复剂)的掉落数量。128号技能的备注:关联物品=2,表明使用128号技能会影响到2号物品(也就是强回复剂)的掉落数量。
2、敌人数据的设计
(1)一定要在会使用恢复类物品的敌人的掉落物品栏中填写对应的恢复类物品。比如范例中1号敌人史莱姆,它会使用127号技能,也就是假象的使用回复剂,那么它的掉落物品栏中一定要填写回复剂,若不填写则不会掉落,掉落概率随你自己设计。
(2)敌人的行动AI中别忘了写上敌人擅长的恢复类技能哦,不然敌人就不会使用技能。见范例中对1号、2号敌人的设计。
(3)会使用恢复类物品的敌人的备注栏中必须填写这样的两行文字:
掉落物品=XX
最大掉落=XX

掉落物品等号后面填写的数字必须与掉落物品的ID相同。最大掉落等号后面填写的数字必须大于1。

按要求上图:


按要求上脚本:
除了自己写的脚本外,还辅助使用了沉影不器大触的《读取备注》。因为备注栏什么的写的东西多了。由于篇幅原因,这里就不帖沉影不器大触的《读取备注》了,范例里面有。
  1. #==============================================================================
  2. # ■ Game_BattlerBase
  3. #------------------------------------------------------------------------------
  4. #  管理战斗者的类。主要含有能力值计算的方法。Game_Battler 类的父类。
  5. #==============================================================================

  6. class Game_BattlerBase
  7.   #--------------------------------------------------------------------------
  8.   # ● 检查技能的使用条件  再定义
  9.   #--------------------------------------------------------------------------
  10.   def skill_conditions_met?(skill)
  11.     if $data_skills[skill.id].note.include?("关联物品")
  12.       for i in 0...$game_troop.members.size
  13.         if self == $game_troop.members[i]
  14.           if $drop_item[i] > 0
  15.             return true
  16.           else
  17.             return false
  18.           end  
  19.         end  
  20.       end
  21.     end
  22.     usable_item_conditions_met?(skill) &&
  23.     skill_wtype_ok?(skill) && skill_cost_payable?(skill) &&
  24.     !skill_sealed?(skill.id) && !skill_type_sealed?(skill.stype_id)
  25.   end
  26. end  
  27.   

  28. #==============================================================================
  29. # ■ Game_Enemy
  30. #------------------------------------------------------------------------------
  31. #  管理敌人的类。本类在 Game_Troop 类 ($game_troop) 的内部使用。
  32. #==============================================================================

  33. class Game_Enemy < Game_Battler
  34.   #--------------------------------------------------------------------------
  35.   # ● 生成物品数组  再定义
  36.   #--------------------------------------------------------------------------
  37.   def make_drop_items
  38.     enemy.drop_items.inject([]) do |r, di|
  39.       if di.kind > 0 && rand * di.denominator < drop_item_rate
  40.         r.push(item_object(di.kind, di.data_id))
  41.         if enemy.read_note('掉落物品') != nil
  42.           ($drop_item[@index] - 1).times do r.push(item_object(1, enemy.read_note('掉落物品'))) end
  43.           return r
  44.         end  
  45.       else
  46.         r
  47.       end
  48.     end
  49.   end
  50. end  


  51. #==============================================================================
  52. # ■ Scene_Battle
  53. #------------------------------------------------------------------------------
  54. #  战斗画面
  55. #==============================================================================

  56. class Scene_Battle < Scene_Base
  57.   #--------------------------------------------------------------------------
  58.   # ● 开始处理  再定义
  59.   #--------------------------------------------------------------------------
  60.   def start
  61.     super
  62.     create_spriteset
  63.     create_all_windows
  64.     BattleManager.method_wait_for_message = method(:wait_for_message)
  65.     enemy_usable_items                      # 添加
  66.   end
  67.   
  68.   #--------------------------------------------------------------------------
  69.   # ● 敌人可使用的物品列表  新定义
  70.   #--------------------------------------------------------------------------
  71.   def enemy_usable_items
  72.     $drop_item = [] if $drop_item == nil    # 初始化
  73.     for i in 0...$game_troop.members.size
  74.       if $data_enemies[$game_troop.members[i].enemy_id].note.include?("最大掉落")
  75.         $drop_item[i] = $data_enemies[$game_troop.members[i].enemy_id].read_note('最大掉落').to_i
  76.       end  
  77.     end
  78.   end   

  79.   #--------------------------------------------------------------------------
  80.   # ● 使用技能/物品  再定义
  81.   #--------------------------------------------------------------------------
  82.   def use_item
  83.     item = @subject.current_action.item
  84.     @log_window.display_use_item(@subject, item)
  85.     @subject.use_item(item)
  86.     refresh_status
  87.     targets = @subject.current_action.make_targets.compact
  88.     show_animation(targets, item.animation_id)
  89.     targets.each {|target| item.repeats.times { invoke_item(target, item) } }
  90.     do_item_decrease(item)                  # 添加
  91.   end
  92.   
  93.   #--------------------------------------------------------------------------
  94.   # ● 敌人使用物品减少的处理  新定义
  95.   #--------------------------------------------------------------------------
  96.   def do_item_decrease(item)
  97.     for i in 0...$game_troop.members.size
  98.       if @subject == $game_troop.members[i]
  99.         if $data_skills[item.id].read_note('关联物品') != nil
  100.           $drop_item[i] -= 1 if $drop_item[i] != nil
  101.         end
  102.       end  
  103.     end  
  104.   end
  105. end
复制代码

作者: 迷糊的安安    时间: 2012-10-20 11:35
protosssonny 发表于 2012-10-16 15:23
基本功能:使敌人会使用恢复类物品。敌人每使用一次恢复类物品,其死亡后掉落该物品的数量都将减少一个。
...

整体测试下来 怪物的使用技能次数不会超过定制数量 这一点达成了。
怪物使用技能会使物品掉落数量减少 这一点也达成了。
掉落的概率看来也是通过设定概率多次重复判断的,这点做得很不错。

但是还有一个小瑕疵,把物品掉率设置成极低,比如1/1000。
然后战斗以后没提示获得物品,身上却莫名其妙多了一个恢复剂。
再试试把掉率设置成1/1,开场打死所有敌人,则身上还是会莫名其妙多一个恢复剂,这是?
作者: 怪蜀黍    时间: 2012-10-20 12:21
迷糊的安安 发表于 2012-10-20 11:35
整体测试下来 怪物的使用技能次数不会超过定制数量 这一点达成了。
怪物使用技能会使物品掉落数量减少 这 ...

我是为了测试角色使用恢复剂,在战斗前指定获得恢复剂。





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