#==============================================================================
# ■ Sprite_Back_Picture
#------------------------------------------------------------------------------
# ダメージ表示のスプライトです。
#==============================================================================
class Sprite_Damage < Sprite
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :action_end # POP終了フラグ
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(viewport = nil, battler)
super(viewport)
@battler = battler
@time = 0
return @action_end = true if !@battler
@direction = -1
@direction *= -1 if @battler.actor?
@direction *= -1 if $sv_camera.mirror
set_state
set_damage
end
#--------------------------------------------------------------------------
# ● ステート表示
#--------------------------------------------------------------------------
def set_state
return if !N03::STATE_POP
states = @battler.result.added_state_objects
states.delete($data_states[@battler.death_state_id]) if @battler.result.hp_damage != 0
return if states == []
return if @battler.sv.add_state == @battler.result.added_state_objects
@battler.sv.add_state = states.dup
@st = []
@st_base = []
for i in 0...states.size
@st_base = []
@st = Sprite.new
bitmap_state(@st, states)
@st_base[0] = @direction * (-20 + 5 * i) + @battler.sv.x / 100
@st_base[1] = -40 - @state_height * i + (@battler.sv.y - @battler.sv.h - @battler.sv.j - @battler.sv.oy_adjust)/ 100
@st.z = 1000 + i
@st.opacity = 0
end
@time = @pop_time = 80
end
#--------------------------------------------------------------------------
# ● ステート画像
#--------------------------------------------------------------------------
def bitmap_state(state, state_object)
name = state_object.name
if FileTest.exist?("Graphics/System/" + name+ ".png") or FileTest.exist?("Graphics/System/" + name+ ".jpg")
state.bitmap = Cache.system(name)
@state_height = state.bitmap.height
else
state.bitmap = Cache.system("Iconset").dup
state.src_rect.set(state_object.icon_index % 16 * 24, state_object.icon_index / 16 * 24, 24, 24)
@state_height = 24
end
end
#--------------------------------------------------------------------------
# ● ダメージ表示
#--------------------------------------------------------------------------
def set_damage
return @action_end = true if !N03::DAMAGE_POP
damage = @battler.result.hp_damage if @battler.result.hp_damage != 0
damage = @battler.result.mp_damage if @battler.result.mp_damage != 0
damage = @battler.result.tp_damage if @battler.result.tp_damage != 0
if !damage or damage == 0
@action_end = true if @states == nil
return
end
@hit = @battler.sv.hit
@battler.sv.hit += 1 if damage > 0
file = N03::DAMAGE_PLUS if damage > 0
file = N03::DAMAGE_MINUS if damage < 0
add_file = N03::DAMAGE_MP if @battler.result.mp_damage != 0
add_file = N03::DAMAGE_TP if @battler.result.tp_damage != 0
adjust_x = N03::DAMAGE_ADJUST
@num = []
@num_base = []
damage = damage.abs
max_num = damage.to_s.size
max_num += 1 if add_file != nil
for i in 0...max_num
@num = Sprite.new
if add_file != nil && i == max_num - 1
@num.bitmap = Cache.system(add_file)
cw = (damage % (10 * 10 ** i))/(10 ** i)
sw = 0 if sw == nil
else
@num.bitmap = Cache.system(file)
cw = (damage % (10 * 10 ** i))/(10 ** i)
sw = @num.bitmap.width / 10
@num.src_rect.set(cw * sw, 0, sw, @num.bitmap.height)
end
@num_base = []
@num_base[0] = (sw + adjust_x) * i * -1 + (@battler.sv.x / 100)
@num_base[1] = -(@num.bitmap.height / 3) - i * 2 - @hit * 2 + (@battler.sv.y - @battler.sv.h - @battler.sv.j - @battler.sv.oy_adjust)/ 100
@num_base[0] -= @num.bitmap.width / 2 - adjust_x if add_file != nil && i == max_num - 1
@num.z = 1000 + i + @hit * 10
end
@time = @pop_time = 80
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
return if @time == 0
for i in [email protected] do update_state_move(@st, i) end if @st != nil
for i in [email protected] do update_num_move(@num, i) end if @num != nil
@time -= 1
@action_end = true if @time == 0
end
#--------------------------------------------------------------------------
# ● ステート画像の更新
#--------------------------------------------------------------------------
def update_state_move(state, index)
min = @pop_time - index * 2
case @time
when min-15..min
@st_base[index][0] += @direction
state.opacity += 25
when min-80..min-50
@st_base[index][0] += @direction
state.opacity -= 25
end
state.x = (@st_base[index][0] - $sv_camera.x) * $sv_camera.zoom
state.y = (@st_base[index][1] - $sv_camera.y) * $sv_camera.zoom
end
#--------------------------------------------------------------------------
# ● 数値の更新
#--------------------------------------------------------------------------
def update_num_move(num, index)
min = @pop_time - index * 2
case @time
when min-1..min
@num_base[index][0] += @direction * @hit
@num_base[index][1] -= 5 + @hit * 2
when min-3..min-2
@num_base[index][0] += @direction * @hit
@num_base[index][1] -= 4 + @hit * 2
when min-6..min-4
@num_base[index][0] += @direction
@num_base[index][1] -= 3 + @hit * 2
when min-14..min-7
@num_base[index][0] += @direction
@num_base[index][1] += 2
when min-17..min-15
@num_base[index][1] -= 2 + @hit * 2
when min-23..min-18
@num_base[index][1] += 1
when min-27..min-24
@num_base[index][1] -= 1
when min-30..min-28
@num_base[index][1] += 1
when min-33..min-31
@num_base[index][1] -= 1
when min-36..min-34
@num_base[index][1] += 1
end
num.x = (@num_base[index][0] - $sv_camera.x) * $sv_camera.zoom
num.y = (@num_base[index][1] - $sv_camera.y) * $sv_camera.zoom
num.opacity = 256 - (12 - @time) * 32
num.visible = false if @time == 0
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
@battler.sv.hit = 0
bitmap.dispose if bitmap
for i in [email protected] do @num.dispose end if @num != nil
for i in [email protected] do @st.dispose end if @st != nil
super
end
end
#==============================================================================
# ■ Spriteset_Sideview
#------------------------------------------------------------------------------
# サイドビュー独自のスプライトをまとめたクラスです。
#==============================================================================
class Spriteset_Sideview
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(viewport)
@viewport = viewport
@weapons = []
@pictures = []
@back_pic = []
@damage = []
$sv_camera.setup
N03.camera(nil, N03::BATTLE_CAMERA["ターン開始前"].dup)
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
update_battler_data
update_damage
update_pictures
update_back_pic
update_weapons
end
#--------------------------------------------------------------------------
# ● バトラーデータの更新
#--------------------------------------------------------------------------
def update_battler_data
for battler in $game_party.battle_members + $game_troop.members
weapon_end(battler) if battler.sv.weapon_end
next if battler.sv.effect_data == []
for effect_data in battler.sv.effect_data do set_effects(battler, effect_data) end
end
end
#--------------------------------------------------------------------------
# ● ダメージ画像の更新
#--------------------------------------------------------------------------
def update_damage
for damager in $sv_camera.damager do set_damage end if $sv_camera.damager != []
for i in [email protected]
next if @damage == nil
@damage.update if @damage != nil
next if !@damage.action_end
@damage.dispose
@damage = nil
end
end
#--------------------------------------------------------------------------
# ● ピクチャアクションの更新
#--------------------------------------------------------------------------
def update_pictures
for i in [email protected]
next if @pictures == nil
@pictures.update if @pictures != nil
next if !@pictures.action_end
@pictures.dispose
@pictures = nil
end
end
#--------------------------------------------------------------------------
# ● 周期ピクチャの更新
#--------------------------------------------------------------------------
def update_back_pic
set_back_pic if $sv_camera.program_picture != []
for i in 0...@back_pic.size
next if @back_pic == nil
@back_pic.update if @back_pic != nil
next if !@back_pic.action_end
@back_pic.dispose
@back_pic = nil
end
end
#--------------------------------------------------------------------------
# ● 武器アクションの更新
#--------------------------------------------------------------------------
def update_weapons
for i in [email protected]
next if @weapons == nil
@weapons.update if @weapons != nil
next if !@weapons.action_end
@weapons.dispose
@weapons = nil
end
end
#--------------------------------------------------------------------------
# ● ダメージ実行
#--------------------------------------------------------------------------
def set_damage
for i in [email protected]
next if @damage != nil
return @damage = Sprite_Damage.new(@viewport, $sv_camera.damager.shift)
end
@damage.push(Sprite_Damage.new(@viewport, $sv_camera.damager.shift))
end
#--------------------------------------------------------------------------
# ● 周期ピクチャ実行
#--------------------------------------------------------------------------
def set_back_pic
for data in $sv_camera.program_picture
if @back_pic[data[2]] != nil
@back_pic[data[2]].dispose
@back_pic[data[2]] = nil
end
@back_pic[data[2]] = Sprite_Back_Picture.new(@viewport, data[2])
@back_pic[data[2]].setup(data)
end
$sv_camera.program_picture = []
end
#--------------------------------------------------------------------------
# ● エフェクト開始
#--------------------------------------------------------------------------
def set_effects(battler, effect_data)
case effect_data[0]
when "pic" ; set_pictures(battler, effect_data)
when "wp" ; set_weapons(battler, true)
when "m_a" ; set_weapons(battler, false)
end
end
#--------------------------------------------------------------------------
# ● ピクチャアクション実行
#--------------------------------------------------------------------------
def set_pictures(battler, effect_data)
@pictures[effect_data[1]] = Sprite_Battle_Picture.new if @pictures[effect_data[1]] == nil
@pictures[effect_data[1]].set(battler)
end
#--------------------------------------------------------------------------
# ● 武器アクション実行
#--------------------------------------------------------------------------
def set_weapons(battler, weapon_flug)
for i in [email protected]
next if @weapons != nil
@weapons = Sprite_Weapon.new(@viewport, i, battler)
battler.sv.weapon_index.push(i) if weapon_flug
return i
end
@weapons.push(Sprite_Weapon.new(@viewport, @weapons.size, battler))
battler.sv.weapon_index.push(@weapons.size - 1) if weapon_flug
return @weapons.size - 1
end
#--------------------------------------------------------------------------
# ● バトラーの武器アクション終了
#--------------------------------------------------------------------------
def weapon_end(battler)
battler.sv.weapon_end = false
for index in battler.sv.weapon_index
weapon_index = battler.sv.weapon_index.shift
@weapons[weapon_index].dispose if @weapons[weapon_index] != nil
@weapons[weapon_index] = nil
end
battler.sv.weapon_index.compact!
end
#--------------------------------------------------------------------------
# ● ヒット時の戦闘アニメ実行
#--------------------------------------------------------------------------
def set_hit_animation(battler, weapon_index, hit_targets, miss)
weapon = @weapons[weapon_index]
for target in hit_targets
next @weapons[@hit_index].timing_battler_set(target) if @hit_index != nil
@hit_index = set_weapons(battler, false)
@weapons[@hit_index].set_hit_animation(weapon.hit_position, weapon.hit_anime_id, target)
end
@hit_index = nil
if !weapon.through && !miss
@weapons[weapon_index].dispose
@weapons[weapon_index] = nil
else
@weapons[weapon_index].through_change
end
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
dispose_effects(@weapons)
dispose_effects(@pictures)
dispose_effects(@back_pic)
dispose_effects(@damage)
end
#--------------------------------------------------------------------------
# ● エフェクト画像の解放
#--------------------------------------------------------------------------
def dispose_effects(effects)
for i in 0...effects.size
effects.dispose if effects != nil
effects = nil
end
end
end
#==============================================================================
# ■ Sprite_Battle_Back
#------------------------------------------------------------------------------
# 戦闘背景用のスプライトです。
#==============================================================================
class Sprite_Battle_Back < Plane
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(viewport = nil, index, battleback_name)
super(viewport)
@index = index
if @index == 1
data = N03::FLOOR1_DATA[battleback_name]
data = N03::FLOOR1_DATA["全Battlebacks1"] if data == nil
elsif @index == 2
data = N03::FLOOR2_DATA[battleback_name]
data = N03::FLOOR2_DATA["全Battlebacks2"] if data == nil
end
data = data.dup
@battleback_name = battleback_name
@adjust_position = data[0]
@zoom_x = data[1][0] / 100.0
@zoom_y = data[1][1] / 100.0
@shake_on = data[2]
$game_switches[data[3]] = true if data[3] > 0
$sv_camera.switches[data[3].abs] = true if data[3] < 0
reset_scroll
back_data_set(0, @move_x, @move_y, false, battleback_name)
end
#--------------------------------------------------------------------------
# ● 背景データをセット
#--------------------------------------------------------------------------
def back_data_set(sw_id, move_x, move_y, ba, battleback_name)
@back_data = [] if !@back_data
@back_data.push([sw_id, [move_x, move_y],ba, battleback_name])
end
#--------------------------------------------------------------------------
# ● 背景データを更新
#--------------------------------------------------------------------------
def update_back_data
delete = false
for i in 0...@back_data.size
delete = back_data_off(i) if @back_data[0] > 0 && !$game_switches[@back_data[0]]
delete = back_data_off(i) if @back_data[0] < 0 && !$sv_camera.switches[@back_data[0].abs]
end
return if !delete
data = @back_data.shift
back_data_on(data[0], data[1][0], data[1][1], data[2], data[3])
end
#--------------------------------------------------------------------------
# ● 背景データの消去
#--------------------------------------------------------------------------
def back_data_off(index)
@back_data.delete_at index
return true
end
#--------------------------------------------------------------------------
# ● 背景データの実行
#--------------------------------------------------------------------------
def back_data_on(sw_id, move_x, move_y, ba, battleback_name)
data = ["scroll", sw_id, @index, [move_x, move_y], ba, battleback_name,""]
scroll_set(data)
end
#--------------------------------------------------------------------------
# ● 背景スクロールを初期化
#--------------------------------------------------------------------------
def reset_scroll
@scroll_x = 0
@scroll_y = 0
@move_x = 0
@move_y = 0
@reserve = []
end
#--------------------------------------------------------------------------
# ● 背景画像のセッティング
#--------------------------------------------------------------------------
def set_graphics(new_bitmap)
self.bitmap = new_bitmap
@base_x = (self.bitmap.width * @zoom_x - Graphics.width) / 2 + @adjust_position[0]
@base_y = (self.bitmap.height * @zoom_y - Graphics.height) / 2 + @adjust_position[1]
# 限界座標を取得
max_top = 0
max_bottom = self.bitmap.height * @zoom_y - Graphics.height
max_left = 0
max_right = self.bitmap.width * @zoom_x - Graphics.width
$sv_camera.setting(@index, [max_top, max_bottom, max_left, max_right, @base_x, @base_y])
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
return if !bitmap
update_back_data if @back_data && @back_data != []
update_scroll unless @move_x == 0 && @move_y == 0
update_color
update_position
update_back_adjust if @bt_back != nil
set_reserve if @reserve != [] && @reserve_data == nil && @scroll_x == 0 && @scroll_y == 0
end
#--------------------------------------------------------------------------
# ● 背景スクロールの更新
#--------------------------------------------------------------------------
def update_scroll
@scroll_x += @move_x
@scroll_y += @move_y
@scroll_x = 0 if @scroll_x / 100 >= self.bitmap.width * @zoom_x or @scroll_x / 100 <= -self.bitmap.width * @zoom_x
@scroll_y = 0 if @scroll_y / 100 >= self.bitmap.height * @zoom_y or @scroll_y / 100 <= -self.bitmap.height * @zoom_y
end
#--------------------------------------------------------------------------
# ● 色調変更の更新
#--------------------------------------------------------------------------
def update_color
color_set if $sv_camera.color_set[@index] != nil
return if @color_data == nil
@color_data[4] -= 1
if @color_data[4] == 0 && @color_data[5] != 0
@color_data[4] = @color_data[5]
@color_data[5] = 0
@color_data[6] *= -1
elsif @color_data[4] == 0
return @color_data = nil
end
@color_data[3] += @color_data[6]
@color_data[3] = [[@color_data[3], 255].min, 0].max
self.color.set(@color_data[0], @color_data[1], @color_data[2], @color_data[3])
end
#--------------------------------------------------------------------------
# ● 座標の更新
#--------------------------------------------------------------------------
def update_position
self.ox = $sv_camera.x + @base_x - @scroll_x / 100
self.oy = $sv_camera.y + @base_y - @scroll_y / 100
self.ox -= $sv_camera.sx / 100 if @shake_on
self.oy -= $sv_camera.sy / 100 if @shake_on
self.zoom_x = @zoom_x * $sv_camera.zoom
self.zoom_y = @zoom_y * $sv_camera.zoom
self.ox *= $sv_camera.zoom
self.oy *= $sv_camera.zoom
self.z = @index * 10
self.visible = @battler.sv.weapon_visible if @battler
end
#--------------------------------------------------------------------------
# ● 背景変更補正画像を更新
#--------------------------------------------------------------------------
def update_back_adjust
@bt_adjust[0][0] = 0 if @scroll_x == 0
@bt_adjust[0][1] = 0 if @scroll_y == 0
@bt_adjust[1][0] -= @bt_adjust[2][0] if @scroll_x == 0
@bt_adjust[1][1] -= @bt_adjust[2][1] if @scroll_y == 0
for i in 0...@bt_back.size
@bt_back.x = -self.ox + @bt_adjust[0] * $sv_camera.zoom
@bt_back.y = -self.oy + @bt_adjust[1] * $sv_camera.zoom
@bt_back.zoom_x = self.zoom_x
@bt_back.zoom_y = self.zoom_y
@bt_back.z = self.z + 1
@bt_back.color.set(@color_data[0], @color_data[1], @color_data[2], @color_data[3]) if @color_data != nil
end
if @move_reserve != nil && @bt_adjust[0][0] == 0 && @bt_adjust[0][1] == 0
mirror = $sv_camera.mirror
mirror = false if !@reserve_data[4]
@move_x = @reserve_data[3][0]
@move_x *= -1 if mirror
@move_y = @reserve_data[3][1]
@move_reserve = nil
end
if @bt_adjust[1][0] == 0 && @bt_adjust[1][1] == 0
self.bitmap = @bt_back[1].bitmap
@bt_back[0].dispose
@bt_back[1].dispose
@bt_back = nil
@reserve_data = nil
end
end
#--------------------------------------------------------------------------
# ● 保留した背景データをセット
#--------------------------------------------------------------------------
def set_reserve
@reserve_data = @reserve.shift
@move_reserve = true
name = @reserve_data[5]
name = @battleback_name if name == ""
back_data_set(@reserve_data[1], @reserve_data[3][0], @reserve_data[3][1], @reserve_data[4], name)
back_setting(@reserve_data)
end
#--------------------------------------------------------------------------
# ● 色調変更
#--------------------------------------------------------------------------
def color_set
set = $sv_camera.color_set[@index]
$sv_camera.color_set[@index] = nil
set[4] = 1 if set[4] == 0
@color_data = [set[0], set[1], set[2], set[3]/set[4], set[4], set[5], set[3]/set[4]]
end
#--------------------------------------------------------------------------
# ● 背景スクロールをセット
#--------------------------------------------------------------------------
def scroll_set(data)
mirror = $sv_camera.mirror
mirror = false if !data[4]
pre_x = @move_x
pre_y = @move_y
@move_x = data[3][0]
@move_x *= -1 if mirror
@move_y = data[3][1]
back_setting(data)
return if @reserve == []
@move_x = pre_x
@move_y = pre_y
name = data[5]
name = @battleback_name if name == ""
back_data_set(data[1], data[3][0], data[3][1], data[4], name)
end
#--------------------------------------------------------------------------
# ● 背景画像の変更をセット
#--------------------------------------------------------------------------
def back_setting(data)
return if data[5] == ""
return back_set(data[5]) if data[6] == ""
return if @move_x != 0 && @move_y != 0
# 背景スクロールが途中で変更補正画像がある場合、データを保留
return @reserve.push(data) if @scroll_x != 0 or @scroll_y != 0
mirror = $sv_camera.mirror
mirror = false if !data[4]
@bt_back = []
@bt_back[0] = Sprite.new(viewport)
@bt_back[0].bitmap = Cache.battleback1(data[6]) if @index == 1
@bt_back[0].bitmap = Cache.battleback2(data[6]) if @index == 2
@bt_back[0].mirror = mirror
@bt_back[1] = Sprite.new(viewport)
@bt_back[1].bitmap = Cache.battleback1(data[5]) if @index == 1
@bt_back[1].bitmap = Cache.battleback2(data[5]) if @index == 2
@bt_back[1].mirror = mirror
@bt_adjust = []
sign = -1
if @move_x !=0
sign = 1 if @move_x < 0
@bt_adjust[0] = [self.bitmap.width * @zoom_x * sign, 0]
@bt_adjust[1] = [self.bitmap.width * @zoom_x * sign * 2, 0]
else
sign = 1 if @move_y < 0
@bt_adjust[0] = [0, self.bitmap.height * @zoom_y * sign]
@bt_adjust[1] = [0, self.bitmap.height * @zoom_y * sign * 2]
end
@bt_adjust[2] = [@bt_adjust[0][0], @bt_adjust[0][1]]
end
#--------------------------------------------------------------------------
# ● 背景画像を変更
#--------------------------------------------------------------------------
def back_set(back_name)
return if back_name == @battleback_name
self.bitmap = Cache.battleback1(back_name) if @index == 1
self.bitmap = Cache.battleback2(back_name) if @index == 2
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
bitmap.dispose if bitmap
for i in 0...@bt_back.size do @bt_back.dispose end if @bt_back != nil
super
end
end
#==============================================================================
# ■ Battle_Camera
#------------------------------------------------------------------------------
# 戦闘カメラやバトルプログラムを扱うクラスです。
#==============================================================================
class Battle_Camera
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :sx # シェイクX座標
attr_reader :sy # シェイクY座標
attr_reader :max_top # 上限界座標
attr_reader :max_bottom # 下限界座標
attr_reader :max_left # 左限界座標
attr_reader :max_right # 右限界座標
attr_accessor :switches # サイドビュー専用スイッチ
attr_accessor :color_set # 色調変更データ
attr_accessor :wait # 戦闘シーンの強制ウエイト
attr_accessor :win_wait # 戦闘勝利前のウエイト
attr_accessor :mirror # 画面反転フラグ
attr_accessor :damager # ダメージPOPバトラー
attr_accessor :program_scroll # バトルプログラム 背景の自動スクロール
attr_accessor :program_picture # バトルプログラム 周期ピクチャ
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
@switches = []
@max_data = []
@color_set = []
@wait = 0
@win_wait = false
@mirror = false
@damager = []
setup
end
#--------------------------------------------------------------------------
# ● カメラX座標
#--------------------------------------------------------------------------
def x
return @x / 100
end
#--------------------------------------------------------------------------
# ● カメラY座標
#--------------------------------------------------------------------------
def y
return @y / 100
end
#--------------------------------------------------------------------------
# ● ズーム率
#--------------------------------------------------------------------------
def zoom
return @zoom * 0.001
end
#--------------------------------------------------------------------------
# ● ズーム率による座標変換
#--------------------------------------------------------------------------
def convert
return @zoom
end
#--------------------------------------------------------------------------
# ● カメラ初期化
#--------------------------------------------------------------------------
def setup
@x = 0
@y = 0
@sx = 0
@sy = 0
@zoom = 1000
@time = 0
@shake_time = 0
program_setup
end
#--------------------------------------------------------------------------
# ● バトルプログラムのセットアップ
#--------------------------------------------------------------------------
def program_setup
@played_program = []
@program_switch = []
@program_sound = []
@program_scroll = []
@program_se = []
@program_shake = []
@program_color = []
@program_picture = []
@program_base = N03::BATTLE_PROGRAM.values.dup
program_check
end
#--------------------------------------------------------------------------
# ● バトルプログラムのチェック
#--------------------------------------------------------------------------
def program_check
for data in @program_base
next if @played_program.include?(data)
if program_start?(data[1])
@played_program.push(data.dup)
@program_scroll.push(data.dup) if data[0] == "scroll"
@program_picture.push(data.dup) if data[0] == "kpic"
start_sound(data.dup) if data[0] == "sound"
start_program_switch(data.dup) if data[0] == "switch"
start_program_se(data.dup) if data[0] == "keep_se"
start_program_shake(data.dup) if data[0] == "keep_sk"
start_program_color(data.dup) if data[0] == "keep_c"
else
@played_program.delete(data)
@program_scroll.delete(data) if data[0] == "scroll"
@program_picture.delete(data) if data[0] == "kpic"
@program_switch.delete(data) if data[0] == "switch"
@program_sound.delete(data) if data[0] == "sound"
@program_se.delete(data) if data[0] == "keep_se"
@program_shake.delete(data) if data[0] == "keep_sk"
@program_color.delete(data) if data[0] == "keep_c"
end
end
end
#--------------------------------------------------------------------------
# ● バトルプログラムの開始
#--------------------------------------------------------------------------
def program_start?(num)
start = false
start = true if $game_switches[num.abs] && num > 0
start = true if @switches[num.abs] && num < 0
return start
end
#--------------------------------------------------------------------------
# ● バトルプログラム スイッチ操作の開始
#--------------------------------------------------------------------------
def start_program_switch(data)
data[4] = data[4] + rand(data[5] + 1)
data[4] = 1 if data[4] <= 0
@program_switch.push(data)
end
#--------------------------------------------------------------------------
# ● スイッチ操作の更新
#--------------------------------------------------------------------------
def update_program_switch
for data in @program_switch
data[4] -= 1
next @program_switch.delete(data) if data[1] > 0 && !$game_switches[data[1]]
next @program_switch.delete(data) if data[1] < 0 && !@switches[data[1]]
next if data[4] != 0
for id in data[2]
$game_switches[id] = true if id > 0
@switches[id.abs] = true if id < 0
end
for id in data[3]
$game_switches[id] = false if id > 0
@switches[id.abs] = false if id < 0
end
@program_switch.delete(data)
program_check
end
end
#--------------------------------------------------------------------------
# ● バトルプログラム BGM/BGSの開始
#--------------------------------------------------------------------------
def start_sound(data)
@program_sound.push(data)
name = data[5]
case data[2]
when "se"
Audio.se_play("Audio/SE/" + name, data[4], data[3])
when "bgm"
name = RPG::BGM.last.name if data[5] == ""
Audio.bgm_play("Audio/BGM/" + name, data[4], data[3])
when "bgs"
name = RPG::BGS.last.name if data[5] == ""
Audio.bgs_play("Audio/BGS/" + name, data[4], data[3])
end
end
#--------------------------------------------------------------------------
# ● バトルプログラム 周期SEの開始
#--------------------------------------------------------------------------
def start_program_se(data)
data[3] = [data[2], data[3]]
data[2] = data[3][0] + rand(data[3][1] + 1)
@program_se.push(data)
Audio.se_play("Audio/SE/" + data[7], data[5], data[4]) if data[6]
end
#--------------------------------------------------------------------------
# ● 周期SEの更新
#--------------------------------------------------------------------------
def update_program_se
for data in @program_se
data[2] -= 1
next @program_se.delete(data) if data[1] > 0 && !$game_switches[data[1]]
next @program_se.delete(data) if data[1] < 0 && !@switches[data[1].abs]
next if data[2] != 0
Audio.se_play("Audio/SE/" + data[7], data[5], data[4])
data[2] = data[3][0] + rand(data[3][1] + 1)
end
end
#--------------------------------------------------------------------------
# ● バトルプログラム 周期シェイクの開始
#--------------------------------------------------------------------------
def start_program_shake(data)
data[3] = [data[2], data[3]]
data[2] = data[3][0] + rand(data[3][1] + 1)
@program_shake.push(data)
shake(data[4], data[5], data[6]) if data[7]
end
#--------------------------------------------------------------------------
# ● 周期シェイクの更新
#--------------------------------------------------------------------------
def update_program_shake
for data in @program_shake
data[2] -= 1
next @program_shake.delete(data) if data[1] > 0 && !$game_switches[data[1]]
next @program_shake.delete(data) if data[1] < 0 && !@switches[data[1].abs]
next if data[2] != 0
shake(data[4], data[5], data[6])
data[2] = data[3][0] + rand(data[3][1] + 1)
end
end
#--------------------------------------------------------------------------
# ● バトルプログラム 周期色調変更の開始
#--------------------------------------------------------------------------
def start_program_color(data)
data[3] = [data[2], data[3]]
data[2] = data[3][0] + rand(data[3][1] + 1)
data[7] = true if data[4] == 0 or data[4] == 4
case data[4]
when 1 ;data[4] = $game_troop.members
when 2 ;data[4] = $game_party.battle_members
when 3,4 ;data[4] = $game_troop.members + $game_party.battle_members
else ;data[4] = []
end
@program_color.push(data)
return if !data[6]
for target in data[4] do target.sv.color_set = data[5] end if data[4] != []
@color_set[1] = data[5] if data[7]
@color_set[2] = data[5] if data[7]
end
#--------------------------------------------------------------------------
# ● 周期色調変更の更新
#--------------------------------------------------------------------------
def update_program_color
for data in @program_color
data[2] -= 1
next @program_color.delete(data) if data[1] > 0 && !$game_switches[data[1]]
next @program_color.delete(data) if data[1] < 0 && !@switches[data[1].abs]
next if data[2] != 0
for target in data[4] do target.sv.color_set = data[5] end if data[4] != []
@color_set[1] = data[5] if data[7]
@color_set[2] = data[5] if data[7]
data[2] = data[3][0] + rand(data[3][1] + 1)
end
end
#--------------------------------------------------------------------------
# ● 背景からカメラの限界値を取得 data = [max_top, max_bottom, max_left, max_right]
#--------------------------------------------------------------------------
def setting(index, data)
@max_data[index - 1] = data
return if index != 2
setup
# カメラの中心座標
@center_x = (Graphics.width / 2 + N03::CAMERA_POSITION[0]) * 100
@center_y = (Graphics.height / 2 + N03::CAMERA_POSITION[1]) * 100
# 上下左右の移動限界距離
base_x = [@max_data[0][5], @max_data[1][5]].min
base_y = [@max_data[0][4], @max_data[1][4]].min
@max_top = [@max_data[0][0], @max_data[1][0]].max - base_x
@max_bottom = [@max_data[0][1], @max_data[1][1]].min + @max_top
@max_left = [@max_data[0][2], @max_data[1][2]].max - base_y
@max_right = [@max_data[0][3], @max_data[1][3]].min + @max_left
@max_width = @max_right - @max_left + Graphics.width
@max_height = @max_bottom - @max_top + Graphics.height
# ズームアウト限界値
max_zoom_x = 100 * Graphics.width / @max_width
max_zoom_y = 100 * Graphics.height / @max_height
@max_zoom_out = [max_zoom_x, max_zoom_y].max
end
#--------------------------------------------------------------------------
# ● カメラ移動
#--------------------------------------------------------------------------
def move(target_x, target_y, zoom, time, screen = true)
# 戦闘背景以上のサイズまでズームアウトしないよう調整
@target_zoom = [zoom * 0.01, @max_zoom_out * 0.01].max
# ズーム分の中心座標補正
if screen && @target_zoom != 1
target_x = target_x + @center_x
target_y = target_y + @center_y
end
adjust_x = @center_x * (@target_zoom - 1) / (@target_zoom ** 2 - @target_zoom)
adjust_y = @center_y * (@target_zoom - 1) / (@target_zoom ** 2 - @target_zoom)
adjust_x = 0 if adjust_x.nan?
adjust_y = 0 if adjust_y.nan?
adjust_x = @center_x if !screen && adjust_x == 0
adjust_y = @center_y if !screen && adjust_y == 0
@target_x = target_x - adjust_x.to_i
@target_y = target_y - adjust_y.to_i
@target_zoom = (@target_zoom * 1000).to_i
@zoom = @zoom.to_i
limit_test
# 時間0の場合は即実行
return @time = time.abs if time != 0
@time = 1
update
end
#--------------------------------------------------------------------------
# ● 限界座標の試算
#--------------------------------------------------------------------------
def limit_test
new_width = @max_width * @target_zoom / 1000
new_height = @max_height * @target_zoom / 1000
new_max_right = @max_right - (@max_width - new_width)
new_max_bottom = @max_bottom - (@max_height - new_height)
# 画面の移動先が限界の場合、限界座標をセット
if @target_x < @max_left * 100
@target_x = @max_left * 100
end
if @target_x > new_max_right * 100
@target_x = new_max_right * 100
end
if @target_y < @max_top * 100
@target_y = @max_top * 100
end
if @target_y > new_max_bottom * 100
@target_y = new_max_bottom * 100
end
end
#--------------------------------------------------------------------------
# ● カメラリセット
#--------------------------------------------------------------------------
def reset(time)
move(0, 0, 100, time, true)
end
#--------------------------------------------------------------------------
# ● 画面のシェイク
#--------------------------------------------------------------------------
def shake(power, speed, time)
@shake_x = power[0] * 100
@shake_y = power[1] * 100
@power_time_base = @power_time = speed
@shake_time = time
update_shake
end
#--------------------------------------------------------------------------
# ● シェイクの更新
#--------------------------------------------------------------------------
def update_shake
@sx = (@sx * (@power_time - 1) + @shake_x) / @power_time
@sy = (@sy * (@power_time - 1) + @shake_y) / @power_time
@power_time -= 1
@shake_time -= 1
return @sx = @sy = 0 if @shake_time == 0
return if @power_time != 0
@power_time = @power_time_base
@shake_x = @shake_x * -4 / 5
@shake_y = @shake_y * -4 / 5
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
update_shake if @shake_time != 0
update_program
return if @time == 0
@x = (@x * (@time - 1) + @target_x) / @time
@y = (@y * (@time - 1) + @target_y) / @time
@zoom = (@zoom * (@time - 1) + @target_zoom) / @time
@time -= 1
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update_program
update_program_switch if @program_switch != []
update_program_se if @program_se != []
update_program_shake if @program_shake != []
update_program_color if @program_color != []
end
end
#==============================================================================
# ■ Scene_Battle
#------------------------------------------------------------------------------
# バトル画面の処理を行うクラスです。
#==============================================================================
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# ● フレーム更新(基本)
#--------------------------------------------------------------------------
alias update_basic_scene_battle_n03 update_basic
def update_basic
update_basic_scene_battle_n03
update_camera
end
#--------------------------------------------------------------------------
# ● カメラの更新
#--------------------------------------------------------------------------
def update_camera
$sv_camera.update
$sv_camera.wait = N03::TURN_END_WAIT if $sv_camera.win_wait
camera_wait
end
#--------------------------------------------------------------------------
# ● カメラウェイト
#--------------------------------------------------------------------------
def camera_wait
while $sv_camera.wait != 0
Graphics.update
Input.update
update_all_windows
$game_timer.update
$game_troop.update
$sv_camera.update
@spriteset.update
update_info_viewport
update_message_open
$sv_camera.wait -= 1
$sv_camera.wait = 1 if $sv_camera.wait == 0 && @spriteset.effect?
BattleManager.victory if $sv_camera.win_wait && $sv_camera.wait == 0
end
end
#--------------------------------------------------------------------------
# ● エフェクト実行が終わるまでウェイト ★再定義
#--------------------------------------------------------------------------
def wait_for_effect
end
#--------------------------------------------------------------------------
# ● ターン開始
#--------------------------------------------------------------------------
alias turn_end_scene_battle_n03 turn_end
def turn_end
$sv_camera.wait = N03::TURN_END_WAIT
camera_wait
N03.camera(nil, N03::BATTLE_CAMERA["ターン開始前"].dup)
turn_end_scene_battle_n03
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの使用 ★再定義
#--------------------------------------------------------------------------
def use_item
@log_window.off if !N03::BATTLE_LOG
item = @subject.current_action.item
@log_window.display_use_item(@subject, item)
@subject.use_item(item)
refresh_status
targets = @subject.current_action.make_targets.compact
targets = [@subject] if targets.size == 0
for time in item.repeats.times
play_sideview(targets, item)
end
$sv_camera.wait = N03::ACTION_END_WAIT if @subject.sv.derivation_skill_id == 0
camera_wait
@log_window.clear
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの効果を適用 ★再定義
#--------------------------------------------------------------------------
def apply_item_effects(target, item)
target.item_apply(@subject, item)
refresh_status
end
#--------------------------------------------------------------------------
# ● サイドビューアクション実行
#--------------------------------------------------------------------------
def play_sideview(targets, item)
@subject.sv.set_target(targets)
return if @subject.sv.attack_action(item) == nil
@subject.sv.start_action(@subject.sv.attack_action(item))
@targets = targets
loop do
update_basic
data = @subject.sv.play_data
second_targets_set if data[0] == "second_targets_set"
targets_set if data[0] == "targets_set"
immortaling if data[0] == "no_collapse"
unimmortaling if data[0] == "collapse"
next set_move_anime(item) if @subject.sv.m_a_data != []
set_damage(item) if @subject.sv.set_damage
break derived_skill if @subject.sv.derivation_skill_id != 0
break if @subject.sv.action_end
end
unimmortaling if @immortal
end
#--------------------------------------------------------------------------
# ● ターゲットをセカンドターゲットへ
#--------------------------------------------------------------------------
def second_targets_set
@targets = @subject.sv.second_targets
@subject.sv.target_battler = @subject.sv.second_targets
end
#--------------------------------------------------------------------------
# ● セカンドターゲットをターゲットへ
#--------------------------------------------------------------------------
def targets_set
@subject.sv.second_targets = @subject.current_action.make_targets.compact
@subject.sv.target_battler = @subject.sv.second_targets
end
#--------------------------------------------------------------------------
# ● コラプス禁止
#--------------------------------------------------------------------------
def immortaling
@immortal = true
# 全員に不死身付与
for member in $game_party.battle_members + $game_troop.members
next if member.dead?
# イベント操作等で不死身設定になっていたら解除を無効にするフラグを立てる
member.sv.immortal = true if member.state?(N03::IMMORTAL_ID)
member.add_state(N03::IMMORTAL_ID)
end
end
#--------------------------------------------------------------------------
# ● コラプス許可
#--------------------------------------------------------------------------
def unimmortaling
@immortal = false
# 全員の不死身化解除(イベント等で不死身設定がされていれば除く)
for member in $game_party.battle_members + $game_troop.members
next if member.dead?
# 不死身ステートが行動中に解除されていた場合、解除無効を解除
member.sv.immortal = false if !member.state?(N03::IMMORTAL_ID) && member.sv.immortal
next member.sv.immortal = false if member.sv.immortal
member.remove_state(N03::IMMORTAL_ID)
member.add_state(1) if member.hp == 0
member.perform_collapse_effect if member.dead?
end
end
#--------------------------------------------------------------------------
# ● ダメージの実行
#--------------------------------------------------------------------------
def set_damage(item)
targets = @targets
targets = [@subject.sv.individual_targets[0]] if @subject.sv.individual_targets.size != 0
for target in targets do damage_anime(target, item) end
@subject.sv.set_damage = false
@subject.sv.damage_anime_data = []
end
#--------------------------------------------------------------------------
# ● ダメージ戦闘アニメ処理
#--------------------------------------------------------------------------
def damage_anime(target, item)
@log_window.back_to(1) if @log_window.line_number == 5
@miss = false
invoke_item(target,item)
if target.result.missed
target.sv.miss_action(@subject, item)
@miss = true
return @log_window.display_action_results(target, item)
elsif target.result.evaded
target.sv.evasion_action(@subject, item)
@miss = true
return @log_window.display_action_results(target, item)
end
target.sv.damage_action(@subject, item)
@log_window.display_action_results(target, item)
$sv_camera.damager.push(target)
return if @subject.sv.damage_anime_data == []
target.animation_id = @subject.sv.damage_anime_data[0]
target.animation_mirror = @subject.sv.damage_anime_data[1]
target.sv.anime_no_mirror = @subject.sv.damage_anime_data[2]
target.sv.anime_camera_zoom = @subject.sv.damage_anime_data[3]
end
#--------------------------------------------------------------------------
# ● 飛ばしアニメ処理
#--------------------------------------------------------------------------
def set_move_anime(item)
for data in @subject.sv.m_a_data
@subject.sv.damage_anime_data = data[4]
hit_targets = []
for target in data[1]
damage_anime(target, item) if data[0]
hit_targets.push(target) if !@miss
end
@miss = false if !data[3]
@spriteset.set_hit_animation(@subject, data[2], hit_targets, @miss)
end
@subject.sv.set_damage = false
@subject.sv.m_a_data = []
end
#--------------------------------------------------------------------------
# ● スキル派生
#--------------------------------------------------------------------------
def derived_skill
@subject.force_action(@subject.sv.derivation_skill_id, -2)
BattleManager.unshift_action_battlers(@subject)
end
end
end
#==============================================================================
# ■ BattleManager
#------------------------------------------------------------------------------
# 戦闘の進行を管理するモジュールです。
#==============================================================================
module BattleManager
#--------------------------------------------------------------------------
# ● エンカウント時の処理 ★再定義
#--------------------------------------------------------------------------
def self.on_encounter
@preemptive = (rand < rate_preemptive)
@surprise = (rand < rate_surprise && !@preemptive)
$sv_camera.mirror = @surprise if N03::BACK_ATTACK
end
#--------------------------------------------------------------------------
# ● 勝利の処理 ★再定義
#--------------------------------------------------------------------------
def self.process_victory
$sv_camera.win_wait = true
end
#--------------------------------------------------------------------------
# ● 勝利
#--------------------------------------------------------------------------
def self.victory
$sv_camera.win_wait = false
N03.camera(nil, N03::BATTLE_CAMERA["戦闘終了時"].dup)
for member in $game_party.members do member.sv.start_action(member.sv.win) if member.movable? end
play_battle_end_me
replay_bgm_and_bgs
$game_message.add(sprintf(Vocab::Victory, $game_party.name))
display_exp
gain_gold
gain_drop_items
gain_exp
SceneManager.return
battle_end(0)
return true
end
#--------------------------------------------------------------------------
# ● 逃走の処理 ★再定義
#--------------------------------------------------------------------------
def self.process_escape
$game_message.add(sprintf(Vocab::EscapeStart, $game_party.name))
success = @preemptive ? true : (rand < @escape_ratio)
Sound.play_escape
if success
process_abort
for member in $game_party.members do member.sv.start_action(member.sv.escape) if member.movable? end
else
@escape_ratio += 0.1
$game_message.add('\.' + Vocab::EscapeFailure)
$game_party.clear_actions
for member in $game_party.members do member.sv.start_action(member.sv.escape_ng) if member.movable? end
end
wait_for_message
return success
end
#--------------------------------------------------------------------------
# ● 次のコマンド入力へ ★再定義
#--------------------------------------------------------------------------
def self.next_command
begin
if !actor || !actor.next_command
@actor_index += 1
if @actor_index >= $game_party.members.size
for member in $game_party.battle_members.reverse
break member.sv.start_action(member.sv.command_a) if member.inputable?
end
N03.camera(nil, N03::BATTLE_CAMERA["ターン開始後"].dup)
return false
end
end
end until actor.inputable?
actor.sv.start_action(actor.sv.command_b) if actor != nil && actor.inputable?
if pre_actor
pre_actor.sv.start_action(pre_actor.sv.command_a) if pre_actor != nil && pre_actor.inputable?
end
return true
end
#--------------------------------------------------------------------------
# ● 前のコマンド入力へ ★再定義
#--------------------------------------------------------------------------
def self.prior_command
begin
if !actor || !actor.prior_command
@actor_index -= 1
if @actor_index < 0
for member in $game_party.battle_members
break member.sv.start_action(member.sv.command_a) if member.inputable?
end
return false
end
end
end until actor.inputable?
actor.sv.start_action(actor.sv.command_b) if actor.inputable?
after_actor.sv.start_action(after_actor.sv.command_a) if after_actor != nil && after_actor.inputable?
return true
end
#--------------------------------------------------------------------------
# ● コマンド入力前のアクターを取得
#--------------------------------------------------------------------------
def self.pre_actor
return if @actor_index == 0
$game_party.members[@actor_index - 1]
end
#--------------------------------------------------------------------------
# ● コマンド入力後のアクターを取得
#--------------------------------------------------------------------------
def self.after_actor
$game_party.members[@actor_index + 1]
end
#--------------------------------------------------------------------------
# ● 戦闘行動者を前に追加
#--------------------------------------------------------------------------
def self.unshift_action_battlers(battler)
@action_battlers.unshift(battler)
end
end
#==============================================================================
# ■ Game_Battler
#------------------------------------------------------------------------------
# スプライトや行動に関するメソッドを追加したバトラーのクラスです。
#==============================================================================
class Game_Battler < Game_BattlerBase
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :sv # サイドビューデータ
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias initialize_game_battler_n03 initialize
def initialize
initialize_game_battler_n03
@sv = SideView.new(self)
end
#--------------------------------------------------------------------------
# ● 現在の戦闘行動を除去
#--------------------------------------------------------------------------
alias remove_current_action_game_battler_n03 remove_current_action
def remove_current_action
return @sv.derivation_skill_id = 0 if @sv.derivation_skill_id != 0
remove_current_action_game_battler_n03
end
#--------------------------------------------------------------------------
# ● ターン終了処理
#--------------------------------------------------------------------------
alias on_turn_end_game_battler_n03 on_turn_end
def on_turn_end
on_turn_end_game_battler_n03
@sv.add_state = []
$sv_camera.damager.push(self) if @result.hp_damage != 0 or @result.mp_damage
end
#--------------------------------------------------------------------------
# ● パタメータ条件比較 data = [種別, 数値, 判別]
#--------------------------------------------------------------------------
def comparison_parameter(data)
return true if data[0][0] == 0
kind = data[0]
num = data[1]
select = data[2]
case kind
when 1 ; par = level
when 2 ; par = mhp
when 3 ; par = mmp
when 4 ; par = hp
when 5 ; par = mp
when 6 ; par = tp
when 7 ; par = atk
when 8 ; par = self.def
when 9 ; par = mat
when 10 ; par = mdf
when 11 ; par = agi
when 12 ; par = luk
end
if num < 0
case kind
when 4 ; num = mhp * num / 100
when 5 ; num = mmp * num / 100
when 6 ; num = max_tp * num / 100
end
num = num.abs
end
case select
when 0 ; return par == num
when 1 ; return par < num
when 2 ; return par > num
end
end
#--------------------------------------------------------------------------
# ● 装備条件比較 data = [装備種別, ID]
#--------------------------------------------------------------------------
def comparison_equip(data)
kind = data[0]
id = data[1].abs
return false if !actor?
case kind
when 0 ; return weapons.include?($data_weapons[id])
when 1 ; return armors.include?($data_armors[id])
end
end
end
#==============================================================================
# ■ Game_Actor
#------------------------------------------------------------------------------
# アクターを扱うクラスです。
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :actor_id # ID
#--------------------------------------------------------------------------
# ● ID
#--------------------------------------------------------------------------
def id
return @actor_id
end
#--------------------------------------------------------------------------
# ● スプライトを使うか? ★再定義
#--------------------------------------------------------------------------
def use_sprite?
return true
end
#--------------------------------------------------------------------------
# ● ダメージ効果の実行 ★再定義
#--------------------------------------------------------------------------
def perform_damage_effect
return if !N03::ACTOR_DAMAGE
$game_troop.screen.start_shake(5, 5, 10)
@sprite_effect_type = :blink
Sound.play_actor_damage
end
end
#==============================================================================
# ■ Game_Enemy
#------------------------------------------------------------------------------
# 敵キャラを扱うクラスです。
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :enemy_id # ID
#--------------------------------------------------------------------------
# ● ID
#--------------------------------------------------------------------------
def id
return @enemy_id
end
#--------------------------------------------------------------------------
# ● ダメージ効果の実行 ★再定義
#--------------------------------------------------------------------------
def perform_damage_effect
return if !N03::ENEMY_DAMAGE
@sprite_effect_type = :blink
Sound.play_enemy_damage
end
#--------------------------------------------------------------------------
# ● 武器
#--------------------------------------------------------------------------
def weapons
weapon1 = $data_weapons[@sv.enemy_weapon1_id]
weapon2 = $data_weapons[@sv.enemy_weapon2_id]
return [weapon1, weapon2]
end
#--------------------------------------------------------------------------
# ● 防具
#--------------------------------------------------------------------------
def armors
return [$data_armors[@sv.enemy_shield_id]]
end
#--------------------------------------------------------------------------
# ● 二刀流の判定
#--------------------------------------------------------------------------
def dual_wield?
return $data_weapons[@sv.enemy_weapon2_id] != nil
end
#--------------------------------------------------------------------------
# ● バトラー画像変更
#--------------------------------------------------------------------------
def graphics_change(battler_name)
@battler_name = battler_name
end
#--------------------------------------------------------------------------
# ● 通常攻撃 アニメーション ID の取得
#--------------------------------------------------------------------------
def atk_animation_id1
return weapons[0].animation_id if weapons[0]
return weapons[1] ? 0 : 1
end
#--------------------------------------------------------------------------
# ● 通常攻撃 アニメーション ID の取得(二刀流:武器2)
#--------------------------------------------------------------------------
def atk_animation_id2
return weapons[1] ? weapons[1].animation_id : 0
end
end
#==============================================================================
# ■ SideViewバトラー設定
#------------------------------------------------------------------------------
# アクション設定で作ったアクションをバトラーに貼り付けたり
# バトラーに関する設定を行います
#==============================================================================
class SideView
#--------------------------------------------------------------------------
# ● バトラーアニメ画像の横・縦セル数 = [ 横, 縦] アニメさせない場合は[1, 1]
#--------------------------------------------------------------------------
def max_pattern
# バトラーIDで分岐
case id
when 1 # 1番のアクター
return [ 3, 4]
when -1 # 1番のエネミー(エネミーはIDをマイナスにすることで指定します)
return [ 1, 1]
else # 上のID以外を一括で設定
return [ 3, 4] if id > 0 # 全アクター(IDがプラス)
return [ 1, 1] if id < 0 # 全エネミー(IDがマイナス)
end
# 以降の設定でID分岐させる場合はこの記述を参考にしてください
end
#--------------------------------------------------------------------------
# ● 影画像ファイル名 画像はCharactersフォルダに入れてください falseで影なし
#--------------------------------------------------------------------------
def shadow
return "shadow01" if id > 0 # 全アクター
return false if id < 0 # 全エネミー
end
#--------------------------------------------------------------------------
# ● バトラー画像反転設定 初期状態でバトラー画像を反転させるならtrue
#--------------------------------------------------------------------------
def graphic_mirror_flug
return false if id > 0 # 全アクター
return true if id < 0 # 全エネミー
end
#--------------------------------------------------------------------------
# ● 通常待機
#--------------------------------------------------------------------------
def normal
return "通常待機" if id > 0 # 全アクター
return "待機固定WT" if id < 0 # 全エネミー
# フルアクションではなくアクションだけを貼り付けることもできます
end
#--------------------------------------------------------------------------
# ● ピンチ待機 HPが1/4以下の状態で行う待機アクション
#--------------------------------------------------------------------------
def pinch
return "ピンチ待機" if id > 0 # 全アクター
end
#--------------------------------------------------------------------------
# ● ステートアクション 複数重なった場合、表示優先度の高いステートが優先されます
#--------------------------------------------------------------------------
def state(state_id)
# ステートIDで分岐
case state_id
when 1
return "戦闘不能" if id > 0 # 全アクター
return "敵コラプス" if id < 0 # 全エネミー
when 2
return "毒待機"
when 6
return "睡眠待機"
when 3,4,5,7,8
return "汎用状態異常待機"
when 9
return "防御"
end
end
#--------------------------------------------------------------------------
# ● 戦闘開始アクション
#--------------------------------------------------------------------------
def first_action
return "戦闘開始味方" if id > 0 # 全アクター
return "待機固定WT" if id < 0 # 全エネミー
end
#--------------------------------------------------------------------------
# ● 勝利アクション
#--------------------------------------------------------------------------
def win
case id
when 2 # 2番のアクター
return "勝利ポーズ拳"
when 7,10 # 7・10番のアクター
return "勝利ポーズバク転"
else # 上記以外
return "勝利ポーズ振り"
end
end
#--------------------------------------------------------------------------
# ● 戦闘退場アクション パーティの入れ替えが行われた際の退場アクション
#--------------------------------------------------------------------------
def remove_action
return "味方退場"
end
#--------------------------------------------------------------------------
# ● 逃走アクション
#--------------------------------------------------------------------------
def escape
return "逃走" if id > 0 # 全アクター
return "敵逃走" if id < 0 # 全エネミー
end
#--------------------------------------------------------------------------
# ● 逃走失敗アクション
#--------------------------------------------------------------------------
def escape_ng
return "逃走失敗"
end
#--------------------------------------------------------------------------
# ● コマンド入力前動作
#--------------------------------------------------------------------------
def command_b
return "コマンド入力"
end
#--------------------------------------------------------------------------
# ● コマンド入力後動作
#--------------------------------------------------------------------------
def command_a
# 選択したスキルIDで分岐
case skill_id
when 2
return "コマンド後防御"
end
# 選択したスキルタイプで指定
case skill_type
when 1 # 特技
return "コマンド後特技"
when 2 # 魔法
return "コマンド後魔法"
end
# 上の指定以外
return "コマンド入力後"
end
#--------------------------------------------------------------------------
# ● 被ダメージアクション
#--------------------------------------------------------------------------
def damage(attacker)
# 受けた攻撃がクリティカルの場合
if critical?
return "被ダメージ大"
# 回復の場合
elsif recovery?
return
# アクションを取らせたくない時はreturnのみを記述します
end
# 受けたスキルIDで分岐
case damage_skill_id
when 1 # スキル1番の場合
return "被ダメージ"
when 2,6,135 # 防御、エネミーの逃走はダメージアクションなし
return
# 特定のスキルにダメージアクションを取らせたくない時はここでreturnのみを記述します
end
# 受けたアイテムIDで指定(回復の場合は既にアクションが決定されています)
case damage_item_id
when 1 # アイテム1番の場合
return
else
# 上のアイテムID以外
if damage_item_id != 0
return
end
end
# 上の設定に当てはまらない場合
return "被ダメージ"
end
#--------------------------------------------------------------------------
# ● 回避動作 被ダメージアクションと同じ分岐が可能です
#--------------------------------------------------------------------------
def evasion(attacker)
return "盾ガード" if shield? # 盾を装備している場合
return "回避"
end
#--------------------------------------------------------------------------
# ● 相手の攻撃ミス時の動作 被ダメージアクションと同じ分岐が可能です
#--------------------------------------------------------------------------
def miss(attacker)
return "盾ガード" if shield? # 盾を装備している場合
return "回避"
end
#--------------------------------------------------------------------------
# ● 武器アクション 通常攻撃のアクションを装備武器で指定します
# エネミーは下のエネミー武器設定で持たせることができます
#--------------------------------------------------------------------------
def weapon_action
# 武器IDで指定
case weapon_id
when 0 # 武器0番の場合(素手)
return "通常攻撃"
when 1 # 武器1番の場合
return "斬り攻撃"
end
# 武器タイプで指定
case weapon_type
when 1 # 武器タイプ1番の場合
return "斬り攻撃"
when 4,5,7,8,9 # 複数まとめて指定する場合
return "斬り攻撃"
when 2
return "拳攻撃"
when 3
return "突き攻撃"
when 6
return "弓攻撃"
end
end
#--------------------------------------------------------------------------
# ● エネミー右手武器 エネミーにも装備武器をID指定します
#--------------------------------------------------------------------------
def enemy_weapon1_id
case id
when -1 # 1番のエネミー(エネミーはIDをマイナスにすることで分岐させます)
return 0 # 武器IDを指定。0番は素手扱いです
else
return 0
end
end
#--------------------------------------------------------------------------
# ● エネミー左手武器 エネミーにも二刀装備武器をID指定します
#--------------------------------------------------------------------------
def enemy_weapon2_id
return 0
end
#--------------------------------------------------------------------------
# ● エネミー盾 エネミーにも盾をID指定します 左手武器より優先されます
#--------------------------------------------------------------------------
def enemy_shield_id
return 0
end
#--------------------------------------------------------------------------
# ● 武器グラフィック指定
#--------------------------------------------------------------------------
# 武器アクションのタイプ設定で [1:独自画像] [2:2003仕様]を選択した際の
# 参照先の画像をここで指定します
# return "001-Weapon01" ←対応する武器グラフィックのファイル名を入れてください
# 武器グラフィックはCharactersフォルダに入れてください
# 特定の武器を非表示にしたい場合は空の画像を用意して、それを指定します
def weapon_graphic(weapon_id, weapon_type)
# 武器IDで指定
case weapon_id
when 1 # 武器1番の画像ファイル名
return ""
end
# 武器タイプで指定
case weapon_type
when 6 # 武器タイプ6番の画像ファイル名
return "bow01"
end
end
#--------------------------------------------------------------------------
# ● 盾グラフィック指定
#--------------------------------------------------------------------------
# 武器アクションのタイプ設定で [1:独自画像] [2:2003仕様]を選択し、さらに
# 武器アクションの逆手設定をtrueにした場合の参照先の盾画像をここで指定します
#
# return "001-Shield01" ←対応する盾グラフィックのファイル名を入れてください
# 盾グラフィックはCharactersフォルダに入れてください
def shield_graphic(weapon_id, shield_type)
# 防具IDで指定
case shield_id
when 41 # 防具41番(バックラー)の画像ファイル名
return ""
end
# 防具タイプで指定
case shield_type
when 5 # 防具タイプ5番(小型盾)の画像ファイル名
return ""
end
end
#--------------------------------------------------------------------------
# ● スキルアクション
#--------------------------------------------------------------------------
def skill_action
case skill_id # スキルIDで指定
when 1 # スキル1番は通常攻撃なので、上の武器アクションを実行します
return weapon_action
when 2 # スキル2番は防御
return "防御"
when 3,4,5
return weapon_action
when 6 # スキル6番はエネミー逃走
return escape
when 7 # スキル7番は様子見
return "様子見"
when 128
return "水鉄砲"
when 129
return "武器投げ"
when 130
return "5回攻撃"
when 131
return "カットイン攻撃"
when 132
return "ムービー攻撃"
when 133
return "オオカミ変身"
when 134
return "スキル派生"
when 135
return "空中攻撃"
end
case skill_type # スキルタイプで指定
when 1 # 特技
return "汎用スキル"
when 2 # 魔法
return "汎用魔法"
end
return "汎用スキル"
end
#--------------------------------------------------------------------------
# ● アイテムアクション
#--------------------------------------------------------------------------
def item_action
case item_id # アイテムIDで指定
when 1
return "アイテム使用"
else
return "アイテム使用"
end
end