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

Project1

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

[已经解决] 如何设置一个怪物掉落多个宝物?

[复制链接]

Lv1.梦旅人

梦石
0
星屑
54
在线时间
64 小时
注册时间
2010-7-28
帖子
141
跳转到指定楼层
1
发表于 2014-2-9 18:53:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 Demon丶旋律 于 2014-2-9 19:15 编辑

在VA的帖子上看到了一个可以设置怪物掉落多个宝物和几率的脚本.
http://rpg.blue/forum.php?mod=viewthread&tid=224109
以上,,

小弟想请教这个脚本能改造成在XP上使用的么,,
求大神帮助..


找到了XP用的另一个..
但是他这个的宝物掉率是统一的,,
如何改成单个物品有单独的掉率?
这个脚本我测试后发现,单个怪物只会掉落1件物品,
如何改成按照几率能够同时掉落全部物品.?
#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================
# ============================================================================
# 四格掉宝设定 by SailCat
# ============================================================================
# 脚本使用说明:
# 1.复制后插入到Main前面
# 2.数据库设定额外掉宝的概率,在敌人名称那里
#   格式: 敌人名称,宝物2,宝物3,宝物4
#   宝物写法: (I|W|A)n 分别对应: n号道具,n号武器,n号防具 I W A必须大写
#   例: Cockatrice,A5,I5,W3
#       Fishman,I2,I3
#   三栏中任一栏留空不写时,取前一格的设定,全都不写时,取默认宝物设定
# 3.186行是四格概率比设定,在那里填上4个数字就可以更改概率了,该行内容:
#         rarity = [178, 51, 15, 12]
# ============================================================================
#--------------------------------------------------------------------------
# □ RPG::Enemy
#--------------------------------------------------------------------------
module RPG
class Enemy
   def name
     name = @name.split(/,/)[0]
     return name != nil ? name : ""
   end
   def treasure2
     treasure = @name.split(/,/)[1]
     return treasure.to_s
   end
   def treasure3
     treasure = @name.split(/,/)[2]
     return treasure.to_s
   end
   def treasure4
     treasure = @name.split(/,/)[3]
     return treasure.to_s
   end
end
end
#==============================================================================
# ■ Game_Enemy
#------------------------------------------------------------------------------
#  处理敌人的类。本类在 Game_Troop 类 ($game_troop) 的
# 内部使用。
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ● 获取物品 ID2
#--------------------------------------------------------------------------
def item2_id
   if $data_enemies[@enemy_id].treasure2 == ""
     return item_id
   elsif $data_enemies[@enemy_id].treasure2[0,1] != "I"
     return 0
   else
     return $data_enemies[@enemy_id].treasure2[/[0-9]+/].to_i
   end
end
#--------------------------------------------------------------------------
# ● 获取武器 ID2
#--------------------------------------------------------------------------
def weapon2_id
   if $data_enemies[@enemy_id].treasure2 == ""
     return weapon_id
   elsif $data_enemies[@enemy_id].treasure2[0,1] != "W"
     return 0
   else
     return $data_enemies[@enemy_id].treasure2[/[0-9]+/].to_i
   end
end
#--------------------------------------------------------------------------
# ● 获取防具 ID2
#--------------------------------------------------------------------------
def armor2_id
   if $data_enemies[@enemy_id].treasure2 == ""
     return armor_id
   elsif $data_enemies[@enemy_id].treasure2[0,1] != "A"
     return 0
   else
     return $data_enemies[@enemy_id].treasure2[/[0-9]+/].to_i
   end
end
#--------------------------------------------------------------------------
# ● 获取物品 ID3
#--------------------------------------------------------------------------
def item3_id
   if $data_enemies[@enemy_id].treasure3 == ""
     return item2_id
   elsif $data_enemies[@enemy_id].treasure3[0,1] != "I"
     return 0
   else
     return $data_enemies[@enemy_id].treasure3[/[0-9]+/].to_i
   end
end
#--------------------------------------------------------------------------
# ● 获取武器 ID3
#--------------------------------------------------------------------------
def weapon3_id
   if $data_enemies[@enemy_id].treasure3 == ""
     return weapon2_id
   elsif $data_enemies[@enemy_id].treasure3[0,1] != "W"
     return 0
   else
     return $data_enemies[@enemy_id].treasure3[/[0-9]+/].to_i
   end
