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

Project1

 找回密码
 注册会员
搜索
查看: 7445|回复: 9

[RMVX发布] 战斗中敌人也使用物品

 关闭 [复制链接]

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
46
在线时间
10 小时
注册时间
2007-5-27
帖子
2558

第1届Title华丽大赛新人奖

发表于 2009-10-11 20:00:44 | 显示全部楼层 |阅读模式

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

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

x
战斗中敌人也使用物品 by 沉影不器


功能: 使敌人在战斗中也能用物品补血或进攻.
       注意,此脚本不提供敌人AI,仅判断当前是否可以使用物品
用法:
     ① 脚本插入到Main之前
     ② 在数据库-敌角色-备注 内输入item[1]=物品ID,数量
        一个敌人带多个物品时,每行输入一种,如第二行输入item[2]=物品ID,数量
        允许最多携带种数在脚本第行设定
     ③ 脚本第20行设定使用物品的优先级
     ④ 具体用法请看范例
     ⑤ 此脚本需要基础脚本[读取rmvx备注栏指定字段]

截图:
1.JPG
2.JPG

脚本:
  1. #==============================================================================
  2. # 战斗中敌人也使用物品 by 沉影不器
  3. #------------------------------------------------------------------------------
  4. # 功能: 使敌人在战斗中也能用物品补血或进攻.
  5. #       注意,此脚本不提供敌人AI,仅判断当前是否可以使用物品
  6. # 用法:
  7. #     ① 脚本插入到Main之前
  8. #     ② 在数据库-敌角色-备注 内输入item[1]=物品ID,数量
  9. #        一个敌人带多个物品时,每行输入一种,如第二行输入item[2]=物品ID,数量
  10. #        允许最多携带种数在脚本第行设定
  11. #     ③ 脚本第20行设定使用物品的优先级
  12. #     ④ 具体用法请看范例
  13. #     ⑤ 此脚本需要基础脚本[读取rmvx备注栏指定字段]
  14. #==============================================================================
  15. module EnemyItems
  16.   ## 最多携带物品种数(每个敌人)
  17.   MaxTypes = 10
  18.   ## 行动优先级(1-10) 敌人行动中使用物品的可能性
  19.   ItemRating = 9
  20. end
  21. #==============================================================================
  22. # Enemy::Action
  23. #==============================================================================
  24. module RPG
  25.   class Enemy
  26.     class Action
  27.       def initialize
  28.         @kind = 0
  29.         @basic = 0
  30.         @skill_id = 1
  31.         @item_id = 1
  32.         @target_index = nil
  33.         @condition_type = 0
  34.         @condition_param1 = 0
  35.         @condition_param2 = 0
  36.         @rating = 5
  37.       end
  38.       def skill?
  39.         return @kind == 1
  40.       end
  41.       attr_accessor :kind
  42.       attr_accessor :basic
  43.       attr_accessor :skill_id
  44.       attr_accessor :item_id
  45.       attr_accessor :target_index
  46.       attr_accessor :condition_type
  47.       attr_accessor :condition_param1
  48.       attr_accessor :condition_param2
  49.       attr_accessor :rating
  50.     end
  51.   end
  52. end
  53. #==============================================================================
  54. # ■ Game_BattleAction
  55. #==============================================================================
  56. class Game_BattleAction
  57.   #--------------------------------------------------------------------------
  58.   # 判断行动是否有效
  59.   #--------------------------------------------------------------------------
  60.   def valid?
  61.     return false if nothing?
  62.     return true if @forcing
  63.     return false unless battler.movable?
  64.     if skill?
  65.       return false unless battler.skill_can_use?(skill)
  66.     elsif item?
  67.       return true if @battler.is_a? Game_Enemy
  68.       return false unless friends_unit.item_can_use?(item)
  69.     end
  70.     return true
  71.   end
  72. end
  73. #==============================================================================
  74. # ■ Game_Enemy
  75. #==============================================================================
  76. class Game_Enemy < Game_Battler
  77.   #--------------------------------------------------------------------------
  78.   # 初始化
  79.   #--------------------------------------------------------------------------
  80.   alias ini_enemy initialize
  81.   def initialize(index, enemy_id)
  82.     ini_enemy(index, enemy_id)
  83.     # 行动数组
  84.     @actions = enemy.actions + [item_action]
  85.   end
  86.   #--------------------------------------------------------------------------
  87.   # 药物知识
  88.   #--------------------------------------------------------------------------
  89.   def pharmacology
  90.     return false
  91.   end
  92.   #--------------------------------------------------------------------------
  93.   # 物品
  94.   #--------------------------------------------------------------------------
  95.   def get_items
  96.     items = {}
  97.     for i in 1..EnemyItems::MaxTypes
  98.       str = $data_enemies[@enemy_id].read_note("item[#{i}]").split(/,/)
  99.       next if str.empty?
  100.       items[str[0].to_i] = str[1].to_i
  101.     end   
  102.     return items
  103.   end
  104.   #--------------------------------------------------------------------------
  105.   # 技能
  106.   #--------------------------------------------------------------------------
  107.   def get_skills
  108.     skills = []
  109.     enemy.actions.each do |i|
  110.       skills.push i if i.skill?
  111.     end
  112.     return skills
  113.   end
  114.   #--------------------------------------------------------------------------
  115.   # 插入物品行动 ## item_id以后定义
  116.   #--------------------------------------------------------------------------
  117.   def item_action
  118.     result = RPG::Enemy::Action.new
  119.     result.kind = 2
  120.     result.rating = EnemyItems::ItemRating
  121.     return result
  122.   end
  123.   #--------------------------------------------------------------------------
  124.   # 物品行动是否有效
  125.   #--------------------------------------------------------------------------
  126.   def item_action_effective?(action)
  127.     item = $data_items[action.item_id]
  128.     ## 对敌方时
  129.     return true if item.for_opponent?
  130.     ## 对己方死亡对象时
  131.     dis = []
  132.     if item.for_dead_friend?
  133.       for i in 0...$game_troop.members.size##dead_members
  134.         dis.push i if $game_troop.members[i].dead?
  135.       end
  136.       if dis.empty?
  137.         return false
  138.       else
  139.         action.target_index = dis[rand(dis.size)]
  140.         return true
  141.       end
  142.     end
  143.     ## 对己方存活对象时
  144.     is = []
  145.     for i in 0...$game_troop.members.size##existing_members
  146.       next if $game_troop.members[i].dead?
  147.       if item_action_test($game_troop.members[i], item)
  148.         is.push i
  149.       end
  150.     end
  151.     if is.empty?
  152.       return false
  153.     else
  154.       action.target_index = is[rand(is.size)]
  155.       return true
  156.     end
  157.   end
  158.   #--------------------------------------------------------------------------
  159.   # 物品行动测试 tester被打的人
  160.   #--------------------------------------------------------------------------
  161.   def item_action_test(user, item)
  162.     tester = user.clone
  163.     tester.make_obj_damage_value(self, item)
  164.     tester.apply_state_changes(item)
  165.     if tester.hp_damage < 0 or tester.calc_hp_recovery(user, item) > 0
  166.       return true if tester.hp < tester.maxhp
  167.     end
  168.     if tester.mp_damage < 0 or tester.calc_mp_recovery(user, item) > 0
  169.       return true if tester.mp < tester.maxmp
  170.     end
  171.     return true unless tester.added_states.empty?
  172.     return true unless tester.removed_states.empty?
  173.     return true if item.parameter_type > 0
  174.     return false
  175.   end
  176.   #--------------------------------------------------------------------------
  177.   # 生成行动
  178.   #--------------------------------------------------------------------------
  179.   def make_action
  180.     @action.clear
  181.     return unless movable?
  182.     available_actions = []
  183.     rating_max = 0
  184.     for action in @actions
  185.       next unless conditions_met?(action)
  186.       if action.kind == 1
  187.         next unless skill_can_use?($data_skills[action.skill_id])
  188.       end
  189.       ## 预扣除物品
  190.       if action.kind == 2
  191.         items = $game_troop.items
  192.         action.item_id = items.keys[rand(items.keys.size)]
  193.         item = $data_items[action.item_id]
  194.         if $game_troop.item_can_use?(item) and item_action_effective?(action)
  195.           $game_troop.items[action.item_id] -= 1
  196.         else
  197.           next
  198.         end
  199.       end
  200.       available_actions.push(action)
  201.       rating_max = [rating_max, action.rating].max
  202.     end
  203.     ratings_total = 0
  204.     rating_zero = rating_max - 3
  205.     for action in available_actions
  206.       next if action.rating <= rating_zero
  207.       ratings_total += action.rating - rating_zero
  208.     end
  209.     return if ratings_total == 0
  210.     value = rand(ratings_total)
  211.     for action in available_actions
  212.       next if action.rating <= rating_zero
  213.       if value < action.rating - rating_zero
  214.         @action.kind = action.kind
  215.         @action.basic = action.basic
  216.         @action.item_id = action.item_id
  217.         @action.skill_id = action.skill_id
  218.         ## 处理补血物品的特定对象
  219.         if action.target_index
  220.           @action.target_index = action.target_index
  221.         else
  222.           @action.decide_random_target
  223.         end
  224.         return
  225.       else
  226.         value -= action.rating - rating_zero
  227.       end
  228.     end
  229.   end
  230. end
  231. #==============================================================================
  232. # ■ Game_Troop
  233. #==============================================================================
  234. class Game_Troop < Game_Unit
  235.   attr_accessor :items
  236.   #--------------------------------------------------------------------------
  237.   # 文字表
  238.   #--------------------------------------------------------------------------
  239.   LETTER_TABLE = [ 'A','B','C','D','E','F','G','H','I','J',
  240.                    'K','L','M','N','O','P','Q','R','S','T',
  241.                    'U','V','W','X','Y','Z']
  242.   #--------------------------------------------------------------------------
  243.   # 设置
  244.   #--------------------------------------------------------------------------
  245.   alias set_troop setup
  246.   def setup(troop_id)
  247.     set_troop(troop_id)
  248.     ## 初始化物品
  249.     ini_items
  250.   end
  251.   #--------------------------------------------------------------------------
  252.   # 初始化物品
  253.   #--------------------------------------------------------------------------
  254.   def ini_items
  255.     @items = {}
  256.     @items.default = 0
  257.     @enemies.each do |e|
  258.       i = e.get_items
  259.       i.each do |k,v|
  260.         @items[k] += v
  261.       end
  262.     end
  263.   end
  264.   #--------------------------------------------------------------------------
  265.   # 是否可以使用物品
  266.   #--------------------------------------------------------------------------
  267.   def item_can_use?(item)
  268.     return false unless item.is_a?(RPG::Item)
  269.     return false if @items[item.id] <= 0
  270.     return item.battle_ok?
  271.   end
  272.   #--------------------------------------------------------------------------
  273.   # 清除
  274.   #--------------------------------------------------------------------------
  275.   alias clear_troop clear
  276.   def clear
  277.     clear_troop
  278.     @items.clear if @items
  279.   end
  280. end
