Project1
标题:
求大神帮忙整合两个战斗效果的脚本
[打印本页]
作者:
ultraomega
时间:
2015-2-18 23:51
标题:
求大神帮忙整合两个战斗效果的脚本
这两个是战斗特殊效果和合体技能的脚本……如果把合体技能脚本放在特效后面,1162行的特效就会冲突,如果把合体技放在特效前面则标记为合体技的技能就一直处于无法使用状态……求大神帮忙整合,脚本比较长,麻烦了orz
#==============================================================================
#合体技能系统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
复制代码
#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================
# ▼▲▼ XRXS19. 特殊効果詰め合わせ:戦闘用 with 29 parts ver..18a ▼▲▼
# by 桜雅 在土, 和希, シムナフ
#==============================================================================
# ■ 以下内容定义各特技的属性名
#==============================================================================
class Game_Battler
RERAISE_STATE_NAME = /复活/
LIBLA_SKILL_ELEMENT_NAME = "透视"
POWERSTOCK_SKILL_ELEMENT_NAME = "聚气"
POWERSTOCK_BASE_RATE = 1.5 #——每回合聚气威力上升倍率
STEAL_SKILL_ELEMENT_NAME = "偷窃"
ELEMENT_NAME_SP_DAMAGE = "MP损伤"
ELEMENT_NAME_HP_DRAIN = "HP吸收"
ELEMENT_NAME_SP_DRAIN = "MP吸收"
ELEMENT_NAME_CRITICAL_HIT = "必杀"
ELEMENT_NAME_CERTAIN_HIT = "必中"
ELEMENT_NAME_HP_COST = "HP消耗"
end
class Game_BattleAction
ELEMENT_NAME_SPEED_PRIORITY = "优先度"
end
class Scene_Battle
ELEMENT_NAME_HP_COST = "HP消耗"
ELEMENT_NAME_DERIVER = "派生"
ELEMENT_NAME_MOVE_TIMES = "行动回数"
ELEMENT_NAME_AREA_ENEMY_ALL = "全体化"
ELEMENT_NAME_AREA_WHOLE = "全域化"
ELEMENT_NAME_AREA_ENEMY_RAND = "敌方随机"
ELEMENT_NAME_AREA_ACTOR_RAND ="我方随机"
ELEMENT_NAME_AREA_ALL_RANDOM ="对象随机"
RERAISE_HP = 1
RERAISE_HP_PERCENT = 0
RERAISE_ANIMATION_ID = 26
end
module Cover_Module
ELEMENT_NAME_COVER = "援助"
STATE_NAME_COVER = "援助"
COVER_HP_PERCENT = 100
COVER_EFFECT_PERCENT = 100
COVER_EFFECT_CHAR = "Covered!"
COVER_ANIMATION_ID = 324
COVER_DEFAULT_NUMBER = 2
end
#==============================================================================
$xrxs19_special_effections_set_work = true
#--------------------------------------------------------------------------
# ● 属性修正の計算?改
#--------------------------------------------------------------------------
class Game_Battler
def elements_correct(element_set)
# 無属性の場合 100 を返す
return 100 if element_set == []
# 与えられた属性のレートを全て乗算
result = 100
for i in element_set
result *= self.element_rate(i) / 100.0
end
return result.to_i
end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 追加公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :reraise_state
attr_accessor :reraised # リレイズしたかどうか
attr_accessor :metamor_target # 変身対象
attr_accessor :battler_name # バトラーグラフィック
attr_reader :battler_name_original # バトラーグラフィック初期値
attr_writer :hp0_ban # HP/SPの 0 化または最大制限の解除
attr_writer :certain_hit # 必中受け(Trueだと攻撃を避けられない)
attr_accessor :covered_friends #庇っている味方の配列
attr_accessor :effect_message #
attr_accessor :current_friend #かばっている味方
attr_accessor :cover_remain #かばう可能な残り回数
#--------------------------------------------------------------------------
# ● 初期化
#--------------------------------------------------------------------------
alias xrxs19_battler_initialize initialize
def initialize
xrxs19_battler_initialize
# 「かばう」用変数初期化
@covered_friends = []
@effect_message = nil
@current_friend = nil
@cover_remain = 0
end
#--------------------------------------------------------------------------
# ● ステートの付加
# state_id : ステート ID
# force : 強制付加フラグ (オートステートの処理で使用)
#--------------------------------------------------------------------------
alias xrxs19_add_state add_state
def add_state(state_id, force = false)
xrxs19_add_state(state_id, force)
# 「かばう」のステート付加の場合
if state_id == get_cover_state_id()
self.cover_remain = COVER_DEFAULT_NUMBER
end
end
#--------------------------------------------------------------------------
# ● HP の変更
#--------------------------------------------------------------------------
def hp=(hp)
if @hp0_ban
@hp = hp
else
@hp = [[hp, maxhp].min, 0].max
# 戦闘不能を付加または解除
for i in 1...$data_states.size
if $data_states[i].zero_hp
if self.dead?
# 追加
for x in 1...$data_states.size
# ステート名は変更可。
if $data_states[x].name[RERAISE_STATE_NAME] != nil
reraise_id = $data_states[x].id
break
end
end
# リレイズ復活
if reraise_id != nil && self.state?(reraise_id)
self.remove_state(reraise_id)
@reraised = true
# 戦闘不能マイナスステートに設定されているものを解除
if $data_states[i].minus_state_set != []
for j in $data_states[i].minus_state_set
remove_state(j)
end
end
elsif
# ここまで
add_state(i)
end
else
remove_state(i)
end
end
end
end
end
#--------------------------------------------------------------------------
# ● SP の変更
#--------------------------------------------------------------------------
def sp=(sp)
if @hp0_ban
@sp = sp
else
@sp = [[sp, maxsp].min, 0].max
end
end
#--------------------------------------------------------------------------
# ● ステート [攻撃を回避できない] 判定
#--------------------------------------------------------------------------
alias xrxs19_cant_evade? cant_evade?
def cant_evade?
return true if @certain_hit
return xrxs19_cant_evade?
end
#--------------------------------------------------------------------------
# ● 通常攻撃の効果適用
#--------------------------------------------------------------------------
alias xrxs19_attack_effect attack_effect# alias したものは effect_it 内で使用
def attack_effect(attacker)
# 通常攻撃の場合、skill = nil で呼ぶ
return effect_it(attacker, nil)
end
#--------------------------------------------------------------------------
# ● スキルの効果適用
#--------------------------------------------------------------------------
alias xrxs19_skill_effect skill_effect # alias したものは effect_it 内で使用
def skill_effect(user, skill)
# スキルの場合は、skill を指定して呼ぶ
return effect_it(user, skill)
end
#--------------------------------------------------------------------------
# ● 効果適用
#--------------------------------------------------------------------------
def effect_it(user, skill = nil)
# 実行前の数値を保持
last_hp = self.hp
last_sp = self.sp
@hp0_ban = true
# 武器IDの取得
weapon_id = user.is_a?(Game_Actor) ? user.weapon_id : 0
# 特殊効果:必中
if skill != nil and skill_element_include?(skill, ELEMENT_NAME_CERTAIN_HIT)
self.certain_hit = true
elsif skill == nil and equip_weapon_element_include?(user, ELEMENT_NAME_CERTAIN_HIT)
self.certain_hit = true
end
# 基本実行、skill が nil かどうかで通常攻撃とスキルを分別
if skill == nil
bool = xrxs19_attack_effect(user)
else
bool = xrxs19_skill_effect(user, skill)
end
# ダメージ測定
damage = last_hp - self.hp
# 必中の解除
self.certain_hit = false
# 特殊効果:スティール/アイテム奪取
if skill != nil and skill_element_include?(skill, STEAL_SKILL_ELEMENT_NAME)
self.steal_effect(user, skill) if self.is_a?(Game_Enemy)
elsif skill == nil and equip_weapon_element_include?(user, STEAL_SKILL_ELEMENT_NAME)
self.steal_effect(user, skill) if self.is_a?(Game_Enemy)
end
# 特殊効果:対象に変身
if skill != nil and skill_element_include?(skill, "变身")
if user.metamor_target == nil
if self.metamor_target == nil
# 変身状態で無い場合、変身
user.metamor_target = self
else
# 対象が変身状態の場合、対象の変身対象に変身する。
user.metamor_target = self.metamor_target
end
else
# 変身状態の場合、変身を解除する
user.metamor_target = user
end
# 自分への変身を禁止
user.metamor_target = nil if user.metamor_target == user
# 対象のダメージ表示を消す
self.damage = nil if self.damage == "Miss"
# HP/SP最大値変更への対応
@hp0_ban = false
user.hp = user.hp
user.sp = user.sp
end
# 特殊効果:武器を投げる
if (skill != nil and skill_element_include?(skill, "武器投掷"))
# 投擲武器の取得
throw_weapon = $data_weapons[user.current_action.basic]
# 武器の消費
if $xrxs24_weapon_property_system_work
$game_party.lose_weapon(throw_weapon.id, user.current_action.basic_ex)
else
$game_party.lose_weapon(throw_weapon.id, 1)
end
# ダメージの変更
self.hp += damage if bool
damage = throw_weapon.atk
if weapon_element_include?(throw_weapon.id, "投掷威力")
damage = damage * @one.to_i / 100
end
self.damage = damage
self.hp -= self.damage
bool = true
end
# 特殊効果:消費金額に順ずる固定ダメージ
if skill != nil and skill_element_include?(skill, "金钱投掷")
# ゴールドの消費
last_gold = $game_party.gold
$game_party.gain_gold(-1 * ($game_party.gold * skill.variance / 100 + skill.power))
self.hp += damage if bool
damage = last_gold - $game_party.gold
self.damage = damage
self.hp -= self.damage
bool = true
end
# 基本実行でfalse(Miss等)の場合、ここで終了する
# つまり、この上までにダメージに関係なく実行される特殊効果をいれて
# これより下はダメージに関係する特殊効果を入れる。
# "武器投擲"と"銭投げ"はMissでも金額を消費するため上に。
return false if bool == false
# 特殊効果:防御能力の判定
if damage > 0 and self.guarding?
# 特殊効果:防御能力 2(強防御)
if battler_element_rank?(self, "防御能力") == 2
damage /= 2
self.damage -= damage
self.hp += damage
end
# 特殊効果:防御能力 1(無効防御)
if battler_element_rank?(self, "防御能力") == 1
self.hp += damage
damage = 0
self.damage = damage
end
end
# 特殊効果:必殺確実クリティカル
if (skill != nil and skill_element_include?(skill, ELEMENT_NAME_CRITICAL_HIT)) or
(skill == nil and equip_weapon_element_include?(user, ELEMENT_NAME_CRITICAL_HIT)) and damage > 0
if self.critical
self.critical = false
damage /= 2
self.damage -= damage
self.hp += damage
end
if @one == nil or rand(100) < @one.to_i
self.critical = true
self.hp -= damage
damage *= 2
self.damage = damage
end
end
# 特殊効果:使用者の 最大HP - 現在HP 固定ダメージ
if skill != nil and skill_element_include?(skill, "固定HP差分")
self.hp += damage
damage = user.maxhp - user.hp
self.damage = damage
self.hp -= self.damage
self.critical = false # 固定ダメージ故クリティカルを禁止
end
# 特殊効果:使用者の 現在HP 固定ダメージ
if skill != nil and skill_element_include?(skill, "现在HP损伤")
self.hp += damage
damage = user.hp
self.damage = damage
self.hp -= self.damage
self.critical = false # 固定ダメージ故クリティカルを禁止
end
# 特殊効果:現在HPに順ずる固定ダメージ
if skill != nil and skill_element_include?(skill, "固定现在HP")
self.hp += damage
damage = self.hp * skill.variance / 100 + skill.power
damage *= -1 if skill.power < 0
self.damage = damage
self.hp -= self.damage
self.critical = false # 固定ダメージ故クリティカルを禁止
end
# 特殊効果:最大HPに順ずる固定ダメージ
if skill != nil and skill_element_include?(skill, "固定最大HP")
self.hp += damage
damage = self.maxhp * @one.to_i / 100
damage *= -1 if skill.power < 0
self.damage = damage
self.hp -= self.damage
self.critical = false # 固定ダメージ故クリティカルを禁止
end
# 特殊効果:HPではなくSPにダメージを与える
if (skill != nil and skill_element_include?(skill, ELEMENT_NAME_SP_DAMAGE)) or
(skill == nil and equip_weapon_element_include?(user, ELEMENT_NAME_SP_DAMAGE))
self.hp += damage
self.sp -= damage
self.damage = "SP " + damage.to_s
# このタイミングで戦闘不能判定
@hp0_ban = false
self.sp = self.sp
real_damage = last_sp - self.sp
else
# このタイミングで戦闘不能判定
@hp0_ban = false
self.hp = self.hp
real_damage = last_hp - self.hp
end
# 使用者のHP/SPもリセット
user.hp = user.hp
user.sp = user.sp
# 特殊効果:与えたダメージを自分のHPとして吸収
if (skill != nil and skill_element_include?(skill, ELEMENT_NAME_HP_DRAIN)) or
(skill == nil and equip_weapon_element_include?(user, ELEMENT_NAME_HP_DRAIN))
user.damage = -real_damage * @one.to_i / 100
user.hp -= user.damage
end
# 特殊効果:与えたダメージを自分のSPとして吸収
if (skill != nil and skill_element_include?(skill, ELEMENT_NAME_SP_DRAIN)) or
(skill == nil and equip_weapon_element_include?(user, ELEMENT_NAME_SP_DRAIN))
user.damage = -real_damage * @one.to_i / 100
user.sp -= user.damage
user.damage = "SP " + user.damage.to_s
end
return true
end
#--------------------------------------------------------------------------
# ● バトラーの指定名の属性のランクを判定
#--------------------------------------------------------------------------
def battler_element_rank?(battler, element_name)
for i in 1..$data_system.elements.size
if $data_system.elements[i] == element_name
if self.is_a?(Game_Actor)
return $data_classes[battler.class_id].element_ranks[i]
else
return $data_enemies[battler.id].element_ranks[i]
end
end
end
return 3
end
#--------------------------------------------------------------------------
# ● MaxHP の取得
#--------------------------------------------------------------------------
alias xrxs19_maxhp maxhp
def maxhp
if !@metamor_target.nil?
return @metamor_target.maxhp
end
xrxs19_maxhp
end
#--------------------------------------------------------------------------
# ● MaxSP の取得
#--------------------------------------------------------------------------
alias xrxs19_maxsp maxsp
def maxsp
if !@metamor_target.nil?
return @metamor_target.maxsp
end
xrxs19_maxsp
end
#--------------------------------------------------------------------------
# ● 腕力の取得
#--------------------------------------------------------------------------
alias xrxs19_str str
def str
if !@metamor_target.nil?
return @metamor_target.str
end
xrxs19_str
end
#--------------------------------------------------------------------------
# ● 器用さの取得
#--------------------------------------------------------------------------
alias xrxs19_dex dex
def dex
if !@metamor_target.nil?
return @metamor_target.dex
end
xrxs19_dex
end
#--------------------------------------------------------------------------
# ● 素早さの取得
#--------------------------------------------------------------------------
alias xrxs19_agi agi
def agi
if !@metamor_target.nil?
return @metamor_target.agi
end
xrxs19_agi
end
#--------------------------------------------------------------------------
# ● 魔力の取得
#--------------------------------------------------------------------------
alias xrxs19_int int
def int
if !@metamor_target.nil?
return @metamor_target.int
end
xrxs19_int
end
#--------------------------------------------------------------------------
# ● 攻撃力の取得
#--------------------------------------------------------------------------
alias xrxs19_atk atk
def atk
if !@metamor_target.nil?
return @metamor_target.atk
end
xrxs19_atk
end
#--------------------------------------------------------------------------
# ● 物理防御の取得
#--------------------------------------------------------------------------
alias xrxs19_pdef pdef
def pdef
if !@metamor_target.nil?
return @metamor_target.pdef
end
xrxs19_pdef
end
#--------------------------------------------------------------------------
# ● 魔法防御の取得
#--------------------------------------------------------------------------
alias xrxs19_mdef mdef
def mdef
if !@metamor_target.nil?
return @metamor_target.mdef
end
xrxs19_mdef
end
#--------------------------------------------------------------------------
# ● 回避修正の取得
#--------------------------------------------------------------------------
alias xrxs19_eva eva
def eva
if !@metamor_target.nil?
return @metamor_target.eva
end
xrxs19_eva
end
end
#==============================================================================
# ■ Game_BattleAction
#==============================================================================
class Game_BattleAction
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :speed_priority # スピード優先度
attr_accessor :weapon_id # 武器 ID
attr_accessor :basic_ex # 基本拡張(補助的に数値を保持)
#--------------------------------------------------------------------------
# ● クリア
#--------------------------------------------------------------------------
alias xrxs19_clear clear
def clear
@weapon_id = 0
xrxs19_clear
end
#--------------------------------------------------------------------------
# ● スキルの優先度取得
#--------------------------------------------------------------------------
def speed_priority
if @kind == 0 and @basic == 0
# 通常攻撃の場合
elsif @kind == 1
# スキルの場合
return 0 if $data_skills[@skill_id] == nil
for i in $data_skills[@skill_id].element_set
if $data_system.elements[i] != nil
if $data_system.elements[i] =~ /^#{ELEMENT_NAME_SPEED_PRIORITY}([+-]?[0-9]+)/
return $1.to_i
end
end
end
end
return 0
end
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● セットアップ
#--------------------------------------------------------------------------
alias xrxs19_setup setup
def setup(actor_id)
xrxs19_setup(actor_id)
@reraised = false
@reraise_state = 0
@metamor_target = nil
@battler_name_original = @battler_name
end
#--------------------------------------------------------------------------
# ● MaxHP の取得
#--------------------------------------------------------------------------
alias xrxs19_maxhp maxhp
def maxhp
if !@metamor_target.nil?
return @metamor_target.maxhp
end
xrxs19_maxhp
end
#--------------------------------------------------------------------------
# ● スキルの使用可能判定
#--------------------------------------------------------------------------
alias xrxs19_skill_can_use? skill_can_use?
def skill_can_use?(skill_id)
# スキルを取得
@skill = $data_skills[skill_id]
# HP消費スキルの場合
if skill_element_include?(@skill, ELEMENT_NAME_HP_COST) and @actor_id > 0
# HP が足りない場合は使用不可
if $data_skills[skill_id].sp_cost > self.hp
return false
end
# SP消費量を回復させ、SP が足りない場合を回避(最大値を超えて回復)
self.hp0_ban = true
self.sp += @skill.sp_cost
bool = xrxs19_skill_can_use?(skill_id)
# SPを元に戻す
self.sp -= @skill.sp_cost
self.hp0_ban = false
return bool
else
return xrxs19_skill_can_use?(skill_id)
end
end
end
#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias xrxs19_initialize initialize
def initialize(troop_id, member_index)
xrxs19_initialize(troop_id, member_index)
@reraised = false
@reraise_state = 0
@metamor_target = nil
@battler_name_original = @battler_name
end
end
#==============================================================================
# ■ Window_Item
#==============================================================================
class Window_Item < Window_Selectable
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias xrxs19_initialize initialize
def initialize
xrxs19_initialize
refresh
end
#--------------------------------------------------------------------------
# ● 値の受け渡し
#--------------------------------------------------------------------------
def set_itemkind(itemkind)
@itemkind = itemkind
refresh
end
#--------------------------------------------------------------------------
# ● 値の受け渡し
#--------------------------------------------------------------------------
def set_restrict(restrict)
@restrict = restrict
refresh
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
alias xrxs19_refresh refresh
def refresh
if @itemkind != 11
xrxs19_refresh
return
end
# 11 = 制限:投擲武器のみ
if self.contents != nil
self.contents.dispose
self.contents = nil
end
@data = []
@data_id = []
for i in 1...$data_weapons.size
if $game_party.weapon_number(i) > 0
@data.push($data_weapons[i]) if weapon_element_include?(i, "投掷威力")
end
end
# 項目数が 0 でなければビットマップを作成し、全項目を描画
@item_max = @data.size
if @item_max > 0
self.contents = Bitmap.new(width - 32, row_max * 32)
for i in 0...@item_max
draw_item(i)
end
end
end
#--------------------------------------------------------------------------
# ● 項目の描画
#--------------------------------------------------------------------------
alias xrxs19_draw_item draw_item
def draw_item(index)
if @itemkind != 11
xrxs19_draw_item(index)
return
end
# 11 = 制限:投擲武器のみ
item = @data[index]
number = $game_party.weapon_number(item.id)
self.contents.font.color = normal_color
x = 4 + index % @column_max * (288 + 32)
y = index / @column_max * 32
rect = Rect.new(x, y, self.width / @column_max - 32, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
bitmap = RPG::Cache.icon(item.icon_name)
opacity = self.contents.font.color == normal_color ? 255 : 128
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ● メイン処理
#--------------------------------------------------------------------------
alias xrxs19_main main
def main
@phase4_5_done = false
xrxs19_main
end
#--------------------------------------------------------------------------
# ● フレーム更新 (アクターコマンドフェーズ)
#--------------------------------------------------------------------------
alias xrxs19_update_phase3 update_phase3
def update_phase3
# 武器のみアイテムウィンドウが有効の場合
if @item_window_weapons != nil and @item_window_weapons.visible
update_phase3_item_window_weapons
return
end
# 他
xrxs19_update_phase3
end
#--------------------------------------------------------------------------
# ● フレーム更新 (アクターコマンドフェーズ : スキル選択)
#--------------------------------------------------------------------------
alias xrxs19_update_phase3_skill_select update_phase3_skill_select
def update_phase3_skill_select
# C ボタンが押された場合
if Input.trigger?(Input::C)
# スキルウィンドウで現在選択されているデータを取得
@skill = @skill_window.skill
if skill_element_include?(@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
# アイテム選択へ移行する
start_item_select_from_skill(@one.to_i)
return
end
end
xrxs19_update_phase3_skill_select
end
#--------------------------------------------------------------------------
# ● フレーム更新 (アクターコマンドフェーズ : 武器のみアイテム選択)
#--------------------------------------------------------------------------
def update_phase3_item_window_weapons
# 武器アイテムウィンドウを可視状態にする
@item_window_weapons.visible = true
# 武器アイテムウィンドウを更新
@item_window_weapons.update
# B ボタンが押された場合
if Input.trigger?(Input::B)
# キャンセル SE を演奏
$game_system.se_play($data_system.cancel_se)
# 武器アイテムの選択を終了
end_item_select_from_skill
return
end
# C ボタンが押された場合
if Input.trigger?(Input::C)
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
# アイテムウィンドウで現在選択されているデータを取得
@item = @item_window_weapons.item
# アクションを設定
@active_battler.current_action.basic = @item.id
if $xrxs24_weapon_property_system_work
# アイテムウィンドウで現在選択されているデータを取得
@item_room_no = @item_window_weapons.item_room_no
# アクションを設定
@active_battler.current_action.basic_ex = @item_room_no
end
# 武器のみアイテムウィンドウを不可視化
@item_window_weapons.visible = false
# 効果範囲が敵単体の場合
if @skill.scope == 1
# エネミーの選択を開始
start_enemy_select
# 効果範囲が味方単体の場合
elsif @skill.scope == 3 or @skill.scope == 5
# アクターの選択を開始
start_actor_select
# 効果範囲が単体ではない場合
else
# アイテムの選択を終了
end_item_select_from_skill
# 次のアクターのコマンド入力へ
phase3_next_actor
end
return
end
end
#--------------------------------------------------------------------------
# ● スキルからのアイテム選択開始
#--------------------------------------------------------------------------
def start_item_select_from_skill(restrict = 0)
# 投擲アイテムウィンドウを作成 ( 武器のみ:投擲可能のみ )
@item_window_weapons = Window_Item.new
if restrict == 1
@item_window_weapons.set_itemkind(11)
else
@item_window_weapons.set_itemkind(1)
end
# ヘルプウィンドウを関連付け
@item_window_weapons.help_window = @help_window
# スキルウィンドウを無効化
@skill_window.active = false
@skill_window.visible = false
end
#--------------------------------------------------------------------------
# ● スキルからのアイテム選択終了
#--------------------------------------------------------------------------
def end_item_select_from_skill
# 武器のみアイテムウィンドウを解放
@item_window_weapons.dispose
@item_window_weapons = nil
# ヘルプウィンドウを隠す
@help_window.visible = false
# スキルウィンドウを有効化
@skill_window.active = true
@skill_window.visible = true
end
#--------------------------------------------------------------------------
# ● エネミー選択開始
#--------------------------------------------------------------------------
alias xrxs19_start_enemy_select start_enemy_select
def start_enemy_select
return if start_select_check
xrxs19_start_enemy_select
end
#--------------------------------------------------------------------------
# ● アクター選択開始
#--------------------------------------------------------------------------
alias xrxs19_start_actor_select start_actor_select
def start_actor_select
return if start_select_check
xrxs19_start_actor_select
end
#--------------------------------------------------------------------------
# ● 選択開始時のチェック
#--------------------------------------------------------------------------
def start_select_check
# "全体化"、"全域化"、"対象ランダム"の判定
case @active_battler.current_action.kind
when 0 # 攻撃
# ここで「攻撃」使用者の武器IDを保持しておく
@active_battler.current_action.weapon_id = @active_battler.weapon_id
# チェックに戻る
if equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_ENEMY_ALL) or
equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_WHOLE) or
equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_ENEMY_RAND) or
equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_ACTOR_RAND) or
equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_ALL_RANDOM)
phase3_next_actor
return true
end
when 1 # スキル
if skill_element_include?(@skill, ELEMENT_NAME_AREA_ENEMY_ALL) or
skill_element_include?(@skill, ELEMENT_NAME_AREA_WHOLE) or
skill_element_include?(@skill, ELEMENT_NAME_AREA_ENEMY_RAND) or
skill_element_include?(@skill, ELEMENT_NAME_AREA_ACTOR_RAND) or
skill_element_include?(@skill, ELEMENT_NAME_AREA_ALL_RANDOM)
end_skill_select
phase3_next_actor
return true
end
when 2 # アイテム
if item_element_include?(@item, ELEMENT_NAME_AREA_ENEMY_ALL) or
item_element_include?(@item, ELEMENT_NAME_AREA_WHOLE) or
item_element_include?(@item, ELEMENT_NAME_AREA_ENEMY_RAND) or
item_element_include?(@item, ELEMENT_NAME_AREA_ACTOR_RAND) or
item_element_include?(@item, ELEMENT_NAME_AREA_ALL_RANDOM)
end_item_select
phase3_next_actor
return true
end
end
return false
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 1 : アクション準備)
#--------------------------------------------------------------------------
alias xrxs19_update_phase4_step1 update_phase4_step1
def update_phase4_step1
# 初期化
@phase4_act_continuation = 0
@phase4_act_times_max = 1
@skill = nil
@weapon_id = nil
# 戻す
xrxs19_update_phase4_step1
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始)
#--------------------------------------------------------------------------
alias xrxs19_update_phase4_step2 update_phase4_step2
def update_phase4_step2
#リレイズ判定
next_phase_ok = true
next_phase_ok = update_reraise_effect(@active_battler)
if !next_phase_ok
return
end
if next_phase_ok
# ステップ 2 へ
xrxs19_update_phase4_step2
end
end
#--------------------------------------------------------------------------
# ● 基本アクション 結果作成
#--------------------------------------------------------------------------
alias xrxs19_make_basic_action_result make_basic_action_result
def make_basic_action_result
# 攻撃の場合
if @active_battler.current_action.basic == 0
# 武器IDの取得
@weapon_id = @active_battler.is_a?(Game_Actor) ? @active_battler.weapon_id : 0
# 指定行動回数取得 ( "行動回数"が無い場合は 1 のまま )
weapon_element_include?(@weapon_id, ELEMENT_NAME_MOVE_TIMES)
@phase4_act_times_max = @one.to_i if @one != nil
# アニメーション ID を設定
@animation1_id = @active_battler.animation1_id
@animation2_id = @active_battler.animation2_id
# 初期化
@target_battlers = []
# 対象側バトラーの配列を設定
# "全体化"の判定
if equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_ENEMY_ALL)
# 行動側バトラーがエネミーの場合
if @active_battler.is_a?(Game_Enemy)
if @active_battler.restriction == 3
@target_battlers = $game_troop.enemies
else
@target_battlers = $game_party.actors
end
end
# 行動側バトラーがアクターの場合
if @active_battler.is_a?(Game_Actor)
if @active_battler.restriction == 3
@target_battlers = $game_party.actors
else
@target_battlers = $game_troop.enemies
end
end
end
# "敵ランダム"の判定
if equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_ENEMY_RAND)
# 行動側バトラーがエネミーの場合
if @active_battler.is_a?(Game_Enemy)
if @active_battler.restriction == 3
tb_array = $game_troop.enemies
else
tb_array = $game_party.actors
end
end
# 行動側バトラーがアクターの場合
if @active_battler.is_a?(Game_Actor)
if @active_battler.restriction == 3
tb_array = $game_party.actors
else
tb_array = $game_troop.enemies
end
end
@target_battlers = [tb_array[rand(tb_array.size)]]
end
# "味方ランダム"の判定
if equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_ACTOR_RAND)
# 行動側バトラーがエネミーの場合
if @active_battler.is_a?(Game_Enemy)
if @active_battler.restriction == 3
tb_array = $game_party.actors
else
tb_array = $game_troop.enemies
end
end
# 行動側バトラーがアクターの場合
if @active_battler.is_a?(Game_Actor)
if @active_battler.restriction == 3
tb_array = $game_troop.enemies
else
tb_array = $game_party.actors
end
end
@target_battlers = [tb_array[rand(tb_array.size)]]
end
# "全域化"の判定
if equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_WHOLE)
@target_battlers = $game_party.actors + $game_troop.enemies
end
# "対象ランダム"の判定
if equip_weapon_element_include?(@active_battler, ELEMENT_NAME_AREA_ALL_RANDOM)
tb_array = $game_party.actors + $game_troop.enemies
@target_battlers = [tb_array[rand(tb_array.size)]]
end
if @target_battlers.size > 0
##かばう追加
get_target_battlers_after_cover!(@target_battlers, @active_battler)
# 通常攻撃の効果を適用
for target in @target_battlers
target.attack_effect(@active_battler)
end
return
end
end
xrxs19_make_basic_action_result
end
#--------------------------------------------------------------------------
# ● スキルまたはアイテムの対象側バトラー設定
#--------------------------------------------------------------------------
alias xrxs19_set_target_battlers set_target_battlers
def set_target_battlers(scope)
case @active_battler.current_action.kind
when 1
# "全体化"の判定
if skill_element_include?(@skill, ELEMENT_NAME_AREA_ENEMY_ALL)
scope = 2
return
end
# "全域化"の判定
scope = 8 if skill_element_include?(@skill, ELEMENT_NAME_AREA_WHOLE)
# "敵ランダム"の判定
scope = 9 if skill_element_include?(@skill, ELEMENT_NAME_AREA_ENEMY_RAND)
# "味方ランダム"の判定
scope =10 if skill_element_include?(@skill, ELEMENT_NAME_AREA_ACTOR_RAND)
# "対象ランダム"の判定
scope =11 if skill_element_include?(@skill, ELEMENT_NAME_AREA_ALL_RANDOM)
when 2
# "全体化"の判定
if item_element_include?(@item, ELEMENT_NAME_AREA_ENEMY_ALL)
scope = 2
return
end
# "全域化"の判定
scope = 8 if item_element_include?(@item, ELEMENT_NAME_AREA_WHOLE)
# "敵ランダム"の判定
scope = 9 if item_element_include?(@item, ELEMENT_NAME_AREA_ENEMY_RAND)
# "味方ランダム"の判定
scope =10 if item_element_include?(@item, ELEMENT_NAME_AREA_ACTOR_RAND)
# "対象ランダム"の判定
scope =11 if item_element_include?(@item, ELEMENT_NAME_AREA_ALL_RANDOM)
end
case scope
when 8
@target_battlers = $game_party.actors + $game_troop.enemies
return
when 9
# 行動側バトラーがエネミーの場合
if @active_battler.is_a?(Game_Enemy)
tb_array = $game_party.actors
end
# 行動側バトラーがアクターの場合
if @active_battler.is_a?(Game_Actor)
tb_array = $game_troop.enemies
end
@target_battlers = [tb_array[rand(tb_array.size)]]
return
when 10
# 行動側バトラーがエネミーの場合
if @active_battler.is_a?(Game_Enemy)
tb_array = $game_troop.enemies
end
# 行動側バトラーがアクターの場合
if @active_battler.is_a?(Game_Actor)
tb_array = $game_party.actors
end
@target_battlers = [tb_array[rand(tb_array.size)]]
return
when 11
tb_array = $game_party.actors + $game_troop.enemies
@target_battlers = [tb_array[rand(tb_array.size)]]
return
end
# 呼び戻す
xrxs19_set_target_battlers(scope)
##追加
get_target_battlers_after_cover!(@target_battlers, @active_battler)
end
#--------------------------------------------------------------------------
# ● スキルアクション 結果作成
#--------------------------------------------------------------------------
alias xrxs19_make_skill_action_result make_skill_action_result
def make_skill_action_result
# スキルを取得
@skill = $data_skills[@active_battler.current_action.skill_id]
# 既に一回以上行動している場合
if @phase4_act_continuation >= 1
# SP消費分のSPを回復させて擬似的にSPを減らさない
@active_battler.sp += @skill.sp_cost
else
# 指定行動回数取得
skill_element_include?(@skill, ELEMENT_NAME_MOVE_TIMES)
@phase4_act_times_max = @one.to_i if @one != nil
# 特殊効果:消費金額に順ずる固定ダメージ
if skill_element_include?(@skill, "金钱投掷")
# ゴールドウィンドウを作成
if @gold_window == nil or @gold_window.visible == false
@gold_window = Window_Gold.new
@gold_window.x = 640 - @gold_window.width
@gold_window.y = 64
@gold_window.opacity = 160
@gold_window.visible = true
end
end
# HP消費スキルの場合
if skill_element_include?(@skill, ELEMENT_NAME_HP_COST)
# HPが足りるか判定
if @active_battler.hp <= @skill.sp_cost
# 足りない場合
# ステップ 1 に移行
@phase4_step = 1
return
end
# SP消費分のSPを回復させて擬似的にSPを減らさない(最大値を超えて回復)
@active_battler.hp0_ban = true
@active_battler.sp += @skill.sp_cost
# 戻す
xrxs19_make_skill_action_result
# HPを消費
@active_battler.hp -= @skill.sp_cost
# HP/SPの制限の解除
@active_battler.hp0_ban = false
return
end
end
xrxs19_make_skill_action_result
##追加
make_cover_skill_action_result()
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 3 : 行動側アニメーション)
#--------------------------------------------------------------------------
alias xrxs19_update_phase4_step3 update_phase4_step3
def update_phase4_step3
# 既に一回以上行動している場合
if @phase4_act_continuation >= 1
# ステップ 4 に移行
@phase4_step = 4
@wait_count = 0
return
end
xrxs19_update_phase4_step3
# ちからためメッセージ表示。
for target in @target_battlers
if !target.action_message.nil?
@help_window.set_text(target.action_message, 1)
target.action_message = nil
end
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 4 : 対象側アニメーション)
#--------------------------------------------------------------------------
alias xrxs19_update_phase4_step4 update_phase4_step4
def update_phase4_step4
# 武器投擲時、「武器のアニメーション」を対象に使う
if skill_element_include?(@skill, "武器投掷")
@animation2_id = $data_weapons[@active_battler.current_action.basic].animation2_id
end
# ゴールドウィンドウを更新
@gold_window.refresh if @gold_window != nil
if skill_element_include?(@skill, "变身")
tb_array = @target_battlers
@target_battlers = [@active_battler]
xrxs19_update_phase4_step4
@target_battlers = tb_array
else
xrxs19_update_phase4_step4
end
# かばわれたメンバーのアニメーション
for target in @target_battlers
if target.current_friend != nil
target.current_friend.animation_id = COVER_ANIMATION_ID
end
end
# 既に一回以上行動している場合
if @phase4_act_continuation >= 1
@wait_count = 0
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示)
#--------------------------------------------------------------------------
alias xrxs19_update_phase4_step5 update_phase4_step5
def update_phase4_step5
# 呼び戻す
xrxs19_update_phase4_step5
# かばわれたメンバーのダメージ
for target in @target_battlers
if target.current_friend != nil
target.current_friend.damage_pop = true
#かばっている状態の初期化
target.current_friend = nil
end
end
# 生存確認
target_still_left = false
for target in @target_battlers
# ターゲットが生き残っているか判別
target_still_left = true if !target.dead?
# 戦闘不能時で、変身を解除
if target.dead? and target.metamor_target != nil
target.animation_id = 17 # 戦闘不能変身解除時のアニメーションID
target.animation_hit = true
target.battler_name = target.battler_name_original
target.metamor_target = nil
end
end
# ダメージ表示
if @active_battler.damage != nil
@active_battler.damage_pop = true
end
# 変身対象のバトラーグラフィックをコピー
if skill_element_include?(@skill, "变身")
if @active_battler.metamor_target != nil
@active_battler.battler_name = @active_battler.metamor_target.battler_name
else
@active_battler.battler_name = @active_battler.battler_name_original
end
end
# ターゲットの敵への処理
for target in @target_battlers
# スティール結果メッセージ表示。ただし、複数ターゲットの表示は不可能
if !target.effect_message.nil?
@help_window.set_text(target.effect_message, 1)
target.effect_message = nil
end
end
# 行動した回数のカウントを 1 加算
@phase4_act_continuation += 1
# 実行済み行動回数が、指定行動回数に達したかを判別
if @phase4_act_continuation < @phase4_act_times_max
# 達していない場合
# 生存している場合、続ける。
if target_still_left
# 指定行動回数に満たない場合は繰り返す為、ステップ 2 に移行
@phase4_step = 2
@wait_count = 0
# スキル使用中の場合はヘルプウィンドウを隠すのをやめる
if @active_battler.current_action.kind == 1
@help_window.visible = true
end
end
else
# 達した場合
# 敵が生存、かつ skillが"派生"属性を持つ場合
if target_still_left and
(skill_element_include?(@skill, ELEMENT_NAME_DERIVER) or
(@weapon_id != nil and equip_weapon_element_include?(@active_battler, ELEMENT_NAME_DERIVER)))
if @one.to_i > 0
# 回数をリセット
@phase4_act_continuation = 0
@phase4_act_times_max = 1
# 武器攻撃ではなくなるため @weapon_id を nil 化
@weapon_id = nil
# 新しいスキルID
@active_battler.current_action.kind = 1
@active_battler.current_action.skill_id = @one.to_i
# ステップ 2 に移行
@phase4_step = 2
@wait_count = 0
end
end
end
# ゴールドウィンドウを隠す
@gold_window.visible = false if @gold_window != nil
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 6 : リレイズ表示→リフレッシュ)
#--------------------------------------------------------------------------
alias xrxs19_update_phase4_step6 update_phase4_step6
def update_phase4_step6
next_phase_ok = true
#リレイズ判定
for enemy in $game_troop.enemies
next_phase_ok = update_reraise_effect(enemy)
if !next_phase_ok
return
end
end
for actor in $game_party.actors
next_phase_ok = update_reraise_effect(actor)
if !next_phase_ok
return
end
end
if next_phase_ok
xrxs19_update_phase4_step6
end
end
#===================================================
#リレイズエフェクト
#===================================================
def update_reraise_effect(battler)
if battler.reraised
case battler.reraise_state
when 0
battler.reraise_state = 1 # コラプス待ち
@wait_count = 16
return false
when 1
battler.reraise_state = 2 # 復活アニメーション
##IDは好きなアニメーションIDを指定
battler.animation_id = RERAISE_ANIMATION_ID
@wait_count = 8
return false#
when 2
#復活処理
battler.hp = battler.maxhp * RERAISE_HP_PERCENT / 100 + RERAISE_HP
battler.reraise_state = 3 #アピアーアニメーション
@wait_count = 8
return false#
when 3
battler.reraise_state = 0 #終了?通常処理に戻る
battler.reraised = false #フラグを初期値へ
@status_window.refresh
return true
end
else
return true
end
end
#--------------------------------------------------------------------------
# ● アフターバトルフェーズ開始
#--------------------------------------------------------------------------
alias xrxs19_update_phase5 update_phase5
def update_phase5
next_phase_ok = false
# 次のアクターへ
@phase5_i = -1 if @phase5_i == nil
@phase5_i += 1
if @phase5_i < $game_party.actors.size
actor = $game_party.actors[@phase5_i]
# 変身状態の味方がいるか判別し、それを解除する
if actor.metamor_target != nil
actor.animation_id = 17 # 戦闘終了変身解除時のアニメーションID
actor.animation_hit = true
actor.battler_name = actor.battler_name_original
actor.metamor_target = nil
# ステータスウィンドウをリフレッシュ
@status_window.refresh
# アニメーションの長さにかかわらず、最低 4 フレーム待つ
@wait_count = 4
end
else
next_phase_ok = true
end
if next_phase_ok
xrxs19_update_phase5
end
end
#--------------------------------------------------------------------------
# ● 行動順序作成
#--------------------------------------------------------------------------
alias xrxs19_make_action_orders make_action_orders
def make_action_orders
xrxs19_make_action_orders
# 優先度の大きい順 (同値の場合は素早さの速い順) に並び替え
@action_battlers.sort! do |a, b|
if a.current_action.speed_priority > b.current_action.speed_priority
-1
elsif a.current_action.speed_priority < b.current_action.speed_priority
+1
elsif a.current_action.speed > b.current_action.speed
-1
elsif a.current_action.speed < b.current_action.speed
+1
else
0 # a <=> b
end
end
end
#--------------------------------------------------------------------------
# ● バトル終了
#--------------------------------------------------------------------------
alias xrxs19_battle_end battle_end
def battle_end(result)
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
# 変身状態の味方がいるか判別し、それを解除する
if actor.metamor_target != nil
actor.battler_name = actor.battler_name_original
actor.metamor_target = nil
end
end
xrxs19_battle_end(result)
end
end
#=============================================================================
# ◇ スティール
#=============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :effect_message
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias before_steal_original_battler_initialize initialize
def initialize
before_steal_original_battler_initialize()
@effect_message = nil
@steal_skill_id = $data_system.elements.index(STEAL_SKILL_ELEMENT_NAME)
end
end
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias before_steal_original_enemy_initialize initialize
def initialize(troop_id, member_index)
before_steal_original_enemy_initialize(troop_id, member_index)
@item_possession = true
end
#===================================================
#
#===================================================
def name
name = $data_enemies[@enemy_id].name.split(/-/)[0]
if !name.nil?
return name = name.strip()
else
return ''
end
end
#===================================================
#ノーマルアイテムの指定
#エネミーネームに -n種類 ID 個数(-na 10 10) と入れて指定。
#種類は、i(アイテム) w(武器) a(防具)のいずれか一つ
#個数は省略可能、自動で1扱い。
#また、ドロップアイテムと同一にしたい場合は
#エネミーネームに -nd 個数(-nd 2) と入れて指定。
#個数は省略可能、自動で1扱い。
#===================================================
def normal_item
return get_item_from_name("n")#オプション"n"の文字列から取得
end
#===================================================
#レアアイテムの指定
#エネミーネームに -r種類 ID 個数(-na 10 10) と入れて指定。
#種類は、i(アイテム) w(武器) a(防具)のいずれか一つ
#個数は省略可能、自動で1扱い。
#また、ドロップアイテムと同一にしたい場合は
#エネミーネームに -rd 個数(-nd 2) と入れて指定。
#個数は省略可能、自動で1扱い。
#===================================================
def rare_item
return get_item_from_name("r")#オプション"r"の文字列から取得
end
#===================================================
#*Nameからアイテムを抜き出す処理
#===================================================
def get_item_from_name(opt)
names = $data_enemies[@enemy_id].name.split(/-/)
if names.size > 1
for i in 1...names.size
if names[i][0,1] != opt
next
end
names[i].sub!(/^.(.*)/){$1}
ary = names[i].split(/ /)
if ary[0][0,1] == "g"
cgy = "g"
id = 0
if ary[1].nil?
ary[1] = "1"
elsif ary[1].sub!(/^([0-9]+)/){$1}.nil?
ary[1] = "1"
end
possession = {"Category"=>cgy, "ID"=>id, "Num"=>ary[1].to_i}
return possession
elsif ary[0][0,1] == "d"
cgy = ""
id = 0
if self.item_id != 0
cgy = "i"
id = self.item_id
elsif self.weapon_id != 0
cgy = "w"
id = self.weapon_id
elsif self.armor_id != 0
cgy = "a"
id = self.armor_id
else
return nil
end
if ary[1].nil?
ary[1] = "1"
elsif ary[1].sub!(/^([0-9]+)/){$1}.nil?
ary[1] = "1"
end
possession = {"Category"=>cgy, "ID"=>id, "Num"=>ary[1].to_i}
return possession
elsif !ary[0].sub!(/^([iwa])/){$1}.nil? && !ary[1].sub!(/^([0-9]+)/){$1}.nil?
if ary[2].nil? || ary[2].sub!(/^([0-9]+)/){$1}.nil?
ary[2] = "1"
end
possession = {"Category"=>ary[0], "ID"=>ary[1].to_i, "Num"=>ary[2].to_i}
return possession
end
end
end
return nil
end
#===================================================
#スティールエフェクト
#===================================================
def steal_effect(user, skill) # 引数skillを追加
pos = self.normal_item
if !@item_possession || pos.nil?
@effect_message = "没有东西可偷。"
#self.damage = "Miss"
return false
end
#盗み成功判定 アジリティが同一で50%、2倍で100%
if rand(100) <= ((user.agi+0.01)/(self.agi+0.01))*100/2
r_pos = self.rare_item
#レアアイテム判定
if !r_pos.nil? && rand(10) <= 1
pos = r_pos
end
case pos["Category"]
when "i"
item = $data_items[pos["ID"]]
if item.nil?
print "这个物品不存在!"
return false
end
$game_party.gain_item(item.id, pos["Num"])
when "w"
item = $data_weapons[pos["ID"]]
if item.nil?
print "这个物品不存在!"
return false
end
$game_party.gain_weapon(item.id, pos["Num"])
when "a"
item = $data_armors[pos["ID"]]
if item.nil?
print "这个物品不存在!"
return false
end
$game_party.gain_armor(item.id, pos["Num"])
when "g"
# ゴールド獲得
$game_party.gain_gold(pos["Num"])
end
if pos["Category"] == "g"
@effect_message = "#{pos["Num"]}#{$data_system.words.gold}偷到!"
else
@effect_message = "#{item.name}#{pos["Num"]}个偷到!"
end
@item_possession = false
self.damage = "Steal!" if self.damage == "Miss"
return true
else
@effect_message = "没有东西可偷???"
#self.damage = "Miss
return false
end
return false # 念のためfalse返す処理追加
# 多分なくてもifの結果(false)が返ると思うけど…
end
end
#=============================================================================
# ■ ライブラ スキル実装スクリプト 2004/09/24 - 0.1α
#=============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 追加公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :libla_reserve # ライブラ予約
#--------------------------------------------------------------------------
# ● 初期化
#--------------------------------------------------------------------------
alias before_libra_initialize initialize
def initialize
before_libra_initialize
# 「ライブラ」属性のID取得
@libra_element_id = $data_system.elements.index(LIBLA_SKILL_ELEMENT_NAME)
@libra_element_id = 0 if @libra_element_id.nil?
# 今回の行動フェイズでライブラを受けたかどうかフラグ、初期化
@libla_reserve = false
end
#--------------------------------------------------------------------------
# ● スキルの効果適用
# user : 使用者 (バトラー)
# skill: スキル
#--------------------------------------------------------------------------
alias before_libra_skill_effect skill_effect
def skill_effect(user, skill)
#「ライブラ」スキルかどうかの判定。
if skill.element_set.include?(@libra_element_id)
# 命中率を適用する場合は下のif文のコメントを外してください
#if rand(100) < skill.hit
# このバトラーがエネミーなら情報ウィンドウを表示する
if self.is_a?(Game_Enemy)
self.libla_reserve = true
end
# 命中率を適用する場合は下のelse~endのコメントを外してください
#else
# self.damage = "Miss"
#end
# 普通のスキル判定は行わない。
return true
else
return before_libra_skill_effect(user, skill)
end
end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示)
#--------------------------------------------------------------------------
alias before_libra_update_phase4_step5 update_phase4_step5
def update_phase4_step5
# ダメージ表示
for target in @target_battlers
if target.libla_reserve
libra_window = Window_EnemyStatus.new(target)
loop do
# ゲーム画面を更新
Graphics.update
# 入力情報を更新
Input.update
# ボタンが押されたら情報ウィンドウを閉じてループを中断
if Input.trigger?(Input::C) or Input.trigger?(Input::B)
libra_window.dispose
libra_window = nil
break
end
end
end
# ライブラ予約フラグを解除
target.libla_reserve = false
end
before_libra_update_phase4_step5
end
end
#==============================================================================
# ■ Window_EnemyStatus
#------------------------------------------------------------------------------
# エネミーのステータスを表示するステータスウィンドウです。
#==============================================================================
class Window_EnemyStatus < Window_Base
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# enemy : エネミー
#--------------------------------------------------------------------------
def initialize(enemy)
super(0, 64, 640, 256)
self.contents = Bitmap.new(width - 32, height - 32)
self.back_opacity = 127
@enemy = enemy
refresh
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
self.contents.clear
draw_enemy_name(@enemy, 4, 0)
draw_enemy_state(@enemy, 4, 48)
draw_enemy_hp(@enemy,196, 48, 172)
draw_enemy_sp(@enemy,196, 72, 172)
draw_enemy_parameter(@enemy, 4, 120, 0)
draw_enemy_parameter(@enemy, 4, 144, 1)
draw_enemy_parameter(@enemy, 4, 168, 2)
draw_enemy_parameter(@enemy, 4, 192, 7)
draw_enemy_parameter(@enemy,196, 120, 3)
draw_enemy_parameter(@enemy,196, 144, 4)
draw_enemy_parameter(@enemy,196, 168, 5)
draw_enemy_parameter(@enemy,196, 192, 6)
self.contents.font.color = system_color
self.contents.draw_text(384, 24, 80, 32, "EXP")
self.contents.draw_text(384, 48, 80, 32, "金钱")
self.contents.draw_text(384, 96, 96, 32, "战利品")
self.contents.draw_text(384, 144, 96, 32, "偷窃物")
self.contents.font.color = normal_color
self.contents.draw_text(384 + 80, 24, 84, 32, @enemy.exp.to_s, 2)
self.contents.draw_text(384 + 80, 48, 84, 32, @enemy.gold.to_s, 2)
draw_item_name(get_enemy_item(@enemy,1), 384 + 16, 120)
draw_item_name(get_enemy_item(@enemy,2), 384 + 16, 168)
draw_item_name(get_enemy_item(@enemy,3), 384 + 16, 192)
end
#--------------------------------------------------------------------------
# ○ アイテムの取得
#--------------------------------------------------------------------------
def get_enemy_item( enemy, type )
case type
when 1:
if enemy.item_id != nil and enemy.item_id != 0
return $data_items[enemy.item_id]
elsif enemy.weapon_id != nil and enemy.weapon_id != 0
return $data_weapons[enemy.weapon_id]
elsif enemy.armor_id != nil and enemy.armor_id != 0
return $data_armors[enemy.armor_id]
else
return nil
end
when 2:
info = enemy.get_item_from_name("n")
return nil if info == nil
case info["Category"]
when "i"
return $data_items[info["ID"]]
when "w"
return $data_weapons[info["ID"]]
when "a"
return $data_armors[info["ID"]]
otherwise
return nil
end
when 3:
info = enemy.get_item_from_name("r")
return nil if info == nil
case info["Category"]
when "i"
return $data_items[info["ID"]]
when "w"
return $data_weapons[info["ID"]]
when "a"
return $data_armors[info["ID"]]
otherwise
return nil
end
otherwise
return nil
end
end
#--------------------------------------------------------------------------
# ● 名前の描画
# enemy : エネミー
# x : 描画先 X 座標
# y : 描画先 Y 座標
#--------------------------------------------------------------------------
def draw_enemy_name(enemy, x, y)
self.contents.font.color = normal_color
self.contents.draw_text(x, y, 120, 32, enemy.name)
end
#--------------------------------------------------------------------------
# ● ステートの描画
# enemy : エネミー
# x : 描画先 X 座標
# y : 描画先 Y 座標
# width : 描画先の幅
#--------------------------------------------------------------------------
def draw_enemy_state(enemy, x, y, width = 120)
text = make_battler_state_text(enemy, width, true)
self.contents.font.color = enemy.hp == 0 ? knockout_color : normal_color
self.contents.draw_text(x, y, width, 32, text)
end
#--------------------------------------------------------------------------
# ● HP の描画
# enemy : エネミー
# x : 描画先 X 座標
# y : 描画先 Y 座標
# width : 描画先の幅
#--------------------------------------------------------------------------
def draw_enemy_hp(enemy, x, y, width = 144)
# 文字列 "HP" を描画
self.contents.font.color = system_color
self.contents.draw_text(x, y, 32, 32, $data_system.words.hp)
# MaxHP を描画するスペースがあるか計算
if width - 32 >= 108
hp_x = x + width - 108
flag = true
elsif width - 32 >= 48
hp_x = x + width - 48
flag = false
end
# HP を描画
self.contents.font.color = enemy.hp == 0 ? knockout_color :
enemy.hp <= enemy.maxhp / 4 ? crisis_color : normal_color
self.contents.draw_text(hp_x, y, 48, 32, enemy.hp.to_s, 2)
# MaxHP を描画
if flag
self.contents.font.color = normal_color
self.contents.draw_text(hp_x + 48, y, 12, 32, "/", 1)
self.contents.draw_text(hp_x + 60, y, 48, 32, enemy.maxhp.to_s)
end
end
#--------------------------------------------------------------------------
# ● SP の描画
# enemy : エネミー
# x : 描画先 X 座標
# y : 描画先 Y 座標
# width : 描画先の幅
#--------------------------------------------------------------------------
def draw_enemy_sp(enemy, x, y, width = 144)
# 文字列 "SP" を描画
self.contents.font.color = system_color
self.contents.draw_text(x, y, 32, 32, $data_system.words.sp)
# MaxSP を描画するスペースがあるか計算
if width - 32 >= 108
sp_x = x + width - 108
flag = true
elsif width - 32 >= 48
sp_x = x + width - 48
flag = false
end
# SP を描画
self.contents.font.color = enemy.sp == 0 ? knockout_color :
enemy.sp <= enemy.maxsp / 4 ? crisis_color : normal_color
self.contents.draw_text(sp_x, y, 48, 32, enemy.sp.to_s, 2)
# MaxSP を描画
if flag
self.contents.font.color = normal_color
self.contents.draw_text(sp_x + 48, y, 12, 32, "/", 1)
self.contents.draw_text(sp_x + 60, y, 48, 32, enemy.maxsp.to_s)
end
end
#--------------------------------------------------------------------------
# ● パラメータの描画
# enemy : エネミー
# x : 描画先 X 座標
# y : 描画先 Y 座標
# type : パラメータの種類 (0~6)
#--------------------------------------------------------------------------
def draw_enemy_parameter(enemy, x, y, type)
case type
when 0
parameter_name = $data_system.words.atk
parameter_value = enemy.atk
when 1
parameter_name = $data_system.words.pdef
parameter_value = enemy.pdef
when 2
parameter_name = $data_system.words.mdef
parameter_value = enemy.mdef
when 3
parameter_name = $data_system.words.str
parameter_value = enemy.str
when 4
parameter_name = $data_system.words.dex
parameter_value = enemy.dex
when 5
parameter_name = $data_system.words.agi
parameter_value = enemy.agi
when 6
parameter_name = $data_system.words.int
parameter_value = enemy.int
when 7
parameter_name = "回避"
parameter_value = enemy.eva
end
self.contents.font.color = system_color
self.contents.draw_text(x, y, 120, 32, parameter_name)
self.contents.font.color = normal_color
self.contents.draw_text(x + 120, y, 36, 32, parameter_value.to_s, 2)
end
end
#=============================================================================
# ◇ ちからため スキル実装スクリプト by 和希
#=============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 追加公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :powerstock # 「ちからため」回数
attr_accessor :action_message # ヘルプウィンドウに表示する文字
#--------------------------------------------------------------------------
# ● 初期化
#--------------------------------------------------------------------------
alias before_powerstock_original_initialize initialize
def initialize
before_powerstock_original_initialize
@powerstock = 0
@powerstock_skill_id = $data_system.elements.index(POWERSTOCK_SKILL_ELEMENT_NAME)
@powerstock_skill_id = 0 if @powerstock_skill_id == nil
@effect_message = nil
end
#--------------------------------------------------------------------------
# ● 通常攻撃の効果適用
# attacker : 攻撃者 (バトラー)
#--------------------------------------------------------------------------
alias before_powerstock_original_attack_effect attack_effect
def attack_effect(attacker)
# 攻撃者が「ちからため」しているか?
if attacker.powerstock > 0
bool_powerstock = true
# 攻撃者の力を一時的に上昇させる
stock_attacker_str = attacker.str
attacker.str += ( stock_attacker_str * POWERSTOCK_BASE_RATE * attacker.powerstock ).to_i
# ヘルプメッセージに「ちからためx?」を出す
@action_message = POWERSTOCK_SKILL_ELEMENT_NAME
@action_message += " x"
@action_message += attacker.powerstock.to_s
# ストックを消す
attacker.powerstock = 0
else
bool_powerstock = false
end
# fukuyamaさん↓のミス発見ありがとうございました
result = before_powerstock_original_attack_effect(attacker)
# 力を上昇させていた場合、元に戻す
if bool_powerstock
attacker.str = stock_attacker_str
end
return result
end
#--------------------------------------------------------------------------
# ● スキルの効果適用
# user : 使用者 (バトラー)
# skill: スキル
#--------------------------------------------------------------------------
alias before_powerstock_original_skill_effect skill_effect
def skill_effect(user, skill)
#「ちからため」スキルかどうかの判定。
if skill.element_set.include?(@powerstock_skill_id)
# 命中率を適用する場合は下のif文のコメントを外してください
#if rand(100) < skill.hit
@powerstock += 1 # 「ちからため」回数を1増やす
# ダメージに"Charge"をセットする
self.damage = "Charge"
# 命中率を適用する場合は下のelse~endのコメントを外してください
#else
# self.damage = "Miss"
#end
# 普通のスキル判定は行わない。
return true
else
return before_powerstock_original_skill_effect(user, skill)
end
end
end
#=============================================================================
# ◇ 見切りステート by 和希
#=============================================================================
class Game_Battler
# 見切りステートの名前
ABANDONS_SKILL_STATE_NAME = "断念"
#--------------------------------------------------------------------------
# ● 通常攻撃の効果適用
#--------------------------------------------------------------------------
alias before_abandons_original_attack_effect attack_effect
def attack_effect(attacker)
# 見切りステートが存在するか?
if nil != (abandons_skill = get_abandons_id)
# 見切りステートにかかっているか?
if self.state?(abandons_skill)
## 避ける!
# クリティカルフラグをクリア
self.critical = false
# ダメージに "Avoid!!" を設定
self.damage = "Avoid!!"
# 見切りステートを解除
self.remove_state(abandons_skill,true)
# メソッド終了
return false
end
end
# 見切りステート状態でなかった時は通常どおり
return before_abandons_original_attack_effect(attacker)
end
#--------------------------------------------------------------------------
# ● 見切りステータスのID取得
#--------------------------------------------------------------------------
def get_abandons_id
result = nil
if @abandons_status_id == nil
for i in 1 ... $data_states.size
if $data_states[i].name[/\A#{ABANDONS_SKILL_STATE_NAME}\Z/]
result = $data_states[i].id
break
end
end
@abandons_status_id = ( result != nil ? result : 0 )
elsif @abandons_status_id > 0
result = @abandons_status_id
end
return result
end
end
#=============================================================================
# ◇ かばう by シムナフ
#=============================================================================
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
#追加
attr_reader :active_battler
#ここまで
##新メソッド
def make_cover_skill_action_result
cover_num = 0
cover_bool = false
for i in @skill.element_set
if !($data_system.elements[i][/^#{ELEMENT_NAME_COVER}/].nil?)
cover_bool = true
elm_num = $data_system.elements[i][/([+-]*[0-9]+)/]
if !(elm_num.nil?)
cover_num += elm_num.to_i
end
end
end
if cover_bool.equal?(true)
##自分のみが対象だった場合は味方からランダムに1人をかばう
if @target_battlers.include?(@active_battler)
if @target_battlers.size == 1
if @target_battlers[0].is_a?(Game_Actor)
friends = $game_party.actors.dup
friends.delete(@active_battler)
@target_battlers = [friends[rand(friends.size)]]
elsif @target_battlers[0].is_a?(Game_Enemy)
friends = $game_troop.enemies.dup
friends.delete(@active_battler)
@target_battlers = [friends[rand(friends.size)]]
end
else
@target_battlers.delete(@active_battler)
end
end
@active_battler.covered_friends = @target_battlers.dup
@active_battler.add_state(get_cover_state_id())##ステート付加時にデフォルト回数で発動回数が設定される
if (cover_num > 0)
@active_battler.cover_remain = cover_num#発動回数が有った場合はその回数で上書き
end
for target in @target_battlers
target.damage = COVER_EFFECT_CHAR
end
end
end
##ここまで
end
class Game_Party
##追加エイリアス
include Cover_Module
#--------------------------------------------------------------------------
# ● 対象アクターのスムーズな決定
# actor_index : アクターインデックス
#--------------------------------------------------------------------------
alias before_cover_original_smooth_target_actor smooth_target_actor
def smooth_target_actor(actor_index)
if $scene.is_a?(Scene_Battle)
battler = $scene.active_battler()
else
battler = nil
end
target = [before_cover_original_smooth_target_actor(actor_index)]
get_target_battlers_after_cover!(target, battler)
return target[0]
end
##ここまで
end
class Game_Troop
##追加エイリアス
include Cover_Module
#--------------------------------------------------------------------------
# ● 対象エネミーのスムーズな決定
# enemy_index : エネミーインデックス
#--------------------------------------------------------------------------
alias before_cover_original_smooth_target_enemy smooth_target_enemy
def smooth_target_enemy(enemy_index)
if $scene.is_a?(Scene_Battle)
battler = $scene.active_battler()
else
battler = nil
end
target = [before_cover_original_smooth_target_enemy(enemy_index)]
get_target_battlers_after_cover!(target, battler)
return target[0]
end
##ここまで
end
#==============================================================================
# ◇ 付加属性名称判定モジュール
#==============================================================================
module Check_ElementName_Set
#--------------------------------------------------------------------------
# ● スキルが指定名の属性を持つか判定
#--------------------------------------------------------------------------
def skill_element_include?(skill, element_name)
@one = @two = nil
return false if skill == nil or !skill.is_a?(RPG::Skill)
for i in skill.element_set
if $data_system.elements[i] =~ /#{element_name}([+-]?[0-9]+)?(%)?/
@one = $1
@two = $2
return true
end
end
return false
end
#--------------------------------------------------------------------------
# ● アイテムが指定名の属性を持つか判定
#--------------------------------------------------------------------------
def item_element_include?(item, element_name)
@one = @two = nil
return false if item == nil or !item.is_a?(RPG::Item)
for i in item.element_set
if $data_system.elements[i] =~ /#{element_name}([+-]?[0-9]+)?(%)?/
@one = $1
@two = $2
return true
end
end
return false
end
#--------------------------------------------------------------------------
# ● 武器が指定名の属性を持つか判定
#--------------------------------------------------------------------------
def weapon_element_include?(weapon_id, element_name)
@one = @two = nil
return false if weapon_id == nil or weapon_id <= 0
for i in $data_weapons[weapon_id].element_set
if $data_system.elements[i] =~ /#{element_name}([+-]?[0-9]+)?(%)?/
@one = $1
@two = $2
return true
end
end
return false
end
#--------------------------------------------------------------------------
# ● 防具が指定名の属性を持つか判定
#--------------------------------------------------------------------------
def armor_element_include?(armor_id, element_name)
@one = @two = nil
return false if armor_id == nil or armor_id <= 0
for i in $data_armors[armor_id].guard_element_set
if $data_system.elements[i] =~ /#{element_name}([+-]?[0-9]+)?(%)?/
@one = $1
@two = $2
return true
end
end
return false
end
#--------------------------------------------------------------------------
# ● 防具が指定名の属性を持つ場合その後に付く接尾テキストを取得
#--------------------------------------------------------------------------
def armor_element_suftext(armor_id, element_name)
return nil if armor_id == nil or armor_id <= 0
for i in $data_armors[armor_id].guard_element_set
if $data_system.elements[i] =~ /#{element_name}(.*)/
return $1
end
end
return nil
end
#--------------------------------------------------------------------------
# ● アクターが指定名の属性を持つ武器を装備しているかか判定
#--------------------------------------------------------------------------
def equip_weapon_element_include?(actor, element_name)
@one = @two = nil
return false if !actor.is_a?(Game_Actor)
return false if actor.weapon_id == nil or actor.weapon_id <= 0
bool = false
one_total = 0
for i in $data_weapons[actor.weapon_id].element_set
if $data_system.elements[i] =~ /#{element_name}([+-]?[0-9]+)?(%)?/
one_total += $1.to_i
@two = $2
bool = true
end
end
# 武器管理システムXC.が導入されている場合
if $xrxs24_weapon_property_system_work
for i in [PROPERTY_ELEMENT_GRANT_1st, PROPERTY_ELEMENT_GRANT_2nd,
PROPERTY_ELEMENT_GRANT_3rd, PROPERTY_ELEMENT_GRANT_4th]
if $data_system.elements[actor.weapon_property[i]] =~ /#{element_name}([+-]?[0-9]+)?(%)?/
one_total += $1.to_i
@two = $2
bool = true
end
end
end
@one = one_total
return bool
end
#--------------------------------------------------------------------------
# ● アクターが指定名の属性を持つ武器/防具を装備中か判定 数値の合計も保持
#--------------------------------------------------------------------------
def actor_element_equip?(actor, element_name)
one_total = 0
bool = false
return false if !actor.is_a?(Game_Actor)
weapon = $data_weapons[actor.weapon_id]
armor1 = $data_armors[actor.armor1_id]
armor2 = $data_armors[actor.armor2_id]
armor3 = $data_armors[actor.armor3_id]
armor4 = $data_armors[actor.armor4_id]
if equip_weapon_element_include?(actor, element_name)
one_total += @one.to_i
bool = true
end
if armor_element_include?(armor1.id, element_name)
one_total += @one.to_i
bool = true
end
if armor_element_include?(armor2.id, element_name)
one_total += @one.to_i
bool = true
end
if armor_element_include?(armor3.id, element_name)
one_total += @one.to_i
bool = true
end
if armor_element_include?(armor4.id, element_name)
one_total += @one.to_i
bool = true
end
@one = one_total
return bool
end
end
#=============================================================================
# ◇ かばうModule
#=============================================================================
####以下新規追加Module
module Cover_Module
#--------------------------------------------------------------------------
# ● かばう 後のターゲット配列生成
#--------------------------------------------------------------------------
def get_target_battlers_after_cover!(target_battlers, active_battler = nil)
#HP割合の低い順にソート
#target_battlers.sort_by!{|b| (b.hp.to_f/b.maxhp.to_f)}
target_battlers.sort!{|a,b| (a.hp.to_f/a.maxhp.to_f) <=> (b.hp.to_f/b.maxhp.to_f)}
#HP割合の多い順にソート
actors = $game_party.actors.sort_by{|b| (b.hp.to_f/b.maxhp.to_f)}.reverse
enemies = $game_troop.enemies.sort_by{|b| (b.hp.to_f/b.maxhp.to_f)}.reverse
for i in 0...target_battlers.size
if target_battlers[i].is_a?(Game_Actor)
for actor in actors
new_target = get_target_after_cover(active_battler,target_battlers[i],actor)
if !new_target.equal?(target_battlers[i]) && new_target.current_friend.nil? #かばう人がすでにかばっていた場合かばえない
new_target.effect_message = "#{new_target.name}は#{target_battlers[i].name}をかばった!"
new_target.current_friend = target_battlers[i]
new_target.current_friend.damage = COVER_EFFECT_CHAR
target_battlers[i] = new_target
break
end
end
end
if target_battlers[i].is_a?(Game_Enemy)
for enemy in enemies
new_target = get_target_after_cover(active_battler,target_battlers[i],enemy)
if !new_target.equal?(target_battlers[i]) && new_target.current_friend.nil? #かばう人がすでにかばっていた場合かばえない
new_target.effect_message = "#{new_target.name}は#{target_battlers[i].name}をかばった!"
new_target.current_friend = target_battlers[i]
new_target.current_friend.damage = COVER_EFFECT_CHAR
target_battlers[i] = new_target
break
end
end
end
end
#ターゲット重複を排除する(かばった人が2度ダメージを受けない)
target_battlers.uniq!()
#「かばう」ステートの解除判定
for target in target_battlers
if !target.current_friend.nil?
#かばう 残り回数がなくなった場合
target.cover_remain -= 1
if target.cover_remain <= 0
target.remove_state(get_cover_state_id())
target.cover_remain = 0
end
end
end
end
#--------------------------------------------------------------------------
# ● かばう の発動判定
#--------------------------------------------------------------------------
def get_target_after_cover(battler, target, coverer)
#味方からのターゲットは庇わない
if battler.is_a?(Game_Actor)
if target.is_a?(Game_Actor)
return target
end
end
if battler.is_a?(Game_Enemy)
if target.is_a?(Game_Enemy)
return target
end
end
#庇う人が動けない時は庇わない
if !(coverer.movable? && coverer.exist?)
return target
end
#庇う人が かばう のステートになっている時のみ
if !coverer.state?(get_cover_state_id())
return target
end
#ターゲットが既に他の人を庇っている時は無効
if target.state?(get_cover_state_id())
return target
end
#ターゲットと庇う人が同じの場合は無効
if target.equal?(coverer)
return target
end
#発動確率判定
if !(rand(100) <= COVER_EFFECT_PERCENT)
return taget
end
#ターゲットのHP割合判定
if !(100.0*target.hp.to_f/target.maxhp.to_f <= COVER_HP_PERCENT)
return target
end
#「かばっている味方配列」が空だったら、全ての味方を庇う
if coverer.covered_friends.size.zero?
return coverer
else
for covered_friend in coverer.covered_friends
if target.equal?(covered_friend)
return coverer
end
end
end
return target
end
#--------------------------------------------------------------------------
# ● かばう のStateID
#--------------------------------------------------------------------------
def get_cover_state_id
result = nil
if @cover_status_id == nil
for i in 1 ... $data_states.size
if $data_states[i].name[/\A#{STATE_NAME_COVER}\Z/]
result = $data_states[i].id
break
end
end
@cover_status_id = ( result != nil ? result : 0 )
elsif @cover_status_id > 0
result = @cover_status_id
end
return result
end
end
####Module End
#//////////////////////////////////////////////////////////////////////////////
# ◇ インクルード
#//////////////////////////////////////////////////////////////////////////////
module Check_ElementName_Set
include Fixed_PropertyNumber if $xrxs24_weapon_property_system_work
end
class Game_Battler
include Check_ElementName_Set
include Cover_Module
end
class Window_Item < Window_Selectable
include Check_ElementName_Set
end
class Scene_Battle
include Check_ElementName_Set
include Cover_Module
end
#==============================================================================
# ◇ RPG::再定義「"SP "を含む場合SPダメージとして色を変更」
#==============================================================================
module RPG
class Sprite < ::Sprite
alias xrxs19_damage damage
def damage(value, critical)
if value.is_a?(String) and value.include?($data_system.words.sp)
# 解放
dispose_damage
# 数値部分を抜き取る
value = value.scan(/[+-]?[0-9]+/)[0].to_i
# 表示文字列の設定
damage_string = $data_system.words.sp + " " + value.abs.to_s
# 描写
bitmap = Bitmap.new(160, 48)
bitmap.font.name = "黑体"
bitmap.font.size = 32
bitmap.font.color.set(0, 0, 0)
bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
if value < 0
bitmap.font.color.set(128, 255, 255)
else
bitmap.font.color.set(255, 176, 144)
end
bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
if critical
bitmap.font.size = 20
bitmap.font.color.set(0, 0, 0)
bitmap.draw_text(-1, -1, 160, 20, "CRITICAL", 1)
bitmap.draw_text(+1, -1, 160, 20, "CRITICAL", 1)
bitmap.draw_text(-1, +1, 160, 20, "CRITICAL", 1)
bitmap.draw_text(+1, +1, 160, 20, "CRITICAL", 1)
bitmap.font.color.set(255, 255, 255)
bitmap.draw_text(0, 0, 160, 20, "CRITICAL", 1)
end
@_damage_sprite = ::Sprite.new(self.viewport)
@_damage_sprite.bitmap = bitmap
@_damage_sprite.ox = 80
@_damage_sprite.oy = 20
@_damage_sprite.x = self.x
@_damage_sprite.y = self.y - self.oy / 2
@_damage_sprite.z = 3000
@_damage_duration = 40
else
# 通常時?戻す
xrxs19_damage(value, critical)
end
end
end
end
#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================
复制代码
作者:
ultraomega
时间:
2015-2-20 02:09
{:2_272:}打扰了……已经自行解决了问题
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1