end
#--------------------------------------------------------------------------
# ● 获取防具 ID3
#--------------------------------------------------------------------------
def armor3_id
   if $data_enemies[@enemy_id].treasure3 == ""
     return armor2_id
   elsif $data_enemies[@enemy_id].treasure3[0,1] != "A"
     return 0
   else
     return $data_enemies[@enemy_id].treasure3[/[0-9]+/].to_i
   end
end
#--------------------------------------------------------------------------
# ● 获取物品 ID4
#--------------------------------------------------------------------------
def item4_id
   if $data_enemies[@enemy_id].treasure4 == ""
     return item3_id
   elsif $data_enemies[@enemy_id].treasure4[0,1] != "I"
     return 0
   else
     return $data_enemies[@enemy_id].treasure4[/[0-9]+/].to_i
   end
end
#--------------------------------------------------------------------------
# ● 获取武器 ID4
#--------------------------------------------------------------------------
def weapon4_id
   if $data_enemies[@enemy_id].treasure4 == ""
     return weapon3_id
   elsif $data_enemies[@enemy_id].treasure4[0,1] != "W"
     return 0
   else
     return $data_enemies[@enemy_id].treasure4[/[0-9]+/].to_i
   end
end
#--------------------------------------------------------------------------
# ● 获取防具 ID4
#--------------------------------------------------------------------------
def armor4_id
   if $data_enemies[@enemy_id].treasure4 == ""
     return armor3_id
   elsif $data_enemies[@enemy_id].treasure4[0,1] != "A"
     return 0
   else
     return $data_enemies[@enemy_id].treasure4[/[0-9]+/].to_i
   end
end
end
#==============================================================================
# ■ Scene_Battle
#------------------------------------------------------------------------------
#  处理战斗画面的类。
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ● 开始结束战斗回合
#--------------------------------------------------------------------------
def start_phase5
   # 转移到回合 5
   @phase = 5
   # 演奏战斗结束 ME
   $game_system.me_play($game_system.battle_end_me)
   # 还原为战斗开始前的 BGM
   $game_system.bgm_play($game_temp.map_bgm)
   # 初始化 EXP、金钱、宝物
   exp = 0
   gold = 0
   treasures = []
   # 循环
   for enemy in $game_troop.enemies
     # 敌人不是隐藏状态的情况下
     unless enemy.hidden
       # 获得 EXP、增加金钱
       exp += enemy.exp
       gold += enemy.gold
       # 出现宝物判定
       if rand(100) < enemy.treasure_prob
         rarity = [178, 51, 15, 12]
         case rand(rarity[0] + rarity[1] + rarity[2] + rarity[3])
         when 0..rarity[0] - 1
           if enemy.item_id > 0
             treasures.push($data_items[enemy.item_id])
           end
           if enemy.weapon_id > 0
            treasures.push($data_weapons[enemy.weapon_id])
           end
           if enemy.armor_id > 0
             treasures.push($data_armors[enemy.armor_id])
           end
         when rarity[0]..rarity[0] + rarity[1] - 1
           if enemy.item2_id > 0
             treasures.push($data_items[enemy.item2_id])
           end
           if enemy.weapon2_id > 0
            treasures.push($data_weapons[enemy.weapon2_id])
           end
           if enemy.armor2_id > 0
             treasures.push($data_armors[enemy.armor2_id])
           end
         when rarity[0] + rarity[1]..rarity[0] + rarity[1] + rarity[2] - 1
           if enemy.item3_id > 0
             treasures.push($data_items[enemy.item3_id])
           end
           if enemy.weapon3_id > 0
            treasures.push($data_weapons[enemy.weapon3_id])
           end
           if enemy.armor3_id > 0
             treasures.push($data_armors[enemy.armor3_id])
           end
         else
           if enemy.item4_id > 0
             treasures.push($data_items[enemy.item4_id])
           end
           if enemy.weapon4_id > 0
            treasures.push($data_weapons[enemy.weapon4_id])
           end
           if enemy.armor4_id > 0
             treasures.push($data_armors[enemy.armor4_id])
           end
         end
       end
     end
   end
   # 限制宝物数为 8 个
   treasures = treasures[0..7]
   # 获得 EXP
   for i in 0...$game_party.actors.size
     actor = $game_party.actors
     if actor.cant_get_exp? == false
       last_level = actor.level
       actor.exp += exp
       if actor.level > last_level
         @status_window.level_up(i)
       end
     end
   end
   # 获得金钱
   $game_party.gain_gold(gold)
   # 获得宝物
   for item in treasures
     case item
     when RPG::Item
       $game_party.gain_item(item.id, 1)
     when RPG::Weapon
       $game_party.gain_weapon(item.id, 1)
     when RPG::Armor
       $game_party.gain_armor(item.id, 1)
     end
   end
   # 生成战斗结果窗口
   @result_window = Window_BattleResult.new(exp, gold, treasures)
   # 设置等待计数
   @phase5_wait_count = 100
