Project1
标题:
敌人宝物功能扩展
[打印本页]
作者:
后知后觉
时间:
2009-5-26 07:44
标题:
敌人宝物功能扩展
宝物数量可以达到N个= =||b
也可以自定义,目前提供3种方案+默认功能
1.只要满足设置的获得几率 就会获得该宝物
2.整场战斗只随机获得满足获得几率的宝物的其中一个
3.每个敌人只掉落最多一个宝物 从满足获得几率的宝物中抽取 BOSS除外
4.默认数据库功能
可以在游戏运行时随时切换掉落方案
如果你想要别的获得方案可以回帖
我有空就帮你看看= =||b
有冲突的脚本也可以发个地址来 反正冲突的强度不大
=begin
敌人掉宝扩展 v 1.1
作者:后知后觉
使用说明:
数据库设置敌人名字的时候在后面追加如下格式
@种类(A/W/I),ID,几率
A是防具 W是武器 I是物品 几率0-99 如果不设置默认为100
例如
幽灵@A,1,80@W,2@I,3,50@I,4,50@I,5,30@W,7,10
意思就是80%得1号防具 100%得2号武器 50%得3号物品 50%得4号物品 30%得5号物品 10%得7号武器
当然这么长的名字在数据库里无法设置
所以需要这么长名字的敌人在脚本里设置
找到Scene_Title的这一行
$data_system = load_data("Data/System.rxdata")
在下面添加类似这样的行就可以了
$data_enemies[1].name = "幽灵@I,1,80@I,2,80@I,3,80@A,4,80@W,5,80@W,6,80@A,7,80"
这个[1]里面的1就是敌人的ID号
数据库本身自带的敌人的宝物功能仍然有效
冲突:修改了start_phase5的脚本
解决方法:我修改的地方有醒目标志,复制到冲突脚本的对应位置就可以了
然后把那个脚本放在这个脚本的下面
其他冲突可能,对敌人名字进行过处理的脚本
参数设置
=end
HZHJ_TREASURES_KIND = 1
=begin
这是数据库变量的ID号,用变量随时控制掉宝方案
变量的值为0的时候 只要满足设置的获得几率 就会获得该宝物
为1的时候 整场战斗结束时只随机获得满足获得几率的宝物的其中一个
为2的时候 每个敌人只掉落最多一个宝物 宝物是从满足获得几率的宝物中随机抽取 BOSS除外 BOSS在下面设置
为3的时候 默认数据库功能
=end
HZHJ_ENEMY_BOSS_ID_ARRAY = [47,48,50]
#这是敌人BOSS的ID的数组 把你的BOSS的ID都放进去
#比如47号 88号和99号敌人是BOSS 就是这样写 [47,88,99]
#这个设置只针对变量值为2的情况
#这里开始是脚本
module RPG
class Enemy
def name
name = @name.split(/@/)[0]
name = name != nil ? name : ""
return name
end
def hzhj_baowu
baowu = @name.split(/@/)
baowu.shift
return baowu
end
end
end
class Scene_Battle
def start_phase5
@phase = 5
$game_system.me_play($game_system.battle_end_me)
$game_system.bgm_play($game_temp.map_bgm)
exp = 0
gold = 0
treasures = []
#######################################################################
if $game_variables[HZHJ_TREASURES_KIND] == nil
$game_variables[HZHJ_TREASURES_KIND] = 3
end
for enemy in $game_troop.enemies
unless enemy.hidden
exp += enemy.exp
gold += enemy.gold
bw = $data_enemies[enemy.id].hzhj_baowu
if bw == [] and enemy.item_id == 0 and enemy.weapon_id == 0 and
enemy.armor_id == 0
next
end
hzbw = []
for hbw in bw
if hbw == nil
next
end
jilv = hbw.split(/,/)[2]
jilv = jilv != nil ? jilv.to_i.abs : 100
if rand(100) < jilv
case hbw.split(/,/)[0]
when "I"
hzbw.push($data_items[hbw.split(/,/)[1].to_i.abs])
when "W"
hzbw.push($data_weapons[hbw.split(/,/)[1].to_i.abs])
when "A"
hzbw.push($data_armors[hbw.split(/,/)[1].to_i.abs])
end
end
end
hzbw.delete(nil)
case $game_variables[HZHJ_TREASURES_KIND]
when 0..1
treasures.concat(hzbw) if hzbw.size > 0
if rand(100) < enemy.treasure_prob
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
end
when 2
if rand(100) < enemy.treasure_prob
if enemy.item_id > 0
hzbw.push($data_items[enemy.item_id])
end
if enemy.weapon_id > 0
hzbw.push($data_weapons[enemy.weapon_id])
end
if enemy.armor_id > 0
hzbw.push($data_armors[enemy.armor_id])
end
end
if HZHJ_ENEMY_BOSS_ID_ARRAY.include?(enemy.id)
treasures.concat(hzbw) if hzbw.size > 0
else
treasures.push(hzbw[rand(hzbw.size)]) if hzbw.size > 0
end
when 3
if rand(100) < enemy.treasure_prob
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
end
end
end
end
treasures.delete(nil)
#######################################################################
#######################################################################
case $game_variables[HZHJ_TREASURES_KIND]
when 0
when 1
if treasures.size > 0
hzhjbw = treasures[rand(treasures.size)]
treasures = []
treasures.push(hzhjbw)
end
when 2
when 3
treasures = treasures[0..5]
end
#######################################################################
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
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
复制代码
附上战斗结束窗口一个(Window_BattleResult)
class Window_BattleResult < Window_Base
def initialize(exp, gold, treasures)
@exp = exp
@gold = gold
@treasures = treasures
@a = {}
@b = []
for item in @treasures
if @a.include?(item) == false
@a[item] = 1
else
@a[item] += 1
end
if @b.include?(item)
next
else
@b.push(item)
end
end
@height = @b.size * 32 + 96
super(40, 0, 256, @height)
self.contents = Bitmap.new(width - 32, height - 32)
self.y = 160 - @height / 2
self.y = 0 if self.y < 0
self.z = 9999
self.back_opacity = 160
self.visible = false
refresh
end
def refresh
self.contents.clear
self.contents.font.color = system_color
self.contents.draw_text(32, 0, 64, 32, "经验")
self.contents.font.color = normal_color
self.contents.draw_text(96, 0, 128, 32, @exp.to_s,2)
self.contents.font.color = system_color
self.contents.draw_text(32, 32, 64, 32, $data_system.words.gold)
self.contents.font.color = normal_color
self.contents.draw_text(96, 32, 128, 32, @gold.to_s,2)
y = 64
for i in @b
draw_item_name(i, 4, y,contents.text_size(i.name).width)
self.contents.draw_text(96,y,128,32,@a[i].to_s,2)
y += 32
end
end
def draw_item_name(item, x, y, width = 212)
if item == nil
return
end
bitmap = RPG::Cache.icon(item.icon_name)
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24))
self.contents.font.color = normal_color
self.contents.draw_text(x + 28, y, width, 32, item.name)
end
end
复制代码
作者:
精灵使者
时间:
2009-5-28 16:25
VX的可以不可以运行?
精灵需要一个敌人掉多个宝物的VX版本……
作者:
后知后觉
时间:
2009-5-28 20:23
VX的我不懂哦
不清楚VX里的split用法是不是和XP的一样
split返回数组 去除敌人名字的首单元后的数组在脚本里用for循环
在for循环里对每个单元再次split 然后进行判断
作者:
精灵使者
时间:
2009-5-28 21:03
VX可以用备注,可以在备注里填写你的掉宝数。
作者:
天使喝可乐
时间:
2009-5-28 21:17
可以设置0.X的几率吗?
设置方法看着好麻烦啊............
还是顶个~{/se}
作者:
后知后觉
时间:
2009-5-28 21:19
额,VX没研究过
脚本里是怎么样的结构都不清楚呢
刚才发现个BUG
当数据库敌人名字后没有追加部分时,选择默认功能会被无视而什么都不得
于是堵之
更新到 v 1.1
rand函数不会出小数点的 所以 n<3 和n<2.3 是一个意思
想要把几率再细致点 可以把
rand(100) < jilv 的100改大
个人觉得一般的单机游戏都没有这个必要
设置名字嘛,记住格式就是了 宝物和宝物之间用 @ 分割
宝物的种类 ID 几率 用 , 分割
作者:
偶要当英雄
时间:
2009-5-28 22:37
提示:
作者被禁止或删除 内容自动屏蔽
作者:
紫苏
时间:
2009-5-29 05:52
不给 rand 传递参数最好,这样它返回的就是 0 到 1 之间的实数了,是地道的概率,这样就可以用用浮点数来判断~
作者:
后知后觉
时间:
2009-5-29 06:54
以下引用
紫苏于2009-5-28 21:52:34
的发言:
不给 rand 传递参数最好,这样它返回的就是 0 到 1 之间的实数了,是地道的概率,这样就可以用用浮点数来判断~
还可以这样的啊{/gg}我这才知道呢{/hx}
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1