=begin
================================================================================
使用方法:
1. 敌人等级直接设定
在敌人的备注栏里打上
[等级 n]
例如:[等级 25]
n 为该敌人等级。(「等级」二字简繁体皆可,也可以打成英文的 level)
2. 敌人等级与角色队伍平均等级相同
在敌人的备注栏里打上
[主角等级]
则自动依队伍平均等级计算该敌人等级
(「主角等级」四字可以为简繁体,或是英文的 player_level)
3. 敌人等级为角色队伍平均等级的差距
在敌人的备注栏里打上
[强度 X]
例如:[强度 很弱]
X 为下面的哈希表所设置的强度,可以自己修改,
(「强度」二字可以为简繁体,或是英文的 strength)
强度标签单独使用时,是使用主角队伍平均等级计算
若是与等级标签同用,则是以该等级计算
详细看下面的范例设定。
4. 敌人类型
(其实是参考了小幽的战斗AI脚本,可以配合该脚本使用
在战斗AI里设定好的类型,这里就不用再设定一次了
如果读取到了战斗AI脚本的敌人类型,就会忽略数据库里的设定。)
在敌人的备注栏里打上
[类型 X]
例如:[类型 巫师]
X 为下面的哈希表所设置的强度,可以自己修改,
(「类型」二字可以为简繁体,或是英文的 type)
5. 经验值系数设定
EXPERIENCE 是设定一般敌人经验值
0.1 表示所得经验值为角色队伍在该等级所需升级的经验值数的十分之一
BOSS_EXP 是设定BOSS敌人经验值
3 表示计算经验值後再加值计算的经验值
6. 哈希表设置部分说明
ENEMY_TYPE 哈希表
字符部分为类型,可以修改,数字部分为类型代号,不要修改
STRENGTH 哈希表
字符部分为强度,数字部分为与主角平均等级差
例如:"很弱" => -3
表示当敌人强度设为「很弱」时,该敌人等级为队伍等级-3
例如:
1 角色 等级:3
2 角色 等级:4
3 角色 等级:8
4 角色 等级:6
怪物1设为 [强度 弱]
怪物2设为 [很强 很强] [等级 1]
那麽怪物1等级就是:
(3+4+8+6)/4 = 5.25 <= 取整为5
5 - 2 = 3 <= 怪物等级为3
那麽怪物2等级就是:
1 + 3 = 4 <= 怪物等级为4
要注意的是,当等级为0或以下时则自动修正为1
若无法在哈希表中找到相对应的key,就会将该敌人设置为与主角队伍平均等级相同
配合使用方法:
一般敌人建议用第一种方法,设立(伪)绝对等级,主角成长後依然为弱怪的敌人。
头目敌人可以直接指定其类型为 BOSS,但是其能力值增值方面就比较死板,
若是想做成巫师型的血低魔高的BOSS,可以用下面的方法
用第二、三种方法,设立相对等级,主角成长也会跟着成长的敌人。
设立为「弱」时,虽然对主角来说依然是弱怪,
但是会随着主角成长,HP、MP、经验值会随着增加,
可以用来做练级用的怪。
调用敌人图鉴方式:
在调用前先执行脚本 make_enemy_database
只要 WRITE_2_DATABASE 设为 false
就不会覆写数据库的资料,而是在游戏中调用而已。
不过说明方面就会有点问题了
覆写数据库方法:
将WRITE_2_DATABASE 设为 true
随意在地图上用一个事件执行 make_enemy_database
再回到脚本将WRITE_2_DATABASE 设为 false(以免在运行中误操作)
=end
# 设置部分:
module Auto_Enemy
# 是否写入数据库
WRITE_2_DATABASE = false
# 是否自動設置屬性有效度
AUTO_SET_ELEMENT = true
# 是否自動設定狀態抵禦度
AUTO_SET_STATES = true
# 经验值计算系数
EXPERIENCE = 0.1
BOSS_EXP = 3
STRENGTH = {
"很弱" => -3,
"弱" => -2,
"同" => 1,
"强" => 2,
"很强" => 3,
"default" => 0 # 这行不要修改,除错用的
}
# 敌人类型设定
ENEMY_TYPE = {
"普通" => 0, # 普通敌人,能力值依队伍平均计算
"武士" => 1, # 武士型敌人,物理攻击等偏高
"法师" => 2, # 法师型敌人,魔法攻击偏高
"牧师" => 3, # 牧师型敌人,魔力值偏高
"巫师" => 4, # 巫师型敌人,命中率偏高
"挡箭牌" => 5, # 挡箭牌型敌人,血高肉厚
"BOSS" => 6, # BOSS型敌人,各项能力值都增强
# 以上的数值可以在下面的数组变更
"随机" => -1, # 随机,看看它的运气,加值在 1~1.99
"default"=> 0 # 这行不要修改,除错用,默认为普通
}
# 敌人能力值加值参数,对应上放哈希表的敌人类型。不会改的话就别改了。
# 普通 武士 法师 牧师 巫师 档箭 BOSS
ENEMY_TYPE_HP = [1, 1.5, 0.75, 0.6, 0.8, 2, 4] # 体力最大值
ENEMY_TYPE_MP = [1, 0.75, 1.5, 3, 1.4, 1.1, 4] # 魔力最大值
ENEMY_TYPE_ATK = [1, 2, 0.75, 0.5, 0.6, 1.1, 4] # 攻击力
ENEMY_TYPE_DEF = [1, 1.25, 0.5, 0.75, 0.7, 3, 4] # 防御力
ENEMY_TYPE_SPI = [1, 0.1, 2, 1.75, 1.5, 0, 2] # 精神力
ENEMY_TYPE_AGI = [1, 1.2, 2, 0.8, 1.1, 0.2, 2] # 敏捷
ENEMY_TYPE_HIT = [1, 1.3, 1.1, 1.5, 1.8, 1 ] # 命中率
ENEMY_TYPE_EVA = [1, 1, 1, 0.9, 1.1, 0 ] # 闪躲率
# BOSS的命中率和闪躲率为默认最高的95%
end
class Game_Party
def avg_number(number, level=nil)
average = 0
for i in @actors
actor = level ? $data_actors[i] : $game_actors[i]
case number
when "level"
average += $game_actors[i].level
when "exp"
average += $game_actors[i].next_exp_s
when "hp"
if level
average += actor.parameters[0, level]
else
average += actor.maxhp
end
when "mp"
if level
average += actor.parameters[1, level]
else
average += actor.maxmp
end
when "atk"
if level
average += actor.parameters[2, level]
else
average += actor.atk
end
when "def"
if level
average += actor.parameters[3, level]
else
average += actor.def
end
when "spi"
if level
average += actor.parameters[4, level]
else
average += actor.spi
end
when "agi"
if level
average += actor.parameters[5, level]
else
average += actor.agi
end
when "hit"
average += $game_actors[i].hit
when "eva"
average += $game_actors[i].eva
end
end
average /= members.size
return average
end
# 獲取平均等級
def avg_level
return avg_number("level")
end
# 獲取平均升級經驗
def avg_exp_needed
return avg_number("exp")
end
def avg_hp_max(level=nil)
return avg_number("hp", level)
end
def avg_mp_max(level=nil)
return avg_number("mp", level)
end
def avg_atk(level=nil)
return avg_number("atk", level)
end
def avg_def(level=nil)
return avg_number("def", level)
end
def avg_spi(level=nil)
return avg_number("spi", level)
end
def avg_agi(level=nil)
return avg_number("agi", level)
end
def avg_hit
return avg_number("hit")
end
def avg_eva
return avg_number("eva")
end
end
class RPG::Enemy
# 获取等级
def get_level
elevel = 0
self.note.split(/[\r\n]+/).each { |line|
if line =~ /\[(level|等級|等级) {1,2}\]/
a = line.split(/ /)[1]
elevel += a.to_i
elsif line =~ /\[player_level|主角等級|主角等级\]/
elevel += $game_party.avg_level
end
}
return elevel==0 ? nil : elevel
end
# 获取强度
def get_str
self.note.split(/[\r\n]+/).each { |line|
if line =~ /\[(strength|強度|强度) \w+\]/
a = line.split(/ /)[1]
d = ""
while ((c = a.slice!(/./m)) != nil)
d += c if c != "]"
end
return d
end
}
return "default"
end
def get_enemy_type
self.note.split(/[\r\n]+/).each { |line|
if line =~ /\[(type|類型|类型) \w+\]/
a = line.split(/ /)[1]
d = ""
while ((c = a.slice!(/./m)) != nil)
d += c if c != "]"
end
return d
end
}
return "default"
end
# 计算等级
def level
if auto_level?
if auto_str?
return [get_level + str, 1].max
else
return get_level
end
elsif auto_str?
elevel = $game_party.avg_level + str
return [elevel, 1].max
end
end
def str
estr = Auto_Enemy::STRENGTH[get_str]
if estr != nil
return estr
else
return Auto_Enemy::STRENGTH["default"]
end
end
def type
if $enemies_class != nil
return $enemies_class[@enemy_id] if $enemies_class[@enemy_id]!=nil
end
return Auto_Enemy::ENEMY_TYPE[get_enemy_type]
end
def auto_level?
return get_level
end
def auto_str?
return get_str
end
def auto_setup?
return (auto_level? or auto_str?)
end
end
#==============================================================================
# ■ Game_Enemy
#------------------------------------------------------------------------------
# 处理敌人的类。本类在 Game_Troop 类 ($game_troop) 的 内部使用。
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ● 获取基本体力最大值
#--------------------------------------------------------------------------
def base_maxhp
if enemy.auto_setup?
enemy_maxhp = $game_party.avg_hp_max(enemy.level)
if enemy.type == -1
enemy_maxhp *= (1 + rand(0))
else
enemy_maxhp *= Auto_Enemy::ENEMY_TYPE_HP[enemy.type]
end
enemy_maxhp = enemy_maxhp.to_i
enemy_maxhp += rand(10)
return enemy_maxhp
else
return enemy.maxhp
end
end
#--------------------------------------------------------------------------
# ● 获取基本魔力最大值
#--------------------------------------------------------------------------
def base_maxmp
if enemy.auto_setup?
enemy_maxmp = $game_party.avg_mp_max(enemy.level)
if enemy.type == -1
enemy_maxmp *= (1 + rand(0))
else
enemy_maxmp *= Auto_Enemy::ENEMY_TYPE_MP[enemy.type]
end
enemy_maxmp = enemy_maxmp.to_i
enemy_maxmp += rand(5)
return enemy_maxmp
else
return enemy.maxmp
end
end
#--------------------------------------------------------------------------
# ● 获取基本攻击力
#--------------------------------------------------------------------------
def base_atk
if enemy.auto_setup?
enemy_atk = $game_party.avg_atk(enemy.level)
if enemy.type == -1
enemy_atk *= (1 + rand(0))
else
enemy_atk *= Auto_Enemy::ENEMY_TYPE_ATK[enemy.type]
end
enemy_atk = enemy_atk.to_i
enemy_atk += rand(5)
return enemy_atk
else
return enemy.atk
end
end
#--------------------------------------------------------------------------
# ● 获取基本防御力
#--------------------------------------------------------------------------
def base_def
if enemy.auto_setup?
enemy_def = $game_party.avg_def(enemy.level)
if enemy.type == -1
enemy_def *= (1 + rand(0))
else
enemy_def *= Auto_Enemy::ENEMY_TYPE_DEF[enemy.type]
end
enemy_def = enemy_def.to_i
enemy_def += rand(5)
return enemy_def
else
return enemy.def
end
end
#--------------------------------------------------------------------------
# ● 获取基本精神力
#--------------------------------------------------------------------------
def base_spi
if enemy.auto_setup?
enemy_spi = $game_party.avg_spi(enemy.level)
if enemy.type == -1
enemy_spi *= (1 + rand(0))
else
enemy_spi *= Auto_Enemy::ENEMY_TYPE_SPI[enemy.type]
end
enemy_spi = enemy_spi.to_i
enemy_spi += rand(5)
return enemy_spi
else
return enemy.spi
end
end
#--------------------------------------------------------------------------
# ● 获取基本敏捷
#--------------------------------------------------------------------------
def base_agi
if enemy.auto_setup?
enemy_agi = $game_party.avg_agi(enemy.level)
if enemy.type == -1
enemy_agi *= (1 + rand(0))
else
enemy_agi *= Auto_Enemy::ENEMY_TYPE_AGI[enemy.type]
end
enemy_agi = enemy_agi.to_i
enemy_agi += rand(5)
return enemy_agi
else
return enemy.agi
end
end
#--------------------------------------------------------------------------
# ● 获取命中率
#--------------------------------------------------------------------------
def hit
if enemy.auto_setup?
enemy_hit = $game_party.avg_hit
if enemy.type == -1
enemy_hit *= (1 + rand(0))
elsif enemy.type == 6
enemy_hit = 95
else
enemy_hit *= Auto_Enemy::ENEMY_TYPE_HIT[enemy.type]
end
return [[enemy_hit.to_i, 95].min, 50].max
else
return enemy.hit
end
end
#--------------------------------------------------------------------------
# ● 获取闪躲率
#--------------------------------------------------------------------------
def eva
if enemy.auto_setup?
enemy_eva = $game_party.avg_eva
if enemy.type == -1
enemy_eva *= (1 + rand(0))
elsif enemy.type == 6
enemy_eva = 95
else
enemy_eva *= Auto_Enemy::ENEMY_TYPE_EVA[enemy.type]
end
return [[enemy_eva.to_i, 95].min, 0].max
else
return enemy.eva
end
end
#--------------------------------------------------------------------------
# ● 获取经验值
#--------------------------------------------------------------------------
def exp
if enemy.auto_setup?
exp = ($game_party.avg_exp_needed * Auto_Enemy::EXPERIENCE).to_i
exp =* enemy.type == 6 ? Auto_Enemy::BOSS_EXP : 1
exp += rand(10)
return exp
else
return enemy.exp
end
end
end
class Game_Interpreter
def make_enemy_database
for i in 1...$data_enemies.size
game_enemy = Game_Enemy.new(1, i)
if $data_enemies[i].auto_setup?
$data_enemies[i].maxhp = game_enemy.base_maxhp
$data_enemies[i].maxmp = game_enemy.base_maxmp
$data_enemies[i].atk = game_enemy.base_atk
$data_enemies[i].def = game_enemy.base_def
$data_enemies[i].spi = game_enemy.base_spi
$data_enemies[i].agi = game_enemy.base_agi
$data_enemies[i].hit = game_enemy.hit
$data_enemies[i].eva = game_enemy.eva
$data_enemies[i].exp = game_enemy.exp
if $lazy_item_setup
$data_enemies[i].drop_item1 = game_enemy.drop_item1
$data_enemies[i].drop_item2 = game_enemy.drop_item2
end
end
end
save_data($data_enemies,"Data/Enemies.rvdata") if Auto_Enemy::WRITE_2_DATABASE
end
end