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 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
Hay quá ,bạn có thể cho tên của trang web đó ko ? đó là 1 bước tiến đó , rpg maker xp có thể dùng để làm cả game [RPG]Action , quá hay !
Ừm cái script này tốt lém đó.Nhưng mình không chuyên thể loại RPG chứ không dùng action http://s15.yousendit.com/d.aspx?id=374SDY1DZFQZU3IWYYE0AIRQKM Cái đó là mẫu . Cái này xuất xứ bến JP tui hông rõ nó nữa, chỉ biết thằng viết ra cái này cũng có 1 trang web riêng .Lúc trước tui post hình trong cái topic "download soure" + trailer đó tự làm hết , viết nhạc ...... đến giờ cũng chưa có Demo chính thức và chỉ có tin tức thông báo bình thường (bằng tiếng JP) .... => Ông đó giỏi thật !!
Ken à , ông cũng cho lại cái link đi nha , cái link kia die lâu roài . Tiện thể nếu được thì giới thiệu luôn chút