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

Project1

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

[已经解决] 【★】如何能让怪物也能使用物品?

[复制链接]

Lv4.逐梦者 (管理员)

砂上描绘的愿想

梦石
15
星屑
4019
在线时间
5070 小时
注册时间
2012-1-15
帖子
4617

开拓者贵宾短篇七成年组亚军剧作品鉴家

跳转到指定楼层
1
发表于 2012-10-8 17:22:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 迷糊的安安 于 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。
与怪物原有物品掉落不冲突。

点评

可不可以考虑做成剩余的y-z个物品按默认概率掉落,而不是全部100%掉落?  发表于 2012-10-14 15:20
提出不合理情况:怪物掉落物品是有概率的,假定怪物使用了z次物品,则不应该把剩余的y-z个物品全部掉落给玩家,否则则认定掉落概率是100%  发表于 2012-10-14 15:19
若后退就皆成谎言。

Lv1.梦旅人

Mr.Gandum

梦石
0
星屑
226
在线时间
2070 小时
注册时间
2007-1-31
帖子
3039

贵宾

2
发表于 2012-10-8 18:40:48 | 只看该作者
你某没有接口肿么办(大雾
回复

使用道具 举报

Lv3.寻梦者 (版主)

八宝粥的基叔

梦石
0
星屑
4509
在线时间
5228 小时
注册时间
2009-4-29
帖子
14318

贵宾

3
发表于 2012-10-16 15:23:13 | 只看该作者
基本功能:使敌人会使用恢复类物品。敌人每使用一次恢复类物品,其死亡后掉落该物品的数量都将减少一个。
目前只支持同一敌人使用同一种恢复类物品。
范例下载地址: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 12:20

评分

参与人数 2星屑 +500 梦石 +6 收起 理由
迷糊的安安 + 6 最佳答案,好人卡+3
Luciffer + 500 认可答案

查看全部评分

《逝去的回忆3:四叶草之梦》真情发布,欢迎点击图片下载试玩喵。

《逝去的回忆3》的讨论群:
一群:192885514
二群:200460747
回复

使用道具 举报

Lv4.逐梦者 (管理员)

砂上描绘的愿想

梦石
15
星屑
4019
在线时间
5070 小时
注册时间
2012-1-15
帖子
4617

开拓者贵宾短篇七成年组亚军剧作品鉴家

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

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

但是还有一个小瑕疵,把物品掉率设置成极低,比如1/1000。
然后战斗以后没提示获得物品,身上却莫名其妙多了一个恢复剂。
再试试把掉率设置成1/1,开场打死所有敌人,则身上还是会莫名其妙多一个恢复剂,这是?

点评

我记得好像是战斗之前用事件指定得到的恢复剂。  发表于 2012-10-20 12:18
若后退就皆成谎言。
回复

使用道具 举报

Lv3.寻梦者 (版主)

八宝粥的基叔

梦石
0
星屑
4509
在线时间
5228 小时
注册时间
2009-4-29
帖子
14318

贵宾

5
发表于 2012-10-20 12:21:41 | 只看该作者
迷糊的安安 发表于 2012-10-20 11:35
整体测试下来 怪物的使用技能次数不会超过定制数量 这一点达成了。
怪物使用技能会使物品掉落数量减少 这 ...

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

点评

我错了QAQ 我把怪物顺序技能类型技能顺序什么全试了 就是没看事件……  发表于 2012-10-20 12:23
《逝去的回忆3:四叶草之梦》真情发布,欢迎点击图片下载试玩喵。

《逝去的回忆3》的讨论群:
一群:192885514
二群:200460747
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-6 18:48

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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