end
end
#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================
>w<

Lv1.梦旅人

薄凉看客

梦石
0
星屑
50
在线时间
1269 小时
注册时间
2010-6-20
帖子
1316
2
发表于 2014-2-9 22:16:35 | 只看该作者
本帖最后由 恋′挂机 于 2014-2-9 22:44 编辑

多格掉宝 并且可以给宝物设置“独立”的概率
  1. # --------------------------------
  2. # 默认一种敌人只能设置掉落一种宝物
  3. # 此脚本 可让同一种敌人掉落多种宝物
  4. # --------------------------------

  5. class Scene_Battle
  6.   #--------------------------------------------------------------------------
  7.   # ● 开始结束战斗回合
  8.   #--------------------------------------------------------------------------
  9.   def start_phase5
  10.     # 转移到回合 5
  11.     @phase = 5
  12.     # 演奏战斗结束 ME
  13.     $game_system.me_play($game_system.battle_end_me)
  14.     # 还原为战斗开始前的 BGM
  15.     $game_system.bgm_play($game_temp.map_bgm)
  16.     # 初始化 EXP、金钱、宝物
  17.     exp = 0
  18.     gold = 0
  19.     treasures = []
  20.    
  21.     for enemy in $game_troop.enemies
  22.       unless enemy.hidden
  23.         exp += enemy.exp
  24.         gold += enemy.gold
  25.         if rand(100) < enemy.treasure_prob
  26.           if enemy.item_id > 0
  27.             treasures.push($data_items[enemy.item_id])
  28.           end
  29.           if enemy.weapon_id > 0
  30.             treasures.push($data_weapons[enemy.weapon_id])
  31.           end
  32.           if enemy.armor_id > 0
  33.             treasures.push($data_armors[enemy.armor_id])
  34.           end
  35.         end
  36.       end
  37.     end
  38.    
  39.     多格掉宝 = {} # 初始化
  40.    
  41.     # ---------------------------
  42.     # 多格掉宝 设置
  43.     # ---------------------------
  44.    
  45.     # 多格掉宝[敌人id] = [掉宝类型,id以及概率的数组]
  46.    
  47.     # 掉宝类型,id以及概率的数组 说明:
  48.     # 索引为 0 的值
  49.     # 0 是 物品 1 是武器 2 是防具
  50.     # 索引为 1 的值
  51.     # 物品 武器 防具 的 id
  52.     # 索引为 2 的值
  53.     # 概率
  54.    
  55.     # PS 这个脚本不会覆盖原掉宝方式!
  56.    
  57.     # 设置范例
  58.    
  59.     多格掉宝[1] = [[0, 1, 10], [1, 2, 50], [2, 5, 80]]
  60.    
  61.     # ----------------------------------------
  62.     if 多格掉宝[enemy.id] != nil
  63.        for i in 多格掉宝[enemy.id]
  64.           概率 = i[2]
  65.           case i[0]
  66.           when 0 # 物品
  67.             if rand(100) < 概率
  68.               if $data_items[i[1]] != nil
  69.                   treasures.push($data_items[i[1]])
  70.               end
  71.             end
  72.           when 1 # 武器
  73.             if rand(100) < 概率
  74.               if $data_weapons[i[1]] != nil
  75.                   treasures.push($data_weapons[i[1]])
  76.               end
  77.             end
  78.           when 2 # 防具
  79.             if rand(100) < 概率
  80.               if $data_armors[i[1]] != nil
  81.                 treasures.push($data_armors[i[1]])
  82.               end
  83.             end
  84.           end
  85.        end
  86.     end
  87.     # ----------------------------------------
  88.     for i in 0...$game_party.actors.size
  89.       actor = $game_party.actors[i]
  90.       if actor.cant_get_exp? == false
  91.         last_level = actor.level
  92.         actor.exp += exp
  93.         if actor.level > last_level
  94.           @status_window.level_up(i)
  95.         end
  96.       end
  97.     end
  98.     # 获得金钱
  99.     $game_party.gain_gold(gold)
  100.     # 获得宝物
  101.     for item in treasures
  102.       case item
  103.       when RPG::Item
  104.         $game_party.gain_item(item.id, 1)
  105.       when RPG::Weapon
  106.         $game_party.gain_weapon(item.id, 1)
  107.       when RPG::Armor
  108.         $game_party.gain_armor(item.id, 1)
  109.       end
  110.     end
  111.     # 生成战斗结果窗口
  112.     @result_window = Window_BattleResult.new(exp, gold, treasures)
  113.     # 设置等待计数
  114.     @phase5_wait_count = 100
  115.   end
  116. end