复制代码
范例工程: 敌人也使用物品.rar (241.41 KB, 下载次数: 2524)

阿桑奇不是一个偶像;阿桑奇是一种思想

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
85
在线时间
424 小时
注册时间
2009-8-3
帖子
984
发表于 2009-10-11 20:35:28 | 显示全部楼层
如果使用物品和怪物物品掉落联系起来就好了...
怪物使用的物品是会掉落的..(这个可以解决)
怪物使用了物品以后,就不会掉这个物品了
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv2.观梦者

梦石
0
星屑
267
在线时间
809 小时
注册时间
2007-12-25
帖子
1545
发表于 2009-10-12 12:34:45 | 显示全部楼层
类似我这样的数据帝,都很难用你这个用的不鸡助。
不过创意倒是很不错,话说我以前是让敌人使用这么一个技能来实现的!
精卫赤龙腾   
总是存在一种强大,去完成似乎不可能的事情.
无畏战乾程   
或是需要一种勇气,去挑战几乎不存在的胜利.
一味玄真魂     
这是拥有一种恒心,去化解根本没有解的困难.
烈卫开天径    
只是带着一种决心,去争取残存的最后的希望。
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
50
在线时间
21 小时
注册时间
2007-7-3
帖子
573
发表于 2009-11-4 16:25:59 | 显示全部楼层
我看到脚本里的“预扣除物品”~~~~这样的话,如果敌人预用了物品,然后还来不及出手就被打死了~~~~物品就白扣了~~~
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

