赞 | 0 |
VIP | 0 |
好人卡 | 7 |
积分 | 1 |
经验 | 43463 |
最后登录 | 2017-9-10 |
在线时间 | 1019 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 1019 小时
- 注册时间
- 2012-4-25
- 帖子
- 799
|
- =begin
- 合体技VXAce
- 2012年07月15日 作成。
- 2012年12月05日 改訂。
- 配布元:
- http://tamurarpgvx.blog137.fc2.com/
- 配布記事:
- http://tamurarpgvx.blog137.fc2.com/blog-entry-124.html
- 【概要】
- 合体技を作成します。
- 【使い方】
- スクリプトエディタの(ここに追加)の下に、このファイルをコピーして下さい。
- 【機能】
- ①まず、どれでもいいので、スキルのメモ欄に <combi;XXX;YYY;ZZZ;AAA> と書き込みます。
- ②するとこのスキルは合体技となり、IDがXXX番のスキル、IDがYYY番のスキル、
- IDがZZZ番のスキル、IDがAAA番のスキルを、アクターが1人ずつ覚えていないと
- 使用できません。
- ひとりが複数のスキルを覚えていても駄目です。ひとつずつ分担します。
- また、<combi;XXX;YYY;ZZZ>とやると3人技、
- <combi;XXX;YYY>で二人技です。
- かならず > で終わりを閉じてください。
- なお、行動不能のアクターは参加できません。
- ③消費するMPは、分担するスキルのものです。合体技そのもののMPは無視します。
- ④スキル習得・MP・行動可能の条件を満たすと、パーティコマンドの「逃げる」の下に
- 「合体技」が出現します。
- ⑤使いたい合体技を選びます。MPが足りない・参加者が行動不能な合体技は表示されません。
- ⑥合体技を選んだら、参加メンバーを選びます。どういう事かと言うと、
- 2・3人技は、同じ技を二人が覚えていると、参加メンバーの組み合わせが複数あるためです。
- ⑦参加メンバーを選んだら、一番上のスキルを使う人の順目で発動します。
- 他のメンバーは行動(コマンド入力)できません。
- 【統括者について】
- ⑥において、一番上のスキルを担当するアクターを統括者と呼びます。
- 合体技の威力や発動順などは、統括者の能力値に準拠します。
- 【注意事項】
- ・XPスタイルバトルよりも下に配置して下さい。
- ・「生者死者両方に使えるスキル・アイテム」よりも下に配置してください。
- ・担当スキルが使用できない場合は合体技に参加できませんが、
- スキル設定の「使用可能時」に限り、これを無視して使うことができます。
- 【バグ対応】
- 20120126 ・製作。
- 20120305 ・5人以上のパーティに対応。
- ・パターンが複数ある技を使用した後、パターンが少ない技を選ぶとエラーが
- 発生するのを修正。
- 20120309 ・戦闘テストに対応。
- 20120310 ・XPスタ Cルバトルとの競合に対策実施。
- 20120311 ・使える合体技が無い場合は、「合体技」を選択できないようにした。
- 20120317 ・前ターンで使った合体技が使えなくなった場合、
- 空欄が選べてしまう不具合を修正。
- ・TP技に対応。
- 20120329 ・反撃で敵を倒したときにエラー落ちする不具合を修正。
- 20120402 ・合体技発動不可の場合には、指定のスキルを発動するようにした。
- 20120403 ・行動可能な人数と同じ必要人数の合体技を選択後、その合体技が
- 使用不可能になった際に不具合が起きる現象を修正。
- 20120420 ・処理を軽量化。
- ・反撃で倒されるとエラー落ちする不具合の修正。
- 20120503 ・アクターが目標のスキルでエラー落ちするのを修正。
- ・<combi;~>を複数記述した時、構成スキルを選択できるようにした。
- 20120505 ・<combi;~>を複数記述した時、同じスキルが複数表示されるのを修正。
- 20120507 ・参加メンバーパターンがおかしくなっていたのを修正。
- 20120715 ・合体技の効果が「使用者に行動不能ステート」の場合、エラーが出るのを修正。
- ・ターゲットを「使用者」にしたとき、エラーが起こるのを修正。
- 20121205 ・スキル封印、スキルタイプ封印のときは合体技に参加できない。
- =end
- module Tamura_Combi
- #合体技が使用不可能な場合、以下のIDのスキルが発動します。7番は「様子を見る」。
- UNUSE = 7
- end
- #==============================================================================
- # ■ DataManager
- #==============================================================================
- module DataManager
- #--------------------------------------------------------------------------
- # ● 戦闘テスト用のデータベースをロード
- #--------------------------------------------------------------------------
- def self.load_battle_test_database_combi
- load_battle_test_database_combi_default
- $com = Combination.new
- end
- #--------------------------------------------------------------------------
- # ● クラスメソッドのエイリアス
- #--------------------------------------------------------------------------
- class << self
- alias :load_battle_test_database_combi_default :load_battle_test_database
- alias :load_battle_test_database :load_battle_test_database_combi
- end
- end
- #==============================================================================
- # ■ BattleManager
- #==============================================================================
- module BattleManager
- #--------------------------------------------------------------------------
- # ● 次の行動主体の取得 ☆再定義
- #--------------------------------------------------------------------------
- def self.next_subject
- loop do
- battler = @action_battlers.shift
- return nil unless battler
- #統括者でない合体技参加メンバーは飛ばす
- if battler.actor? and battler.combi_join != nil
- next if battler.combi_join != 0
- end
- #以下デフォルト処理
- next unless battler.index && battler.alive?
- return battler
- end
- end
- end
- #==============================================================================
- # ■ Game_Action
- #------------------------------------------------------------------------------
- # ・合体技のターゲットが「使用者」である場合、参加メンバー全員を返します。
- # ・「生者死者双方に使えるアイテム」との競合回避を図っています。
- #==============================================================================
- class Game_Action
- #--------------------------------------------------------------------------
- # ● 味方に対するターゲット
- #--------------------------------------------------------------------------
- def targets_for_friends
- if item.for_user?
- if item.note =~ /<combi;/ #合体技なら、参加メンバーを返す。
- members = []
- $game_party.members.each { |actor|
- members.push actor if actor.combi_join != nil
- }
- return members
- else
- [subject]
- end
- #以下、「生者死者双方に使えるアイテム」との競合回避。
- elsif item.for_dead_friend?
- if item.for_one?
- if /<生者にも効果>/ =~ item.note
- [friends_unit.smooth_target_all(@target_index)] #生死関わらず。
- else
- [friends_unit.smooth_dead_target(@target_index)]
- end
- else
- if /<生者にも効果>/ =~ item.note
- friends_unit.members #全メンバーを返す。
- else
- friends_unit.dead_members
- end
- end
- elsif item.for_friend?
- if item.for_one?
- [friends_unit.smooth_target(@target_index)]
- else
- friends_unit.alive_members
- end
- end
- end
- end
- #==============================================================================
- # ■ Game_BattlerBase
- #==============================================================================
- class Game_BattlerBase
- #--------------------------------------------------------------------------
- # ● 公開インスタンス変数
- #--------------------------------------------------------------------------
- attr_accessor :combi_join # 合体技発動の時、何番目のスキルを担当するか。
- #0~3の数字が入る。
- #--------------------------------------------------------------------------
- # ● コマンド入力可能判定 ☆再定義
- #--------------------------------------------------------------------------
- def inputable?
- return false if self.combi_join != nil
- normal? && !auto_battle?
- end
- #--------------------------------------------------------------------------
- # ● スキルの使用可能条件チェック
- # 合体技が使用可能かどうかの時に使用する。
- # 通常の使用可非判定と違うのは、スキルの「使用可能時」を無視するということ。
- #--------------------------------------------------------------------------
- def skill_conditions_met_combi?(skill)
- #usable_item_conditions_met?(skill) &&
- movable? &&
- skill_wtype_ok?(skill) && skill_cost_payable?(skill) &&
- !skill_sealed?(skill.id) && !skill_type_sealed?(skill.stype_id)
- end
- end
- #==============================================================================
- # ■ Scene_Title
- #==============================================================================
- class Scene_Title < Scene_Base
- #--------------------------------------------------------------------------
- # ● コマンド : ニューゲーム
- #--------------------------------------------------------------------------
- def command_new_game_combi
- command_new_game_combi_default
- $com = Combination.new
- end
- alias_method :command_new_game_combi_default, :command_new_game
- alias_method :command_new_game, :command_new_game_combi
- end
- #==============================================================================
- # ■ Scene_Load
- #==============================================================================
- class Scene_Load < Scene_File
- #--------------------------------------------------------------------------
- # ● セーブファイル[決定]
- #--------------------------------------------------------------------------
- def on_savefile_ok_combi
- on_savefile_ok_combi_default
- $com = Combination.new
- end
- alias_method :on_savefile_ok_combi_default, :on_savefile_ok
- alias_method :on_savefile_ok, :on_savefile_ok_combi
- end
- #==============================================================================
- # ■ Scene_Battle
- #==============================================================================
- class Scene_Battle < Scene_Base
- attr_reader :combi_skill_win
- #--------------------------------------------------------------------------
- # ● 開始処理
- #--------------------------------------------------------------------------
- def battle_start_combi_scene_battle
- battle_start_combi_scene_battle_default
- #合体技の数値計算
- #p "combi_call_C" #test
- #$combi_skill_works = [] #配列[発動可能な合体技,その構成メンバーID]
- #$combi_skill_works = $com.search_combi_skill
- #start_combi_scene_battle_default
- cancel_combi_join #合体技参加をクリア。
- @combi_skill_win.refresh
- @party_command_window.refresh
- end
- alias :battle_start_combi_scene_battle_default :battle_start
- alias :battle_start :battle_start_combi_scene_battle
- #--------------------------------------------------------------------------
- # ● 合体技参加をクリア。
- #--------------------------------------------------------------------------
- def cancel_combi_join
- for i in 0 ... $game_party.members.size
- $game_party.members[i].combi_join = nil if $game_party.members[i] != nil
- end
- end
- #--------------------------------------------------------------------------
- # ● 終了処理
- #--------------------------------------------------------------------------
- def terminate_combi_scene_battle
- terminate_combi_scene_battle_default
- @combi_skill_win.dispose
- end
- alias :terminate_combi_scene_battle_default :terminate
- alias :terminate :terminate_combi_scene_battle
- #--------------------------------------------------------------------------
- # ● 全ウィンドウの作成
- #--------------------------------------------------------------------------
- def create_all_windows_combi
- create_all_windows_combi_default
- @combi_skill_win = Window_CombinationSkills.new
- @combi_join_win = Window_CombinationJoin.new
- end
- alias :create_all_windows_combi_default :create_all_windows
- alias :create_all_windows :create_all_windows_combi
- #--------------------------------------------------------------------------
- # ● パーティコマンドウィンドウの作成
- #--------------------------------------------------------------------------
- def create_party_command_window_combi
- create_party_command_window_combi_default
- @party_command_window.set_handler(:combiskill, method(:command_combi_skill))
- end
- alias :create_party_command_window_combi_default :create_party_command_window
- alias :create_party_command_window :create_party_command_window_combi
- #--------------------------------------------------------------------------
- # ● 合体技の選択へ。
- #--------------------------------------------------------------------------
- def command_combi_skill
- @combi_skill_win.visible = true
- @combi_skill_win.active = true
- @help_window.visible = true
- @combi_skill_win.help_window = @help_window
- @combi_join_win.help_window = @help_window
- @combi_skill_win.combi_join_win = @combi_join_win
- end
- #--------------------------------------------------------------------------
- # ● 敵キャラ[決定]
- #--------------------------------------------------------------------------
- def on_enemy_ok_combi
- if @combi_join_win.visible
- $main_combi_actor.input.target_index =
- @enemy_window.enemy.index #ターゲット入力
- @enemy_window.hide
- @combi_join_win.visible = false
- next_command
- else
- on_enemy_ok_combi_default
- end
- end
- alias :on_enemy_ok_combi_default :on_enemy_ok
- alias :on_enemy_ok :on_enemy_ok_combi
- #--------------------------------------------------------------------------
- # ● 敵キャラ[キャンセル]
- #--------------------------------------------------------------------------
- def on_enemy_cancel_combi
- if @combi_join_win.visible
- @enemy_window.hide
- @combi_join_win.active = true
- @combi_join_win.z = 100
- else
- on_enemy_cancel_combi_default
- end
- end
- alias :on_enemy_cancel_combi_default :on_enemy_cancel
- alias :on_enemy_cancel :on_enemy_cancel_combi
- #--------------------------------------------------------------------------
- # ● アクター[決定]
- #--------------------------------------------------------------------------
- def on_actor_ok_combi
- if @combi_join_win.visible
- $main_combi_actor.input.target_index =
- @actor_window.index #ターゲット入力
- @actor_window.hide
- @combi_join_win.visible = false
- next_command
- else
- on_actor_ok_combi_default
- end
- end
- alias :on_actor_ok_combi_default :on_actor_ok
- alias :on_actor_ok :on_actor_ok_combi
- #--------------------------------------------------------------------------
- # ● アクター[キャンセル]
- #--------------------------------------------------------------------------
- def on_actor_cancel_combi
- if @combi_join_win.visible
- @actor_window.hide
- @combi_join_win.active = true
- @combi_join_win.z = 100
- else
- on_actor_cancel_combi_default
- end
- end
- alias :on_actor_cancel_combi_default :on_actor_cancel
- alias :on_actor_cancel :on_actor_cancel_combi
- #--------------------------------------------------------------------------
- # ● ターン終了
- #--------------------------------------------------------------------------
- def turn_end_combi
- turn_end_combi_default
- cancel_combi_join #合体技参加フラグをOFF
- #$combi_skill_works = []
- #p "combi_call_A" #test
- #$combi_skill_works = $com.search_combi_skill
- $main_combi_actor = nil
- @combi_skill_win.index = 0 #カーソルを戻す。
- @combi_skill_win.refresh
- end
- alias :turn_end_combi_default :turn_end
- alias :turn_end :turn_end_combi
- #--------------------------------------------------------------------------
- # ● パーティコマンド選択の開始
- #--------------------------------------------------------------------------
- def start_party_command_selection_combi
- cancel_combi_join #合体技参加フラグをOFF
- @combi_join_win.z = 100
- start_party_command_selection_combi_default
- end
- alias :start_party_command_selection_combi_default :start_party_command_selection
- alias :start_party_command_selection :start_party_command_selection_combi
- #--------------------------------------------------------------------------
- # ● スキル/アイテムの使用
- #--------------------------------------------------------------------------
- def use_item_combi
- item = Marshal.load(Marshal.dump(@subject.current_action.item))
- if item.note =~ /<combi;/ and combi_skill_usable? == false
- @subject.current_action.set_skill(Tamura_Combi::UNUSE) #使用不可能
- end
- use_item_combi_default
-
- #合体技のMPを消費する。
- if @subject.actor? and @subject.alive?
- #item = @subject.current_action.item
- if item.note =~ /<combi;/
- for i in 0 ... $game_party.members.size
- actor = $game_party.members[i]
- if actor.combi_join != nil
- part_skill = $data_skills[$combi_need[actor.combi_join]]
- if part_skill != nil
- actor.mp -= actor.skill_mp_cost(part_skill)
- actor.tp -= actor.skill_tp_cost(part_skill)
- end
- end
- end
- end
- else
- #反撃技など。
- end
- end
- alias :use_item_combi_default :use_item
- alias :use_item :use_item_combi
- #--------------------------------------------------------------------------
- # ● 合体技が使用可能であるか。
- # スキルが使用可能か・行動不能か・
- #--------------------------------------------------------------------------
- def combi_skill_usable?
- for i in 0 ... $game_party.members.size
- actor = $game_party.members[i]
- next if actor.combi_join == nil
- part_skill = $data_skills[$combi_need[actor.combi_join]]
- return false if part_skill == nil
- return false unless actor.skill_conditions_met_combi?(part_skill)
- end
- return true
- end
- #--------------------------------------------------------------------------
- # ● ももまる様製作「XPスタイルバトル」競合対策
- #--------------------------------------------------------------------------
- def actor_selection_item
- return @combi_skill_win.skill if @combi_join_win.visible #合体技
- case @actor_command_window.current_symbol
- when :attack ; $data_skills[BattleManager.actor.attack_skill_id]
- when :skill ; @skill
- when :item ; @item
- when :guard ; $data_skills[BattleManager.actor.guard_skill_id]
- else ; nil
- end
- end
- end
- #==============================================================================
- # ■ Window_PartyCommand
- #------------------------------------------------------------------------------
- # バトル画面で、戦うか逃げるかを選択するウィンドウです。
- #==============================================================================
- class Window_PartyCommand < Window_Command
- #--------------------------------------------------------------------------
- # ● コマンドリストの作成
- #--------------------------------------------------------------------------
- def make_command_list_combi
- make_command_list_combi_default
- if $combi_skill_works == [] #使える合体技なし。
- add_command("合体技", :combiskill , false)
- else
- add_command("合体技", :combiskill , true)
- end
- end
- alias :make_command_list_combi_default :make_command_list
- alias :make_command_list :make_command_list_combi
- #--------------------------------------------------------------------------
- # ● コマンドリストの作成
- #--------------------------------------------------------------------------
- def setup_combi
- $combi_skill_works = $com.search_combi_skill
- setup_combi_default
- end
- alias :setup_combi_default :setup
- alias :setup :setup_combi
- end
- #==============================================================================
- # ■ Window_CombinationSkills
- #------------------------------------------------------------------------------
- # 合体技を選択するウィンドウです。
- #==============================================================================
- class Window_CombinationSkills < Window_Selectable
- #--------------------------------------------------------------------------
- # ● オブジェクト初期化
- # x : ウィンドウの X 座標
- # y : ウィンドウの Y 座標
- # width : ウィンドウの幅
- # height : ウィンドウの高さ
- # actor : アクター
- #--------------------------------------------------------------------------
- def initialize
- super(0, 72, 544, 344)
- @index = 0
- @combi_join_win = nil
- self.visible = false
- self.active = false
- self.set_handler(:ok, method(:on_combi_skill_ok))
- self.set_handler(:cancel, method(:on_combi_skill_cancel))
- refresh
- end
- #--------------------------------------------------------------------------
- # ● 桁数の取得
- #--------------------------------------------------------------------------
- def col_max
- return 2
- end
- #--------------------------------------------------------------------------
- # ● 項目数の取得
- #--------------------------------------------------------------------------
- def item_max
- @data ? @data.size : 1
- end
- #--------------------------------------------------------------------------
- # ● スキルの取得
- #--------------------------------------------------------------------------
- def skill
- return @data[self.index]
- end
- #--------------------------------------------------------------------------
- # ● リフレッシュ
- #--------------------------------------------------------------------------
- def refresh
- if $combi_skill_works != nil
- @data = []
- still = []
- for i in 0 ... $combi_skill_works.size
- skill_id = $combi_skill_works[i][0]
- skill=$data_skills[skill_id]
- next if still.include?(skill.id)
- @data.push(skill)
- still.push(skill.id)
- end
- @item_max = @data.size
- create_contents
- for i in 0...@item_max
- draw_item(i)
- end
- end
- update_help
- end
- #--------------------------------------------------------------------------
- # ● 項目の描画
- # index : 項目番号
- #--------------------------------------------------------------------------
- def draw_item(index)
- rect = item_rect(index)
- self.contents.clear_rect(rect)
- skill = @data[index]
- if skill != nil
- rect.width -= 4
- draw_item_name(skill, rect.x, rect.y, true)
- end
- end
- #--------------------------------------------------------------------------
- # ● ヘルプテキスト更新
- #--------------------------------------------------------------------------
- def update_help
- @help_window.set_item(skill) if @help_window != nil
- end
- #--------------------------------------------------------------------------
- # ● 参加メンバー決定ウィンドウに選択したスキルを受け渡す時に使用。
- #--------------------------------------------------------------------------
- def combi_join_win=(combi_join_win)
- @combi_join_win = combi_join_win
- end
- #--------------------------------------------------------------------------
- # ● [決定]
- #--------------------------------------------------------------------------
- def on_combi_skill_ok
- @combi_join_win.index = @index
- @combi_join_win.active = true
- @combi_join_win.visible = true
- self.active = false
- self.visible = false
- @combi_join_win.skill = skill
- @combi_join_win.prepare
- @combi_join_win.combi_skill_win = self
- @help_window.visible = false
- end
- #--------------------------------------------------------------------------
- # ● [キャンセル]
- #--------------------------------------------------------------------------
- def on_combi_skill_cancel
- self.active =false
- self.visible =false
- @help_window.visible = false
- SceneManager.scene.start_party_command_selection
- end
- end
- #==============================================================================
- # ■ Window_CombinationJoin
- #------------------------------------------------------------------------------
- # 合体技に参加するメンバーを決定するウィンドウです。
- #==============================================================================
- class Window_CombinationJoin < Window_Base
- attr_accessor :pattern
- attr_accessor :combi_main_actor #統括者
- #--------------------------------------------------------------------------
- # ● オブジェクト初期化
- # x : ウィンドウの X 座標
- # y : ウィンドウの Y 座標
- # width : ウィンドウの幅
- # height : ウィンドウの高さ
- # actor : アクター
- #--------------------------------------------------------------------------
- def initialize
- super(0, 0, 544, 384)
- [url=home.php?mod=space&uid=260100]@skill[/url] = nil #合体技スキル
- @index = 0 #合体技ウィンドウのindex
- @pattern = 0 #参加メンバーのパターン
- @combi_main_actor = nil #統括者(参加メンバーの一番目のアク ^ー)。
- self.z = 100
- self.visible = false
- self.active = false
- end
- #--------------------------------------------------------------------------
- # ● 合体技ウィンドウのindexを入力
- #--------------------------------------------------------------------------
- def index=(index)
- @index = index
- end
- #--------------------------------------------------------------------------
- # ● スキルを入力
- #--------------------------------------------------------------------------
- def skill=(skill)
- @skill = skill
- end
- #--------------------------------------------------------------------------
- # ● 合体技ウィンドウ。こちらから操作するために受け取る。
- #--------------------------------------------------------------------------
- def combi_skill_win=(combi_skill_win)
- @combi_skill_win = combi_skill_win
- end
- #--------------------------------------------------------------------------
- # ● 合体技ウィンドウ。こちらから操作するために受け取る。
- #--------------------------------------------------------------------------
- def help_window=(help_window)
- @help_window = help_window
- end
- #--------------------------------------------------------------------------
- # ● 準備
- #--------------------------------------------------------------------------
- def prepare
- #$combi_need = $com.need_skills(@skill) #合体技に必要なスキルのID
- skill_id = @skill.id
- $combi_patterns = []
- $combi_skill_works.each do |combi_skill|
- if combi_skill[0] == skill_id
- $combi_patterns.push combi_skill
- end
- end
- #p $combi_patterns #test
- @big_pattern = 0
- $combi_need = Marshal.load(Marshal.dump($combi_patterns[@big_pattern][2]))
- refresh
- end
- #--------------------------------------------------------------------------
- # ● リフレッシュ
- #--------------------------------------------------------------------------
- def refresh
- skill_id = $combi_patterns[@big_pattern][0]
- @pattern = 0 if $combi_patterns[@big_pattern][1][@pattern] == nil
- @join_pattern = Marshal.load(Marshal.dump($combi_patterns[@big_pattern][1][@pattern]))
- $combi_need = Marshal.load(Marshal.dump($combi_patterns[@big_pattern][2]))
- create_contents
- draw_item_name(@skill, 0, 0, true)
- self.contents.draw_text(220, 0*24, 270, line_height, "に参加するメンバーを選んでください。", 0)
- draw_item_name(@skill, 0, 1*24, true)
- self.contents.draw_text(220, 1*24, 270, line_height, "は以下の技の合体技です。", 0)
- self.contents.draw_text(0, 3*24, 100, line_height, "スキル名", 0)
- self.contents.draw_text(200, 3*24, 100, line_height, "MP", 0)
- self.contents.draw_text(290, 3*24, 100, line_height, "使用者", 0)
-
- for i in 0 ... $combi_need.size
- #p $combi_need #test
- part_skill=$data_skills[$combi_need[i]]
- draw_item_name(part_skill,0 , (i+4)*24, true)
- actor = $game_party.members[@join_pattern[i]]
- draw_actor_name(actor, 290, (i+4)*24)
- #統括者の取得。
- @main_combi_actor = actor if i == 0
- if part_skill != nil
- if actor.skill_mp_cost(part_skill) >0 #MPコストを表示する
- self.contents.draw_text(200, (i+4)*24, 100, line_height , actor.skill_mp_cost(part_skill), 0)
- elsif actor.skill_tp_cost(part_skill) > 0 #TPコスト表示
- str = "TP" + actor.skill_tp_cost(part_skill).to_s
- self.contents.draw_text(200, (i+4)*24, 100, line_height , str, 0)
- end
- end
- end
- self.contents.draw_text(0, ($combi_need.size + 5)*24, 270, line_height, "←→:参加メンバーの変更", 0)
- self.contents.draw_text(0, ($combi_need.size + 6)*24, 270, line_height, "決定:このメンバーで使用する。", 0)
- self.contents.draw_text(0, ($combi_need.size + 7)*24, 270, line_height, "キャンセル:合体技の選択に戻る", 0)
- #@join_pattern = Marshal.load(Marshal.dump($combi_skill_works[@index][1][@pattern]))
- end
- #--------------------------------------------------------------------------
- # ● 項目の描画
- # index : 項目番号
- #--------------------------------------------------------------------------
- def draw_item(index)
- rect = item_rect(index)
- self.contents.clear_rect(rect)
- if skill != nil
- rect.width -= 4
- draw_item_name(skill, rect.x, rect.y, true)
- end
- end
- #--------------------------------------------------------------------------
- # ● 更新
- #--------------------------------------------------------------------------
- def update
- super
- if self.active
- on_combi_join_ok if (Input.trigger?(:C))
- on_combi_join_cancel if (Input.trigger?(:B))
- on_combi_join_right if Input.repeat?(:RIGHT) #(Input.trigger?(:RIGHT))
- on_combi_join_left if Input.repeat?(:LEFT) #(Input.trigger?(:LEFT))
- end
- end
- #--------------------------------------------------------------------------
- # ● [決定]
- #--------------------------------------------------------------------------
- def on_combi_join_ok
- $main_combi_actor = @main_combi_actor
- $main_combi_actor.input.set_skill(@skill.id) #統括者にスキル入力。
- $main_combi_actor.last_skill.object = @skill
- decision_join_member #combi_join入力
- self.z = 10
- self.active = false
- #self.visible = false #ここではまだ表示し、表示をフラグとして扱う。
- #必要であればターゲット選択へ。
- if [email protected]_selection?
- self.visible = false
- SceneManager.scene.next_command
- elsif @skill.for_opponent?
- SceneManager.scene.select_enemy_selection
- else
- SceneManager.scene.select_actor_selection
- end
- end
- #--------------------------------------------------------------------------
- # ● [キャンセル]
- #--------------------------------------------------------------------------
- def on_combi_join_cancel
- @combi_skill_win.active = true
- @combi_skill_win.visible = true
- @help_window.visible = true
- self.active =false
- self.visible =false
- end
- #--------------------------------------------------------------------------
- # ● [右] パターン+1
- #--------------------------------------------------------------------------
- def on_combi_join_right
- self.pattern += 1
- #if self.pattern == $combi_skill_works[@index][1].size
- if self.pattern == $combi_patterns[@big_pattern][1].size
- self.pattern = 0
- @big_pattern += 1
- if @big_pattern == $combi_patterns.size
- @big_pattern = 0
- end
- end
- self.refresh
- end
- #--------------------------------------------------------------------------
- # ● [左] パターン-1
- #--------------------------------------------------------------------------
- def on_combi_join_left
- self.pattern -= 1
- if self.pattern < 0
- @big_pattern -= 1
- if @big_pattern < 0
- @big_pattern = $combi_patterns.size - 1
- end
- self.pattern = $combi_patterns[@big_pattern][1].size - 1
- end
- self.refresh
- end
- #--------------------------------------------------------------------------
- # ● 参加メンバー決定ウィンドウで使用。参加メンバーを決定し、combi_join入力。
- #--------------------------------------------------------------------------
- def decision_join_member
- cancel_combi_join
- $main_combi_actor = @main_combi_actor
- #p "C" #test
- #p @join_pattern #test
- for j in 0 ... @join_pattern.size
- $game_party.members[@join_pattern[j]].combi_join = j
- end
- end
- #--------------------------------------------------------------------------
- # ● 合体技参加をクリア。
- #--------------------------------------------------------------------------
- def cancel_combi_join
- #p "B" #test
- #p @join_pattern #test
- for i in 0 ... $game_party.members.size
- $game_party.members[i].combi_join = nil if $game_party.members[i] != nil
- end
- $main_combi_actor = nil
- end
- #--------------------------------------------------------------------------
- # ● ヘルプテキスト更新
- #--------------------------------------------------------------------------
- def update_help
- @help_window.set_text(skill == nil ? "" : skill.description)
- end
- end
- #==============================================================================
- # ■ Combination
- #------------------------------------------------------------------------------
- # 合体技が発動可能かを調べる。
- #
- # actor_works : [ [[分担パターン1],[分担パターン2],……], [スキル②のパターン達],……]
- #==============================================================================
- #total_skill_arr[0] : 合体技スキルのID
- #total_skill_arr[1] : 合体技の参加パターン
- #total_skill_arr[2] : 合体技の構成スキルIDの配列
- class Combination
- #すべてのスキルを調べ、合体技を抜き出す。
- def search_combi_skill
- total_skill_arr=[]
- actor_works = []
- for i in 1 ... $data_skills.size
- need = []
- need = need_skills($data_skills[i])
- if need != []
- #p $data_skills[i].name #test
- need.each do |n|
- skill_arr=[]
- skill_arr.push i
- actor_works = combination_usable?(n)
- #p actor_works #test
- if actor_works != []
- skill_arr.push actor_works
- skill_arr.push n
- total_skill_arr.push skill_arr
- end
- #p skill_arr #test
- end
- end
- end
- #p create_party_skills #test
- #p total_skill_arr #test
- return total_skill_arr
- end
-
- #スキルIDを受け取り、合体技に必要なIDを調べてneed配列を返す。
- #なお、合体技でない場合は空の配列を返す。
- def need_skills(skill)
- return false if skill.id == nil
- note = skill.note
- if /<combi;/ =~ note
- str1 = note.scan(/<combi(\S+)>/)
- need = []
- str1.each do |s|
- #p s #test
- need_one = []
- str2 = s[0].scan(/;(\d+)/)
- for str in str2
- need_one.push str[0].to_i
- end
- need.push need_one
- end
- #p need #test
- return need
- end
- return []
- end
-
-
- #使用可能なスキルIDの配列を作る。
- # [[1],[2,3],[]] で、一人目がスキル1番、二人目がスキル2,3番習得。
- # 3人目 ヘ行動不能か、スキル無し。
- def create_party_skills
- party_skills = []
- for actor in $game_party.members
- ini_skills_id = []
- unless actor.movable?
- party_skills.push []
- next
- end
- for i in 0 ... actor.skills.size
- skill = $data_skills[actor.skills[i].id]
- next unless actor.skill_conditions_met_combi?(skill)
- #if skill.mp_cost > actor.mp
- # next
- #elsif skill.tp_cost > actor.tp
- # next
- #end
- ini_skills_id.push skill.id
- end
- party_skills.push ini_skills_id
- end
- return party_skills
- end
-
- #もし、合体技の構成スキル3番を、1番目のアクターが、担当できるのなら、
- #[X,X,1]といったような配列を作る。これをパターンの数だけ作る。すなわち
- #[[1,3,2],[3,2,1],[3,4,1]]のような配列を最終的に作る。
- def combination_usable?(need)
- @need = need #必要スキルのIDの配列。
- @actor_works = []
- [url=home.php?mod=space&uid=95897]@actor[/url] = []
- @party_skills = create_party_skills
-
- #まず、全ての習得パターンを書き出す。
- @pre_actor_works = [] #途中経過を記録する配列。
- @new_actor_works = [] #そのさらに途中経過を一時保管。
- return [] if @party_skills.size < @need.size #人数不足。
-
- for i in 0 ... @need.size
- if i == 0
- for j in 0 ... @party_skills.size
- if @party_skills[j].include?(@need[i])
- @pre_actor_works.push [j]
- end
- end
- else
- @new_actor_works = []
- for k in 0 ... @pre_actor_works.size
- for j in 0 ... @party_skills.size #パーティを一人ずつ調べる。
- next if @pre_actor_works[k].include?(j)
- if @party_skills[j].include?(@need[i])
- #p k.to_s + "" + j.to_s if i == 3
- now_research_arr = Marshal.load(Marshal.dump(@pre_actor_works[k]))
- now_research_arr.push j
- @new_actor_works.push now_research_arr
- end
- end
- end
- @pre_actor_works = Marshal.load(Marshal.dump(@new_actor_works))
- end
- end
- return @pre_actor_works
- end
-
- end
- #=end
复制代码 来源,不记得了。 |
|