Project1
标题:
组合技能如何弄
[打印本页]
作者:
唐小航
时间:
2011-8-31 17:27
标题:
组合技能如何弄
如 热血物语rm 地狱双龙 dsu_plus_rewardpost_czw
作者:
萨绯罗斯
时间:
2011-8-31 18:08
#==============================================================================
#合体技能系统v1.0 BY 绿发的Eclair
#嗯...这个脚本可以相对完美地实现多人合力技能的效果。
#使用方法:
#首先设定合体技能使用的成员,在数据库最后一页的“属性”中设定如下格式的属性:
#合体技,第一个队员ID,第二个队员ID
#记得一定要用英文逗号分隔“合体技”三个字和使用队员哦,不然会错。
#如果技能需要三人以上合力,只要在第二个队员ID后面继续添加一个半角逗号和第三个人的ID即可。
#PS:默认战斗超出4人以上的合体技能是一定用不鸟的- -|||具体原因在这脚本之中~~
#最后只要把想设定成合体技能的技能勾上这个属性就完成了,就这么简单。
#最后,和战斗类脚本发生冲突的可能性非常高,使用这个脚本之前最好找个技工帮忙(如果自己就是技工的话54这句8~)
#==============================================================================
#==============================================================================
# ■ Game_chain
#------------------------------------------------------------------------------
# - -|||一个伪造的battler模子....
#==============================================================================
class Game_chain
attr_accessor :atk
attr_accessor :str
attr_accessor :dex
attr_accessor :agi
attr_accessor :int
attr_accessor :hit
def initialize
@atk = 0
@str = 0
@dex = 0
@agi = 0
@int = 0
@hit = 0
end
end
module RPG
class Skill
def chain_id
use = []
for i in @element_set
if $data_system.elements[i].split(/,/)[0] == "合体技"
for j in 1...$data_system.elements[i].split(/,/).size
use.push($data_system.elements[i].split(/,/)[j].to_i)
end
end
end
return use
end
end
end
#==============================================================================
# ■ Scene_Battle (分割定义 4)
#------------------------------------------------------------------------------
# 处理战斗画面的类。
#==============================================================================
class Scene_Battle
attr_accessor :phase
#--------------------------------------------------------------------------
# ● 刷新画面画面 (角色命令回合 : 选择敌人)
#--------------------------------------------------------------------------
def update_phase3_enemy_select
# 刷新敌人箭头
@enemy_arrow.update
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 演奏取消 SE
$game_system.se_play($data_system.cancel_se)
# 选择敌人结束
end_enemy_select
return
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 设置行动
@active_battler.current_action.target_index = @enemy_arrow.index
#####################################################eclair
if @skill_window != nil
if @active_battler.current_action.kind == 1 and $data_skills[@active_battler.current_action.skill_id].chain_id != []
for i in $game_party.actors
for j in $data_skills[@active_battler.current_action.skill_id].chain_id
if i.id == j
i.current_action.target_index = @enemy_arrow.index
end
end
end
end
end
#####################################################eclair
# 选择敌人结束
end_enemy_select
# 显示特技窗口中的情况下
if @skill_window != nil
# 结束特技选择
end_skill_select
end
# 显示物品窗口的情况下
if @item_window != nil
# 结束物品选择
end_item_select
end
# 转到下一位角色的指令输入
phase3_next_actor
end
end
#--------------------------------------------------------------------------
# ● 设置角色指令窗口
#--------------------------------------------------------------------------
def phase3_setup_command_window
######################################################eclair
if @active_battler.chain_id != 0
phase3_next_actor
return
end
######################################################eclair
# 同伴指令窗口无效化
@party_command_window.active = false
@party_command_window.visible = false
# 角色指令窗口无效化
@actor_command_window.active = true
@actor_command_window.visible = true
# 设置角色指令窗口的位置
@actor_command_window.x = @actor_index * 160
# 设置索引为 0
@actor_command_window.index = 0
end
#--------------------------------------------------------------------------
# ● 转向前一个角色的命令输入
#--------------------------------------------------------------------------
def phase3_prior_actor
######################################################eclair
if $game_party.actors[@actor_index - 1].chain_id != 0
a = $game_party.actors[@actor_index - 1].chain_id
b = []
for i in $game_party.actors
i.blink = false
if i.chain_id == a
b.push(i.id)
end
end
for j in b
$game_actors[j].chain_id = 0
$game_actors[j].chain_over = false
end
@actor_index = b.min
@active_battler = $game_party.actors[@actor_index]
end
######################################################eclair
# 循环
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?
# 设置角色的命令窗口
phase3_setup_command_window
end
#--------------------------------------------------------------------------
# ● 刷新画面 (主回合步骤 1 : 准备行动)
#--------------------------------------------------------------------------
def update_phase4_step1
# 隐藏帮助窗口
@help_window.visible = false
# 判定胜败
if judge
# 胜利或者失败的情况下 : 过程结束
return
end
# 强制行动的战斗者不存在的情况下
if $game_temp.forcing_battler == nil
# 设置战斗事件
setup_battle_event
# 执行战斗事件中的情况下
if $game_system.battle_interpreter.running?
return
end
end
# 强制行动的战斗者存在的情况下
if $game_temp.forcing_battler != nil
# 在头部添加后移动
@action_battlers.delete($game_temp.forcing_battler)
@action_battlers.unshift($game_temp.forcing_battler)
end
# 未行动的战斗者不存在的情况下 (全员已经行动)
##################################################eclair
if @action_battlers.size == 0
for i in $game_party.actors
i.chain_over = false
i.chain_id = 0
end
# 开始同伴命令回合
start_phase2
return
end
##################################################eclair
# 初始化动画 ID 和公共事件 ID
@animation1_id = 0
@animation2_id = 0
@common_event_id = 0
# 未行动的战斗者移动到序列的头部
@active_battler = @action_battlers.shift
# 如果已经在战斗之外的情况下
if @active_battler.index == nil
return
end
# 连续伤害
if @active_battler.hp > 0 and @active_battler.slip_damage?
@active_battler.slip_damage_effect
@active_battler.damage_pop = true
end
# 自然解除状态
@active_battler.remove_states_auto
# 刷新状态窗口
@status_window.refresh
# 移至步骤 2
@phase4_step = 2
end
#--------------------------------------------------------------------------
# ● 刷新画面 (角色命令回合 : 选择特技)
#--------------------------------------------------------------------------
def update_phase3_skill_select
# 设置特技窗口为可视状态
@skill_window.visible = true
# 刷新特技窗口
@skill_window.update
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 演奏取消 SE
$game_system.se_play($data_system.cancel_se)
# 结束特技选择
end_skill_select
return
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
# 获取特技选择窗口现在选择的特技的数据
@skill = @skill_window.skill
# 无法使用的情况下
if @skill == nil or not @active_battler.skill_can_use?(@skill.id)
# 演奏冻结 SE
$game_system.se_play($data_system.buzzer_se)
return
end
# 演奏确定 SE
$game_system.se_play($data_system.decision_se)
# 设置行动
@active_battler.current_action.skill_id = @skill.id
####################################################eclair
#设定合体技能ID
if @active_battler.is_a?(Game_Actor)
for i in $data_skills[@skill.id].chain_id
for j in $game_party.actors
if j.id == i
j.current_action.kind = 1
j.chain_id = @skill.id
end
end
end
end
####################################################eclair
# 设置特技窗口为不可见状态
@skill_window.visible = false
# 效果范围是敌单体的情况下
if @skill.scope == 1
# 开始选择敌人
start_enemy_select
# 效果范围是我方单体的情况下
elsif @skill.scope == 3 or @skill.scope == 5
# 开始选择角色
start_actor_select
# 效果范围不是单体的情况下
else
# 选择特技结束
end_skill_select
# 转到下一位角色的指令输入
phase3_next_actor
end
return
end
end
#--------------------------------------------------------------------------
# ● 生成特技行动结果
#--------------------------------------------------------------------------
def make_skill_action_result
# 获取特技
@skill = $data_skills[@active_battler.current_action.skill_id]
#################################################eclair
if @active_battler.chain_over == true
@help_window.visible = false
@phase4_step = 1
return
end
if @active_battler.chain_id != 0
@skill = $data_skills[@active_battler.chain_id]
@a = Game_chain.new
for i in $data_skills[@skill.id].chain_id
for j in $game_party.actors
if j.id == i
@a.atk += j.atk / @skill.chain_id.size
@a.str += j.str / @skill.chain_id.size
@a.dex += j.dex / @skill.chain_id.size
@a.agi += j.agi / @skill.chain_id.size
@a.int += j.int / @skill.chain_id.size
@a.hit += j.hit / @skill.chain_id.size
end
end
end
end
#################################################eclair
# 如果不是强制行动
unless @active_battler.current_action.forcing
# 因为 SP 耗尽而无法使用的情况下
unless @active_battler.skill_can_use?(@skill.id)
# 清除强制行动对像的战斗者
$game_temp.forcing_battler = nil
# 移至步骤 1
@phase4_step = 1
return
end
end
# 消耗 SP
##################################################eclair
if @skill.chain_id != []
for i in @skill.chain_id
$game_actors[i].sp -= @skill.sp_cost
end
else
@active_battler.sp -= @skill.sp_cost
end
##################################################eclair
# 刷新状态窗口
@status_window.refresh
# 在帮助窗口显示特技名
@help_window.set_text(@skill.name, 1)
# 设置动画 ID
@animation1_id = @skill.animation1_id
@animation2_id = @skill.animation2_id
# 设置公共事件 ID
@common_event_id = @skill.common_event_id
# 设置对像侧战斗者
set_target_battlers(@skill.scope)
# 应用特技效果
#####################################################eclair
if @active_battler.chain_id == 0
for target in @target_battlers
target.skill_effect(@active_battler, @skill)
end
else
for target in @target_battlers
target.skill_effect(@a, @skill)
end
end
######################################################eclair
end
#--------------------------------------------------------------------------
# ● 刷新画面 (主回合步骤 3 : 行动方动画)
#--------------------------------------------------------------------------
def update_phase4_step3
# 行动方动画 (ID 为 0 的情况下是白色闪烁)
####################################################eclair
if @active_battler.chain_id == 0#1
if @animation1_id == 0#2
@active_battler.white_flash = true
else
@active_battler.animation_id = @animation1_id
@active_battler.animation_hit = true
end#2
else
for i in $data_skills[@skill.id].chain_id#4
for j in $game_party.actors#5
if j.id == i#3
j.animation_id = $data_skills[@skill.id].animation1_id
j.animation_hit = true
end#3
end#4
end#5
end#1
########################################################eclair
# 移至步骤 4
@phase4_step = 4
end
#--------------------------------------------------------------------------
# ● 刷新画面 (主回合步骤 5 : 显示伤害)
#--------------------------------------------------------------------------
def update_phase4_step5
# 隐藏帮助窗口
@help_window.visible = false
# 刷新状态窗口
@status_window.refresh
# 显示伤害
for target in @target_battlers
if target.damage != nil
target.damage_pop = true
end
end
#####################################################eclair
if @active_battler.chain_id != 0
for i in $game_party.actors
if i.chain_id == @active_battler.chain_id
i.chain_over = true
end
end
end
#####################################################eclair
# 移至步骤 6
@phase4_step = 6
end
end
#==============================================================================
# ■ Game_Battler (分割定义 1)
#------------------------------------------------------------------------------
# 处理战斗者的类。这个类作为 Game_Actor 类与 Game_Enemy 类的
# 超级类来使用。
#==============================================================================
class Game_Battler
attr_accessor :chain_id # 使用合体技能的ID
attr_accessor :chain_over # 合体技能使用完毕的标志
alias initialize_c initialize
def initialize
initialize_c
@chain_id = 0
@chain_over = false
end
#--------------------------------------------------------------------------
# ● 可以使用特技的判定
# skill_id : 特技 ID
#--------------------------------------------------------------------------
def skill_can_use?(skill_id)
# SP 不足的情况下不能使用
if $data_skills[skill_id].sp_cost > self.sp
return false
end
# 战斗不能的情况下不能使用
if dead?
return false
end
# 沉默状态的情况下、物理特技以外的特技不能使用
if $data_skills[skill_id].atk_f == 0 and self.restriction == 1
return false
end
###################################################eclair
if $data_skills[skill_id].chain_id != [] and self.is_a?(Game_Actor)
for i in $data_skills[skill_id].chain_id
return false if !$game_party.actors.include?($game_actors[i])
return false if !$game_actors[i].movable? or !$game_actors[i].inputable? or $game_actors[i].dead?
return false if $game_actors[i].chain_id != 0 and ($game_actors[i].sp < $data_skills[skill_id].sp_cost)
return false if $game_actors[i].chain_id != 0 && skill_id and $scene.phase != 4
end
end
##################################################eclair
# 获取可以使用的时机
occasion = $data_skills[skill_id].occasion
# 战斗中的情况下
if $game_temp.in_battle
# [平时] 或者是 [战斗中] 可以使用
return (occasion == 0 or occasion == 1)
# 不是战斗中的情况下
else
# [平时] 或者是 [菜单中] 可以使用
return (occasion == 0 or occasion == 2)
end
end
end
复制代码
范例
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1