风雪夜不归人

梦石
0
星屑
50
在线时间
276 小时
注册时间
2006-3-7
帖子
6721

贵宾

发表于 2009-11-6 13:24:14 | 显示全部楼层
其实我有个很简单的办法……
将技能设定成“药水”发动台词是“使用了”
不需要修改任何脚本,动动数据库就好了……

不过这个也丰富了一个功能,支持。
有些人,到了七八月份就会诈尸。
宫斗,是女生永远的爱。
冷门,是本人不变的欲。
作弊,是玩家自由的痛。
练级,是橙光割舍的情。
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
50
在线时间
116 小时
注册时间
2008-5-12
帖子
264
发表于 2009-11-16 01:45:03 | 显示全部楼层
等会敌人使用了关闭游戏就完了。。。。
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
46
在线时间
10 小时
注册时间
2007-5-27
帖子
2558

第1届Title华丽大赛新人奖

 楼主| 发表于 2009-11-23 20:10:33 | 显示全部楼层
本帖最后由 沉影不器 于 2009-11-23 21:32 编辑
如果使用物品和怪物物品掉落联系起来就好了...
怪物使用的物品是会掉落的..(这个可以解决)
怪物使用了物品以后,就不会掉这个物品了
wsmyzc 发表于 2009-10-11 20:35