复制代码
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
54
在线时间
64 小时
注册时间
2010-7-28
帖子
141
3
 楼主| 发表于 2014-2-10 00:39:17 | 只看该作者
   
    多格掉宝[1] = [[0, 1, 10], [1, 2, 50], [2, 5, 80]]

我可以理解成 1号敌人,掉落[[(物品),(武器),(10???)],[(1号物品),(2号武器),(50号那啥,,没明白..)],[(2%几率),(5%几率),(80%几率)]]
是这个意思么- -?
抱歉啊,,能不能给我再做个示范啊..

比如,1号敌人,掉落 5号物品33%几率,6号武器66%几率, 7号防具99%几率,
我有点没弄明白里面一大串数字- -,,谢谢了...

>w<
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
54
在线时间
64 小时
注册时间
2010-7-28
帖子
141
4
 楼主| 发表于 2014-2-10 01:07:25 | 只看该作者
本帖最后由 Demon丶旋律 于 2014-2-10 17:53 编辑

好吧,,弄明白了 - -

敌人[ID]=[[(分类),(ID),(概率)],[(分类),(ID),(概率)],[(分类),(ID),(概率)]]
这意思对吧,,,
我不太聪明,,呵呵,

还有一个问题,
就是我一场战斗中有3个不同敌人,
我把物品掉率设置成了100%
但是击败3个敌人以后只给了1组战利品...
是只给了最后一个敌人的那组战利品..
3个相同的敌人也是不会叠加变成给3个,
都是只给1个..
求救- -@恋′挂机

脚本试验器.rar

189.19 KB, 下载次数: 70

点评

bug全部处理 为防止连贴已经编辑5楼  发表于 2014-2-10 18:54
>w<
回复 支持 反对

使用道具 举报

Lv1.梦旅人

薄凉看客

梦石
0
星屑
50
在线时间
1269 小时
注册时间
2010-6-20
帖子
1316
5
发表于 2014-2-10 18:23:08 | 只看该作者
本帖最后由 恋′挂机 于 2014-2-10 18:52 编辑

