#============================================================================== # [ZTBS] -Zenith Tactical Battle System- タクティカルバトルシステム #  〜1:ZTBS用 基本設定強化〜   by 水夜 #  ver1.00  Zenith Creation (http://zenith.ifdef.jp/) #------------------------------------------------------------------------------ # マップ上での戦略的なバトルを実現。 #============================================================================== class Game_System #-------------------------------------------------------------------------- # ● 公開インスタンス変数 Game_Systemに記録することでセーブに対応 #-------------------------------------------------------------------------- attr_accessor :in_tactics # タクティクス中フラグ attr_accessor :tactics_turn # ターン attr_accessor :tactics_phase # フェーズ attr_accessor :tactics_step # ステップ attr_accessor :tactics_setup # セットアップフラグ attr_accessor :tactics_actors # アクター attr_accessor :tactics_dead_actors # 戦闘不能アクター attr_accessor :tactics_enemies # エネミー #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias ztbs_initialize initialize def initialize # 呼び戻す ztbs_initialize @in_tactics = false @tactics_turn = 0 @tactics_phase = 0 @tactics_step = 0 @tactics_setup = false @tactics_actors = {} @tactics_dead_actors = {} @tactics_enemies = {} end end class Game_Party #-------------------------------------------------------------------------- # ● アイテムの使用可能判定 #-------------------------------------------------------------------------- alias ztbs_item_can_use? item_can_use? def item_can_use?(item_id) if $game_system.in_tactics # アイテムの個数が 0 個の場合 if item_number(item_id) == 0 # 使用不能 return false end # 戦闘不能者がいない場合は戦闘不能回復を使用不可に if [5, 6].include?($data_items[item_id].scope) and $game_system.tactics_dead_actors.size == 0 return false end return true else # 呼び戻す ztbs_item_can_use?(item_id) end end end class Game_Battler #-------------------------------------------------------------------------- # ● 移動可能距離の取得 #-------------------------------------------------------------------------- def movable n = agi / ZTBS::C_MOVABLE n = [[Integer(n), 1].max, ZTBS::MOVABLE_MAX].min return n end #-------------------------------------------------------------------------- # ● スキルの使用可能判定 #-------------------------------------------------------------------------- alias ztbs_skill_can_use? skill_can_use? def skill_can_use?(skill_id) if $game_system.in_tactics # タクティカルスキルではない場合は使用不可 if !$data_skills[skill_id].tactical? return false end # SP が足りない場合は使用不可 if $data_skills[skill_id].sp_cost > self.sp return false end # 戦闘不能者がいない場合は戦闘不能回復を使用不可に if [5, 6].include?($data_skills[skill_id].scope) if self.is_a?(Game_Actor) return false if $game_system.tactics_dead_actors.size == 0 else return false end end # 戦闘不能の場合は使用不可 if dead? return false end # 沈黙状態の場合、物理スキル以外は使用不可 if $data_skills[skill_id].atk_f == 0 and self.restriction == 1 return false end return true else # 呼び戻す ztbs_skill_can_use?(skill_id) end end #-------------------------------------------------------------------------- # ● スキルの効果適用 #-------------------------------------------------------------------------- alias ztbs_skill_effect skill_effect def skill_effect(user, skill) if $game_system.in_tactics # 戦闘中フラグ $game_temp.in_battle = true # 呼び戻す effective = ztbs_skill_effect(user, skill) # 戦闘中フラグ解除 $game_temp.in_battle = false else # 呼び戻す effective = ztbs_skill_effect(user, skill) end # メソッド終了 return effective end #-------------------------------------------------------------------------- # ● アイテムの効果適用 #-------------------------------------------------------------------------- alias ztbs_item_effect item_effect def item_effect(item) if $game_system.in_tactics # 戦闘中フラグ $game_temp.in_battle = true # 呼び戻す effective = ztbs_item_effect(item) # 戦闘中フラグ解除 $game_temp.in_battle = false else # 呼び戻す effective = ztbs_item_effect(item) end # メソッド終了 return effective end end class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias ztbs_initialize initialize def initialize(troop_id, member_index) if troop_id == 0 super() @enemy_id = member_index enemy = $data_enemies[@enemy_id] @hp = maxhp @sp = maxsp else ztbs_initialize(troop_id, member_index) end end #-------------------------------------------------------------------------- # ● タクティカルアクション作成 #-------------------------------------------------------------------------- def make_tactical_action # カレントアクションをクリア self.current_action.clear # 現在有効なアクションを抽出 available_actions = [] rating_max = 0 for action in self.actions # ターン 条件確認 n = $game_system.tactics_turn a = action.condition_turn_a b = action.condition_turn_b if (b == 0 and n != a) or (b > 0 and (n < 1 or n < a or n % b != a % b)) next end # HP 条件確認 if self.hp * 100.0 / self.maxhp > action.condition_hp next end # レベル 条件確認 if $game_party.max_level < action.condition_level next end # スイッチ 条件確認 switch_id = action.condition_switch_id if switch_id > 0 and $game_switches[switch_id] == false next end # スキル使用可能判定 if action.kind == 1 skill = $data_skills[action.skill_id] if !self.skill_can_use?(skill.id) next end end # 条件に該当 : このアクションを追加 available_actions.push(action) if action.rating > rating_max rating_max = action.rating end end # 最大のレーティング値を 3 として合計を計算 (0 以下は除外) ratings_total = 0 for action in available_actions if action.rating > rating_max - 3 ratings_total += action.rating - (rating_max - 3) end end # レーティングの合計が 0 ではない場合 if ratings_total > 0 # 乱数を作成 value = rand(ratings_total) # 作成した乱数に対応するものをカレントアクションに設定 for action in available_actions if action.rating > rating_max - 3 if value < action.rating - (rating_max - 3) self.current_action.kind = action.kind self.current_action.basic = action.basic self.current_action.skill_id = action.skill_id return else value -= action.rating - (rating_max - 3) end end end end end end class Game_Map #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :tactics_end_map # タクティクス終了時の移動先 #-------------------------------------------------------------------------- # ● セットアップ #-------------------------------------------------------------------------- alias ztbs_setup setup def setup(map_id) # 呼び戻す ztbs_setup(map_id) # マップ名を取得 $data_mapinfos = load_data("Data/MapInfos.rxdata") if $data_mapinfos.nil? map_name = $data_mapinfos[@map_id].name # タクティクス終了時の移動先を取得 @tactics_end_map = get_tactics_end_map(@map_id) # マップ名からタクティクスマップ判定 $game_system.in_tactics = map_name.include?("[T]") end end class Game_Character #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :appear # 出現 attr_accessor :damage_pop # ダメージ表示フラグ attr_accessor :damage # ダメージ値 attr_accessor :critical # クリティカルフラグ attr_accessor :animation_id # アニメーション ID attr_accessor :animation_hit # アニメーション ヒットフラグ attr_accessor :white_flash # 白フラッシュフラグ attr_accessor :blink # 明滅フラグ attr_accessor :collapse # コラプス attr_accessor :acted # 行動済み attr_accessor :effect # エフェクト中 attr_accessor :invisible # 不可視状態 attr_accessor :not_update # 更新禁止 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias ztbs_initialize initialize def initialize # 呼び戻す ztbs_initialize @damage_pop = false @damage = nil @critical = false @animation_id = 0 @animation_hit = false @white_flash = false @blink = false @collapse = 0 @acted = false @effect = false @invisible = false @not_update = false end #-------------------------------------------------------------------------- # ● ステートのアニメーション ID 取得 #-------------------------------------------------------------------------- def state_animation_id if self.is_a?(Game_Player) or !$game_system.in_tactics or (!$game_system.tactics_actors.keys.include?(self.id) and !$game_system.tactics_enemies.keys.include?(self.id)) return 0 end # バトラー取得 if $game_system.tactics_actors.keys.include?(self.id) battler = $game_system.tactics_actors[self.id] else battler = $game_system.tactics_enemies[self.id] end # ステートがひとつも付加されていない場合 if battler.states.size == 0 return 0 end # レーティング最大のステートのアニメーション ID を返す return $data_states[battler.states[0]].animation_id end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias ztbs_update update def update return if @not_update ztbs_update # 「簡易版マップ処理軽量化」でのエラー防止 if defined? $onscreen and $game_system.in_tactics # スプライト更新ありにする $onscreen[@id] = true end end end class Game_Event < Game_Character #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :name # 名前 attr_reader :move_frequency # 移動頻度 attr_reader :erased # 消去済み #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias ztbs_e_initialize initialize def initialize(map_id, event) ztbs_e_initialize(map_id, event) @name = event.name end #-------------------------------------------------------------------------- # ● 消去取り消し #-------------------------------------------------------------------------- def cancel_erase @erased = false @appear = true @effect = true end end class Game_Player < Game_Character #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :through # すり抜け attr_accessor :move_speed # 移動速度 attr_accessor :through_original # すり抜け記憶 attr_accessor :speed_original # 移動速度記憶 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize() super() @through_original = @through @speed_original = @move_speed end #-------------------------------------------------------------------------- # ● 歩数増加 #-------------------------------------------------------------------------- alias ztbs_increase_steps increase_steps def increase_steps super return if $game_system.in_tactics # 呼び戻す ztbs_increase_steps end end class Sprite_Character < RPG::Sprite #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias ztbs_update update def update if $game_system.in_tactics super # タイル ID、ファイル名、色相のどれかが現在のものと異なる場合 if @tile_id != @character.tile_id or @character_name != @character.character_name or @character_hue != @character.character_hue # タイル ID とファイル名、色相を記憶 @tile_id = @character.tile_id @character_name = @character.character_name @character_hue = @character.character_hue # タイル ID が有効な値の場合 if @tile_id >= 384 self.bitmap = RPG::Cache.tile($game_map.tileset_name, @tile_id, @character.character_hue) self.src_rect.set(0, 0, 32, 32) self.ox = 16 self.oy = 32 # タイル ID が無効な値の場合 else self.bitmap = RPG::Cache.character(@character.character_name, @character.character_hue) @cw = bitmap.width / 4 @ch = bitmap.height / 4 self.ox = @cw / 2 self.oy = @ch end end # 可視状態を設定 self.visible = (not @character.transparent) # グラフィックがキャラクターの場合 if @tile_id == 0 # 転送元の矩形を設定 sx = @character.pattern * @cw sy = (@character.direction - 2) / 2 * @ch self.src_rect.set(sx, sy, @cw, @ch) end # スプライトの座標を設定 self.x = @character.screen_x self.y = @character.screen_y self.z = @character.screen_z(@ch) # 不透明度、合成方法、茂み深さを設定 if self.opacity == 0 @character.invisible = true end unless @character.effect if @character.acted self.opacity = @character.opacity - 100 elsif @character.invisible self.opacity = 0 else self.opacity = @character.opacity end self.blend_type = @character.blend_type self.bush_depth = @character.bush_depth end @character.effect = effect? if @character.is_a?(Game_Player) return end # アニメーション ID が現在のものと異なる場合 if @character.damage == nil and @character.state_animation_id != @state_animation_id and ($game_system.tactics_step < 6 or $game_system.tactics_step > 9) and ZTBS::STATE_ANIMATION @state_animation_id = @character.state_animation_id loop_animation($data_animations[@state_animation_id]) end # アニメーション if @character.animation_id != 0 animation = $data_animations[@character.animation_id] animation(animation, @character.animation_hit) @character.animation_id = 0 end # 出現 if @character.appear and ($game_system.tactics_step < 6 or $game_system.tactics_step > 8) @character.refresh @character.invisible = false self.opacity = @character.opacity appear @character.appear = false end # 明滅 if @character.blink blink_on else blink_off end # 白フラッシュ if @character.white_flash whiten @character.white_flash = false end # ダメージ if @character.damage_pop damage(@character.damage, @character.critical) @character.damage = nil @character.critical = false @character.damage_pop = false end # コラプス if @character.damage == nil and @character.collapse > 0 case @character.collapse when 1 $game_system.se_play($data_system.actor_collapse_se) when 2 $game_system.se_play($data_system.enemy_collapse_se) end collapse @character.collapse = 0 @character.effect = true end else # 呼び戻す ztbs_update end end end class Spriteset_Map #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :viewport1 # ビューポート1 attr_accessor :area_sprites # エリアスプライト attr_accessor :range_sprites # レンジスプライト attr_reader :character_sprites # キャラクタースプライト #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias ztbs_initialize initialize def initialize if $game_system.in_tactics # ビューポートを作成 @viewport1 = Viewport.new(0, 0, 640, 480) @viewport2 = Viewport.new(0, 0, 640, 480) @viewport3 = Viewport.new(0, 0, 640, 480) @viewport2.z = 200 @viewport3.z = 5000 # タイルマップを作成 @tilemap = Tilemap.new(@viewport1) @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name) for i in 0..6 autotile_name = $game_map.autotile_names[i] @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name) end @tilemap.map_data = $game_map.data @tilemap.priorities = $game_map.priorities # パノラマプレーンを作成 @panorama = Plane.new(@viewport1) @panorama.z = -1000 # フォグプレーンを作成 @fog = Plane.new(@viewport1) @fog.z = 3000 # エリアスプライトを作成 @area_sprites = [] # レンジスプライトを作成 @range_sprites = [] # 「簡易版マップ処理軽量化」でのエラー防止 if defined? $onscreen # キャラクタースプライトを作成 @character_sprites = [] @party_sprites = [] for i in $game_map.events.keys.sort sprite = Sprite_Character.new(@viewport1, $game_map.events[i]) @character_sprites[i] = sprite $onscreen[i] = true end @party_sprites.push(Sprite_Cursor.new(@viewport1, $game_player.x, $game_player.y)) else # キャラクタースプライトを作成 @character_sprites = [] for i in $game_map.events.keys.sort sprite = Sprite_Character.new(@viewport1, $game_map.events[i]) @character_sprites.push(sprite) end @character_sprites.push(Sprite_Cursor.new(@viewport1, $game_player.x, $game_player.y)) end # 天候を作成 @weather = RPG::Weather.new(@viewport1) # ピクチャを作成 @picture_sprites = [] for i in 1..50 @picture_sprites.push(Sprite_Picture.new(@viewport2, $game_screen.pictures[i])) end # タイマースプライトを作成 @timer_sprite = Sprite_Timer.new # フレーム更新 update else ztbs_initialize end end #-------------------------------------------------------------------------- # ● エフェクト表示中判定 #-------------------------------------------------------------------------- def effect? # エフェクトが一つでも表示中なら true を返す for sprite in @character_sprites if sprite != nil and sprite.effect? return true end end return false end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- alias ztbs_dispose dispose def dispose ztbs_dispose return if !defined? @area_sprites # エリアスプライトを解放 for sprite in @area_sprites + @range_sprites sprite.dispose end end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias ztbs_update update def update ztbs_update return if !defined? @area_sprites # エリアスプライトを更新 for sprite in @area_sprites + @range_sprites sprite.update end end end class Window_Help < Window_Base #-------------------------------------------------------------------------- # ● アクター情報リフレッシュ #-------------------------------------------------------------------------- def refresh_actor(actor) @actor = nil set_actor(actor) end #-------------------------------------------------------------------------- # ● エネミー情報リフレッシュ #-------------------------------------------------------------------------- def refresh_enemy(enemy) @actor = nil set_enemy(enemy) end #-------------------------------------------------------------------------- # ● エネミー設定 #-------------------------------------------------------------------------- alias ztbs_set_enemy set_enemy def set_enemy(enemy) if $game_system.in_tactics and ZTBS::ENEMY_HPSP set_actor(enemy) else # 呼び戻す ztbs_set_enemy(enemy) end end end #============================================================================== # ■ Scene_Load #------------------------------------------------------------------------------ # ※システム初期化を不要にします。 # 新規プロジェクトで開始する場合やゲーム完成時には # 以下のスクリプトを消しても構いません。 #============================================================================== class Scene_Load < Scene_File #-------------------------------------------------------------------------- # ● セーブデータの読み込み #-------------------------------------------------------------------------- alias ztbs_read_save_data read_save_data def read_save_data(file) # 呼び戻す ztbs_read_save_data(file) # システム初期化を不要に if $game_system.tactics_turn == nil $game_system.in_tactics = false $game_system.tactics_turn = 0 $game_system.tactics_phase = 0 $game_system.tactics_step = 0 $game_system.tactics_setup = false $game_system.tactics_actors = {} $game_system.tactics_dead_actors = {} $game_system.tactics_enemies = {} end end end