Project1
标题:
可否限定自动战斗AI的使用技能
[打印本页]
作者:
ada01
时间:
2019-4-25 23:41
标题:
可否限定自动战斗AI的使用技能
因为有些技能不适合在清小怪的时候一直出现,所以想在随机技能那边加一个 限定使用的技能 或 限定不使用的技能
希望在较有研究的前辈能帮帮忙,谢谢
#==============================================================================
# ■ Game_Actor
#------------------------------------------------------------------------------
# AI模块
#==============================================================================
class Game_Battler
attr_accessor :marks
end
class Game_Actor < Game_Battler
AI = [1,2,3,4] # 需要自动攻击的角色编号
# 物理攻击倾向指数 魔法攻击倾向指数 防御指数 什么都不做指数
Action_Index = [50,50]
IQ = 90 # 智商设定,90为标准值,IQ越高,越优先攻击生命值少,防御力小的
Hp_Mark = [30,-10] # 生命值评分标准,[生命值最低的得分,步进值(负)]
Df_Mark = [20,-10] # 防御值评分标准,[防御值最低的得分,步进值(负)]
EQ = 90 # 情商设定,90为标准值,EQ越高,越优先使用对应魔法(属性有效度为准),
def make_action
$game_troop.enemies.each{|i|i.marks=50}
$game_party.actors.each{|i|i.marks=50}
# 先确认动作
index = Action_Index
skills = self.skills.inject([]){|a,b|a<<b if skill_can_use?(b);a}
index[1] = 0 if skills == []
index[0] *= IQ/90.0;index[1] *= IQ/90.0;index[1] *= EQ/90.0
index[0].to_i;index[1].to_i
all = index.inject(0){|a,b|a+b}.to_i
value = rand(all)
action = 0 # 默认攻击
for i in 0...index.size
if i > value
action = i
break
else
value -= index[i]
end
end
# 目前动作为 action
case action
when 0 # 攻击
# 智商检查
enemies = $game_troop.enemies.inject([]){|a,b|a<<b if !b.hp0?;a}
# 评分
enemies.sort!{|a,b|a.hp<=>b.hp}
for i in 0...enemies.size
enemies[i].marks += (Hp_Mark[0] + i*Hp_Mark[1])*IQ/90
end
# 防御检查
enemies.sort!{|a,b|a.pdef<=>b.pdef}
for i in 0...enemies.size
enemies[i].marks += (Df_Mark[0] + i*Df_Mark[1])*IQ/90
end
# 确认目标
value = rand(enemies.inject(0){|a,b|a+b.marks})
tag = nil
for i in enemies
if i.marks > value
tag = i
break
else
value -= i.marks
end
end
# 目标确认 tag
@current_action.kind = 0
@current_action.basic = 0
return @current_action.target_index = 0 unless tag
@current_action.target_index = $game_troop.enemies.index(tag)
when 1 # 魔法
# 魔法分类,对敌/对己(加持)/附着状态/解除状态
@current_action.kind = 0
return @current_action.basic = 1 if skills == []
@current_action.kind = 1
# 随机技能
@current_action.skill_id = skills[rand(skills.size)]
# 确认对象
scope = $data_skills[@current_action.skill_id].scope
@current_action.target_index = 0
case @scope
when 1 # 敌单体
# 智商检查
enemies = $game_troop.enemies.inject([]){|a,b|a<<b if !b.hp0?;a}
# 属性有效度评分
table = [0,50,25,10,0,-10,-20]
for i in 0...enemies.size
enemies[i].marks += enemies[i].element_ranks[@current_action.skill_id]
end
# 确认目标
value = rand(enemies.inject(0){|a,b|a+b.marks})
tag = nil
for i in enemies
if i.marks > value
tag = i
break
else
value -= i.marks
end
end
@current_action.target_index = $game_troop.enemies.index(tag) if tag
when 3
# 智商检查
enemies = game_party.actors.inject([]){|a,b|a<<b if !b.hp0?;a}
# 属性有效度评分
table = [0,50,25,10,0,-10,-20]
for i in 0...enemies.size
enemies[i].marks += enemies[i].element_ranks[@current_action.skill_id]
end
# 确认目标
value = rand(enemies.inject(0){|a,b|a+b.marks})
tag = nil
for i in enemies
if i.marks > value
tag = i
break
else
value -= i.marks
end
end
@current_action.target_index = game_party.actors.index(tag) if tag
end
when 2 # 防御
@current_action.basic = 0
@current_action.basic = 1
end
end
end
class Scene_Battle
#--------------------------------------------------------------------------
# ● 转到输入下一个角色的命令
#--------------------------------------------------------------------------
def phase3_next_actor
# 循环
begin
# 角色的明灭效果 OFF
if @active_battler != nil
@active_battler.blink = false
end
# 最后的角色的情况
if @actor_index == $game_party.actors.size-1
# 开始主回合
start_phase4
return
end
# 推进角色索引
@actor_index += 1
@active_battler = $game_party.actors[@actor_index]
@active_battler.blink = true
# 如果角色是在无法接受指令的状态就再试
end until @active_battler.inputable?
# $
if Game_Actor::AI.include?(@active_battler.id)
#AI同伴
@actor_command_window.active = false
@actor_command_window.visible = false
@active_battler.make_action
phase3_next_actor
else
# 设置角色的命令窗口
phase3_setup_command_window
end
end
#--------------------------------------------------------------------------
# ● 转向前一个角色的命令输入
#--------------------------------------------------------------------------
def phase3_prior_actor
# 循环
begin
# 角色的明灭效果 OFF
if @active_battler != nil
@active_battler.blink = false
end
# 最初的角色的情况下
if @actor_index == 0
# 开始同伴指令回合
start_phase2
return
end
# 返回角色索引
@actor_index -= 1
@active_battler = $game_party.actors[@actor_index]
@active_battler.blink = true
# 如果角色是在无法接受指令的状态就再试
end until @active_battler.inputable?
# 设置角色的命令窗口
if Game_Actor::AI.include?(@active_battler.id)
#AI同伴
phase3_prior_actor
else
phase3_setup_command_window
end
end
end
复制代码
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1