有点小失误抱歉
  1. class Scene_Battle
  2.   #--------------------------------------------------------------------------
  3.   # ● 开始结束战斗回合
  4.   #--------------------------------------------------------------------------
  5.   def start_phase5
  6.     # 转移到回合 5
  7.     @phase = 5
  8.     # 演奏战斗结束 ME
  9.     $game_system.me_play($game_system.battle_end_me)
  10.     # 还原为战斗开始前的 BGM
  11.     $game_system.bgm_play($game_temp.map_bgm)
  12.     # 初始化 EXP、金钱、宝物
  13.     exp = 0
  14.     gold = 0
  15.     treasures = []
  16.    
  17.     for enemy in $game_troop.enemies
  18.       unless enemy.hidden
  19.         exp += enemy.exp
  20.         gold += enemy.gold
  21.         if rand(100) < enemy.treasure_prob
  22.           if enemy.item_id > 0
  23.             treasures.push($data_items[enemy.item_id])
  24.           end
  25.           if enemy.weapon_id > 0
  26.             treasures.push($data_weapons[enemy.weapon_id])
  27.           end
  28.           if enemy.armor_id > 0
  29.             treasures.push($data_armors[enemy.armor_id])
  30.           end
  31.         end
  32.       end
  33.     end
  34.    
  35.     多格掉宝 = {} # 初始化
  36.    
  37.     # ---------------------------
  38.     # 多格掉宝 设置
  39.     # ---------------------------
  40.    
  41.     # 多格掉宝[敌人id] = [掉宝类型,id以及概率的数组]
  42.    
  43.     # 掉宝类型,id以及概率的数组 说明:
  44.     # 索引为 0 的值
  45.     # 0 是 物品 1 是武器 2 是防具
  46.     # 索引为 1 的值
  47.     # 物品 武器 防具 的 id
  48.     # 索引为 2 的值
  49.     # 概率
  50.    
  51.     # 设置范例
  52.    
  53.     多格掉宝[1] = [[0, 1, 10], [1, 2, 50], [2, 5, 80]]
  54.    
  55.     # ----------------------------------------
  56.     for enemy in $game_troop.enemies
  57.     unless enemy.hidden
  58.     if 多格掉宝[enemy.id] != nil
  59.        for i in 多格掉宝[enemy.id]
  60.           概率 = i[2]
  61.           case i[0]
  62.           when 0 # 物品
  63.             if rand(100) < 概率
  64.               if $data_items[i[1]] != nil
  65.                 treasures.push($data_items[i[1]])
  66.               end
  67.             end
  68.           when 1 # 武器
  69.             if rand(100) < 概率
  70.               if $data_weapons[i[1]] != nil
  71.                 treasures.push($data_weapons[i[1]])
  72.               end
  73.             end
  74.           when 2 # 防具
  75.             if rand(100) < 概率
  76.               if $data_armors[i[1]] != nil
  77.                 treasures.push($data_armors[i[1]])
  78.               end
  79.             end
  80.           end
  81.        end
  82.     end
  83.     end
  84.     end
  85.     # ----------------------------------------
  86.     for i in 0...$game_party.actors.size
  87.       actor = $game_party.actors[i]
  88.       if actor.cant_get_exp? == false
  89.         last_level = actor.level
  90.         actor.exp += exp
  91.         if actor.level > last_level
  92.           @status_window.level_up(i)
  93.         end
  94.       end
  95.     end
  96.     # 获得金钱
  97.     $game_party.gain_gold(gold)
  98.     # 获得宝物
  99.     for item in treasures
  100.       case item
  101.       when RPG::Item
  102.         $game_party.gain_item(item.id, 1)
  103.       when RPG::Weapon
  104.         $game_party.gain_weapon(item.id, 1)
  105.       when RPG::Armor
  106.         $game_party.gain_armor(item.id, 1)
  107.       end
  108.     end
  109.     # 生成战斗结果窗口
  110.     @result_window = Window_BattleResult.new(exp, gold, treasures)
  111.     # 设置等待计数
  112.     @phase5_wait_count = 100
  113.   end
  114. end
复制代码
并且再插入这个脚本

#==============================================================================
# ■ Window_BattleResult
#------------------------------------------------------------------------------
#  战斗结束时、显示获得的 EXP 及金钱的窗口。
#==============================================================================

class Window_BattleResult < Window_Base
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     exp       : EXP
  #     gold      : 金钱
  #     treasures : 宝物
  #--------------------------------------------------------------------------
  def initialize(exp, gold, treasures)
    @数量 = Hash.new {|hash,key| hash[key] = 0}
    @重复 = []
    for item in treasures
      unless @重复.include? item
        @重复 << item
        @数量[item] += 1
      else
        @数量[item] += 1
      end
    end
    @exp = exp
    @gold = gold
    @treasures = treasures
    super(160, 0, 320, @重复.size * 32 + 64)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.y = 160 - height / 2
    self.back_opacity = 160
    self.visible = false
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    x = 4
    self.contents.font.color = normal_color
    cx = contents.text_size(@exp.to_s).width
    self.contents.draw_text(x, 0, cx, 32, @exp.to_s)
    x += cx + 4
    self.contents.font.color = system_color
    cx = contents.text_size("EXP").width
    self.contents.draw_text(x, 0, 64, 32, "EXP")
    x += cx + 16
    self.contents.font.color = normal_color
    cx = contents.text_size(@gold.to_s).width
    self.contents.draw_text(x, 0, cx, 32, @gold.to_s)
    x += cx + 4
    self.contents.font.color = system_color
    self.contents.draw_text(x, 0, 128, 32, $data_system.words.gold)
    y = 32
    for item in @重复
      draw_item_name(item, 4, y)
      contents.draw_text(24 + contents.text_size(item.name).width, y,
      width - 40, 32, "    ×    "+@数量[item].to_s)
      y += 32
    end
  end
end

评分

参与人数 2星屑 +127 收起 理由
myownroc + 120 认可答案
Demon丶旋律 + 7 非常感谢!!这个真的很有用!!

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-23 07:59

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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