Project1
标题:
问一个物品掉落的算法……
[打印本页]
作者:
saturnfjh
时间:
2010-10-6 16:29
标题:
问一个物品掉落的算法……
本帖最后由 saturnfjh 于 2010-10-25 10:28 编辑
先奉上原脚本《掉落扩张》:
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/ ◆ ドロップアイテム拡張 - KGC_ExtraDropItem ◆ VX ◆
#_/ ◇ Last update : 2008/08/28 ◇
#_/----------------------------------------------------------------------------
#_/ 敵が落とすアイテムの種類を増やします。
#_/============================================================================
#_/ 【特殊システム】≪戦闘難易度≫ より上に導入してください。
#_/ 【メニュー】≪モンスター図鑑≫ より下に導入してください。
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
$imported = {} if $imported == nil
$imported["ExtraDropItem"] = true
module KGC
module ExtraDropItem
# 正規表現
module Regexp
# エネミー
module Enemy
# ドロップアイテム
DROP_ITEM = /<(?:DROP|ドロップ)\s*([IWA]):(\d+)\s+(\d+)([%%])?>/i
end
end
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ RPG::Enemy
#==============================================================================
class RPG::Enemy
#--------------------------------------------------------------------------
# ○ ドロップアイテム拡張のキャッシュ生成
#--------------------------------------------------------------------------
def create_extra_drop_item_cache
@__extra_drop_items = []
self.note.each_line { |line|
case line
when KGC::ExtraDropItem::Regexp::Enemy::DROP_ITEM
# ドロップアイテム
item = RPG::Enemy::DropItem.new
case $1.upcase
when "I" # アイテム
item.kind = 1
item.item_id = $2.to_i
when "W" # 武器
item.kind = 2
item.weapon_id = $2.to_i
when "A" # 防具
item.kind = 3
item.armor_id = $2.to_i
else
next
end
# ドロップ率
if $4 != nil
item.drop_prob = $3.to_i
else
item.denominator = $3.to_i
end
@__extra_drop_items << item
end
}
end
#--------------------------------------------------------------------------
# ○ 拡張ドロップアイテム
#--------------------------------------------------------------------------
def extra_drop_items
create_extra_drop_item_cache if @__extra_drop_items == nil
return @__extra_drop_items
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ RPG::Enemy::DropItem
#==============================================================================
unless $@
class RPG::Enemy::DropItem
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_writer :drop_prob # ドロップ率
#--------------------------------------------------------------------------
# ○ ドロップ率取得
#--------------------------------------------------------------------------
def drop_prob
@drop_prob = 0 if @drop_prob == nil
return @drop_prob
end
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ○ 拡張ドロップアイテムの取得
#--------------------------------------------------------------------------
def extra_drop_items
return enemy.extra_drop_items
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Game_Troop
#==============================================================================
class Game_Troop < Game_Unit
#--------------------------------------------------------------------------
# ● ドロップアイテムの配列作成
#--------------------------------------------------------------------------
alias make_drop_items_KGC_ExtraDropItem make_drop_items
def make_drop_items
drop_items = make_drop_items_KGC_ExtraDropItem
dead_members.each { |enemy|
enemy.extra_drop_items.each_with_index { |di, i|
next if di.kind == 0
if di.drop_prob > 0
# 確率指定
next if di.drop_prob < rand(100)
else
# 分母指定
next if rand(di.denominator) != 0
end
if di.kind == 1
drop_items.push($data_items[di.item_id])
elsif di.kind == 2
drop_items.push($data_weapons[di.weapon_id])
elsif di.kind == 3
drop_items.push($data_armors[di.armor_id])
end
# ドロップ済みフラグをセット
if $imported["EnemyGuide"]
KGC::Commands.set_enemy_item_dropped(enemy.enemy.id, i + 2)
end
}
}
return drop_items
end
end
复制代码
问题如下:
现在我想修改一下物品掉落的算法,不再一个一个物品判断,而是从N件物品中选取X件掉落:
设想如下:
STEP1 利用以上脚本读取掉落列表中的各物品掉落率
STEP2 加总掉落率总和,以此判断掉落件数,例如,总和T满足:T<100则掉落一件,100<T<200则掉落2件……以此类推
STEP3 从掉落列表中用rand(T)函数获取第1件掉落
STEP4 从掉落列表中用rand(T)函数获取第2件掉落(如果有的话),与第1件相同则重复此步骤
STEP5 从掉落列表中用rand(T)函数获取第3件掉落(如果有的话),与第1、2件相同则重复此步骤
STEP6 ...
FINAL STEP 确定掉落
以上算法要用脚本应该怎么写?替换原脚本哪一节?我刚接触脚本不久,对于里面一些函数的用法不熟悉,想请高手指点一二;另,有没有更优的算法?
作者:
saturnfjh
时间:
2010-10-6 21:25
自顶……求大师指点一二啊……我不是伸手党,只是不知道怎么写这个算法。。555。。
作者:
saturnfjh
时间:
2010-10-7 21:20
再顶……豁出去了……求指点……
作者:
summer92
时间:
2010-10-8 10:59
提示:自己写算法,有时候不要死钻一点
作者:
saturnfjh
时间:
2010-10-10 17:08
回复
summer92
的帖子
=。= 现在就是找不到更好地算法才来求救的。。
关键是我不太熟悉脚本的循环。。
作者:
saturnfjh
时间:
2010-10-12 20:22
自顶。。。求安慰。。
作者:
禾西
时间:
2010-10-13 09:57
make_drop_items是關鍵
作用就是讀取物品 push 進 drop_items 這個
數組
中
作者:
saturnfjh
时间:
2010-10-14 20:51
class Game_Troop < Game_Unit
#--------------------------------------------------------------------------
# ● ドロップアイテムの配列作成
#--------------------------------------------------------------------------
alias make_drop_items_KGC_ExtraDropItem make_drop_items
def make_drop_items
drop_items = make_drop_items_KGC_ExtraDropItem
drop_count = 0
drop_piece = 0
drop_make = 0
drop_price = 0
dead_members.each { |enemy|
enemy.extra_drop_items.each_with_index { |di, i|
drop_count += i
next if di.kind == 0
#判断掉落件数
if drop_count <= 100
drop_piece = drop_count > rand(100)? 1:0
elsif drop_count <= 200
drop_piece = drop_count > rand(200)? 2:1
else
drop_piece = drop_count > rand(300)? 3:2
end
#根据件数判断物品
case drop_piece
when 0
return
when 1
drop_price = rand(100)
enemy.extra_drop_items.each_with_index { |di, i|
drop_make += i
next if drop_make < drop_price
if di.kind == 1
drop_items.push($data_items[di.item_id])
elsif di.kind == 2
drop_items.push($data_weapons[di.weapon_id])
elsif di.kind == 3
drop_items.push($data_armors[di.armor_id])
end
}
when 2
for a in 1..2
drop_price = rand(200)
enemy.extra_drop_items.each_with_index { |di, i|
drop_make += i
next if drop_make < drop_price
if di.kind == 1
drop_items.push($data_items[di.item_id])
elsif di.kind == 2
drop_items.push($data_weapons[di.weapon_id])
elsif di.kind == 3
drop_items.push($data_armors[di.armor_id])
end
}
next
end
when 3
for a in 1..3
drop_price = rand(300)
enemy.extra_drop_items.each_with_index { |di, i|
drop_make += i
next if drop_make < drop_price
if di.kind == 1
drop_items.push($data_items[di.item_id])
elsif di.kind == 2
drop_items.push($data_weapons[di.weapon_id])
elsif di.kind == 3
drop_items.push($data_armors[di.armor_id])
end
}
next
end
end
if $imported["EnemyGuide"]
KGC::Commands.set_enemy_item_dropped(enemy.enemy.id, i + 2)
end
}
}
return drop_items
end
end
复制代码
我照着改了一下,然后出现 未定义 each 方法,请各位大师指点一下要怎么修改。。
作者:
saturnfjh
时间:
2010-10-15 17:02
自顶。。求安慰。。
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1