Tạo một script có tên XRXS System và ABS đưa 2 cái này vào
Sưu tầm bởi "dude666" in Japanese Web
Sưu tầm bởi "dude666" in Japanese Web
Mã:
#==============================================================================
# ■ XRXS.RGSS
#------------------------------------------------------------------------------
# Created by 桜雅 在土
#==============================================================================
#==============================================================================
# □ カスタマイズポイント
#==============================================================================
class Game_Battler
# 「乗算属性修正」
# ("特殊効果詰め合わせ"使用時は true にする必要があります。falseだと「最高倍率」)
ELEMENT_CORRECT_BY_MULTI = true
end
class Game_Actor < Game_Battler
# 「スキル使用可能条件をスキルを習得しているか否かに依存しない」(falseだと依存)
INDEPEND_SKILL_USABLE_ON_LEARNED = true
end
class Window_Skill < Window_Selectable
# 「消費SP0を隠す」(falseにすると、"スキル名 : 0"とゼロを表示します)
HIDE_ZERO_SP_COST = true
end
#==============================================================================
=begin
前書き
これはRGSSをXMS.RPGツクールXPスクリプトシェルフを
より開発しやすくする為に作られた修正の詰め合わせです。
コピー場所
「Scene_Debugより下でMainより上。
スクリプトシェルフ等を利用している場合はそれら全てより上。」
※Scene_Debug以上を書き換えている場合、
それらの変更が無効になってしまう場合があります。
修正内容---------------------------------------------------------------------
修正/追加 部分
Game_Battler 属性修正の計算「乗算属性修正」への対応
Game_Actor 「スキル使用可能条件」への対応
オートステートの更新
Window_Item @column_maxへの対応
Window_SKill @column_maxへの対応
SP消費 0 を表示させない機能を搭載。
Window_EquipItem @column_maxへの対応
Window_ShopSell @column_maxへの対応
Scene_Map 戦闘開始時のBGM停止を削除
同じBGMの場合は引き続きの演奏が出来る様に修正。
Scene_Battle バトルメッセージ処理軽減。
バトル終了時にMEをフェードアウト後に停止予約
リファクタリング 部分
Game_Actor X位置のシフト値
Window_Item 武器などの@dataへのプッシュ
Window_MenuStatus draw_actor_menu_status
Window_EquipItem 武器などの@dataへのプッシュ
Window_ShopSell 武器などの@dataへのプッシュ
Window_BattleStatus draw_actor_battle_status
Scene_Equip 装備変更後のパラメータを取得 1~4
実際に装着
(追加)refresh軽量化
Scene_Battle make_basic_action_target_set
battle_exp
battle_gold
追加モジュール
XRXS_Check_ElementName_Set 属性名判定
-------------------------------------------------------------修正内容ここまで
=end
#------------------------------------------------------------------------------
#
#
# ▽ 修正/追加 部分
#
#
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 属性修正の計算 + 倍率計算式
#--------------------------------------------------------------------------
alias xrxs_rgss_amendcustomize_elements_correct elements_correct
def elements_correct(element_set)
if ELEMENT_CORRECT_BY_MULTI
# 無属性の場合 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
else
return xrxs_rgss_amendcustomize_elements_correct
end
end
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● スキルの使用可能判定 + 習得判定無効化設定可
#--------------------------------------------------------------------------
def skill_can_use?(skill_id)
# INDEPEND_SKILL_USABLE_ON_LEARNED が true であればスキル習得判定を飛ばす
if not skill_learn?(skill_id) and not INDEPEND_SKILL_USABLE_ON_LEARNED
return false
end
return super
end
#--------------------------------------------------------------------------
# ● オートステートの更新
# old_armor : 外した防具
# new_armor : 装備した防具
#--------------------------------------------------------------------------
def update_auto_state(old_armor, new_armor)
# 外した防具のオートステートを強制解除
if old_armor != nil and old_armor.auto_state_id != 0
# 外す防具のオートステートが、
# 他の装備中の防具のオートステートと一致する場合、解除を行わない
bool = armors_auto_state_include?(old_armor)
unless bool
remove_state(old_armor.auto_state_id, true)
end
end
# 装備した防具のオートステートを強制付加
if new_armor != nil and new_armor.auto_state_id != 0
add_state(new_armor.auto_state_id, true)
end
end
#--------------------------------------------------------------------------
# ● 指定の防具のオートステートが現在装備中の防具のオートステートに含まれるか?
#--------------------------------------------------------------------------
def armors_auto_state_include?(old_armor)
return false if old_armor.nil?
bool = false
# 現在装備中の防具を取得
armor1 = $data_armors[@armor1_id]
armor2 = $data_armors[@armor2_id]
armor3 = $data_armors[@armor3_id]
armor4 = $data_armors[@armor4_id]
# 外された箇所を特定
case old_armor
when armor1
current_armor = armor1
when armor2
current_armor = armor2
when armor3
current_armor = armor3
when armor4
current_armor = armor4
end
# 判定
if current_armor != armor1 and !armor1.nil?
bool |= (old_armor.auto_state_id == armor1.auto_state_id)
end
if current_armor != armor2 and !armor2.nil?
bool |= (old_armor.auto_state_id == armor2.auto_state_id)
end
if current_armor != armor3 and !armor3.nil?
bool |= (old_armor.auto_state_id == armor3.auto_state_id)
end
if current_armor != armor4 and !armor4.nil?
bool |= (old_armor.auto_state_id == armor4.auto_state_id)
end
return bool
end
end
#==============================================================================
# ■ Window_Item
#==============================================================================
class Window_Item < Window_Selectable
#--------------------------------------------------------------------------
# ● 項目の描画 + @column_maxへの対応
#--------------------------------------------------------------------------
def draw_item(index)
item = @data[index]
case item
when RPG::Item
number = $game_party.item_number(item.id)
when RPG::Weapon
number = $game_party.weapon_number(item.id)
when RPG::Armor
number = $game_party.armor_number(item.id)
end
if item.is_a?(RPG::Item) and
$game_party.item_can_use?(item.id)
self.contents.font.color = normal_color
else
self.contents.font.color = disabled_color
end
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
#==============================================================================
# ■ Window_EquipItem
#==============================================================================
class Window_EquipItem < Window_Selectable
#--------------------------------------------------------------------------
# ● 項目の描画 + @column_maxへの対応
#--------------------------------------------------------------------------
def draw_item(index)
item = @data[index]
x = 4 + index % @column_max * (288 + 32)
y = index / @column_max * 32
case item
when RPG::Weapon
number = $game_party.weapon_number(item.id)
when RPG::Armor
number = $game_party.armor_number(item.id)
end
bitmap = RPG::Cache.icon(item.icon_name)
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24))
self.contents.font.color = normal_color
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
#==============================================================================
# ■ Window_ShopSell
#==============================================================================
class Window_ShopSell < Window_Selectable
#--------------------------------------------------------------------------
# ● 項目の描画
# index : 項目番号
#--------------------------------------------------------------------------
def draw_item(index)
item = @data[index]
case item
when RPG::Item
number = $game_party.item_number(item.id)
when RPG::Weapon
number = $game_party.weapon_number(item.id)
when RPG::Armor
number = $game_party.armor_number(item.id)
end
# 売却可能なら通常文字色に、そうでないなら無効文字色に設定
if item.price > 0
self.contents.font.color = normal_color
else
self.contents.font.color = disabled_color
end
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_Map
#==============================================================================
class Scene_Map
#--------------------------------------------------------------------------
# ● バトルの呼び出し + 同BGM連続再生
#--------------------------------------------------------------------------
def call_battle
# バトル呼び出しフラグをクリア
$game_temp.battle_calling = false
# メニュー呼び出しフラグをクリア
$game_temp.menu_calling = false
$game_temp.menu_beep = false
# エンカウント カウントを作成
$game_player.make_encounter_count
# マップ BGM を記憶し、BGM を停止
$game_temp.map_bgm = $game_system.playing_bgm
$game_system.bgm_stop
# バトル開始 SE を演奏
$game_system.se_play($data_system.battle_start_se)
# バトル BGM を演奏
$game_system.bgm_play($game_system.battle_bgm)
# プレイヤーの姿勢を矯正
$game_player.straighten
# バトル画面に切り替え
$scene = Scene_Battle.new
end
end
#$game_system.bgm_stop #←ココをコメントアウトしました
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ● フレーム更新 + バトルメッセージ表示軽量化
#--------------------------------------------------------------------------
def update
# バトルイベント実行中の場合
if $game_system.battle_interpreter.running?
# インタプリタを更新
$game_system.battle_interpreter.update
# アクションを強制されているバトラーが存在しない場合
if $game_temp.forcing_battler == nil
# バトルイベントの実行が終わった場合
unless $game_system.battle_interpreter.running?
# 戦闘継続の場合、バトルイベントのセットアップを再実行
unless judge
setup_battle_event
end
end
# アフターバトルフェーズでなければ
if @phase != 5 and (not $game_temp.message_window_showing) # ←ココ
# ステータスウィンドウをリフレッシュ
@status_window.refresh
end
end
end
# システム (タイマー)、画面を更新
$game_system.update
$game_screen.update
# タイマーが 0 になった場合
if $game_system.timer_working and $game_system.timer == 0
# バトル中断
$game_temp.battle_abort = true
end
# ウィンドウを更新
@help_window.update
@party_command_window.update
@actor_command_window.update
@status_window.update
@message_window.update
# スプライトセットを更新
@spriteset.update
# トランジション処理中の場合
if $game_temp.transition_processing
# トランジション処理中フラグをクリア
$game_temp.transition_processing = false
# トランジション実行
if $game_temp.transition_name == ""
Graphics.transition(20)
else
Graphics.transition(40, "Graphics/Transitions/" +
$game_temp.transition_name)
end
end
# メッセージウィンドウ表示中の場合
if $game_temp.message_window_showing
return
end
# エフェクト表示中の場合
if @spriteset.effect?
return
end
# ゲームオーバーの場合
if $game_temp.gameover
# ゲームオーバー画面に切り替え
$scene = Scene_Gameover.new
return
end
# タイトル画面に戻す場合
if $game_temp.to_title
# タイトル画面に切り替え
$scene = Scene_Title.new
return
end
# バトル中断の場合
if $game_temp.battle_abort
# バトル開始前の BGM に戻す
$game_system.bgm_play($game_temp.map_bgm)
# バトル終了
battle_end(1)
return
end
# ウェイト中の場合
if @wait_count > 0
# ウェイトカウントを減らす
@wait_count -= 1
return
end
# アクションを強制されているバトラーが存在せず、
# かつバトルイベントが実行中の場合
if $game_temp.forcing_battler == nil and
$game_system.battle_interpreter.running?
return
end
# フェーズによって分岐
case @phase
when 1 # プレバトルフェーズ
update_phase1
when 2 # パーティコマンドフェーズ
update_phase2
when 3 # アクターコマンドフェーズ
update_phase3
when 4 # メインフェーズ
update_phase4
when 5 # アフターバトルフェーズ
update_phase5
end
end
#--------------------------------------------------------------------------
# ● バトル終了 + 戦闘勝利MEフェードアウト
#--------------------------------------------------------------------------
def battle_end(result)
# 戦闘中フラグをクリア
$game_temp.in_battle = false
# パーティ全員のアクションをクリア
$game_party.clear_actions
# バトル用ステートを解除
for actor in $game_party.actors
actor.remove_states_battle
end
# エネミーをクリア
$game_troop.enemies.clear
# バトル コールバックを呼ぶ
if $game_temp.battle_proc != nil
$game_temp.battle_proc.call(result)
$game_temp.battle_proc = nil
end
# MEの停止
Audio.me_fade(1000)
# ここからスレッド
@me_fade_thread = Thread.new do
sleep(0.25)
Audio.me_stop
@me_fade_thread.kill
end
# ここまでスレッド
# マップ画面に切り替え
$scene = Scene_Map.new
end
end
#------------------------------------------------------------------------------
#
#
# ▽ リファクタリング 部分
#
#
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 防御の効果適用
#--------------------------------------------------------------------------
def guarding_effect(damage)
return damage / 2
end
#--------------------------------------------------------------------------
# ● 通常攻撃の効果適用
# attacker : 攻撃者 (バトラー)
#--------------------------------------------------------------------------
def attack_effect(attacker)
# クリティカルフラグをクリア
self.critical = false
# 第一命中判定
hit_result = (rand(100) < attacker.hit)
# 命中の場合
if hit_result == true
# 基本ダメージを計算
atk = [attacker.atk - self.pdef / 2, 0].max
self.damage = atk * (20 + attacker.str) / 20
# 属性修正
self.damage *= elements_correct(attacker.element_set)
self.damage /= 100
# ダメージの符号が正の場合
if self.damage > 0
# クリティカル修正
if rand(100) < 4 * attacker.dex / self.agi
self.damage *= 2
self.critical = true
end
# 防御修正
if self.guarding?
self.damage = guarding_effect(self.damage)
end
end
# 分散
if self.damage.abs > 0
amp = [self.damage.abs * 15 / 100, 1].max
self.damage += rand(amp+1) + rand(amp+1) - amp
end
# 第二命中判定
eva = 8 * self.agi / attacker.dex + self.eva
hit = self.damage < 0 ? 100 : 100 - eva
hit = self.cant_evade? ? 100 : hit
hit_result = (rand(100) < hit)
end
# 命中の場合
if hit_result == true
# ステート衝撃解除
remove_states_shock
# HP からダメージを減算
self.hp -= self.damage
# ステート変化
@state_changed = false
states_plus(attacker.plus_state_set)
states_minus(attacker.minus_state_set)
# ミスの場合
else
# ダメージに "Miss" を設定
self.damage = "Miss"
# クリティカルフラグをクリア
self.critical = false
end
# メソッド終了
return true
end
#--------------------------------------------------------------------------
# ● スキルの基本ダメージ計算
#--------------------------------------------------------------------------
def cals_skill_damage(user, skill)
# 威力を計算
power = skill.power + user.atk * skill.atk_f / 100
if power > 0
power -= self.pdef * skill.pdef_f / 200
power -= self.mdef * skill.mdef_f / 200
power = [power, 0].max
end
# 倍率を計算
rate = 20
rate += (user.str * skill.str_f / 100)
rate += (user.dex * skill.dex_f / 100)
rate += (user.agi * skill.agi_f / 100)
rate += (user.int * skill.int_f / 100)
# 基本ダメージを計算
return power * rate / 20
end
#--------------------------------------------------------------------------
# ● スキルの効果適用
# user : スキルの使用者 (バトラー)
# skill : スキル
#--------------------------------------------------------------------------
def skill_effect(user, skill)
# クリティカルフラグをクリア
self.critical = false
# スキルの効果範囲が HP 1 以上の味方で、自分の HP が 0、
# またはスキルの効果範囲が HP 0 の味方で、自分の HP が 1 以上の場合
if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
# メソッド終了
return false
end
# 有効フラグをクリア
effective = false
# コモンイベント ID が有効の場合は有効フラグをセット
effective |= skill.common_event_id > 0
# 第一命中判定
hit = skill.hit
if skill.atk_f > 0
hit *= user.hit / 100
end
hit_result = (rand(100) < hit)
# 不確実なスキルの場合は有効フラグをセット
effective |= hit < 100
# 命中の場合
if hit_result == true
# スキルの基本ダメージの計算
self.damage = cals_skill_damage(user, skill)
# 属性修正
self.damage *= elements_correct(skill.element_set)
self.damage /= 100
# ダメージの符号が正の場合
if self.damage > 0
# 防御修正
if self.guarding?
self.damage = guarding_effect(self.damage)
end
end
# 分散
if skill.variance > 0 and self.damage.abs > 0
amp = [self.damage.abs * skill.variance / 100, 1].max
self.damage += rand(amp+1) + rand(amp+1) - amp
end
# 第二命中判定
eva = 8 * self.agi / user.dex + self.eva
hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
hit = self.cant_evade? ? 100 : hit
hit_result = (rand(100) < hit)
# 不確実なスキルの場合は有効フラグをセット
effective |= hit < 100
end
# 命中の場合
if hit_result == true
# 威力 0 以外の物理攻撃の場合
if skill.power != 0 and skill.atk_f > 0
# ステート衝撃解除
remove_states_shock
# 有効フラグをセット
effective = true
end
# HP からダメージを減算
last_hp = self.hp
self.hp -= self.damage
effective |= self.hp != last_hp
# ステート変化
@state_changed = false
effective |= states_plus(skill.plus_state_set)
effective |= states_minus(skill.minus_state_set)
# 威力が 0 の場合
if skill.power == 0
# ダメージに空文字列を設定
self.damage = ""
# ステートに変化がない場合
unless @state_changed
# ダメージに "Miss" を設定
self.damage = "Miss"
end
end
# ミスの場合
else
# ダメージに "Miss" を設定
self.damage = "Miss"
end
# 戦闘中でない場合
unless $game_temp.in_battle
# ダメージに nil を設定
self.damage = nil
end
# メソッド終了
return effective
end
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● バトル画面 X 座標の取得
#--------------------------------------------------------------------------
def screen_x
# パーティ内の並び順から X 座標を計算して返す
if self.index != nil
return self.index * screen_x_shift + 80
else
return 0
end
end
#--------------------------------------------------------------------------
# ● バトル画面 X 座標のパーティ人数によるシフトの量
#--------------------------------------------------------------------------
def screen_x_shift
return 160
end
end
#==============================================================================
# ■ Window_Selectable
#==============================================================================
class Window_Selectable < Window_Base
#--------------------------------------------------------------------------
# ● 一行の高さ
#--------------------------------------------------------------------------
def row_height
return 32
end
#--------------------------------------------------------------------------
# ● 先頭の行の取得
#--------------------------------------------------------------------------
def top_row
# ウィンドウ内容の転送元 Y 座標を、1 行の高さで割る
return self.oy / row_height
end
#--------------------------------------------------------------------------
# ● 先頭の行の設定
# row : 先頭に表示する行
#--------------------------------------------------------------------------
def top_row=(row)
# row が 0 未満の場合は 0 に修正
if row < 0
row = 0
end
# row が row_max - 1 超の場合は row_max - 1 に修正
if row > row_max - 1
row = row_max - 1
end
# row に 1 行の高さを掛け、ウィンドウ内容の転送元 Y 座標とする
self.oy = row * row_height
end
end
#==============================================================================
# ■ Window_MenuStatus
#==============================================================================
class Window_MenuStatus < Window_Selectable
#--------------------------------------------------------------------------
# ● 一行の高さ
#--------------------------------------------------------------------------
def row_height
return 116
end
#--------------------------------------------------------------------------
# ● 一人当たりの描写部分のサイズ
#--------------------------------------------------------------------------
def drawable_box_size
return 96
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
self.contents.clear
@item_max = $game_party.actors.size
for i in 0...$game_party.actors.size
x = 64
y = i * row_height
actor = $game_party.actors[i]
draw_actor_menu_status(actor, x, y)
end
end
#--------------------------------------------------------------------------
# ● メニューステータス用アクターステータスの描写
#--------------------------------------------------------------------------
def draw_actor_menu_status(actor, x, y)
# 描写可能なサイズを取得
size = drawable_box_size
# 描写
draw_actor_graphic(actor, x - 40, y + size*5/6)
draw_actor_name(actor, x, y)
draw_actor_class(actor, x + 144, y)
draw_actor_level(actor, x, y + size/2 - 16)
draw_actor_state(actor, x + 90, y + size/2 - 16)
draw_actor_exp(actor, x, y + size*5/6 - 16)
draw_actor_hp(actor, x + 236, y + size/2 - 16)
draw_actor_sp(actor, x + 236, y + size*5/6 - 16)
end
#--------------------------------------------------------------------------
# ● カーソルの矩形更新
#--------------------------------------------------------------------------
def update_cursor_rect
if @index < 0
self.cursor_rect.empty
else
self.cursor_rect.set(0, @index * row_height, self.width - 32, drawable_box_size)
end
end
end
#==============================================================================
# ■ Window_Item
#==============================================================================
class Window_Item < Window_Selectable
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
if self.contents != nil
self.contents.dispose
self.contents = nil
end
@data = []
get_data_of_draw_items
# 項目数が 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
#--------------------------------------------------------------------------
# ● 描写するアイテム@dataの取得
#--------------------------------------------------------------------------
def get_data_of_draw_items
# アイテムを追加
set_own_item_data
# 戦闘中以外なら武器と防具も追加
unless $game_temp.in_battle
set_own_weapon_data
set_own_armor_data
end
end
#--------------------------------------------------------------------------
# ● 所有数が 1 以上のアイテムを @data に返す
#--------------------------------------------------------------------------
def set_own_item_data
for i in 1...$data_items.size
if $game_party.item_number(i) > 0
@data.push($data_items[i])
end
end
end
#--------------------------------------------------------------------------
# ● 所有数が 1 以上の武器を @data に返す
#--------------------------------------------------------------------------
def set_own_weapon_data
for i in 1...$data_weapons.size
if $game_party.weapon_number(i) > 0
@data.push($data_weapons[i])
end
end
end
#--------------------------------------------------------------------------
# ● 所有数が 1 以上の防具を @data に返す
#--------------------------------------------------------------------------
def set_own_armor_data
for i in 1...$data_armors.size
if $game_party.armor_number(i) > 0
@data.push($data_armors[i])
end
end
end
end
#==============================================================================
# ■ Window_Skill
#==============================================================================
class Window_Skill < Window_Selectable
#--------------------------------------------------------------------------
# ● 項目の描画 + @column_maxへの対応 + 「SP消費0を隠す」 + リファクタリング
#--------------------------------------------------------------------------
def draw_item(index)
skill = @data[index]
if @actor.skill_can_use?(skill.id)
self.contents.font.color = normal_color
else
self.contents.font.color = disabled_color
end
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(skill.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, 204, 32, skill.name, 0)
sp_cost = get_sp_cost(skill)
if sp_cost > 0 or !HIDE_ZERO_SP_COST
self.contents.draw_text(x + 232, y, 48, 32, sp_cost.to_s, 2)
end
end
#--------------------------------------------------------------------------
# ● スキルの消費SPの値の取得
#--------------------------------------------------------------------------
def get_sp_cost(skill)
return skill.sp_cost
end
end
#==============================================================================
# ■ Window_EquipItem
#==============================================================================
class Window_EquipItem < Window_Selectable
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
if self.contents != nil
self.contents.dispose
self.contents = nil
end
@data = []
# 装備可能な武器を追加
if @equip_type == 0
set_equipable_weapon_data(@actor.class_id)
end
# 装備可能な防具を追加
if @equip_type != 0
set_equipable_armor_data(@actor.class_id)
end
# 空白を追加
@data.push(nil)
# ビットマップを作成し、全項目を描画
@item_max = @data.size
self.contents = Bitmap.new(width - 32, row_max * 32)
for i in 0...@item_max-1
draw_item(i)
end
end
#--------------------------------------------------------------------------
# ● 指定クラスが装備可能、かつ所有している武器を @data に返す
#--------------------------------------------------------------------------
def set_equipable_weapon_data(class_id)
weapon_set = $data_classes[class_id].weapon_set
for i in 1...$data_weapons.size
if $game_party.weapon_number(i) > 0 and weapon_set.include?(i)
@data.push($data_weapons[i])
end
end
end
#--------------------------------------------------------------------------
# ● 指定クラスが装備可能、かつ所有している防具を @data に返す
#--------------------------------------------------------------------------
def set_equipable_armor_data(class_id)
armor_set = $data_classes[class_id].armor_set
for i in 1...$data_armors.size
if $game_party.armor_number(i) > 0 and armor_set.include?(i)
if $data_armors[i].kind == @equip_type-1
@data.push($data_armors[i])
end
end
end
end
end
#==============================================================================
# ■ Window_ShopSell
#==============================================================================
class Window_ShopSell < Window_Selectable
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
if self.contents != nil
self.contents.dispose
self.contents = nil
end
@data = []
set_own_item_data
set_own_weapon_data
set_own_armor_data
# 項目数が 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
#--------------------------------------------------------------------------
# ● 所有数が 1 以上のアイテムを @data に返す
#--------------------------------------------------------------------------
def set_own_item_data
for i in 1...$data_items.size
if $game_party.item_number(i) > 0
@data.push($data_items[i])
end
end
end
#--------------------------------------------------------------------------
# ● 所有数が 1 以上の武器を @data に返す
#--------------------------------------------------------------------------
def set_own_weapon_data
for i in 1...$data_weapons.size
if $game_party.weapon_number(i) > 0
@data.push($data_weapons[i])
end
end
end
#--------------------------------------------------------------------------
# ● 所有数が 1 以上の防具を @data に返す
#--------------------------------------------------------------------------
def set_own_armor_data
for i in 1...$data_armors.size
if $game_party.armor_number(i) > 0
@data.push($data_armors[i])
end
end
end
end
#==============================================================================
# ■ Window_BattleStatus
#==============================================================================
class Window_BattleStatus < Window_Base
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
self.contents.clear
@item_max = $game_party.actors.size
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
x = i * drawable_x_shift + 4
y = 0
draw_actor_battle_status(actor, x, y, @level_up_flags[i])
end
end
#--------------------------------------------------------------------------
# ● 一人当たりの描写スペース
#--------------------------------------------------------------------------
def drawable_space
return 120
end
#--------------------------------------------------------------------------
# ● 一人当たりの描写間隔
#--------------------------------------------------------------------------
def drawable_x_shift
return 160
end
#--------------------------------------------------------------------------
# ● バトルステータス用アクターステータスの描写
#--------------------------------------------------------------------------
def draw_actor_battle_status(actor, x, y, level_up_flag = false)
max_width = drawable_space
draw_actor_name(actor, x, y)
draw_actor_hp(actor, x, y + 32, max_width)
draw_actor_sp(actor, x, y + 64, max_width)
if level_up_flag
self.contents.font.color = normal_color
self.contents.draw_text(x, y + 96, max_width, 32, "LEVEL UP!")
else
draw_actor_state(actor, x, y + 96)
end
end
end
#==============================================================================
# ■ Scene_Equip
#==============================================================================
class Scene_Equip
#--------------------------------------------------------------------------
# ● リフレッシュ + 軽量化処理
#--------------------------------------------------------------------------
def refresh
# アイテムウィンドウの可視状態設定
@item_window1.visible = (@right_window.index == 0)
@item_window2.visible = (@right_window.index == 1)
@item_window3.visible = (@right_window.index == 2)
@item_window4.visible = (@right_window.index == 3)
@item_window5.visible = (@right_window.index == 4)
# 現在装備中のアイテムを取得
item1 = @right_window.item
# 現在のアイテムウィンドウを @item_window に設定
case @right_window.index
when 0
@item_window = @item_window1
when 1
@item_window = @item_window2
when 2
@item_window = @item_window3
when 3
@item_window = @item_window4
when 4
@item_window = @item_window5
end
# ライトウィンドウがアクティブの場合
if @right_window.active
# 装備変更後のパラメータを消去
@left_window.set_new_parameters(nil, nil, nil)
end
# アイテムウィンドウがアクティブの場合
if @item_window.active
# カーソル位置が変わっていなければリターン
return if @item_window_cursor == @item_window.index
@item_window_cursor = @item_window.index
after_equip_parameter # ▽ 装備変更後のパラメータを取得 1~2へ。
end
end
#--------------------------------------------------------------------------
# ● 装備変更後のパラメータを取得 1~4
#--------------------------------------------------------------------------
def after_equip_parameter
# 現在選択中のアイテムを取得
item2 = @item_window.item
# 装備を変更
last_hp = @actor.hp
last_sp = @actor.sp
@actor.equip(@right_window.index, item2 == nil ? 0 : item2.id)
# 装備変更後のパラメータを取得
after_equip_parameter_phase2
# 現在装備中のアイテムを取得
item1 = @right_window.item
# 装備を戻す
@actor.equip(@right_window.index, item1 == nil ? 0 : item1.id)
@actor.hp = last_hp
@actor.sp = last_sp
# レフトウィンドウに描画
after_equip_parameter_phase4
end
def after_equip_parameter_phase2
# 装備変更後のパラメータを取得
@new_atk = @actor.atk
@new_pdef = @actor.pdef
@new_mdef = @actor.mdef
end
def after_equip_parameter_phase4
# レフトウィンドウに描画
@left_window.set_new_parameters(@new_atk, @new_pdef, @new_mdef)
end
#--------------------------------------------------------------------------
# ● フレーム更新 (アイテムウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
def update_item
# B ボタンが押された場合
if Input.trigger?(Input::B)
# キャンセル SE を演奏
$game_system.se_play($data_system.cancel_se)
# ライトウィンドウをアクティブ化
@right_window.active = true
@item_window.active = false
@item_window.index = -1
return
end
# C ボタンが押された場合
if Input.trigger?(Input::C)
# 装備 SE を演奏
$game_system.se_play($data_system.equip_se)
# 実際に装着
update_item_do_equip
# ライトウィンドウをアクティブ化
@right_window.active = true
@item_window.active = false
@item_window.index = -1
# ライトウィンドウ、アイテムウィンドウの内容を再作成
@right_window.refresh
@item_window.refresh
return
end
end
#--------------------------------------------------------------------------
# ● 実際に装着
#--------------------------------------------------------------------------
def update_item_do_equip
# アイテムウィンドウで現在選択されているデータを取得
item = @item_window.item
# 装備を変更
@actor.equip(@right_window.index, item == nil ? 0 : item.id)
end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ● アクターコマンドウィンドウのセットアップ
#--------------------------------------------------------------------------
def phase3_setup_command_window
# パーティコマンドウィンドウを無効化
@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 * phase3_setup_command_window_x_shift, 640-@actor_command_window.width].min
# インデックスを 0 に設定
@actor_command_window.index = 0
end
#--------------------------------------------------------------------------
# ● アクターコマンドウィンドウのXシフト量
#--------------------------------------------------------------------------
def phase3_setup_command_window_x_shift
return 160
end
#--------------------------------------------------------------------------
# ● 基本アクション 結果作成
#--------------------------------------------------------------------------
def make_basic_action_result
# 攻撃の場合
if @active_battler.current_action.basic == 0
# アニメーション ID を設定
@animation1_id = @active_battler.animation1_id
@animation2_id = @active_battler.animation2_id
# ターゲット配列の取得
make_basic_action_target_set
# 通常攻撃の効果を適用
for target in @target_battlers
target.attack_effect(@active_battler)
end
return
end
# 防御の場合
if @active_battler.current_action.basic == 1
# ヘルプウィンドウに "防御" を表示
@help_window.set_text($data_system.words.guard, 1)
return
end
# 逃げるの場合
if @active_battler.is_a?(Game_Enemy) and
@active_battler.current_action.basic == 2
# ヘルプウィンドウに "逃げる" を表示
@help_window.set_text("逃げる", 1)
# 逃げる
@active_battler.escape
return
end
# 何もしないの場合
if @active_battler.current_action.basic == 3
# アクション強制対象のバトラーをクリア
$game_temp.forcing_battler = nil
# ステップ 1 に移行
@phase4_step = 1
return
end
end
#--------------------------------------------------------------------------
# ● 基本アクションのターゲット配列作成
#--------------------------------------------------------------------------
def make_basic_action_target_set
# 行動側バトラーがエネミーの場合
if @active_battler.is_a?(Game_Enemy)
if @active_battler.restriction == 3
target = $game_troop.random_target_enemy
elsif @active_battler.restriction == 2
target = $game_party.random_target_actor
else
index = @active_battler.current_action.target_index
target = $game_party.smooth_target_actor(index)
end
end
# 行動側バトラーがアクターの場合
if @active_battler.is_a?(Game_Actor)
if @active_battler.restriction == 3
target = $game_party.random_target_actor
elsif @active_battler.restriction == 2
target = $game_troop.random_target_enemy
else
index = @active_battler.current_action.target_index
target = $game_troop.smooth_target_enemy(index)
end
end
# 対象側バトラーの配列を設定
@target_battlers = [target]
end
#--------------------------------------------------------------------------
# ● スキルアクション 結果作成
#--------------------------------------------------------------------------
def make_skill_action_result
# スキルを取得
@skill = $data_skills[@active_battler.current_action.skill_id]
# 強制アクションでなければ
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 消費
sp_cost = get_sp_cost(@skill)
@active_battler.sp -= sp_cost
# ステータスウィンドウをリフレッシュ
@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)
# スキルの効果を適用
for target in @target_battlers
target.skill_effect(@active_battler, @skill)
end
end
#--------------------------------------------------------------------------
# ● スキルの消費SPの値の取得
#--------------------------------------------------------------------------
def get_sp_cost(skill)
return skill.sp_cost
end
#--------------------------------------------------------------------------
# ● アフターバトルフェーズ開始
#--------------------------------------------------------------------------
def start_phase5
# フェーズ 5 に移行
@phase = 5
# バトル終了 ME を演奏
$game_system.me_play($game_system.battle_end_me)
# バトル開始前の BGM に戻す
$game_system.bgm_play($game_temp.map_bgm)
# EXP、ゴールド、トレジャーを初期化
exp = 0
gold = 0
treasures = []
# 獲得EXPを追加
exp += battle_exp
# 獲得ゴールドを追加
gold += battle_gold
# ループ
for enemy in $game_troop.enemies
# エネミーが隠れ状態でない場合
unless enemy.hidden
# トレジャー出現判定
if rand(100) < enemy.treasure_prob
if enemy.item_id > 0
treasures.push($data_items[enemy.item_id])
end
if enemy.weapon_id > 0
treasures.push($data_weapons[enemy.weapon_id])
end
if enemy.armor_id > 0
treasures.push($data_armors[enemy.armor_id])
end
end
end
end
# トレジャーの数を 6 個までに限定
treasures = treasures[0..5]
# EXP 獲得
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
if actor.cant_get_exp? == false
last_level = actor.level
actor.exp += exp
if actor.level > last_level
@status_window.level_up(i)
end
end
end
# ゴールド獲得
$game_party.gain_gold(gold)
# トレジャー獲得
for item in treasures
case item
when RPG::Item
$game_party.gain_item(item.id, 1)
when RPG::Weapon
$game_party.gain_weapon(item.id, 1)
when RPG::Armor
$game_party.gain_armor(item.id, 1)
end
end
# バトルリザルトウィンドウを作成
@result_window = Window_BattleResult.new(exp, gold, treasures)
# ウェイトカウントを設定
@phase5_wait_count = 100
end
#--------------------------------------------------------------------------
# ● 獲得する戦闘経験値の取得
#--------------------------------------------------------------------------
def battle_exp
bexp = 0
# ループ
for enemy in $game_troop.enemies
# エネミーが隠れ状態でない場合
unless enemy.hidden
# 獲得を追加
bexp += enemy.exp
end
end
return bexp
end
#--------------------------------------------------------------------------
# ● 獲得する戦闘金の取得
#--------------------------------------------------------------------------
def battle_gold
bgold = 0
# ループ
for enemy in $game_troop.enemies
# エネミーが隠れ状態でない場合
unless enemy.hidden
# 獲得を追加
bgold += enemy.gold
end
end
return bgold
end
end
#------------------------------------------------------------------------------
#
#
# ▽ 追加モジュール
#
#
#==============================================================================
# ◇ 付加属性名称判定モジュール
#==============================================================================
module XRXS_Check_ElementName_Set
#--------------------------------------------------------------------------
# ● スキルが指定名の属性を持つか判定
#--------------------------------------------------------------------------
def skill_element_include?(skill, element_name)
return [false, 0, 0] unless skill.is_a?(RPG::Skill)
returnar = [false, 0, 0] # 存在したか?, 固定値の合計、%値の合計
for i in skill.element_set
if $data_system.elements[i] =~ /^#{element_name}([+-]?[0-9]+)?(%)?/
returnar[0] = true
if $2 == nil
returnar[1] += $1.to_i
else
returnar[2] += $1.to_i
end
end
end
return returnar
end
#--------------------------------------------------------------------------
# ● アイテムが指定名の属性を持つか判定
#--------------------------------------------------------------------------
def item_element_include?(item, element_name)
return [false, 0, 0] unless item.is_a?(RPG::Item)
returnar = [false, 0, 0] # 存在したか?, 固定値の合計、%値の合計
for i in item.element_set
if $data_system.elements[i] =~ /^#{element_name}([+-]?[0-9]+)?(%)?/
returnar[0] = true
if $2 == nil
returnar[1] += $1.to_i
else
returnar[2] += $1.to_i
end
end
end
return returnar
end
#--------------------------------------------------------------------------
# ● 指定IDの武器が指定名の属性を持つか判定
#--------------------------------------------------------------------------
def weapon_id_element_include?(weapon_id, element_name)
return [false, 0, 0] if weapon_id == nil or weapon_id <= 0
returnar = [false, 0, 0] # 存在したか?, 固定値の合計、%値の合計
for i in $data_weapons[weapon_id].element_set
if $data_system.elements[i] =~ /^#{element_name}([+-]?[0-9]+)?(%)?/
returnar[0] = true
if $2 == nil
returnar[1] += $1.to_i
else
returnar[2] += $1.to_i
end
end
end
return returnar
end
#--------------------------------------------------------------------------
# ● 防具が指定名の属性を持つか判定
#--------------------------------------------------------------------------
def armor_element_include?(armor, element_name)
returnar = [false, 0, 0] # 存在したか?, 固定値の合計、%値の合計
return returnar unless armor.is_a?(RPG::Armor)
for i in armor.guard_element_set
if $data_system.elements[i] =~ /#{element_name}([+-]?[0-9]+)?(%)?/
returnar[0] = true
if $2 == nil
returnar[1] += $1.to_i
else
returnar[2] += $1.to_i
end
end
end
return returnar
end
#--------------------------------------------------------------------------
# ● 防具が指定名の属性を持つ場合その後に付く接尾テキストを取得
#--------------------------------------------------------------------------
def armor_element_suftext(armor, element_name)
return nil unless armor.is_a?(RPG::Armor)
for i in armor.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)
return [false, 0, 0] unless actor.is_a?(Game_Actor)
return [false, 0, 0] if actor.weapon_id == nil or actor.weapon_id <= 0
bool = false
one_total = two_total = 0
# ここでもdup補正
current_weapon = $data_weapons[actor.weapon_id].dup
# ウェポンプロパティ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]
current_weapon.element_set.push(i) if i != 0
end
end
# 判定
for i in current_weapon.element_set
if $data_system.elements[i] =~ /^#{element_name}([+-]?[0-9]+)?(%)?/
if $2 == nil
one_total += $1.to_i
else
two_total += $1.to_i
end
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]+)?(%)?/
if $2 == nil
one_total += $1.to_i
else
two_total += $1.to_i
end
bool = true
end
end
end
# 存在したか、%無き数値の合計、%有る数値の合計 を返す
return [bool, one_total, two_total]
end
#--------------------------------------------------------------------------
# ● アクターが指定名の属性を持つ武器/防具を装備中か判定 数値の合計も保持
#--------------------------------------------------------------------------
def actor_element_equip?(actor, element_name)
return [false, 0, 0] unless 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]
bool = false
one_total = two_total = 0
# 武器
returnar = equip_weapon_element_include?(actor, element_name)
bool |= returnar[0]
one_total += returnar[1].to_i
two_total += returnar[2].to_i
# 盾
returnar = armor_element_include?(armor1, element_name)
bool |= returnar[0]
one_total += returnar[1].to_i
two_total += returnar[2].to_i
# 頭防具
returnar = armor_element_include?(armor2, element_name)
bool |= returnar[0]
one_total += returnar[1].to_i
two_total += returnar[2].to_i
# 身体防具
returnar = armor_element_include?(armor3, element_name)
bool |= returnar[0]
one_total += returnar[1].to_i
two_total += returnar[2].to_i
# 装飾品
returnar = armor_element_include?(armor4, element_name)
bool |= returnar[0]
one_total += returnar[1].to_i
two_total += returnar[2].to_i
# 存在したか、%無き数値の合計、%有る数値の合計 を返す
return [bool, one_total, two_total]
end
end
Mã:
#==============================================================================
# ■ Action Battle System
#------------------------------------------------------------------------------
# Originally by 桜雅 在土
# Edited and translated by Minkoff
#------------------------------------------------------------------------------
# This script may be a bit buggy, but it should work :)
# And if you use this, please give both 桜雅 在土 and Minkoff a little credit.
#
# Also, keep in mind that if you are editing skills and classes, you have to
# edit this too. If you don't know how to edit this, leave the existing
# database entires alone. It will save you alot of trouble.
#
# ~Minkoff
#==============================================================================
#==============================================================================
# □ カスタマイズポイント
#==============================================================================
class Scene_Battle
# 「レクトラインウィンドウを稼動」
ENABLE_RECTLINE_WINDOW = false
end
class Game_Battler
#--------------------------------------------------------------------------
# ● アクターの運動能力の設定
#--------------------------------------------------------------------------
def setup_actor_reflexes(actor_id)
# 共通項目の設定
@max_jumps = 2 # 「最大ジャンプ回数」
@weight = 100 # 「重さ」
@body_rect = Rect.new(-18, -96, 36, 96) # くらい判定(Rect)
# アクター個別の設定
case actor_id
when 1 # ID 1のアクター
# 運動能力
@air_x_resistance = 0.09 # 「空中X空気抵抗」
@air_x_velocity = 2.0 # 「空中X加速度」
@air_x_maximum = 6.4 # 「空中X最大速度」
@air_y_velocity = 1.6 # 「落下Y加速度」
@dash_x_speed = 9.6 # 「走行X速度」
@walk_x_speed = 3.2 # 「歩行X速度」
@jump_y_init_velocity = 24.0 # 「ジャンプY初速度」
@char_width = 18 # 「キャラ幅/2」
#@body_rect = Rect.new(-0, -96, 48, 96) # くらい判定(Rect)
# 戦技モーション設定---
# 弱攻撃
@motion_time_jub_attack = 16
@rectan_plan_jub_attack[2] = Rect.new(16,-71, 28, 34)
@skl_id_plan_jub_attack[2] = 1
@skl_id_plan_jub_attack[6] = 0
# 前強攻撃
@motion_time_front_attack = 24
@rectan_plan_front_attack[2] = Rect.new(33,-93, 47, 89)
@skl_id_plan_front_attack[2] = 2
@skl_id_plan_front_attack[14] = 0
# 上強攻撃
@motion_time_upper_attack = 26
@rectan_plan_upper_attack[2] = Rect.new(32,-96, 48, 94)
@skl_id_plan_upper_attack[2] = 3
@skl_id_plan_upper_attack[22] = 0
# 下強攻撃
@motion_time_lower_attack = 12
@rectan_plan_lower_attack[3] = Rect.new(20,-42, 54, 38)
@skl_id_plan_lower_attack[3] = 4
@skl_id_plan_lower_attack[10] = 0
# 空中ニュートラル攻撃
@motion_time_air_neutral_attack = 40
@rectan_plan_air_neutral_attack[2] = Rect.new(-23,-43, 67, 34)
@skl_id_plan_air_neutral_attack[2] = 5
@skl_id_plan_air_neutral_attack[36] = 0
# 空中前攻撃
@motion_time_air_front_attack = 20
@rectan_plan_air_front_attack[2] = Rect.new(33,-93, 47, 89)
@skl_id_plan_air_front_attack[2] = 6
@skl_id_plan_air_front_attack[18] = 0
# 空中上攻撃
@motion_time_air_upper_attack = 16
@rectan_plan_air_upper_attack[2] = Rect.new(32,-96, 48, 94)
@skl_id_plan_air_upper_attack[2] = 7
@skl_id_plan_air_upper_attack[14] = 0
# 空中下攻撃
@motion_time_air_lower_attack = 36
@rectan_plan_air_lower_attack[2] = Rect.new(-31,-42, 52, 42)
@skl_id_plan_air_lower_attack[2] = 8
@skl_id_plan_air_lower_attack[36] = 0
# 空中後攻撃
@motion_time_air_arear_attack = 40
@rectan_plan_air_arear_attack[2] = Rect.new(-14,-92, 54, 88)
@skl_id_plan_air_arear_attack[2] = 9
@skl_id_plan_air_arear_attack[36] = 0
when 2 # ID 1のアクター
# 運動能力
@air_x_resistance = 0.09 # 「空中X空気抵抗」
@air_x_velocity = 4.0 # 「空中X加速度」
@air_x_maximum = 9.6 # 「空中X最大速度」
@air_y_velocity = 1.8 # 「落下Y加速度」
@dash_x_speed = 9.6 # 「走行X速度」
@walk_x_speed = 3.2 # 「歩行X速度」
@jump_y_init_velocity = 24.0 # 「ジャンプY初速度」
@char_width = 48 # 「キャラ幅/2」
#@body_rect = Rect.new(-24, -96, 48, 96) # くらい判定(Rect)
# 戦技モーション設定---
# 弱攻撃
@motion_time_jub_attack = 16
@rectan_plan_jub_attack[2] = Rect.new(0,-96, 96, 96)
@skl_id_plan_jub_attack[2] = 1
@skl_id_plan_jub_attack[6] = 0
# 前強攻撃
@motion_time_front_attack = 24
@rectan_plan_front_attack[2] = Rect.new(0,-96, 96, 96)
@skl_id_plan_front_attack[2] = 2
@skl_id_plan_front_attack[14] = 0
# 上強攻撃
@motion_time_upper_attack = 16
@rectan_plan_upper_attack[2] = Rect.new(0,-96, 96, 96)
@skl_id_plan_upper_attack[2] = 3
@skl_id_plan_upper_attack[14] = 0
# 下強攻撃
@motion_time_lower_attack = 24
@rectan_plan_lower_attack[2] = Rect.new(0,-32, 96, 32)
@skl_id_plan_lower_attack[2] = 4
@skl_id_plan_lower_attack[14] = 0
# 空中ニュートラル攻撃
@motion_time_air_neutral_attack = 40
@rectan_plan_air_neutral_attack[2] = Rect.new(-48,-48, 96, 48)
@skl_id_plan_air_neutral_attack[2] = 5
@skl_id_plan_air_neutral_attack[36] = 0
# 空中前攻撃
@motion_time_air_front_attack = 20
@rectan_plan_air_front_attack[2] = Rect.new(-48,-48, 96, 48)
@skl_id_plan_air_front_attack[2] = 6
@skl_id_plan_air_front_attack[18] = 0
# 空中上攻撃
@motion_time_air_upper_attack = 20
@rectan_plan_air_upper_attack[2] = Rect.new(-48,-48, 96, 48)
@skl_id_plan_air_upper_attack[2] = 7
@skl_id_plan_air_upper_attack[24] = 0
# 空中下攻撃
@motion_time_air_lower_attack = 36
@rectan_plan_air_lower_attack[2] = Rect.new(-48,-48, 96, 48)
@skl_id_plan_air_lower_attack[2] = 8
@skl_id_plan_air_lower_attack[36] = 0
# 空中後攻撃
@motion_time_air_arear_attack = 40
@rectan_plan_air_arear_attack[2] = Rect.new(-48,-48, 96, 48)
@skl_id_plan_air_arear_attack[2] = 9
@skl_id_plan_air_arear_attack[36] = 0
when 3 # ID 3のアクター
@air_x_resistance = 0.08 # 「空中X空気抵抗」
@air_x_velocity = 4.0 # 「空中X加速度」
@air_x_maximum = 12.8 # 「空中X最大速度」
@air_y_velocity = 2.4 # 「落下Y加速度」
@dash_x_speed = 9.6 # 「走行X速度」
@walk_x_speed = 2.8 # 「歩行X速度」
@jump_y_init_velocity = 28.2 # 「ジャンプY初速度」
@char_width = 48 # 「キャラ幅/2」
#@body_rect = Rect.new(-48, -96, 96, 96) # くらい判定(Rect)
# 戦技モーション設定---
# 弱攻撃
@motion_time_jub_attack = 16
@rectan_plan_jub_attack[2] = Rect.new(0,-96, 96, 96)
@skl_id_plan_jub_attack[2] = 1
@skl_id_plan_jub_attack[6] = 0
# 前強攻撃
@motion_time_front_attack = 24
@rectan_plan_front_attack[2] = Rect.new(0,-96, 96, 96)
@skl_id_plan_front_attack[2] = 2
@skl_id_plan_front_attack[14] = 0
# 上強攻撃
@motion_time_upper_attack = 24
@rectan_plan_upper_attack[2] = Rect.new(0,-96, 96, 96)
@skl_id_plan_upper_attack[2] = 3
@skl_id_plan_upper_attack[14] = 0
# 下強攻撃
@motion_time_lower_attack = 24
@rectan_plan_lower_attack[2] = Rect.new(0,-32, 96, 32)
@skl_id_plan_lower_attack[2] = 4
@skl_id_plan_lower_attack[14] = 0
# 空中ニュートラル攻撃
@motion_time_air_neutral_attack = 40
@rectan_plan_air_neutral_attack[2] = Rect.new(-48,-48, 96, 48)
@skl_id_plan_air_neutral_attack[2] = 5
@skl_id_plan_air_neutral_attack[36] = 0
# 空中前攻撃
@motion_time_air_front_attack = 20
@rectan_plan_air_front_attack[2] = Rect.new(-48,-48, 96, 48)
@skl_id_plan_air_front_attack[2] = 6
@skl_id_plan_air_front_attack[18] = 0
# 空中上攻撃
@motion_time_air_upper_attack = 26
@rectan_plan_air_upper_attack[2] = Rect.new(-48,-48, 96, 48)
@skl_id_plan_air_upper_attack[2] = 7
@skl_id_plan_air_upper_attack[24] = 0
# 空中下攻撃
@motion_time_air_lower_attack = 36
@rectan_plan_air_lower_attack[2] = Rect.new(-48,-48, 96, 48)
@skl_id_plan_air_lower_attack[2] = 8
@skl_id_plan_air_lower_attack[36] = 0
# 空中後攻撃
@motion_time_air_arear_attack = 40
@rectan_plan_air_arear_attack[2] = Rect.new(-48,-48, 96, 48)
@skl_id_plan_air_arear_attack[2] = 9
@skl_id_plan_air_arear_attack[36] = 0
end
end
#--------------------------------------------------------------------------
# ● エネミーの運動能力の設定
#--------------------------------------------------------------------------
def setup_enemy_reflexes(enemy_id)
# 共通項目
@max_jumps = 2 # 「最大ジャンプ回数」
@weight = 100 # 「重さ」
# エネミー個別設定
case enemy_id
when 1 # ID 1のアクター
setup_actor_reflexes(1)
end
end
#--------------------------------------------------------------------------
# ● スキルの基本ダメージ計算
#--------------------------------------------------------------------------
def cals_skill_damage(user, skill)
# 基本ダメージを計算
return skill.power * user.str * user.atk / self.pdef / 10
end
end
# スキルモーションの設定---
class Game_Motion
def forte_motion_database(skill_id)
# 初期化
@action_duration = 0
@attack_motion_plan.clear
@attack_rectan_plan.clear
@attack_skl_id_plan.clear
# 各種設定
@handling_priority = 1
case skill_id
# スキルモーションの設定説明
#when xx (xxはスキルのID)
# @action_duration = (数字) : そのアクションの長さ(単位:F)
# @attack_motion_plan = (配列) : 実行時のキャラのフォーム
# @attack_rectan_plan = (配列[(Rect)]) : 攻撃範囲、Rectで指定。
# @attack_skl_id_plan = (配列) : スキルのモーションプラン。
# スキルIDを指定、 0 の部分で終了する。
when 57 # ID 13 のスキル
@action_duration = 24
@attack_motion_plan = [121,nil,nil,nil,131]
@attack_rectan_plan = [Rect.new(0,-96, 96, 96)]
@attack_skl_id_plan = [13,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,0]
when 58
@action_duration = 24
@attack_motion_plan = [151,nil,nil,141]
@attack_rectan_plan = [nil,nil,nil,Rect.new(0,-96, 96, 96)]
@attack_skl_id_plan = [nil,nil,nil,14,nil,nil,nil,nil,nil,nil,nil,nil,0]
when 59
@action_duration = 24
@attack_motion_plan = [131]
@attack_rectan_plan = [Rect.new(0,-96, 96, 96)]
@attack_skl_id_plan = [15,nil,nil,nil,nil,nil,nil,nil,nil,0]
when 60
@action_duration = 24
@attack_motion_plan = [131]
@attack_rectan_plan = [Rect.new(0,-96, 96, 96)]
@attack_skl_id_plan = [16,nil,nil,nil,nil,nil,nil,nil,nil,0]
else
# 例外処理
@handling_priority = 0
end
end
end
#------------------------------------------------- カスタマイズポイント End ---
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ○ 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :now_x_speed # 現在X速度 (Numeric)
attr_accessor :now_y_speed # 現在Y速度 (Numeric)
attr_accessor :now_jumps # 現在ジャンプ回数 (Numeric)
attr_accessor :direction # 向き (Numeric) (1が右向き、-1が左向き)
attr_accessor :dashing # ダッシュ中 (true/false)
attr_accessor :guarding # ガード中 (true/false)
attr_accessor :motion # モーション (Game_Motion)
attr_reader :air_x_resistance # 「空中X空気抵抗」(Numeric)
attr_reader :air_x_velocity # 「空中X加速度」 (Numeric)
attr_reader :air_x_maximum # 「空中X最大速度」(Numeric)
attr_reader :air_y_velocity # 「落下Y加速度」 (Numeric)
attr_reader :dash_x_speed # 「歩行X速度」 (Numeric)
attr_reader :walk_x_speed # 「歩行X速度」 (Numeric)
attr_reader :weight # 「重さ」 (Numeric)
attr_reader :jump_y_init_velocity # 「ジャンプY初速度」
attr_reader :max_jumps # 「最大ジャンプ回数」
attr_reader :char_width # 「キャラ幅/2」
attr_reader :body_rect # 「ダメージを受ける範囲」(rect)
#---------------------------------------#
attr_accessor :motion_time_jub_attack
attr_accessor :motion_plan_jub_attack
attr_accessor :rectan_plan_jub_attack
attr_accessor :skl_id_plan_jub_attack
attr_accessor :motion_time_front_attack
attr_accessor :motion_plan_front_attack
attr_accessor :rectan_plan_front_attack
attr_accessor :skl_id_plan_front_attack
attr_accessor :motion_time_upper_attack
attr_accessor :motion_plan_upper_attack
attr_accessor :rectan_plan_upper_attack
attr_accessor :skl_id_plan_upper_attack
attr_accessor :motion_time_lower_attack
attr_accessor :motion_plan_lower_attack
attr_accessor :rectan_plan_lower_attack
attr_accessor :skl_id_plan_lower_attack
attr_accessor :motion_time_air_neutral_attack
attr_accessor :motion_plan_air_neutral_attack
attr_accessor :rectan_plan_air_neutral_attack
attr_accessor :skl_id_plan_air_neutral_attack
attr_accessor :motion_time_air_front_attack
attr_accessor :motion_plan_air_front_attack
attr_accessor :rectan_plan_air_front_attack
attr_accessor :skl_id_plan_air_front_attack
attr_accessor :motion_time_air_upper_attack
attr_accessor :motion_plan_air_upper_attack
attr_accessor :rectan_plan_air_upper_attack
attr_accessor :skl_id_plan_air_upper_attack
attr_accessor :motion_time_air_lower_attack
attr_accessor :motion_plan_air_lower_attack
attr_accessor :rectan_plan_air_lower_attack
attr_accessor :skl_id_plan_air_lower_attack
attr_accessor :motion_time_air_arear_attack
attr_accessor :motion_plan_air_arear_attack
attr_accessor :rectan_plan_air_arear_attack
attr_accessor :skl_id_plan_air_arear_attack
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias xrxs_bs1_battler_initialize initialize
def initialize
#-----
xrxs_bs1_battler_initialize
@now_x_speed = 0 # 現在X速度
@now_y_speed = 0 # 現在Y速度
@now_jumps = 0 # 現在ジャンプ回数
if self.is_a?(Game_Actor) # 向き
@direction = 1
else
@direction = -1
end
@dashing = false
@guarding = false
@motion = Game_Motion.new(self)
#-----
end
def setup_default_reflexes
# 初期化
@motion_plan_jub_attack = [111]
@rectan_plan_jub_attack = []
@skl_id_plan_jub_attack = []
@motion_plan_front_attack = [121]
@rectan_plan_front_attack = []
@skl_id_plan_front_attack = []
@motion_plan_upper_attack = [131]
@rectan_plan_upper_attack = []
@skl_id_plan_upper_attack = []
@motion_plan_lower_attack = [141]
@rectan_plan_lower_attack = []
@skl_id_plan_lower_attack = []
@motion_plan_air_neutral_attack = [151]
@rectan_plan_air_neutral_attack = []
@skl_id_plan_air_neutral_attack = []
@motion_plan_air_front_attack = [161]
@rectan_plan_air_front_attack = []
@skl_id_plan_air_front_attack = []
@motion_plan_air_upper_attack = [171]
@rectan_plan_air_upper_attack = []
@skl_id_plan_air_upper_attack = []
@motion_plan_air_lower_attack = [181]
@rectan_plan_air_lower_attack = []
@skl_id_plan_air_lower_attack = []
@motion_plan_air_arear_attack = [191]
@rectan_plan_air_arear_attack = []
@skl_id_plan_air_arear_attack = []
end
#--------------------------------------------------------------------------
# ● 防御中判定
#--------------------------------------------------------------------------
def guarding?
return @guarding
end
#--------------------------------------------------------------------------
# ● スキルの効果適用
#--------------------------------------------------------------------------
alias xrxs_bs1_skill_effect skill_effect
def skill_effect(user, skill)
bool = xrxs_bs1_skill_effect(user, skill)
# 攻撃成功時のみ
if bool and self.damage != "Miss" and !self.guarding?
# ふっとび値
blow = 1.0 * (self.maxhp - self.hp) / self.maxhp * (skill.power + 4) * self.weight / 280000 * skill.atk_f + skill.eva_f
# ふっとびベクトル向き
radian = skill.variance * Math::PI / 50.0
dir = user.x_pos < self.x_pos ? 1 : -1
self.now_x_speed = blow * Math.cos(radian) / 2.2 * dir
self.now_y_speed = blow * Math.sin(radian) / 2.2
self.now_jumps = 1 if self.now_y_speed > 0
# ダメージモーション
self.motion.clear # まずはクリア
self.motion.do_damage
self.motion.knock_back_duration = skill.power #(blow/ 2).floor
self.motion.hit_stop_duration = 2 # [(blow/10).floor, 8].min
#user.motion.hit_stop_duration = [(blow/10).floor, 8].min
# ダメージによる向き反転
self.direction = user.direction * -1
end
return bool
end
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● セットアップ
#--------------------------------------------------------------------------
alias xrxs_bs1_setup setup
def setup(actor_id)
xrxs_bs1_setup(actor_id)
setup_reflexes(actor_id)
end
#--------------------------------------------------------------------------
# ● 運動能力の設定
#--------------------------------------------------------------------------
def setup_reflexes(actor_id)
# 初期化
setup_default_reflexes
# アクターの運動能力の設定
setup_actor_reflexes(actor_id)
end
end
#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias xrxs_bs1_enemy_initialize initialize
def initialize(troop_id, member_index)
super()
xrxs_bs1_enemy_initialize(troop_id, member_index)
setup_reflexes(@enemy_id)
end
#--------------------------------------------------------------------------
# ● 運動能力の設定
#--------------------------------------------------------------------------
def setup_reflexes(enemy_id)
# 初期化
setup_default_reflexes
# エネミーの運動能力の設定
setup_enemy_reflexes(enemy_id)
end
end
#==============================================================================
# ■ Sprite_Battler
#==============================================================================
class Sprite_Battler < RPG::Sprite
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias xrxs_bs1_update update
def update
# 呼び戻す
xrxs_bs1_update
# バトラーが nil の場合
if @battler == nil
return
end
# 向きに応じて反転・w・この機能マジ燃え(素
if @battler.direction == 1
self.mirror = false
else
self.mirror = true
end
end
end
#==============================================================================
# ■ Spriteset_Battle
#==============================================================================
class Spriteset_Battle
#--------------------------------------------------------------------------
# ● エフェクト表示中判定
#--------------------------------------------------------------------------
def effect?
return false
end
end
#==============================================================================
# ■ Window_RectLine
#==============================================================================
class Window_RectLine < Window_Base
def initialize
super(-16, -16, 672, 512)
self.contents = Bitmap.new(width - 32, height - 32)
self.opacity = 64
self.back_opacity = 64
end
def clear
self.contents.clear
end
def write_rect(rect, color)
rect.x = 320 + rect.x - $xcam_x
rect.y += 304 + $xcam_y
self.contents.draw_rect(rect, color)
end
end
#==============================================================================
# ■ Window_ActiveMenu
#==============================================================================
class Window_ActiveMenu < Window_Selectable
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(0, 160, 160, 160)
self.contents = Bitmap.new(width - 32, height - 32)
self.back_opacity = 160
refresh
@item_max = 2
@index = 0
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
self.contents.clear
bitmap = RPG::Cache.icon("021-Potion01")
self.contents.blt( 0, 4, bitmap, Rect.new(0, 0, 24, 24))
bitmap = RPG::Cache.icon("020-Accessory05")
self.contents.blt( 0, 36, bitmap, Rect.new(0, 0, 24, 24))
end
#--------------------------------------------------------------------------
# ● カーソルの矩形更新
#--------------------------------------------------------------------------
#def update_cursor_rect
# self.cursor_rect.set(0, @index * 24, 24, 24)
#end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ● メイン処理
#--------------------------------------------------------------------------
alias xrxs_bs1_main main
def main
xrxs_bs1_main
if ENABLE_RECTLINE_WINDOW
@window_rectline.dispose
end
end
#--------------------------------------------------------------------------
# ● プレバトルフェーズ開始
#--------------------------------------------------------------------------
alias xrxs_bs1_start_phase1 start_phase1
def start_phase1
xrxs_bs1_start_phase1
# 初期化
@handle_battler = $game_party.actors[0]
@now_attack_frame = false
@trigger_duration_key_left = 0
@trigger_duration_key_right= 0
@trigger_duration_key_down = 0
@xcam_watch_battler = @handle_battler
# スクリーンバックウィンドウを作成
@window_screenback = Window_Base.new(-4, -4, 648, 488)
@window_screenback.back_opacity = 48
@window_screenback.visible = false
@window_screenback.z = 301
# レクトライン表示ON
if ENABLE_RECTLINE_WINDOW
@window_rectline = Window_RectLine.new
end
# アクティヴメニューウィンドウを作成
@window_activemenu = Window_ActiveMenu.new
@window_activemenu.active = false
@window_activemenu.visible = false
@window_activemenu.z = 302
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias xrxs_bs1_update update
def update
# @wait_countを設定して本来の処理を行わないようにする
@wait_count = 1
@wait_count_motion = 1 if @phase == 3
# 呼び戻す
xrxs_bs1_update
# フェーズによって分岐
case @phase
when 1 # ハンドルフェーズ
update_coordinates
update_phase1
update_motions
when 3 # アクティヴメニューフェーズ
update_phase3
when 4 # アタックフェーズ
update_phase4
when 5 # アフターバトルフェーズ
update_coordinates
update_motions
update_phase5
end
end
#--------------------------------------------------------------------------
# ● 次のアクターのコマンド入力へ
#--------------------------------------------------------------------------
def phase3_next_actor
# 無効化
end
#--------------------------------------------------------------------------
# ● フレーム更新 (バトラーモーション)
#--------------------------------------------------------------------------
def update_motions
for battler in $game_party.actors + $game_troop.enemies
battler.motion.update
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (アクターコマンドフェーズ)
#--------------------------------------------------------------------------
alias xrxs_bs1_update_phase3 update_phase3
def update_phase3
# アクティヴメニューがアクティヴの場合
if @window_activemenu.active
update_phase3_activemenu
return
end
# 他
xrxs_bs1_update_phase3
end
#--------------------------------------------------------------------------
# ● フレーム更新 (アクティヴメニュー)
#--------------------------------------------------------------------------
def update_phase3_activemenu
@window_activemenu.update
if Input.trigger?(Input::B)
# キャンセル SE を演奏
$game_system.se_play($data_system.cancel_se)
@xcam_z_destination = 185
@window_activemenu.active = false
@window_activemenu.visible = false
@window_screenback.visible = false
@phase = 1
end
if Input.trigger?(Input::C)
case @window_activemenu.index
when 0 # アイテム
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
@window_activemenu.visible = false
@window_activemenu.active = false
# アイテム選択開始
@active_battler = @handle_battler
@actor_index = 0
start_item_select
@item_window.z = 303
when 1 # 逃走
end
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (アクターコマンドフェーズ : アクター選択)
#--------------------------------------------------------------------------
alias xrxs_bs1_update_phase3_actor_select update_phase3_actor_select
def update_phase3_actor_select
# C ボタンが押された場合
if Input.trigger?(Input::C)
# アイテムウィンドウ表示中の場合
if @item_window != nil
# 行動実行
@handle_battler.motion.do_use_item
@active_battler = @handle_battler
# アクションを設定
@active_battler.current_action.kind = 2
@active_battler.current_action.target_index = @actor_arrow.index
index = @active_battler.current_action.target_index
@target_battlers = [$game_party.smooth_target_actor(index)]
# アイテムアクション結果作成
make_item_action_result
# フェイズ4へ移行
end_actor_select
@xcam_z_destination = 185
@window_screenback.visible = false
@phase = 4
@phase4_step = 4
return
end
end
# 呼び戻す
xrxs_bs1_update_phase3_actor_select
end
#--------------------------------------------------------------------------
# ● アイテム選択終了
#--------------------------------------------------------------------------
alias xrxs_bs1_end_item_select end_item_select
def end_item_select
xrxs_bs1_end_item_select
@actor_command_window.active = false
@actor_command_window.visible = false
# アクティヴメニューを有効化
@window_activemenu.active = true
@window_activemenu.visible = true
end
#--------------------------------------------------------------------------
# ● フレーム更新 (プレバトルフェーズ)再定義
#--------------------------------------------------------------------------
def update_phase1
# 勝敗判定
if judge
# 勝利または敗北の場合 : メソッド終了
return
end
# フレーム更新 (バトラー操作)
update_handling
# フレーム更新 (AI操作)
for battler in $game_party.actors + $game_troop.enemies
update_ai_handle(battler) if battler != @handle_battler
end
# フレーム更新 (攻撃系更新)
update_attack_set
end
#--------------------------------------------------------------------------
# ● フレーム更新 (座標系更新)
#--------------------------------------------------------------------------
def update_rectline
return unless ENABLE_RECTLINE_WINDOW
@window_rectline.clear
for battler in $game_party.actors + $game_troop.enemies
battler_rect = battler.body_rect.dup
battler_rect.x += battler.x_pos
battler_rect.y -= battler.y_pos
@window_rectline.write_rect(battler_rect, Color.new(255, 255, 255, 255))
battler_rect = battler.motion.attack_rect.dup
if battler.direction == -1
# 逆向きの場合
battler_rect.x = -1 * battler_rect.x - battler_rect.width
end
battler_rect.x += battler.x_pos
battler_rect.y -= battler.y_pos
@window_rectline.write_rect(battler_rect, Color.new(255, 128, 128, 255))
end
end
def update_coordinates
# レクトライン描写
update_rectline
# 初期化
battlers_x_min = 512
battlers_x_max = -512
# バトラー位置更新
for battler in $game_party.actors + $game_troop.enemies
# 最大値
battlers_x_min = [battler.x_pos, battlers_x_min].min
battlers_x_max = [battler.x_pos, battlers_x_max].max
# ヒットストップ中の場合は座標移動を行わない
next if battler.motion.hit_stop_duration > 0
# ---X---
# X空気抵抗による更新
battler.now_x_speed = battler.now_x_speed * (1.0 - battler.air_x_resistance)
# X移動
battler.x_pos += battler.now_x_speed
# ぬるり
# 攻撃側の範囲を設定
battler_rect = battler.body_rect.dup
battler_rect.x += battler.x_pos
battler_rect.y -= battler.y_pos
for target in $game_party.actors + $game_troop.enemies
# 自分は除外
next if target == battler
# 重なり判定
target_rect = target.body_rect.dup
target_rect.x += target.x_pos
target_rect.y -= target.y_pos
if rects_over?(battler_rect.dup, target_rect.dup)
# ぬるり発生
if battler.x_pos < target.x_pos
battler.x_pos -= 2
target.x_pos += 2
else
battler.x_pos += 2
target.x_pos -= 2
end
end
end
# X範囲
battler.x_pos = [[battler.x_pos, -512+battler.char_width].max, 512-battler.char_width].min
# ---Y---
# 落下Y加速度による更新
battler.now_y_speed -= battler.air_y_velocity
# Y移動
battler.y_pos = [battler.y_pos + battler.now_y_speed, 0].max
# 着地判定
if battler.now_jumps > 0 and battler.y_pos == 0
# 着地ッ!!
battler.now_jumps = 0
battler.now_x_speed = 0
battler.motion.do_landing_step
end
end
# カメラも移動
#@handle_battler.sp = (battlers_x_min - battlers_x_max).abs.floor
#@xcam_x_destination = @handle_battler.x_pos
#@xcam_y_destination = @handle_battler.y_pos
#@xcam_z_destination = [[((battlers_x_min - battlers_x_max).abs * 185.0 / 640).floor, 148].max, 296].min
end
#--------------------------------------------------------------------------
# ● フレーム更新 (攻撃系更新)
#--------------------------------------------------------------------------
def update_attack_set
# 攻撃判定
for attacker in $game_party.actors + $game_troop.enemies
next if attacker.motion.attack_rect.width == 0
next if attacker.motion.attack_skl_id == nil
# 攻撃側の範囲を設定
attacker_rect = attacker.motion.attack_rect.dup
if attacker.direction == -1
# 逆向きの場合
attacker_rect.x = -1 * attacker_rect.x - attacker_rect.width
end
attacker_rect.x += attacker.x_pos
attacker_rect.y -= attacker.y_pos
# 対象となるバトラーの配列を作成
if attacker.is_a?(Game_Actor)
targets = $game_troop.enemies
elsif attacker.is_a?(Game_Enemy)
targets = $game_party.actors
else
next
end
@target_battlers = []
for target in targets
next if attacker.motion.attack_hit_targets.include?(target)
# 対象側の範囲を設定
target_rect = target.body_rect.dup
target_rect.x += target.x_pos
target_rect.y -= target.y_pos
if rects_over?(attacker_rect, target_rect)
# 攻撃命中!!
@target_battlers.push(target)
attacker.motion.attack_hit_targets.push(target)
end
end
# 攻撃の実行
if @target_battlers.size > 0
# 設定
@active_battler = attacker
@active_battler.current_action.skill_id = attacker.motion.attack_skl_id
# スキルアクション 結果作成
make_skill_action_result
# フェイズ4へ移行
@phase = 4
@phase4_step = 4
end
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (バトラー操作)
#--------------------------------------------------------------------------
def update_handling
# フレーム更新
@trigger_duration_key_left -= 1
@trigger_duration_key_right-= 1
@trigger_duration_key_down -= 1
@handle_battler.guarding = false
# 操作
if @handle_battler.motion.handling_priority <= 0
if Input.trigger?(Input::Z)
# メニュー
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
@xcam_z_destination = 111
@window_activemenu.active = true
@window_activemenu.visible = true
@window_screenback.visible = true
# フェーズ 3 に移行
@phase = 3
return
elsif Input.trigger?(Input::C)
# アタック
if @handle_battler.now_jumps >= 1
# 空中
if (@handle_battler.direction == 1 and Input.press?(Input::RIGHT)) or
(@handle_battler.direction ==-1 and Input.press?(Input::LEFT))
@handle_battler.motion.do_air_front_attack
elsif Input.press?(Input::UP)
@handle_battler.motion.do_air_upper_attack
elsif Input.press?(Input::DOWN)
@handle_battler.motion.do_air_lower_attack
elsif (@handle_battler.direction ==-1 and Input.press?(Input::RIGHT)) or
(@handle_battler.direction == 1 and Input.press?(Input::LEFT))
@handle_battler.motion.do_air_arear_attack
else
@handle_battler.motion.do_air_neutral_attack
end
else
# 地上
if (@handle_battler.direction == 1 and Input.press?(Input::RIGHT)) or
(@handle_battler.direction ==-1 and Input.press?(Input::LEFT))
@handle_battler.motion.do_front_attack
elsif Input.press?(Input::UP)
@handle_battler.motion.do_upper_attack
elsif Input.press?(Input::DOWN)
@handle_battler.motion.do_lower_attack
else
@handle_battler.motion.do_jub_attack
end
end
elsif Input.trigger?(Input::B)
# フォート
if Input.press?(Input::RIGHT) or Input.press?(Input::LEFT)
@handle_battler.motion.do_forte(@handle_battler.skills[3])
elsif Input.press?(Input::UP)
@handle_battler.motion.do_forte(@handle_battler.skills[1])
elsif Input.press?(Input::DOWN)
@handle_battler.motion.do_forte(@handle_battler.skills[2])
else
@handle_battler.motion.do_forte(@handle_battler.skills[0])
end
elsif Input.press?(Input::Y)
# ガード
if @handle_battler.now_jumps < @handle_battler.max_jumps and
((@handle_battler.direction == 1 and Input.trigger?(Input::RIGHT)) or
(@handle_battler.direction ==-1 and Input.trigger?(Input::LEFT)))
# フロントステップ
@handle_battler.motion.do_frontstep
elsif @handle_battler.now_jumps < @handle_battler.max_jumps and
((@handle_battler.direction ==-1 and Input.trigger?(Input::RIGHT)) or
(@handle_battler.direction == 1 and Input.trigger?(Input::LEFT)))
# バックステップ
@handle_battler.motion.do_backstep
else
# ガード
@handle_battler.motion.do_guard
end
elsif Input.trigger?(Input::X)
# ジャンプ
if @handle_battler.now_jumps < @handle_battler.max_jumps
if (@handle_battler.direction == 1 and Input.press?(Input::RIGHT)) or
(@handle_battler.direction ==-1 and Input.press?(Input::LEFT))
@handle_battler.motion.act_derive = "front_jump"
elsif (@handle_battler.direction == 1 and Input.press?(Input::LEFT)) or
(@handle_battler.direction ==-1 and Input.press?(Input::RIGHT))
@handle_battler.motion.act_derive = "back_jump"
else
@handle_battler.motion.act_derive = "jump"
end
@handle_battler.motion.do_crouch_to_jump
end
elsif @handle_battler.now_jumps >= 1
# 空中
if Input.trigger?(Input::UP)
if @handle_battler.now_jumps < @handle_battler.max_jumps
@handle_battler.motion.act_derive = "jump"
@handle_battler.motion.do_crouch_to_jump
end
elsif Input.press?(Input::RIGHT)
# →
@handle_battler.now_x_speed += @handle_battler.air_x_velocity
elsif Input.press?(Input::LEFT)
# ←
@handle_battler.now_x_speed -= @handle_battler.air_x_velocity
end
# 範囲
@handle_battler.now_x_speed = [[@handle_battler.now_x_speed, @handle_battler.air_x_maximum].min, -@handle_battler.air_x_maximum].max
else
# 地上
if Input.trigger?(Input::RIGHT)
if @trigger_duration_key_right > 1
@handle_battler.dashing = true
else
@trigger_duration_key_right = 28
end
elsif Input.trigger?(Input::LEFT)
if @trigger_duration_key_left > 1
@handle_battler.dashing = true
else
@trigger_duration_key_left = 28
end
end
if Input.trigger?(Input::UP)
if @handle_battler.now_jumps < @handle_battler.max_jumps
@handle_battler.motion.act_derive = "jump"
@handle_battler.motion.do_crouch_to_jump
end
elsif Input.press?(Input::RIGHT)
# →歩行
@handle_battler.direction = 1
if @handle_battler.dashing
@handle_battler.x_pos += @handle_battler.dash_x_speed
else
@handle_battler.x_pos += @handle_battler.walk_x_speed
end
@handle_battler.motion.do_walk
elsif Input.press?(Input::LEFT)
# ←歩行
@handle_battler.direction =-1
if @handle_battler.dashing
@handle_battler.x_pos -= @handle_battler.dash_x_speed
else
@handle_battler.x_pos -= @handle_battler.walk_x_speed
end
@handle_battler.motion.do_walk
elsif Input.press?(Input::DOWN)
# しゃがみ
@handle_battler.motion.do_crouch
else
# 待機
@handle_battler.dashing = false
@handle_battler.motion.do_stand
end
end
end
#---
end
#--------------------------------------------------------------------------
# ● フレーム更新 (AI操作)
#--------------------------------------------------------------------------
def update_ai_handle(battler)
# 初期化
battler.guarding = false
# AI待機
@ai_duration = 0 if @ai_duration == nil
@ai_duration -= 1
return if @ai_duration > 0
# 操作
if battler.motion.handling_priority <= 0
# ターゲットを取得
target = @handle_battler
# ターゲットが自分の位置から考えてどのあたりにいるかを計算
x_diff = target.x_pos - battler.x_pos
y_diff = target.y_pos - battler.y_pos
# 位置による判断
case x_diff.abs
when 0..96 # 近距離
# アタック
if battler.now_jumps >= 1
# 空中
case y_diff
when -23..76
battler.motion.do_air_neutral_attack
when 33..80
case y_diff
when 0..96
battler.motion.do_air_upper_attack
else
battler.motion.do_air_front_attack
end
when -96...-48
battler.motion.do_air_lower_attack
else
battler.motion.do_air_arear_attack
end
else
# 地上
case y_diff
when -48...48
battler.motion.do_front_attack
when 48...128
battler.motion.do_upper_attack
when -96...48
battler.motion.do_lower_attack
else
battler.motion.do_jub_attack
end
end
@ai_duration = 36
else # 遠距離
if battler.now_jumps >= 1
# 空中
if Input.press?(Input::RIGHT)
# →
battler.now_x_speed += battler.air_x_velocity
elsif Input.press?(Input::LEFT)
# ←
battler.now_x_speed -= battler.air_x_velocity
end
# 範囲
battler.now_x_speed = [[battler.now_x_speed, battler.air_x_maximum].min, -@handle_battler.air_x_maximum].max
else
# 地上
if battler.x_pos < target.x_pos
# →歩行
battler.direction = 1
battler.x_pos += battler.walk_x_speed
battler.motion.do_walk
elsif battler.x_pos > target.x_pos
# ←歩行
battler.direction =-1
battler.x_pos -= battler.walk_x_speed
battler.motion.do_walk
else
# 待機
battler.motion.do_stand
end
end
end
end
end
#--------------------------------------------------------------------------
# ● スキルまたはアイテムの対象側バトラー設定
#--------------------------------------------------------------------------
def set_target_battlers(scope)
# 無効化
end
#--------------------------------------------------------------------------
# ● スキルアクション 結果作成
#--------------------------------------------------------------------------
alias xrxs_bs1_make_skill_action_result make_skill_action_result
def make_skill_action_result
xrxs_bs1_make_skill_action_result
# ヘルプウィンドウを隠す
@help_window.visible = false
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示)
#--------------------------------------------------------------------------
alias xrxs_bs1_update_phase4_step5 update_phase4_step5
def update_phase4_step5
xrxs_bs1_update_phase4_step5
@phase = 1
end
#--------------------------------------------------------------------------
# ● 二つの rect の共通部分があるかを判別
#--------------------------------------------------------------------------
def rects_over?(rect1, rect2)
x_bool = false
y_bool = false
# Xの重なりを検出
if (rect1.x <= rect2.x and rect2.x <= rect1.x + rect1.width) or
(rect2.x <= rect1.x and rect1.x <= rect2.x + rect2.width) or
(rect1.x <= rect2.x + rect2.width and rect2.x + rect2.width <= rect1.x + rect1.width) or
(rect2.x <= rect1.x + rect1.width and rect1.x + rect1.width <= rect2.x + rect2.width)
x_bool = true
end
# Yの重なりを検出
if (rect1.y <= rect2.y and rect2.y <= rect1.y + rect1.height) or
(rect2.y <= rect1.y and rect1.y <= rect2.y + rect2.height) or
(rect1.y <= rect2.y + rect2.height and rect2.y + rect2.height <= rect1.y + rect1.height) or
(rect2.y <= rect1.y + rect1.height and rect1.y + rect1.height <= rect2.y + rect2.height)
y_bool = true
end
# return
return (x_bool and y_bool)
end
end
#------------------------------------------------------------------------------
#
#
# ▽ 新規
#
#
#==============================================================================
# ■ Game_Motion
#------------------------------------------------------------------------------
# モーション (戦闘中の行動のフォーム) を扱うクラスです。
# このクラスは Game_Battler クラスの内部で使用されます。
#==============================================================================
class Game_Motion
#--------------------------------------------------------------------------
# ○ 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :handling_priority # 現在の行動の操作に対する優先度
attr_accessor :knock_back_duration # のけぞり残りフレーム数
attr_accessor :hit_stop_duration # ヒットストップフレーム数
attr_accessor :action_duration # 行動 残りフレーム数
attr_reader :attack_rect # 攻撃範囲 (Rect)
attr_reader :attack_skl_id # 攻撃スキルID (Numeric)
attr_accessor :attack_hit_targets # 攻撃ヒットターゲット
attr_accessor :act_derive # 行動派生予定
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(battler)
@battler = battler
@attack_rect = Rect.new(0,0,0,0)
@attack_rectan_plan = []
@attack_skl_id_plan = []
@attack_motion_plan = []
@attack_hit_targets = []
@act_derive = ""
clear
end
#--------------------------------------------------------------------------
# ● クリア
#--------------------------------------------------------------------------
def clear
@attack_rect = Rect.new(0,0,0,0)
@attack_rectan_plan.clear
@attack_skl_id_plan.clear
@attack_motion_plan.clear
@attack_hit_targets.clear
@handling_priority = 0
@knock_back_duration = 0
@hit_stop_duration = 0
@action_duration = 0
@attack_skl_id = 0
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
# アクション/のけぞり/ヒットストップ、の残りフレーム数更新
@hit_stop_duration -= 1
return if @hit_stop_duration > 0
@action_duration -= 1
@knock_back_duration -= 1
#
# アクションが終了した場合
if @action_duration == 0 or @knock_back_duration == 0
# クリア
clear
# 行動派生
case @act_derive
when ""
@battler.transgraphic(1)
when "jump"
do_jump
when "front_jump"
do_front_jump
when "back_jump"
do_back_jump
end
@act_derive = ""
end
# モーション予約の更新
if @attack_motion_plan.size > 0
am = @attack_motion_plan.shift
if !am.nil? and @battler.now_form_id/10 != am/10
@battler.transgraphic(am)
end
end
# 攻撃予約の更新
if @attack_skl_id_plan.size > 0
as_id = @attack_skl_id_plan.shift
@attack_skl_id = as_id unless as_id.nil?
# スキルIDが 0 と指定された場合攻撃範囲をしまう
ar = @attack_rectan_plan.shift
if as_id == 0
@attack_rect = Rect.new(0,0,0,0)
@attack_hit_targets.clear
else
@attack_rect = ar if ar.is_a?(Rect)
end
end
end
#--------------------------------------------------------------------------
# ◇ 待機
#--------------------------------------------------------------------------
def do_stand
@attack_motion_plan = [1]
end
#--------------------------------------------------------------------------
# ◇ ダメージのけぞり
#--------------------------------------------------------------------------
def do_damage
@handling_priority = 1
@attack_motion_plan = [71]
end
#--------------------------------------------------------------------------
# ◇ 歩く
#--------------------------------------------------------------------------
def do_walk
if @battler.dashing
do_dash
else
@attack_motion_plan = [11]
end
end
#--------------------------------------------------------------------------
# ◇ 走る
#--------------------------------------------------------------------------
def do_dash
@attack_motion_plan = [21]
end
#--------------------------------------------------------------------------
# ◇ しゃがむ
#--------------------------------------------------------------------------
def do_crouch
@attack_motion_plan = [31]
end
#--------------------------------------------------------------------------
# ◇ ジャンプ
#--------------------------------------------------------------------------
def do_jump
@battler.now_jumps += 1
@attack_motion_plan = [41]
@battler.now_x_speed = 0
@battler.now_y_speed = @battler.jump_y_init_velocity
end
#--------------------------------------------------------------------------
# ◇ 前ジャンプ
#--------------------------------------------------------------------------
def do_front_jump
@battler.now_jumps += 1
@attack_motion_plan = [41]
@battler.now_x_speed = @battler.direction * @battler.air_x_maximum
@battler.now_y_speed = @battler.jump_y_init_velocity * 0.9
end
#--------------------------------------------------------------------------
# ◇ 後ジャンプ
#--------------------------------------------------------------------------
def do_back_jump
@battler.now_jumps += 1
@attack_motion_plan = [51]
@battler.now_x_speed = -1 * @battler.direction * @battler.air_x_maximum
@battler.now_y_speed = @battler.jump_y_init_velocity * 0.9
end
#--------------------------------------------------------------------------
# ◇ 着地隙
#--------------------------------------------------------------------------
def do_landing_step
@action_duration = 3
@handling_priority = 1
@attack_motion_plan = [31]
@attack_skl_id_plan.clear
@attack_rectan_plan.clear
@attack_hit_targets.clear
@attack_rect = Rect.new(0,0,0,0)
end
#--------------------------------------------------------------------------
# ◇ ガード
#--------------------------------------------------------------------------
def do_guard
@attack_motion_plan = [61]
@battler.guarding = true
end
#--------------------------------------------------------------------------
# ◇ ジャンプ隙
#--------------------------------------------------------------------------
def do_crouch_to_jump
@handling_priority = 1
if @battler.now_jumps <= 0
@action_duration = 3
@attack_motion_plan = [31]
else
@action_duration = 1
end
end
#--------------------------------------------------------------------------
# ◇ フロントステップ
#--------------------------------------------------------------------------
def do_frontstep
@action_duration = 10
@handling_priority = 1
@battler.now_jumps += 1
@battler.now_x_speed = 18 * @battler.direction
@battler.now_y_speed = @battler.jump_y_init_velocity / 3
@attack_motion_plan = [51]
end
#--------------------------------------------------------------------------
# ◇ バックステップ
#--------------------------------------------------------------------------
def do_backstep
@action_duration = 20
@handling_priority = 1
@battler.now_jumps += 1
@battler.now_x_speed = -18 * @battler.direction
@battler.now_y_speed = @battler.jump_y_init_velocity / 2
@attack_motion_plan = [51]
end
#--------------------------------------------------------------------------
# ◇ 弱攻撃
#--------------------------------------------------------------------------
def do_jub_attack
@handling_priority = 1
# 設定
@action_duration = @battler.motion_time_jub_attack
@attack_motion_plan = @battler.motion_plan_jub_attack.dup
@attack_rectan_plan = @battler.rectan_plan_jub_attack.dup
@attack_skl_id_plan = @battler.skl_id_plan_jub_attack.dup
end
#--------------------------------------------------------------------------
# ◇ 前強攻撃
#--------------------------------------------------------------------------
def do_front_attack
@handling_priority = 1
# 設定
@action_duration = @battler.motion_time_front_attack
@attack_motion_plan = @battler.motion_plan_front_attack.dup
@attack_rectan_plan = @battler.rectan_plan_front_attack.dup
@attack_skl_id_plan = @battler.skl_id_plan_front_attack.dup
end
#--------------------------------------------------------------------------
# ◇ 上強攻撃
#--------------------------------------------------------------------------
def do_upper_attack
@handling_priority = 1
# 設定
@action_duration = @battler.motion_time_upper_attack
@attack_motion_plan = @battler.motion_plan_upper_attack.dup
@attack_rectan_plan = @battler.rectan_plan_upper_attack.dup
@attack_skl_id_plan = @battler.skl_id_plan_upper_attack.dup
end
#--------------------------------------------------------------------------
# ◇ 下強攻撃
#--------------------------------------------------------------------------
def do_lower_attack
@handling_priority = 1
# 設定
@action_duration = @battler.motion_time_lower_attack
@attack_motion_plan = @battler.motion_plan_lower_attack.dup
@attack_rectan_plan = @battler.rectan_plan_lower_attack.dup
@attack_skl_id_plan = @battler.skl_id_plan_lower_attack.dup
end
#--------------------------------------------------------------------------
# ◇ 空中ニュートラル攻撃
#--------------------------------------------------------------------------
def do_air_neutral_attack
@handling_priority = 1
# 設定
@action_duration = @battler.motion_time_air_neutral_attack
@attack_motion_plan = @battler.motion_plan_air_neutral_attack.dup
@attack_rectan_plan = @battler.rectan_plan_air_neutral_attack.dup
@attack_skl_id_plan = @battler.skl_id_plan_air_neutral_attack.dup
end
#--------------------------------------------------------------------------
# ◇ 空中前攻撃
#--------------------------------------------------------------------------
def do_air_front_attack
@handling_priority = 1
# 設定
@action_duration = @battler.motion_time_air_front_attack
@attack_motion_plan = @battler.motion_plan_air_front_attack.dup
@attack_rectan_plan = @battler.rectan_plan_air_front_attack.dup
@attack_skl_id_plan = @battler.skl_id_plan_air_front_attack.dup
end
#--------------------------------------------------------------------------
# ◇ 空中上攻撃
#--------------------------------------------------------------------------
def do_air_upper_attack
@handling_priority = 1
# 設定
@action_duration = @battler.motion_time_air_upper_attack
@attack_motion_plan = @battler.motion_plan_air_upper_attack.dup
@attack_rectan_plan = @battler.rectan_plan_air_upper_attack.dup
@attack_skl_id_plan = @battler.skl_id_plan_air_upper_attack.dup
end
#--------------------------------------------------------------------------
# ◇ 空中下攻撃
#--------------------------------------------------------------------------
def do_air_lower_attack
@handling_priority = 1
# 設定
@action_duration = @battler.motion_time_air_lower_attack
@attack_motion_plan = @battler.motion_plan_air_lower_attack.dup
@attack_rectan_plan = @battler.rectan_plan_air_lower_attack.dup
@attack_skl_id_plan = @battler.skl_id_plan_air_lower_attack.dup
end
#--------------------------------------------------------------------------
# ◇ 空中後攻撃
#--------------------------------------------------------------------------
def do_air_arear_attack
@handling_priority = 1
# 設定
@action_duration = @battler.motion_time_air_arear_attack
@attack_motion_plan = @battler.motion_plan_air_arear_attack.dup
@attack_rectan_plan = @battler.rectan_plan_air_arear_attack.dup
@attack_skl_id_plan = @battler.skl_id_plan_air_arear_attack.dup
end
#--------------------------------------------------------------------------
# ◇ アイテム使用硬直
#--------------------------------------------------------------------------
def do_use_item
@handling_priority = 1
@action_duration = 20
@attack_motion_plan = [241]
end
#--------------------------------------------------------------------------
# ◇ アイテム受け硬直
#--------------------------------------------------------------------------
def do_receive_item
@handling_priority = 1
@action_duration = 40
@attack_motion_plan = [251]
end
#--------------------------------------------------------------------------
# ◇ フォート(スキル使用)
#--------------------------------------------------------------------------
def do_forte(forte_id)
if forte_id != nil and forte_id > 0
# 設定
forte_motion_database(forte_id)
else
# フォート未設定
# ブザー SE を演奏
$game_system.se_play($data_system.buzzer_se)
end
end
end
# ▼▲▼ XRXL 1. ライン・図形描写 ▼▲▼
# by 桜雅 在土, 和希, fukuyama
#==============================================================================
# ◇ 外部ライブラリ
#==============================================================================
class Bitmap
#--------------------------------------------------------------------------
# ● ライン描画 by 桜雅 在土
#--------------------------------------------------------------------------
def draw_line(start_x, start_y, end_x, end_y, start_color, width = 1, end_color = start_color)
# 描写距離の計算。大きめに直角時の長さ。
distance = (start_x - end_x).abs + (start_y - end_y).abs
# 描写開始
if end_color == start_color
for i in 1..distance
x = (start_x + 1.0 * (end_x - start_x) * i / distance).to_i
y = (start_y + 1.0 * (end_y - start_y) * i / distance).to_i
if width == 1
self.set_pixel(x, y, start_color)
else
self.fill_rect(x, y, width, width, start_color)
end
end
else
for i in 1..distance
x = (start_x + 1.0 * (end_x - start_x) * i / distance).to_i
y = (start_y + 1.0 * (end_y - start_y) * i / distance).to_i
r = start_color.red * (distance-i)/distance + end_color.red * i/distance
g = start_color.green * (distance-i)/distance + end_color.green * i/distance
b = start_color.blue * (distance-i)/distance + end_color.blue * i/distance
a = start_color.alpha * (distance-i)/distance + end_color.alpha * i/distance
if width == 1
self.set_pixel(x, y, Color.new(r, g, b, a))
else
self.fill_rect(x, y, width, width, Color.new(r, g, b, a))
end
end
end
end
#--------------------------------------------------------------------------
# ● 多角形の描画(塗りつぶしなし) by 和希
# peaks : 頂点座標の配列 [[x1,y1],[x2,y2],[x3,y3], ... ]
# color : 線の色
# width : 線の幅
#--------------------------------------------------------------------------
def draw_polygon(peaks, color, width = 1)
# 辺(=頂点)の個数分だけ辺を描く
for i in 0 ... (peaks.size - 1)
# 頂点同士を線で結ぶ
draw_line( peaks[i][0], peaks[i][1], peaks[i+1][0], peaks[i+1][1], color, width )
end
# 最後の頂点と最初の頂点を結ぶ
draw_line( peaks[peaks.size - 1][0], peaks[peaks.size - 1][1], peaks[0][0], peaks[0][1], color, width )
end
#--------------------------------------------------------------------------
# ● Rectの描画(draw_polygonを利用)
#--------------------------------------------------------------------------
def draw_rect(rect, color = Color.new(255, 255, 255, 255))
self.draw_polygon([
[rect.x , rect.y ],
[rect.x + rect.width, rect.y ],
[rect.x + rect.width, rect.y + rect.height],
[rect.x , rect.y + rect.height]
],
color, 1)
end
end
#==============================================================================
# ■ Window_BattleStatus
#==============================================================================
class Window_BattleStatus < Window_Base
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :update_cp_only # CPメーターのみの更新
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias xrxs_bp7_initialize initialize
def initialize
xrxs_bp7_initialize
# ↓Full-Viewの場合は下二行の # を消してください。
self.opacity = 0
self.back_opacity = 0
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
alias xrxs_bp7_refresh refresh
def refresh
if @update_cp_only
xrxs_bp7_refresh
return
end
# 描写を禁止しながら戻す
@draw_ban = true
xrxs_bp7_refresh
# 描写の禁止を解除
@draw_ban = false
# 描写を開始
@item_max = $game_party.actors.size
for i in 0...$game_party.actors.size
actor = $game_party.actors[i]
actor_x = i * 160 + 21
# 歩行キャラグラフィックの描写
draw_actor_graphic(actor, actor_x - 9, 116)
# HP/SPメーターの描写
draw_actor_hp_meter_line(actor, actor_x, 72, 96, 12)
draw_actor_sp_meter_line(actor, actor_x, 104, 96, 12)
# HP数値の描写
self.contents.font.size = 24 # HP/SP数値の文字の大きさ
self.contents.font.color = actor.hp == 0 ? knockout_color :
actor.hp <= actor.maxhp / 4 ? crisis_color : normal_color
draw_shadow_text(actor_x-2, 58, 96, 24, actor.hp.to_s, 2)
# SP数値の描写
self.contents.font.color = actor.sp == 0 ? knockout_color :
actor.sp <= actor.maxsp / 4 ? crisis_color : normal_color
draw_shadow_text(actor_x-2, 90, 96, 24, actor.sp.to_s, 2)
# 用語「HP」と用語「SP」の描写
self.contents.font.size = 12 # 用語「HP/SP」の文字の大きさ
self.contents.font.color = system_color # 用語「HP/SP」の文字の色
draw_shadow_text(actor_x, 60, 96, 12, $data_system.words.hp)
draw_shadow_text(actor_x, 92, 96, 12, $data_system.words.sp)
draw_actor_state(actor, actor_x, 100)
end
end
end
#==============================================================================
# ■ Window_Base
#==============================================================================
class Window_Base < Window
#--------------------------------------------------------------------------
# ● HPメーター の描画
#--------------------------------------------------------------------------
def draw_actor_hp_meter_line(actor, x, y, width = 156, height = 4)
w = width * actor.hp / actor.maxhp
hp_color_1 = Color.new(255, 0, 0, 192)
hp_color_2 = Color.new(255, 255, 0, 192)
self.contents.fill_rect(x+8, y+4, width, (height/4).floor, Color.new(0, 0, 0, 128))
draw_line(x, y, x + w, y, hp_color_1, (height/4).floor, hp_color_2)
x -= 1
y += (height/4).floor
self.contents.fill_rect(x+8, y+4, width, (height/4).ceil , Color.new(0, 0, 0, 128))
draw_line(x, y, x + w, y, hp_color_1, (height/4).ceil , hp_color_2)
x -= 1
y += (height/4).ceil
self.contents.fill_rect(x+8, y+4, width, (height/4).ceil , Color.new(0, 0, 0, 128))
draw_line(x, y, x + w, y, hp_color_1, (height/4).ceil , hp_color_2)
x -= 1
y += (height/4).ceil
self.contents.fill_rect(x+8, y+4, width, (height/4).floor, Color.new(0, 0, 0, 128))
draw_line(x, y, x + w, y, hp_color_1, (height/4).floor, hp_color_2)
end
#--------------------------------------------------------------------------
# ● SPメーター の描画
#--------------------------------------------------------------------------
def draw_actor_sp_meter_line(actor, x, y, width = 156, height = 4)
w = width * actor.sp / actor.maxsp
hp_color_1 = Color.new( 0, 0, 255, 192)
hp_color_2 = Color.new( 0, 255, 255, 192)
self.contents.fill_rect(x+8, y+4, width, (height/4).floor, Color.new(0, 0, 0, 128))
draw_line(x, y, x + w, y, hp_color_1, (height/4).floor, hp_color_2)
x -= 1
y += (height/4).floor
self.contents.fill_rect(x+8, y+4, width, (height/4).ceil , Color.new(0, 0, 0, 128))
draw_line(x, y, x + w, y, hp_color_1, (height/4).ceil , hp_color_2)
x -= 1
y += (height/4).ceil
self.contents.fill_rect(x+8, y+4, width, (height/4).ceil , Color.new(0, 0, 0, 128))
draw_line(x, y, x + w, y, hp_color_1, (height/4).ceil , hp_color_2)
x -= 1
y += (height/4).ceil
self.contents.fill_rect(x+8, y+4, width, (height/4).floor, Color.new(0, 0, 0, 128))
draw_line(x, y, x + w, y, hp_color_1, (height/4).floor, hp_color_2)
end
#--------------------------------------------------------------------------
# ● 名前の描画
#--------------------------------------------------------------------------
alias xrxs_bp7_draw_actor_name draw_actor_name
def draw_actor_name(actor, x, y)
xrxs_bp7_draw_actor_name(actor, x, y) if @draw_ban != true
end
#--------------------------------------------------------------------------
# ● ステートの描画
#--------------------------------------------------------------------------
alias xrxs_bp7_draw_actor_state draw_actor_state
def draw_actor_state(actor, x, y, width = 120)
xrxs_bp7_draw_actor_state(actor, x, y, width) if @draw_ban != true
end
#--------------------------------------------------------------------------
# ● HP の描画
#--------------------------------------------------------------------------
alias xrxs_bp7_draw_actor_hp draw_actor_hp
def draw_actor_hp(actor, x, y, width = 144)
xrxs_bp7_draw_actor_hp(actor, x, y, width) if @draw_ban != true
end
#--------------------------------------------------------------------------
# ● SP の描画
#--------------------------------------------------------------------------
alias xrxs_bp7_draw_actor_sp draw_actor_sp
def draw_actor_sp(actor, x, y, width = 144)
xrxs_bp7_draw_actor_sp(actor, x, y, width) if @draw_ban != true
end
end
#==============================================================================
# ◇ 外部ライブラリ
#==============================================================================
class Window_Base
#--------------------------------------------------------------------------
# ● ライン描画 by 桜雅 在土
#--------------------------------------------------------------------------
def draw_line(start_x, start_y, end_x, end_y, start_color, width = 1, end_color = start_color)
# 描写距離の計算。大きめに直角時の長さ。
distance = (start_x - end_x).abs + (start_y - end_y).abs
# 描写開始
if end_color == start_color
for i in 1..distance
x = (start_x + 1.0 * (end_x - start_x) * i / distance).to_i
y = (start_y + 1.0 * (end_y - start_y) * i / distance).to_i
self.contents.fill_rect(x, y, width, width, start_color)
end
else
for i in 1..distance
x = (start_x + 1.0 * (end_x - start_x) * i / distance).to_i
y = (start_y + 1.0 * (end_y - start_y) * i / distance).to_i
r = start_color.red * (distance-i)/distance + end_color.red * i/distance
g = start_color.green * (distance-i)/distance + end_color.green * i/distance
b = start_color.blue * (distance-i)/distance + end_color.blue * i/distance
a = start_color.alpha * (distance-i)/distance + end_color.alpha * i/distance
self.contents.fill_rect(x, y, width, width, Color.new(r, g, b, a))
end
end
end
#--------------------------------------------------------------------------
# ● 影文字描画 by TOMY
#--------------------------------------------------------------------------
def draw_shadow_text(x, y, width, height, string, align = 0)
# 元の色を保存しておく
color = self.contents.font.color.dup
# 黒字で影描画
self.contents.font.color = Color.new(0, 0, 0)
self.contents.draw_text(x + 2, y + 2, width, height, string, align)
# 元の色に戻して描画
self.contents.font.color = color
self.contents.draw_text(x, y, width, height, string, align)
end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 追加・公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :x_pos # バトルフィールド 横 位置(+が右 )
attr_accessor :y_pos # バトルフィールド 高さ 位置(+が上 )
attr_accessor :z_pos # バトルフィールド奥行き位置(+が手前)
attr_accessor :zoom # 現在のズーム倍率
attr_accessor :x_destination # X 目的地
attr_accessor :y_blow # 現在Y 吹っ飛び速度
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● 追加・公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :actor_in_battlefield # アクターもフィールドに
#--------------------------------------------------------------------------
# ● セットアップ
#--------------------------------------------------------------------------
alias xrxs_bp8_setup setup
def setup(actor_id)
xrxs_bp8_setup(actor_id)
# 機能"アクターもフィールドに"
# trueを優先する
@actor_in_battlefield = false if @actor_in_battlefield != true
end
end
#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ● 追加・公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :actor_in_battlefield # アクターもフィールドに
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias xrxs_bp8_initialize initialize
def initialize(troop_id, member_index)
@actor_in_battlefield = false
@x_pos = $data_troops[troop_id].members[member_index].x - 320
@y_pos = -($data_troops[troop_id].members[member_index].y - 304)
@field_x_offset = -192
@field_y_offset = -144
@z_pos = 0
@zoom = 1.00
xrxs_bp8_initialize(troop_id, member_index)
end
#--------------------------------------------------------------------------
# ● バトル画面 X 座標の取得
#--------------------------------------------------------------------------
def screen_x
return 320 - @field_x_offset + (@x_pos.to_i - $xcam_x.to_i) * @zoom
end
#--------------------------------------------------------------------------
# ● バトル画面 Y 座標の取得
#--------------------------------------------------------------------------
def screen_y
return 240 - @field_y_offset + (-@y_pos.to_i + 64 + $xcam_y.to_i) * @zoom
end
end
#==============================================================================
# ■ Sprite_Battler
#==============================================================================
class Sprite_Battler < RPG::Sprite
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias xrxs_bp8_update update
def update
# 初期化
@z_offset = 0
# 戻す
xrxs_bp8_update
# バトラーが nil の場合戻る
return if @battler == nil
# 敵のみにカメラが影響。
# 見方もバトルフィールドにいる場合ここの if を外す。
if (@battler.is_a?(Game_Actor) and @battler.actor_in_battlefield) or @battler.is_a?(Game_Enemy)
# ズーム率
zoom = 1.00 * 185 / (($xcam_z != nil ? $xcam_z : 185) - @z_offset)
self.zoom_x = zoom
self.zoom_y = zoom
@battler.zoom = zoom
# スプライトの座標を設定
self.x = @battler.screen_x
self.y = @battler.screen_y
self.z = @battler.screen_z
end
end
end
#==============================================================================
# ■ Spriteset_Battle
#==============================================================================
class Spriteset_Battle
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias xrxs_bp8_initialize initialize
def initialize
# 初期化
@now_bg_x = 0
@now_bg_y = 0
@now_bg_z = 185
# 通常時の実行
xrxs_bp8_initialize
# ビューポートを作成
@viewport1 = Viewport.new(-192, -144, 1024, 768)
# バトルバックスプライトを作成
@battleback_sprite = Sprite.new(@viewport1)
@battleback_name = ""
# エネミースプライトを作成
@enemy_sprites = []
for enemy in $game_troop.enemies.reverse
@enemy_sprites.push(Sprite_Battler.new(@viewport1, enemy))
end
# 天候を作成
@weather = RPG::Weather.new(@viewport1)
# フレーム更新
update
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias xrxs_bp8_update update
def update
# バトルバックのファイル名が現在のものと違う場合
if @battleback_name != $game_temp.battleback_name
@battleback_name = $game_temp.battleback_name
if @battleback_sprite.bitmap != nil
@battleback_sprite.bitmap.dispose
end
bg_bitmap = RPG::Cache.battleback(@battleback_name)
bg_bitmap_stretch = Bitmap.new(1024, 768)
bg_bitmap_stretch.stretch_blt(Rect.new(0, 0, 1024, 768), bg_bitmap, bg_bitmap.rect)
@battleback_sprite.bitmap = bg_bitmap_stretch
end
# カメラ位置が動いた場合
if @now_bg_x != $xcam_x or @now_bg_y != $xcam_y or @now_bg_z != $xcam_z
# ズーム率
zoom = 1.00 * 185 / $xcam_z
@battleback_sprite.zoom_x = zoom
@battleback_sprite.zoom_y = zoom
# カメラzによる位置の修正
maximum = 192 * (296 - $xcam_z) / 111
$xcam_x = [[$xcam_x, -maximum].max, maximum].min
# 背景位置更新
@battleback_sprite.x = -$xcam_x * zoom - 512 * (zoom - 1)
@battleback_sprite.y = $xcam_y * zoom - 384 * (zoom - 1)
# 値更新
@now_bg_x = $xcam_x
@now_bg_y = $xcam_y
@now_bg_z = $xcam_z
end
# 戻す
xrxs_bp8_update
end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ● メイン処理
#--------------------------------------------------------------------------
alias xrxs_bp8_main main
def main
# カメラ初期位置決定
$xcam_x = 0
$xcam_y = 0
$xcam_z = 295
# カメラの最初の目的値
@xcam_x_destination = 0
@xcam_y_destination = 0
@xcam_z_destination = 185
# 今、注目バトラーは無し。
@xcam_watch_battler = nil
# 初期化
@wait_count_xcam = 0
# 戻す
xrxs_bp8_main
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias xrxs_bp8_update update
def update
# カメラ位置の更新。
if @wait_count_xcam > 0
# ウェイトカウントを減らす
@wait_count_xcam -= 1
else
if $xcam_z != @xcam_z_destination
if $xcam_z < @xcam_z_destination
distance = [(@xcam_z_destination - $xcam_z)/8, 1].max
else
distance = [(@xcam_z_destination - $xcam_z)/8, -1].min
end
$xcam_z = [[$xcam_z + distance, 74].max, 296].min
end
if @xcam_watch_battler != nil
if $xcam_x != @xcam_watch_battler.x_pos
if ($xcam_x - @xcam_watch_battler.x_pos).abs < 8
distance = @xcam_watch_battler.x_pos - $xcam_x
elsif $xcam_x < @xcam_watch_battler.x_pos
distance = [(@xcam_watch_battler.x_pos - $xcam_x)/8, 8].max
else
distance = [(@xcam_watch_battler.x_pos - $xcam_x)/8, -8].min
end
maximum = 192 * (296 - $xcam_z) / 111
$xcam_x = [[$xcam_x + distance, -maximum].max, maximum].min
end
elsif $xcam_x != @xcam_x_destination
if ($xcam_x - @xcam_x_destination).abs < 8
distance = @xcam_x_destination - $xcam_x
elsif $xcam_x < @xcam_x_destination
distance = [(@xcam_x_destination - $xcam_x)/8, 8].max
else
distance = [(@xcam_x_destination - $xcam_x)/8, -8].min
end
maximum = 192 * (296 - $xcam_z) / 111
$xcam_x = [[$xcam_x + distance, -maximum].max, maximum].min
end
if @xcam_watch_battler != nil
if $xcam_y != @xcam_watch_battler.y_pos
if ($xcam_y - @xcam_watch_battler.y_pos).abs < 8
distance = @xcam_watch_battler.y_pos - $xcam_y
elsif $xcam_y < @xcam_watch_battler.y_pos
distance = [(@xcam_watch_battler.y_pos - $xcam_y)/8, 8].max
else
distance = [(@xcam_watch_battler.y_pos - $xcam_y)/8, -8].min
end
maximum = 144 * (296 - $xcam_z) / 111
$xcam_y = [[$xcam_y + distance, -maximum].max, maximum].min
end
elsif $xcam_y != @xcam_y_destination
if $xcam_y < @xcam_y_destination
distance = [(@xcam_y_destination - $xcam_y)/8, 1].max
else
distance = [(@xcam_y_destination - $xcam_y)/8, -1].min
end
maximum = 164 * (296 - $xcam_z) / 111
$xcam_y = [[$xcam_y + distance, -maximum].max, maximum].min
end
end
# 通常実行
xrxs_bp8_update
end
#--------------------------------------------------------------------------
# ● パーティコマンドフェーズ開始
#--------------------------------------------------------------------------
alias xrxs_bp8_start_phase2 start_phase2
def start_phase2
# カメラ:センタリング
@xcam_watch_battler = nil
@xcam_x_destination = 0
@xcam_z_destination = 185
# 戻す
xrxs_bp8_start_phase2
end
#--------------------------------------------------------------------------
# ● フレーム更新 (アクターコマンドフェーズ)
#--------------------------------------------------------------------------
alias xrxs_bp8_update_phase3 update_phase3
def update_phase3
# カメラをキャラ位置へ
if @active_battler != nil and @active_battler.actor_in_battlefield
@xcam_x_destination = @active_battler.x_pos
#@xcam_z_destination = 175
end
xrxs_bp8_update_phase3
end
#--------------------------------------------------------------------------
# ● フレーム更新 (アクターコマンドフェーズ : エネミー選択)
#--------------------------------------------------------------------------
alias xrxs_bp8_update_phase3_enemy_select update_phase3_enemy_select
def update_phase3_enemy_select
# カメラ:敵ターゲットをズームアップ
@xcam_x_destination = $game_troop.enemies[@enemy_arrow.index].x_pos * $game_troop.enemies[@enemy_arrow.index].zoom
@xcam_z_destination = 175
# 戻す
xrxs_bp8_update_phase3_enemy_select
end
#--------------------------------------------------------------------------
# ● エネミー選択終了
#--------------------------------------------------------------------------
alias xrxs_bp8_end_enemy_select end_enemy_select
def end_enemy_select
# カメラ:中心へ
@xcam_x_destination = 0
@xcam_z_destination = 185
# 戻す
xrxs_bp8_end_enemy_select
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始)
#--------------------------------------------------------------------------
alias xrxs_bp8_update_phase4_step2 update_phase4_step2
def update_phase4_step2
# 戻す
xrxs_bp8_update_phase4_step2
# ステップ 3 に移行する場合
if @phase4_step == 3
if @active_battler.is_a?(Game_Enemy) or @active_battler.actor_in_battlefield
# カメラ:行動バトラーへのズームアップを予約
@xcam_x_destination = @active_battler.x_pos * @active_battler.zoom if @active_battler.x_pos != nil
@xcam_z_destination = 175
end
# 最低 20 フレーム待つ
@wait_count = 20
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 3 : 行動側アニメーション)
#--------------------------------------------------------------------------
alias xrxs_bp8_update_phase4_step3 update_phase4_step3
def update_phase4_step3
# 戻す
xrxs_bp8_update_phase4_step3
if @target_battlers.size > 0 and
(@target_battlers[0].is_a?(Game_Enemy) or @target_battlers[0].actor_in_battlefield)
# カメラ:ターゲットへのズームアップを予約
@xcam_x_destination = @target_battlers[0].x_pos * @target_battlers[0].zoom if @target_battlers[0] != nil
@xcam_z_destination = 185
# もし対象アニメが「位置:画面」のものの場合
if @animation2_id > 0 and $data_animations[@animation2_id].position == 3
# カメラをセンタリング
@xcam_x_destination = 0
# ズームアウトまでやっちゃう・w・
@xcam_z_destination = 222
end
end
# 最低 20 フレーム待つ
@wait_count = 20
end
#--------------------------------------------------------------------------
# ● アフターバトルフェーズ開始
#--------------------------------------------------------------------------
alias xrxs_bp8_start_phase5 start_phase5
def start_phase5
@xcam_z_destination = 185
xrxs_bp8_start_phase5
end
end
#==============================================================================
# ◇ RPG::再定義「戦闘中の"画面"アニメの位置修正」
#==============================================================================
module RPG
class Sprite < ::Sprite
def animation_set_sprites(sprites, cell_data, position)
for i in 0..15
sprite = sprites[i]
pattern = cell_data[i, 0]
if sprite == nil or pattern == nil or pattern == -1
sprite.visible = false if sprite != nil
next
end
sprite.visible = true
sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192)
if position == 3
if self.viewport != nil
if $scene.is_a?(Scene_Battle)
sprite.x = self.viewport.rect.width / 2
sprite.y = 304
else
sprite.x = self.viewport.rect.width / 2
sprite.y = self.viewport.rect.height - 160
end
else
sprite.x = 320
sprite.y = 240
end
else
sprite.x = self.x - self.ox + self.src_rect.width / 2
sprite.y = self.y - self.oy + self.src_rect.height / 2
sprite.y -= self.src_rect.height / 4 if position == 0
sprite.y += self.src_rect.height / 4 if position == 2
end
sprite.x += cell_data[i, 1]
sprite.y += cell_data[i, 2]
sprite.z = 2000
sprite.ox = 96
sprite.oy = 96
sprite.zoom_x = cell_data[i, 3] / 100.0
sprite.zoom_y = cell_data[i, 3] / 100.0
sprite.angle = cell_data[i, 4]
sprite.mirror = (cell_data[i, 5] == 1)
sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
sprite.blend_type = cell_data[i, 7]
end
end
end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 追加・公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :x_pos # バトルフィールド 横 位置(+が右 )
attr_accessor :y_pos # バトルフィールド 高さ 位置(+が上 )
attr_accessor :z_pos # バトルフィールド奥行き位置(+が手前)
attr_accessor :zoom # 現在のズーム倍率
attr_accessor :x_destination # X 目的地
attr_accessor :y_blow # 現在Y 吹っ飛び速度
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● 追加・公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :actor_in_battlefield # アクターもフィールドに
#--------------------------------------------------------------------------
# ● セットアップ
#--------------------------------------------------------------------------
alias xrxs_bp12_setup setup
def setup(actor_id)
xrxs_bp12_setup(actor_id)
# 機能"アクターもフィールドに"
# ここを true にすると、 ↓「アクターもフィールドに」が有効になる。
@actor_in_battlefield = true
@x_pos = 0
@y_pos = 0
@field_x_offset = -224
@field_y_offset = -144
@z_pos = 0
@zoom = 1.00
end
#--------------------------------------------------------------------------
# ● バトル画面 X 座標の取得
#--------------------------------------------------------------------------
alias xrxs_bp12_screen_x screen_x
def screen_x
# パーティ内の並び順から X 座標を計算して返す
if self.index != nil
if @actor_in_battlefield
return 96 - @field_x_offset + (@x_pos.to_i - $xcam_x.to_i) * @zoom
else
return xrxs_bp12_screen_x
end
else
return 0
end
end
#--------------------------------------------------------------------------
# ● バトル画面 Y 座標の取得
#--------------------------------------------------------------------------
def screen_y
if @actor_in_battlefield
return 96 - @field_y_offset + (-@y_pos.to_i + 64 + $xcam_y.to_i) * @zoom
else
return 464
end
end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ● メイン処理
#--------------------------------------------------------------------------
alias xrxs_bp12_main main
def main
# バトラー位置
for battler in $game_party.actors
case battler.index
when 0 # パーティ1人目の位置
battler.x_pos = -304
battler.z_pos = -24
when 1 # パーティ2人目の位置
battler.x_pos = -240
battler.z_pos = 0
when 2 # パーティ3人目の位置
battler.x_pos = -192
battler.z_pos = -24
when 3 # パーティ4人目の位置
battler.x_pos = -128
battler.z_pos = 0
end
battler.x_destination = battler.x_pos
battler.y_blow = 0
battler.y_pos = 0
end
# 戻す
xrxs_bp12_main
end
end
#==============================================================================
# □ カスタマイズポイント
#==============================================================================
class Scene_Battle
# 「状況に応じたフォーム変化を行う」
# (基本的に true で使用しますが、"待機アニメ"だけ使用したいとき、または
# Full-Move Battle Systemを使用する場合、false に設定して下さい。)
DO_FORM_UPDATE = true
# "バッドステート"であると判断するステートのIDの配列
BAD_STATE_IDS = [1, 2, 3, 4, 5, 6, 7, 8]
# 「自動アニメ」稼動
AUTO_UPDATE_DECPLACE = true
end
#==============================================================================
# □ 固定値の設定
#==============================================================================
class Scene_Battle
# フォームIDリスト
FORM_ID_BASIC = 1 # 待機:基本(1に固定)
FORM_ID_BAD_STATE = 31 # 待機:バッドステート
FORM_ID_STEP3_ATTACK = 1 # 通常攻撃 :行動側アニメ時
FORM_ID_STEP4_ATTACK = 121 # 通常攻撃 :対象側アニメ時
FORM_ID_STEP3_GUARD = 61 # 防御選択 :行動側アニメ時
FORM_ID_STEP4_GUARD = 61 # 防御選択 :対象側アニメ時
FORM_ID_STEP3_ESCAPE = 51 # 逃げる :行動側アニメ時
FORM_ID_STEP4_ESCAPE = 51 # 逃げる :対象側アニメ時
FORM_ID_STEP3_NOMOVE = 1 # なにもしない :行動側アニメ時
FORM_ID_STEP4_NOMOVE = 1 # なにもしない :対象側アニメ時
FORM_ID_STEP3_SKILL = 201 # スキル(非魔法):行動側アニメ時
FORM_ID_STEP4_SKILL = 211 # スキル(非魔法):対象側アニメ時
FORM_ID_STEP3_MAGIC = 221 # スキル( 魔法 ):行動側アニメ時
FORM_ID_STEP4_MAGIC = 231 # スキル( 魔法 ):対象側アニメ時
FORM_ID_STEP3_ITEM = 241 # アイテム使用 :行動側アニメ時
FORM_ID_STEP4_ITEM = 251 # アイテム使用 :対象側アニメ時
FORM_ID_STEP4_DAMAGE = 71 # ダメージ受け
FORM_ID_STEP4_GUARD = 61 # 攻撃を防御時
FORM_ID_STEP4_HEALED = 251 # 非ダメージ受け時(回復等)
FORM_ID_STEP4_AVOID = 51 # 回避時
FORM_ID_WIN_ACTION = 991 # 戦闘勝利時
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ● 追加・公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :now_form_id # フォームID
attr_accessor :battler_name_basic_form # バトラーの基本バトラーグラフィック
#--------------------------------------------------------------------------
# ● フォームID
#--------------------------------------------------------------------------
def now_form_id
if @now_form_id != nil
return @now_form_id
else
return 1
end
end
#--------------------------------------------------------------------------
# ● バトラーグラフィックの変更
# form_id : 変更後のフォームのID
#--------------------------------------------------------------------------
def transgraphic(form_id)
# now_form_id の更新。
@now_form_id = form_id
# 0 が指定された場合、グラフィックを消す
if form_id == 0
@battler_name = ""
return
end
# 0の付加
form_id_s = ""
if form_id < 100
form_id_s += "0"
end
if form_id < 10
form_id_s += "0"
end
form_id_s += form_id.to_s
battler_form_name = @battler_name_basic_form.to_s + "_" + form_id_s.to_s
if FileTest.exist?("Graphics/Battlers/" + battler_form_name + ".png")
@battler_name = battler_form_name
elsif form_id == 1
if FileTest.exist?("Graphics/Battlers/" + @battler_name_basic_form.to_s + ".png")
@battler_name = @battler_name_basic_form.to_s
end
end
if FileTest.exist?("Audio/SE/" + battler_form_name + ".wav")
Audio.se_play("Audio/SE/" + battler_form_name)
end
end
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ○ 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :battler_name_basic_form # バトラー ファイル名:基本
#--------------------------------------------------------------------------
# ● セットアップ
#--------------------------------------------------------------------------
alias xrxs_bp11_setup setup
def setup(actor_id)
xrxs_bp11_setup(actor_id)
@battler_name_basic_form = @battler_name
end
#--------------------------------------------------------------------------
# ● グラフィックの変更
#--------------------------------------------------------------------------
alias xrxs_bp11_set_graphic set_graphic
def set_graphic(character_name, character_hue, battler_name, battler_hue)
xrxs_bp11_set_graphic(character_name, character_hue, battler_name, battler_hue)
@battler_name_basic_form = @battler_name
end
end
#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias xrxs_bp11_initialize initialize
def initialize(troop_id, member_index)
xrxs_bp11_initialize(troop_id, member_index)
@battler_name_basic_form = @battler_name
end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ● メイン処理
#--------------------------------------------------------------------------
alias xrxs_bp11_main main
def main
@wait_count_motion = 0
xrxs_bp11_main
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias xrxs_bp11_update update
def update
xrxs_bp11_update
# バトラーグラフィック表示更新
if @wait_count_motion > 0
# ウェイトカウントを減らす
@wait_count_motion -= 1
elsif AUTO_UPDATE_DECPLACE
for battler in $game_party.actors + $game_troop.enemies
# バトラー待機グラフィックの更新
trance_id = battler.now_form_id
# 一つ進める
trance_id += 1
# 循環
trance_id -= 8 if trance_id%10 == 9
battler.transgraphic(trance_id)
end
@wait_count_motion = 2
end
end
#--------------------------------------------------------------------------
# ● プレバトルフェーズ開始
#--------------------------------------------------------------------------
alias xrxs_bp11_start_phase1 start_phase1
def start_phase1
xrxs_bp11_start_phase1
# モーションをリセット
actors_motion_reset
end
#--------------------------------------------------------------------------
# ● アクター達のモーションをリセット
#--------------------------------------------------------------------------
def actors_motion_reset
for actor in $game_party.actors
form_id = FORM_ID_BASIC
for state in actor.states
form_id = FORM_ID_BAD_STATE if BAD_STATE_IDS.include?(state.id)
end
actor.transgraphic(form_id)
end
end
#DO_FORM_UPDATE---
if DO_FORM_UPDATE
#--------------------------------------------------------------------------
# ● 勝敗判定
#--------------------------------------------------------------------------
alias xrxs_bp11_judge judge
def judge
bool = xrxs_bp11_judge
if bool
for battler in $game_party.actors
if battler.dead? == false
battler.transgraphic(FORM_ID_WIN_ACTION)
end
end
end
return bool
end
#--------------------------------------------------------------------------
# ● バトル終了
#--------------------------------------------------------------------------
alias xrxs_bp11_battle_end battle_end
def battle_end(result)
# モーションを基本に戻す
for actor in $game_party.actors
actor.set_graphic(actor.character_name, actor.character_hue, actor.battler_name_basic_form, actor.battler_hue)
end
# 呼び戻す
xrxs_bp11_battle_end(result)
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 3 : 行動側アニメーション)
#--------------------------------------------------------------------------
alias xrxs_bp11_update_phase4_step3 update_phase4_step3
def update_phase4_step3
# モーション:行動側のモーション
# アクションの種別で分岐
case @active_battler.current_action.kind
when 0 # 基本
# 攻撃の場合
if @active_battler.current_action.basic == 0
@active_battler.transgraphic(FORM_ID_STEP3_ATTACK)
end
# 防御の場合
if @active_battler.current_action.basic == 1
@active_battler.transgraphic(FORM_ID_STEP3_GUARD)
end
# 逃げるの場合
if @active_battler.is_a?(Game_Enemy) and @active_battler.current_action.basic == 2
@active_battler.transgraphic(FORM_ID_STEP3_ESCAPE)
end
# 何もしないの場合
if @active_battler.current_action.basic == 3
@active_battler.transgraphic(FORM_ID_STEP3_NOMOVE)
end
when 1 # スキル時、魔法判別
if skill_is_a_magic?(@skill)
@active_battler.transgraphic(FORM_ID_STEP3_MAGIC)
else
@active_battler.transgraphic(FORM_ID_STEP3_SKILL)
end
when 2 # アイテム
@active_battler.transgraphic(FORM_ID_STEP3_ITEM)
end
# 戻す
xrxs_bp11_update_phase4_step3
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 4 : 対象側アニメーション)
#--------------------------------------------------------------------------
alias xrxs_bp11_update_phase4_step4 update_phase4_step4
def update_phase4_step4
# モーション:行動側のモーション
# アクションの種別で分岐
case @active_battler.current_action.kind
when 0 # 基本
# 攻撃の場合
if @active_battler.current_action.basic == 0
@active_battler.transgraphic(FORM_ID_STEP4_ATTACK)
end
# 防御の場合
if @active_battler.current_action.basic == 1
@active_battler.transgraphic(FORM_ID_STEP4_GUARD)
end
# 逃げるの場合
if @active_battler.is_a?(Game_Enemy) and @active_battler.current_action.basic == 2
@active_battler.transgraphic(FORM_ID_STEP4_ESCAPE)
end
# 何もしないの場合
if @active_battler.current_action.basic == 3
@active_battler.transgraphic(FORM_ID_STEP4_NOMOVE)
end
when 1 # スキル時、魔法判別
if skill_is_a_magic?(@skill)
@active_battler.transgraphic(FORM_ID_STEP4_MAGIC)
else
@active_battler.transgraphic(FORM_ID_STEP4_SKILL)
end
when 2 # アイテム
@active_battler.transgraphic(FORM_ID_STEP4_ITEM)
end
# モーション:対象側のダメージ
for target in @target_battlers
if target.damage == "Miss"
target.transgraphic(FORM_ID_STEP4_AVOID)
elsif target.damage.is_a?(Numeric) and target.damage > 0
if target.guarding?
target.transgraphic(FORM_ID_STEP4_GUARD)
else
target.transgraphic(FORM_ID_STEP4_DAMAGE)
end
else
target.transgraphic(FORM_ID_STEP4_HEALED)
end
end
# 戻す
xrxs_bp11_update_phase4_step4
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ)
#--------------------------------------------------------------------------
alias xrxs_bp11_update_phase4_step6 update_phase4_step6
def update_phase4_step6
# 行動者のモーションのリセット
form_id = FORM_ID_BASIC
for state in @active_battler.states
form_id = FORM_ID_BAD_STATE if BAD_STATE_IDS.include?(state.id)
end
@active_battler.transgraphic(form_id)
# 対象のモーションリセット
if @target_battlers != nil
for target in @target_battlers
form_id = FORM_ID_BASIC
for state in target.states
form_id = FORM_ID_BAD_STATE if BAD_STATE_IDS.include?(state.id)
end
target.transgraphic(form_id)
end
end
xrxs_bp11_update_phase4_step6
end
end #---DO_FORM_UPDATE
#--------------------------------------------------------------------------
# ● スキルが魔法スキルがどうか判別
#--------------------------------------------------------------------------
def skill_is_a_magic?(skill)
return false if skill == nil
return true if skill.str_f < skill.int_f
return false
end
end