敌人携带物品中也有不能用的...分类起来又多个麻烦,所以...

类似我这样的数据帝,都很难用你这个用的不鸡助。
不过创意倒是很不错,话说我以前是让敌人使用这么一个技能来实现的!
九夜神尊 发表于 2009-10-12 12:34

本用来实现敌人和同伴全AI战斗的铺垫,玩家只控制主角一人,基本上是自娱自乐产物...对于多数人以及您完全多余...

我看到脚本里的“预扣除物品”~~~~这样的话,如果敌人预用了物品,然后还来不及出手就被打死了~~~~物品就白扣了~~~
goahead 发表于 2009-11-4 16:25

确实如此...感谢指出...
可是不想改了...也许打开rm的机会越来越少=.=||

其实我有个很简单的办法……
将技能设定成“药水”发动台词是“使用了”
不需要修改任何脚本,动动数据库就好了……
不过这个也丰富了一个功能,支持。 ...
风雪优游 发表于 2009-11-6 13:24

这主意好...如此只需要设定技能的使用次数...

等会敌人使用了关闭游戏就完了。。。。
shinliwei 发表于 2009-11-16 01:45

同样不明白...

阿桑奇不是一个偶像;阿桑奇是一种思想

回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv2.观梦者

梦石
0
星屑
480
在线时间
15 小时
注册时间
2010-8-27
帖子
2
发表于 2010-8-28 22:35:33 | 显示全部楼层
感觉用了的话战斗会很麻烦
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
170
在线时间
0 小时
注册时间
2010-9-19
帖子
2
发表于 2010-9-19 11:34:16 | 显示全部楼层
这个功能如果搭配有设难易度的会很有用途OAO
回复 支持 反对

使用道具 举报

TA还没有解放自身的潜力。

Lv1.梦旅人

梦石
0
星屑
60
在线时间
22 小时
注册时间
2010-9-7
帖子
4
发表于 2010-9-19 12:46:18 | 显示全部楼层
不错不错。。。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

站长信箱:fux2@moe9th.com|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2019-3-27 10:09

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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