=begin ▼ キャラクターメイク メインスクリプト ver. 2.2 RPGツクールVXAce用スクリプト 制作 : 木星ペンギン URL : http://woodpenguin.blog.fc2.com/ #////////////////////////////////////////////////////////////////////////////// # # 設定項目なし # #////////////////////////////////////////////////////////////////////////////// ===メモ=== Window_WTCM_MakeCommand : 画面左に表示されるコマンド一覧 Window_WTCM_GenderCommand : 性別選択 Window_WTCM_MakeStatus : 画面右側に表示される設定内容一覧 Window_WTCM_EditCategory : キャラクター生成時に表示されるカテゴリ一覧 Window_WTCM_EditList : キャラクター生成時に表示されるパーツリスト Window_WTCM_EditItem : Window_WTCM_EditList内で使われる各項目 Window_WTCM_CharGraphic : キャラクター生成時に表示される4方向キャラグラ Window_WTCM_FaceList : 顔グラ選択ウィンドウ Window_WTCM_NickNameList : 二つ名選択ウィンドウ Window_WTCM_ClassList : 職業選択ウィンドウ Window_WTCM_ClassStatus : 職業選択時に表示されるステータス一覧 Window_WTCM_WeaponList : 武器選択ウィンドウ Window_WTCM_Skill1List : スキル1選択ウィンドウ Window_WTCM_Skill2List : スキル2選択ウィンドウ Window_WTCM_Confirm : 最終確認ウィンドウ =end module WdTk::CharMake #-------------------------------------------------------------------------- # ● キャラクター生成のビットマップを作成 #-------------------------------------------------------------------------- def self.create_bitmap(edit_data) bitmap = Bitmap.new(96, 128) rect = bitmap.rect parts_count = Hash.new(0) list = PARTS_LIST[edit_data[:gender]] folder = FOLDER_NAME[edit_data[:gender]] LAYER.each do |parts_symbol| number, index = PARTS_DATA[parts_symbol] next if number && edit_data[number].nil? if parts_symbol == :Cloth && parts_count[parts_symbol] == 1 next if edit_data[:skin_index].nil? || edit_data[:skin_index] == 0 rect.x = (edit_data[:skin_index] - 1) * rect.width else rect.x = (edit_data[index] || 0) * rect.width end rect.y = parts_count[parts_symbol] * rect.height name = "" name << folder if GENDER_PARTS.include?(parts) name << parts_symbol.to_s name << sprintf("%02d", edit_data[number]) if number mini_bitmap = Cache.mini(name) bitmap.blt(0, 0, mini_bitmap, rect) parts_count[parts_symbol] += 1 end bitmap end end #////////////////////////////////////////////////////////////////////////////// # # ▼ VX Ace データ構造 # #////////////////////////////////////////////////////////////////////////////// #============================================================================== # ■ RPG::BaseItem #============================================================================== class RPG::BaseItem def edit_data unless @_edit_data @_edit_data = {} @note.scan(//) do |st, i, t| *, number, index = WdTk::CharMake::PARTS_DATA[st.to_sym] next unless index @_edit_data[number] = i.to_i if number case index when :hair_index, :skin_index, :eyes_index @_edit_data[index] = t.to_i unless number else @_edit_data[index] = t.to_i end end end @_edit_data end end #============================================================================== # ■ RPG::Actor #============================================================================== class RPG::Actor def gender @note =~ /<性別\s*:\s*(\d)\s*>/ ? $1.to_i : nil end end #////////////////////////////////////////////////////////////////////////////// # # ▼ モジュール # #////////////////////////////////////////////////////////////////////////////// #============================================================================== # ■ Cache #============================================================================== module Cache FOLDER_MINI = "Graphics/Mini/" #-------------------------------------------------------------------------- # ● キャラクター生成 グラフィックの取得 #-------------------------------------------------------------------------- def self.mini(filename) begin load_bitmap(FOLDER_MINI, filename) rescue unless filename =~ /00$/ p FOLDER_MINI + filename + " が見つかりませんでした。" end empty_bitmap end end end #////////////////////////////////////////////////////////////////////////////// # # ▼ ゲームオブジェクト # #////////////////////////////////////////////////////////////////////////////// #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor #-------------------------------------------------------------------------- # ◯ セットアップ #-------------------------------------------------------------------------- alias _wdtk_charedit_setup setup def setup(actor_id) _wdtk_charedit_setup(actor_id) @edit_data = actor.edit_data @edit_data[:gender] = actor.gender unless @edit_data.empty? end #-------------------------------------------------------------------------- # ◯ 装備の変更 #-------------------------------------------------------------------------- alias _wdtk_charedit_change_equip change_equip def change_equip(slot_id, item) _wdtk_charedit_change_equip(slot_id, item) $game_player.refresh end #-------------------------------------------------------------------------- # ◯ 装備の強制変更 #-------------------------------------------------------------------------- alias _wdtk_charedit_force_change_equip force_change_equip def force_change_equip(slot_id, item) _wdtk_charedit_force_change_equip(slot_id, item) $game_player.refresh end #-------------------------------------------------------------------------- # ● 性別の取得 #-------------------------------------------------------------------------- def gender @edit_data[:gender] end #-------------------------------------------------------------------------- # ● キャラクター生成 データの取得 #-------------------------------------------------------------------------- def edit_data return nil if @edit_data.empty? || !@edit_data.include?(:gender) data = @edit_data.dup equips.each {|item| data.merge!(item.edit_data) if item } data end #-------------------------------------------------------------------------- # ● 顔グラフィックの変更 #-------------------------------------------------------------------------- def set_face(face_name, face_index) @face_name = face_name @face_index = face_index end #-------------------------------------------------------------------------- # ● 職業の強制変更 #-------------------------------------------------------------------------- def force_change_class(class_id) @exp.clear if WdTk::CharMake::DELETE_EXP @class_id = class_id init_exp release_unequippable_items(false) end #-------------------------------------------------------------------------- # ● 装備品の変更(テスト) #-------------------------------------------------------------------------- def test_equips(equips) equips.each_with_index do |item_id, i| @equips[i].set_equip(index_to_etype_id(i) == 0, item_id) if item_id end release_unequippable_items(false) refresh end end #============================================================================== # ■ Game_Party #============================================================================== class Game_Party #-------------------------------------------------------------------------- # ☆ セーブファイル表示用のキャラクター画像情報 #-------------------------------------------------------------------------- def characters_for_savefile battle_members.collect do |actor| [actor.character_name, actor.character_index, actor.edit_data] end end end #============================================================================== # ■ Game_CharacterBase #============================================================================== class Game_CharacterBase #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :edit_data end #============================================================================== # ■ Game_Player #============================================================================== class Game_Player #-------------------------------------------------------------------------- # ◯ リフレッシュ #-------------------------------------------------------------------------- alias _wdtk_charedit_refresh refresh def refresh _wdtk_charedit_refresh @edit_data = actor ? actor.edit_data : nil end end #============================================================================== # ■ Game_Follower #============================================================================== class Game_Follower #-------------------------------------------------------------------------- # ◯ リフレッシュ #-------------------------------------------------------------------------- alias _wdtk_charedit_refresh refresh def refresh _wdtk_charedit_refresh @edit_data = visible? ? actor.edit_data : nil end end #============================================================================== # ■ Game_EditCharacter #============================================================================== class Game_EditCharacter < Game_CharacterBase #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :screen_x attr_accessor :screen_y attr_accessor :stop_turn #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(actor) super() @actor = actor @move_speed = -3 @step_anime = true @screen_x = @screen_y = 0 refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh @character_name = @actor.character_name @character_index = @actor.character_index end #-------------------------------------------------------------------------- # ● 停止時の更新 #-------------------------------------------------------------------------- def update_stop super if @stop_turn && @anime_count == 0 && @pattern == @original_pattern case @direction when 2; @direction = 4 when 4; @direction = 8 when 6; @direction = 2 when 8; @direction = 6 end end end #-------------------------------------------------------------------------- # ● 画面 Z 座標の取得 #-------------------------------------------------------------------------- def screen_z 110 end #-------------------------------------------------------------------------- # ● キャラクター生成 データの取得 #-------------------------------------------------------------------------- def edit_data @actor.edit_data end #-------------------------------------------------------------------------- # ● キャラクター生成 データの設定 #-------------------------------------------------------------------------- def edit_data=(data) @edit_data = data end end #////////////////////////////////////////////////////////////////////////////// # # ▼ スプライト # #////////////////////////////////////////////////////////////////////////////// #============================================================================== # ■ Sprite_Character #============================================================================== class Sprite_Character #-------------------------------------------------------------------------- # ◯ 転送元ビットマップの更新 #-------------------------------------------------------------------------- alias _wdtk_charedit_update_bitmap update_bitmap def update_bitmap _wdtk_charedit_update_bitmap if @edit_data != @character.edit_data @edit_data = @character.edit_data set_edit_character_bitmap if @edit_data && @edit_data.include?(:gender) end end #-------------------------------------------------------------------------- # ● キャラクター生成のビットマップを設定 #-------------------------------------------------------------------------- def set_edit_character_bitmap self.bitmap = Bitmap.new(96, 128) rect = bitmap.rect parts_count = Hash.new(0) list = WdTk::CharMake::PARTS_LIST[@edit_data[:gender]] folder = WdTk::CharMake::FOLDER_NAME[@edit_data[:gender]] WdTk::CharMake::LAYER.each do |parts| number, index = WdTk::CharMake::PARTS_DATA[parts] next if number && @edit_data[number].nil? if parts == :Cloth && parts_count[parts] == 1 next if @edit_data[:skin_index].nil? || @edit_data[:skin_index] == 0 rect.x = (@edit_data[:skin_index] - 1) * rect.width else rect.x = (@edit_data[index] || 0) * rect.width end rect.y = parts_count[parts] * rect.height name = "" name << folder if WdTk::CharMake::GENDER_PARTS.include?(parts) name << parts.to_s name << sprintf("%02d", @edit_data[number]) if number mini_bitmap = Cache.mini(name) self.bitmap.blt(0, 0, mini_bitmap, rect) parts_count[parts] += 1 end @cw = bitmap.width / 3 @ch = bitmap.height / 4 self.ox = @cw / 2 self.oy = @ch end #-------------------------------------------------------------------------- # ◯ 転送元矩形の更新 #-------------------------------------------------------------------------- alias _wdtk_charedit_update_src_rect update_src_rect def update_src_rect if @edit_data pattern = @character.pattern < 3 ? @character.pattern : 1 sx = pattern * @cw sy = (@character.direction - 2) / 2 * @ch self.src_rect.set(sx, sy, @cw, @ch) else _wdtk_charedit_update_src_rect end end end #////////////////////////////////////////////////////////////////////////////// # # ▼ ウィンドウ # #////////////////////////////////////////////////////////////////////////////// #============================================================================== # ■ Window_Base #============================================================================== class Window_Base < Window #-------------------------------------------------------------------------- # ◯ アクターの歩行グラフィック描画 #-------------------------------------------------------------------------- alias _wdtk_charedit_draw_actor_graphic draw_actor_graphic def draw_actor_graphic(actor, x, y) if actor.edit_data draw_edit_graphic(actor.edit_data, x, y) else _wdtk_charedit_draw_actor_graphic(actor, x, y) end end #-------------------------------------------------------------------------- # ● キャラクター生成グラフィックの描画 #-------------------------------------------------------------------------- def draw_edit_graphic(edit_data, x, y) rect = Rect.new(0, 0, 32, 32) parts_count = Hash.new(0) list = WdTk::CharMake::PARTS_LIST[edit_data[:gender]] folder = WdTk::CharMake::FOLDER_NAME[edit_data[:gender]] WdTk::CharMake::LAYER.each do |parts| number, index = WdTk::CharMake::PARTS_DATA[parts] next if number && edit_data[number].nil? if parts == :Cloth && parts_count[parts] == 1 next if edit_data[:skin_index].nil? || edit_data[:skin_index] == 0 rect.x = (edit_data[:skin_index] - 1) * 3 * 32 + 32 else rect.x = (edit_data[index] || 0) * 3 * 32 + 32 end rect.y = parts_count[parts] * 4 * 32 name = "" name << folder if WdTk::CharMake::GENDER_PARTS.include?(parts) name << parts.to_s name << sprintf("%02d", edit_data[number]) if number mini_bitmap = Cache.mini(name) contents.blt(x - 16, y - 32, mini_bitmap, rect) parts_count[parts] += 1 end end end #============================================================================== # ■ Window_SaveFile #============================================================================== class Window_SaveFile < Window_Base #-------------------------------------------------------------------------- # ☆ パーティキャラの描画 #-------------------------------------------------------------------------- def draw_party_characters(x, y) header = DataManager.load_header(@file_index) return unless header header[:characters].each_with_index do |data, i| if data[2] draw_edit_graphic(data[2], x + i * 48, y) else draw_character(data[0], data[1], x + i * 48, y) end end end end #============================================================================== # ■ Window_WTCM_MakeCommand #============================================================================== class Window_WTCM_MakeCommand < Window_Command #-------------------------------------------------------------------------- # ● コマンド選択位置の初期化(クラスメソッド) #-------------------------------------------------------------------------- def self.init_command_position @@last_command_symbol = nil end #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 0) select_last end #-------------------------------------------------------------------------- # ● コマンドリストの作成 #-------------------------------------------------------------------------- def make_command_list WdTk::CharMake::COMMAND.each do |sym| add_command(WdTk::CharMake::NAME[sym], sym) end end #-------------------------------------------------------------------------- # ● 決定ボタンが押されたときの処理 #-------------------------------------------------------------------------- def process_ok @@last_command_symbol = current_symbol super end #-------------------------------------------------------------------------- # ● 前回の選択位置を復帰 #-------------------------------------------------------------------------- def select_last select_symbol(@@last_command_symbol) end end #============================================================================== # ■ Window_WTCM_GenderCommand #============================================================================== class Window_WTCM_GenderCommand < Window_HorzCommand #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(y) x = (Graphics.width - window_width) / 2 super(x, y) self.openness = 0 deactivate end #-------------------------------------------------------------------------- # ● ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width Graphics.width - 160 end #-------------------------------------------------------------------------- # ● 桁数の取得 #-------------------------------------------------------------------------- def col_max item_max end #-------------------------------------------------------------------------- # ● コマンドリストの作成 #-------------------------------------------------------------------------- def make_command_list WdTk::CharMake::GENDER_TYPE.each {|text| add_command(text, :ok) } end end #============================================================================== # ■ Window_WTCM_MakeStatus #============================================================================== class Window_WTCM_MakeStatus < Window_Base #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :edit_skills #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(x, y) super(x, y, window_width, fitting_height(visible_line_number)) @actor = nil end #-------------------------------------------------------------------------- # ● ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width Graphics.width - 160 end #-------------------------------------------------------------------------- # ● 表示行数の取得 #-------------------------------------------------------------------------- def visible_line_number n = WdTk::CharMake::COMMAND.inject(0) do |r, symbol| case symbol when :edit, :face, :ok r when :skill1 r + WdTk::CharMake::SKILL1_NUMBER when :skill2 r + WdTk::CharMake::SKILL2_NUMBER else r + 1 end end [n, WdTk::CharMake::COMMAND.include?(:face) ? 7 : 4].max end #-------------------------------------------------------------------------- # ● アクターの設定 #-------------------------------------------------------------------------- def actor=(actor) return if @actor == actor @actor = actor refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh contents.clear return unless @actor draw_actor_face(@actor, 0, 72) if WdTk::CharMake::COMMAND.include?(:face) draw_actor_edit_status(@actor, 108, 0) end #-------------------------------------------------------------------------- # ● エディット用ステータスの描画 #-------------------------------------------------------------------------- def draw_actor_edit_status(actor, x, y) WdTk::CharMake::COMMAND.each do |symbol| case symbol when :edit, :face, :ok next when :skill1, :skill2 change_color(system_color) draw_text(x, y, 88, line_height, WdTk::CharMake::NAME[symbol]) if symbol == :skill1 n = WdTk::CharMake::SKILL1_NUMBER else n = WdTk::CharMake::SKILL2_NUMBER end skills = @edit_skills ? @edit_skills[symbol] || [] : [] n.times do |i| if skills[i] draw_item_name($data_skills[skills[i]], x + 88, y) else change_color(normal_color) draw_text(x + 112, y, 172, line_height, "--------") end y += line_height end when :weapon change_color(system_color) draw_text(x, y, 88, line_height, WdTk::CharMake::NAME[symbol]) item = @actor.weapons[0] case WdTk::CharMake::WEAPON_DISPLAY when 0 draw_item_name(item, x + 88, y) when 1 draw_icon(item.icon_index, x + 88, y) change_color(normal_color) name = $data_system.weapon_types[item.wtype_id] draw_text(x + 112, y, 172, line_height, name) end y += line_height else change_color(system_color) draw_text(x, y, 88, line_height, WdTk::CharMake::NAME[symbol]) send("draw_actor_#{symbol}", actor, x + 88, y) y += line_height end end end #-------------------------------------------------------------------------- # ● 性別の描画 #-------------------------------------------------------------------------- def draw_actor_gender(actor, x, y, width = 124) return unless actor.gender change_color(normal_color) text = WdTk::CharMake::GENDER_TYPE[actor.gender] draw_text(x, y, width, line_height, text) end end #============================================================================== # ■ Window_WTCM_EditCategory #============================================================================== class Window_WTCM_EditCategory < Window_HorzCommand #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :edit_window #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(*) super self.openness = 0 deactivate end #-------------------------------------------------------------------------- # ● ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width Graphics.width - 160 end #-------------------------------------------------------------------------- # ● 桁数の取得 #-------------------------------------------------------------------------- def col_max WdTk::CharMake::CATEGORY.size end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super if @edit_window && current_symbol != :randam && current_symbol != :default @edit_window.category = current_symbol end end #-------------------------------------------------------------------------- # ● コマンドリストの作成 #-------------------------------------------------------------------------- def make_command_list WdTk::CharMake::CATEGORY.each do |sym| add_command(WdTk::CharMake::NAME[sym], sym) end end #-------------------------------------------------------------------------- # ● キャラクター生成 ウィンドウの設定 #-------------------------------------------------------------------------- def edit_window=(edit_window) @edit_window = edit_window update end #-------------------------------------------------------------------------- # ● ヘルプウィンドウの更新 #-------------------------------------------------------------------------- def update_help if current_symbol == :randam @help_window.set_text(WdTk::CharMake::EDIT_HELP1) elsif current_symbol == :default @help_window.set_text(WdTk::CharMake::EDIT_HELP2) else @help_window.clear end end end #============================================================================== # ■ Window_WTCM_EditList #============================================================================== class Window_WTCM_EditList < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(x, y) @windows = [] @data = [] @heading = [] @fix_data = [] super(x, y, window_width, fitting_height(0)) self.openness = 0 @last_index = {} end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose @windows.each {|window| window.dispose } super end #-------------------------------------------------------------------------- # ● ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width Graphics.width - 160 end #-------------------------------------------------------------------------- # ● 可視状態の設定 #-------------------------------------------------------------------------- def visible=(*) super update_windows end #-------------------------------------------------------------------------- # ● オープン度の設定 #-------------------------------------------------------------------------- def openness=(*) super update_windows end #-------------------------------------------------------------------------- # ● アクティブ状態の設定 #-------------------------------------------------------------------------- def active=(*) super update_cursor end #-------------------------------------------------------------------------- # ● ウィンドウ内容の高さを計算 #-------------------------------------------------------------------------- def contents_height item_max * item_height end #-------------------------------------------------------------------------- # ● ウィンドウ内容の作成 #-------------------------------------------------------------------------- def create_contents super while @windows.size < @data.size @windows << Window_WTCM_EditItem.new(self, @windows.size) end end #-------------------------------------------------------------------------- # ● カテゴリの設定 #-------------------------------------------------------------------------- def category=(category) return if @category == category @category = category refresh end #-------------------------------------------------------------------------- # ● キャラクター生成 データの設定 #-------------------------------------------------------------------------- def edit_data=(edit_data) return if @edit_data == edit_data @edit_data = edit_data refresh end #-------------------------------------------------------------------------- # ● 固定されているかどうか #-------------------------------------------------------------------------- def fix?(symbol) @fix_data.include?(symbol) end #-------------------------------------------------------------------------- # ● 項目数の取得 #-------------------------------------------------------------------------- def item_max @data ? @data.size : 1 end #-------------------------------------------------------------------------- # ● アイテムの取得 #-------------------------------------------------------------------------- def item @data && index >= 0 ? @data[index] : nil end #-------------------------------------------------------------------------- # ● カーソルを右に移動 #-------------------------------------------------------------------------- def cursor_right(*) end #-------------------------------------------------------------------------- # ● カーソルを左に移動 #-------------------------------------------------------------------------- def cursor_left(*) end #-------------------------------------------------------------------------- # ● 左ボタンが押されたときの処理 #-------------------------------------------------------------------------- def process_left return unless enable?(item) window = @windows[index] return unless item && window.index > 0 Sound.play_cursor Input.update window.index -= 1 if window.item.is_a?(Color) @edit_data[item] = window.index else @edit_data[item] = window.item end end #-------------------------------------------------------------------------- # ● 右ボタンが押されたときの処理 #-------------------------------------------------------------------------- def process_right return unless enable?(item) window = @windows[index] list = WdTk::CharMake::PARTS_LIST[@edit_data[:gender]][item] return unless item && window.index < list.size - 1 Sound.play_cursor Input.update window.index += 1 if window.item.is_a?(Color) @edit_data[item] = window.index else @edit_data[item] = window.item end end #-------------------------------------------------------------------------- # ● シフトボタンが押されたときの処理 #-------------------------------------------------------------------------- def process_shift return unless enable?(item) Sound.play_ok Input.update if fix?(@data[index]) @fix_data.delete(@data[index]) else @fix_data << @data[index] end redraw_item(index) end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super @windows.each {|window| window.update } end #-------------------------------------------------------------------------- # ● 決定やキャンセルなどのハンドリング処理 #-------------------------------------------------------------------------- def process_handling return unless open? && active return process_ok if ok_enabled? && Input.trigger?(:C) return process_cancel if cancel_enabled? && Input.trigger?(:B) return process_left if Input.repeat?(:LEFT) return process_right if Input.repeat?(:RIGHT) return process_shift if Input.trigger?(:A) end #-------------------------------------------------------------------------- # ● キャンセルボタンが押されたときの処理 #-------------------------------------------------------------------------- def process_cancel @last_index[@category] = index super end #-------------------------------------------------------------------------- # ● カーソルの更新 #-------------------------------------------------------------------------- def update_cursor if active @windows.each_with_index {|window, i| window.active = @index == i } else @windows.each {|window, i| window.deactivate } end end #-------------------------------------------------------------------------- # ● 小ウィンドウの更新 #-------------------------------------------------------------------------- def update_windows @windows.each_with_index do |window, i| window.visible = visible && open? && i < item_max end end #-------------------------------------------------------------------------- # ● 選択項目の有効状態を取得 #-------------------------------------------------------------------------- def current_item_enabled? enable?(@data[index]) end #-------------------------------------------------------------------------- # ● アイテムを許可状態で表示するかどうか #-------------------------------------------------------------------------- def enable?(item) !WdTk::CharMake::PARTS_LIST[@edit_data[:gender]][item].empty? end #-------------------------------------------------------------------------- # ● アイテムリストの作成 #-------------------------------------------------------------------------- def make_item_list @data = [] @heading = [] return unless @category WdTk::CharMake::EDIT_PARTS[@category].each do |sym| number, index = WdTk::CharMake::PARTS_DATA[sym] if number @data << number @data << index unless index =~ /^(hair_|skin_|eyes_)/ else @data << index end @heading << WdTk::CharMake::NAME[sym] @heading << nil if @heading.size < @data.size end end #-------------------------------------------------------------------------- # ● 前回の選択位置を復帰 #-------------------------------------------------------------------------- def select_last select(@last_index[@category] || 0) end #-------------------------------------------------------------------------- # ● 項目の描画 #-------------------------------------------------------------------------- def draw_item(index) sym = @data[index] if sym && @edit_data.include?(:gender) rect = item_rect(index) change_color(normal_color, enable?(sym)) mark = WdTk::CharMake::CHECK_MARK[fix?(sym) ? 1 : 0] draw_text(rect.x, rect.y, 32, rect.height, mark, 1) draw_text(rect.x + 32, rect.y, rect.width, rect.height, @heading[index]) list = WdTk::CharMake::PARTS_LIST[@edit_data[:gender]][sym] @windows[index].set(sym, list) @windows[index].index = list.index(@edit_data[sym]) || 0 end end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh make_item_list create_contents update_windows return unless @edit_data draw_all_items self.height = fitting_height(item_max) update_cursor end end #============================================================================== # ■ Window_WTCM_EditItem #============================================================================== class Window_WTCM_EditItem < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(window, index) rect = window.item_rect(index) x = window.x + rect.x + 160 y = window.y + rect.y w = rect.width - 160 super(x, y, w, fitting_height(1)) self.opacity = 0 end #-------------------------------------------------------------------------- # ● アクティブ状態の設定 #-------------------------------------------------------------------------- def active=(*) super self.arrows_visible = active && !@list.empty? update_cursor end #-------------------------------------------------------------------------- # ● ウィンドウ内容の幅を計算 #-------------------------------------------------------------------------- def contents_width super * item_max end #-------------------------------------------------------------------------- # ● 項目数の取得 #-------------------------------------------------------------------------- def item_max @list ? @list.size : 0 end #-------------------------------------------------------------------------- # ● アイテムの取得 #-------------------------------------------------------------------------- def item @list && index >= 0 ? @list[index] : nil end #-------------------------------------------------------------------------- # ● 項目の幅を取得 #-------------------------------------------------------------------------- def item_width width - standard_padding * 2 end #-------------------------------------------------------------------------- # ● 項目の高さを取得 #-------------------------------------------------------------------------- def item_height line_height end #-------------------------------------------------------------------------- # ● カーソル位置の設定 #-------------------------------------------------------------------------- def index=(index) self.ox = index * item_width update_cursor end #-------------------------------------------------------------------------- # ● カーソル位置の取得 #-------------------------------------------------------------------------- def index ox / item_width end #-------------------------------------------------------------------------- # ● 項目の幅を取得 #-------------------------------------------------------------------------- def item_width width - standard_padding * 2 end #-------------------------------------------------------------------------- # ● 項目の高さを取得 #-------------------------------------------------------------------------- def item_height line_height end #-------------------------------------------------------------------------- # ● シンボル、アイテムの設定 #-------------------------------------------------------------------------- def set(symbol, list) @symbol = symbol @list = list refresh end #-------------------------------------------------------------------------- # ● カーソルの更新 #-------------------------------------------------------------------------- def update_cursor if active cursor_rect.set(ox, 0, item_width, item_height) else cursor_rect.empty end end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh create_contents return unless @list items = WdTk::CharMake::PARTS_ITEMS[@symbol] unless items if @symbol =~ /_number/ items = WdTk::CharMake::PARTS_ITEMS[:number] else items = WdTk::CharMake::PARTS_ITEMS[:index] end end @list.each_index do |i| x = i * item_width + 4 w = item_width - 8 if items[i].is_a?(Color) contents.fill_rect(x, 4, w, line_height - 8, items[i]) else draw_text(x, 0, w, line_height, items[i], 1) end end end end #============================================================================== # ■ Window_WTCM_CharGraphic #============================================================================== class Window_WTCM_CharGraphic < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(x, y) super(x, y, item_width, item_height) @characters = [] @character_sprites = [] hide end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose @character_sprites.each {|char| char.dispose } super end #-------------------------------------------------------------------------- # ● 項目のサイズを取得 #-------------------------------------------------------------------------- def item_width 160 end def item_height WdTk::CharMake::COMMAND.include?(:face) ? 320 : 224 end #-------------------------------------------------------------------------- # ● 可視状態の設定 #-------------------------------------------------------------------------- def visible=(*) super @characters.each {|char| char.transparent = !visible } end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super @characters.each {|char| char.update } @character_sprites.each {|char| char.update } end #-------------------------------------------------------------------------- # ● アクターの設定 #-------------------------------------------------------------------------- def actor=(actor) return if @actor == actor @actor = actor @characters.clear @character_sprites.each {|char| char.dispose }.clear cy = y + standard_padding + (WdTk::CharMake::COMMAND.include?(:face) ? 96 : 0) 4.times do |i| char = Game_EditCharacter.new(@actor) case i when 0 char.screen_x = x + width / 2 char.screen_y = cy + 192 when 1 char.screen_x = x + width / 4 char.screen_y = cy + 128 when 2 char.screen_x = x + width * 3 / 4 char.screen_y = cy + 128 when 3 char.screen_x = x + width / 2 char.screen_y = cy + 64 end char.transparent = !visible char.set_direction(2 + i * 2) @characters << char sprite = Sprite_Character.new(nil, char) sprite.zoom_x = sprite.zoom_y = 2.0 @character_sprites << sprite end refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh contents.clear return unless @actor return unless WdTk::CharMake::COMMAND.include?(:face) draw_actor_face(@actor, 20, 0) end end #============================================================================== # ■ Window_WTCM_FaceList #============================================================================== class Window_WTCM_FaceList < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(y) ww = col_max * item_width + standard_padding * 2 wh = Graphics.height - y - standard_padding * 2 wh = wh / item_height * item_height + standard_padding * 2 x = (Graphics.width - ww) / 2 super(x, y, ww, wh) self.openness = 0 self.z = 150 end #-------------------------------------------------------------------------- # ● 桁数の取得 #-------------------------------------------------------------------------- def col_max (Graphics.width - standard_padding * 2) / item_width end #-------------------------------------------------------------------------- # ● 横に項目が並ぶときの空白の幅を取得 #-------------------------------------------------------------------------- def spacing return 0 end #-------------------------------------------------------------------------- # ● 項目数の取得 #-------------------------------------------------------------------------- def item_max @data ? @data.size : 1 end #-------------------------------------------------------------------------- # ● 項目のサイズを取得 #-------------------------------------------------------------------------- def item_width; 96; end def item_height; 96; end #-------------------------------------------------------------------------- # ● 顔グラフィックの取得 #-------------------------------------------------------------------------- def item @data && index >= 0 ? @data[index] : nil end #-------------------------------------------------------------------------- # ● アクターの設定 #-------------------------------------------------------------------------- def actor=(actor) @actor = actor refresh select_last end #-------------------------------------------------------------------------- # ● カーソル位置の設定 #-------------------------------------------------------------------------- def index=(index) last_index = @index super end #-------------------------------------------------------------------------- # ● アイテムリストの作成 #-------------------------------------------------------------------------- def make_item_list @data = [] WdTk::CharMake::FACE[@actor.gender].each do |key, value| value.each {|i| @data << [key, i] } end end #-------------------------------------------------------------------------- # ● 前回の選択位置を復帰 #-------------------------------------------------------------------------- def select_last select(@data.index([@actor.face_name, @actor.face_index]) || 0) end #-------------------------------------------------------------------------- # ● 項目の描画 #-------------------------------------------------------------------------- def draw_item(index) name, i = @data[index] if name && i rect = item_rect(index) draw_face(name, i, rect.x, rect.y) end end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh make_item_list create_contents draw_all_items end end #============================================================================== # ■ Window_WTCM_NickNameList #============================================================================== class Window_WTCM_NickNameList < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(x, y) ww = use_header? ? 320 : 160 wh = Graphics.height - y super(x, y, ww, wh) self.openness = 0 end #-------------------------------------------------------------------------- # ● 項目数の取得 #-------------------------------------------------------------------------- def item_max @data ? @data.size : 1 end #-------------------------------------------------------------------------- # ● ニックネームの取得 #-------------------------------------------------------------------------- def item @data && index >= 0 ? @data[index] : nil end #-------------------------------------------------------------------------- # ● スキルの取得 #-------------------------------------------------------------------------- def skill skill_id = index >= 0 ? WdTk::CharMake::NICKNAME_SKILL[index] : nil skill_id ? $data_skills[skill_id] : nil end #-------------------------------------------------------------------------- # ● ヘッダーを表示するかどうか #-------------------------------------------------------------------------- def use_header? !WdTk::CharMake::NICKNAME_SKILL.empty? && !WdTk::CharMake::NICKNAME_HEADER.empty? end #-------------------------------------------------------------------------- # ● 項目を描画する矩形の取得 #-------------------------------------------------------------------------- def item_rect(index) rect = super rect.y += line_height if use_header? rect end #-------------------------------------------------------------------------- # ● アクターの設定 #-------------------------------------------------------------------------- def actor=(actor) @actor = actor refresh select_last end #-------------------------------------------------------------------------- # ● アイテムリストの作成 #-------------------------------------------------------------------------- def make_item_list @data = WdTk::CharMake::NICKNAME end #-------------------------------------------------------------------------- # ● 前回の選択位置を復帰 #-------------------------------------------------------------------------- def select_last select(@data.index(@actor.nickname) || 0) end #-------------------------------------------------------------------------- # ● 項目の描画 #-------------------------------------------------------------------------- def draw_item(index) item = @data[index] if item rect = item_rect_for_text(index) change_color(normal_color) draw_text(rect, item) skill_id = WdTk::CharMake::NICKNAME_SKILL[index] if skill_id && $data_skills[skill_id] draw_text(rect.x + 160, rect.y, 16, rect.height, ":") draw_item_name($data_skills[skill_id], rect.x + 176, rect.y) end end end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_item(skill) end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh make_item_list create_contents if use_header? change_color(system_color) draw_text(4, 0, 160, line_height, WdTk::CharMake::NAME[:nickname]) draw_text(164, 0, 160, line_height, WdTk::CharMake::NICKNAME_HEADER) end draw_all_items end end #============================================================================== # ■ Window_WTCM_ClassList #============================================================================== class Window_WTCM_ClassList < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(x, y) ww = 160 wh = Graphics.height - y super(x, y, ww, wh) self.openness = 0 end #-------------------------------------------------------------------------- # ● アクターの設定 #-------------------------------------------------------------------------- def actor=(actor) @actor = actor refresh select_last end #-------------------------------------------------------------------------- # ● 項目数の取得 #-------------------------------------------------------------------------- def item_max @data ? @data.size : 1 end #-------------------------------------------------------------------------- # ● 職業の取得 #-------------------------------------------------------------------------- def item @data && index >= 0 ? @data[index] : nil end #-------------------------------------------------------------------------- # ● 武器の取得 #-------------------------------------------------------------------------- def weapon weapon_id = index >= 0 ? WdTk::CharMake::CLASS_WEAPON[index] : nil weapon_id ? $data_weapons[weapon_id] : nil end #-------------------------------------------------------------------------- # ● アイテムリストの作成 #-------------------------------------------------------------------------- def make_item_list @data = WdTk::CharMake::CLASSES.collect {|id| $data_classes[id] } end #-------------------------------------------------------------------------- # ● 前回の選択位置を復帰 #-------------------------------------------------------------------------- def select_last select(@data.index(@actor.class) || 0) end #-------------------------------------------------------------------------- # ● 項目の描画 #-------------------------------------------------------------------------- def draw_item(index) item = @data[index] if item rect = item_rect_for_text(index) draw_text(rect, item.name) end end #-------------------------------------------------------------------------- # ● ステータスウィンドウの設定 #-------------------------------------------------------------------------- def status_window=(status_window) @status_window = status_window call_update_help end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_text(WdTk::CharMake::CLASS_DESCRIPTION[index] || "") if @actor && @status_window if item temp_actor = Marshal.load(Marshal.dump(@actor)) temp_actor.force_change_class(item.id) equips = WdTk::CharMake::CLASS_EQUIPS[index] temp_actor.test_equips(equips) if equips @status_window.actor = temp_actor else @status_window.actor = nil end end end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh make_item_list create_contents draw_all_items end end #============================================================================== # ■ Window_WTCM_ClassStatus #============================================================================== class Window_WTCM_ClassStatus < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(x, y) ww = Graphics.width - x super(x, y, ww, window_height) self.openness = 0 @actor = nil @page_index = 0 end #-------------------------------------------------------------------------- # ● ウィンドウ高さの取得 #-------------------------------------------------------------------------- def window_height fitting_height(visible_line_number) end #-------------------------------------------------------------------------- # ● ウィンドウ内容の幅を計算 #-------------------------------------------------------------------------- def contents_width super * page_max end #-------------------------------------------------------------------------- # ● 表示行数の取得 #-------------------------------------------------------------------------- def visible_line_number WdTk::CharMake::CLASS_STATUS.max_by {|ary| ary.size }.size end #-------------------------------------------------------------------------- # ● アクターの設定 #-------------------------------------------------------------------------- def actor=(actor) return if @actor == actor @actor = actor refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh contents.clear return unless @actor self.ox = (width - standard_padding * 2) * @page_index WdTk::CharMake::CLASS_STATUS[@page_index].each_with_index do |param, i| case param when /note(\d+)/ change_color(normal_color) n = $1.to_i - 1 text = @actor.class.note.split(/\r?\n/)[n] draw_text(ox + 8, i * line_height, 176, line_height, text) when /equip(\d+)/ draw_item_name(@actor.equips[$1.to_i], ox + 8, i * line_height) else n = @actor.send(param) n = (n * 100).to_i if n.is_a?(Float) iw = width - standard_padding * 2 - 8 fill_w = iw * n / WdTk::CharMake::GAUGES_MAX[param] gauge_x = ox + iw - fill_w gauge_y = i * line_height + line_height - 8 colors = WdTk::CharMake::CLASS_GAUGES contents.gradient_fill_rect(gauge_x, gauge_y, fill_w, 6, *colors) change_color(system_color) text = WdTk::CharMake::NAME[param] draw_text(ox, i * line_height, 120, line_height, text) change_color(normal_color) draw_text(ox + 120, i * line_height, iw - 132, line_height, n, 2) end end end #-------------------------------------------------------------------------- # ● 最大ページ数の取得 #-------------------------------------------------------------------------- def page_max WdTk::CharMake::CLASS_STATUS.size end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super update_page end #-------------------------------------------------------------------------- # ● ページの更新 #-------------------------------------------------------------------------- def update_page return unless open? && page_max > 1 last_page_index = @page_index @page_index = (@page_index - 1) % page_max if Input.trigger?(:LEFT) @page_index = (@page_index + 1) % page_max if Input.trigger?(:RIGHT) if last_page_index != @page_index Sound.play_cursor refresh end end end #============================================================================== # ■ Window_WTCM_WeaponList #============================================================================== class Window_WTCM_WeaponList < Window_ItemList #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(x, y) ww = WdTk::CharMake::WEAPON_DISPLAY == 0 ? 224 : 160 wh = Graphics.height - y super(x, y, ww, wh) self.openness = 0 @actor = nil end #-------------------------------------------------------------------------- # ● 桁数の取得 #-------------------------------------------------------------------------- def col_max return 1 end #-------------------------------------------------------------------------- # ● アクターの設定 #-------------------------------------------------------------------------- def actor=(actor) @actor = actor refresh select_last end #-------------------------------------------------------------------------- # ● アイテムをリストに含めるかどうか #-------------------------------------------------------------------------- def include?(item) return false unless item.is_a?(RPG::EquipItem) return true if WdTk::CharMake::WEAPON_INCLUDE return enable?(item) end #-------------------------------------------------------------------------- # ● アイテムを許可状態で表示するかどうか #-------------------------------------------------------------------------- def enable?(item) @actor && @actor.equippable?(item) end #-------------------------------------------------------------------------- # ● アイテムリストの作成 #-------------------------------------------------------------------------- def make_item_list @data = WdTk::CharMake::WEAPONS.collect {|id| $data_weapons[id] } @data.select! {|item| include?(item) } end #-------------------------------------------------------------------------- # ● 前回の選択位置を復帰 #-------------------------------------------------------------------------- def select_last select(@data.index(@actor.weapons[0]) || 0) if @actor end #-------------------------------------------------------------------------- # ● 項目の描画 #-------------------------------------------------------------------------- def draw_item(index) item = @data[index] if item rect = item_rect(index) contents.fill_rect(rect, pending_color) if @actor && @actor.weapons[0] == item rect.x += 4 rect.width -= 8 enabled = enable?(item) case WdTk::CharMake::WEAPON_DISPLAY when 0 draw_item_name(item, rect.x, rect.y, enabled) when 1 draw_icon(item.icon_index, rect.x, rect.y, enabled) change_color(normal_color, enabled) name = $data_system.weapon_types[item.wtype_id] draw_text(rect.x + 24, rect.y, rect.width - 24, rect.height, name) end end end end #============================================================================== # ■ Window_WTCM_Skill1List #============================================================================== class Window_WTCM_Skill1List < Window_Selectable #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :edit_skills #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(x, y) ww = 272 wh = Graphics.height - y super(x, y, ww, wh) self.openness = 0 @data = [] end #-------------------------------------------------------------------------- # ● アクターの設定 #-------------------------------------------------------------------------- def actor=(actor) @actor = actor refresh select(0) end #-------------------------------------------------------------------------- # ● 項目数の取得 #-------------------------------------------------------------------------- def item_max @data ? @data.size : 1 end #-------------------------------------------------------------------------- # ● スキルの取得 #-------------------------------------------------------------------------- def item @data && index >= 0 ? @data[index] : nil end #-------------------------------------------------------------------------- # ● 武器の取得 #-------------------------------------------------------------------------- def weapon weapon_id = item ? WdTk::CharMake::SKILL1_WEAPON[item.id] : nil weapon_id ? $data_weapons[weapon_id] : nil end #-------------------------------------------------------------------------- # ● 選択項目の有効状態を取得 #-------------------------------------------------------------------------- def current_item_enabled? item && (@edit_skills[:skill1].include?(item.id) || @edit_skills[:skill1].size < WdTk::CharMake::SKILL1_NUMBER) end #-------------------------------------------------------------------------- # ● スキルを許可状態で表示するかどうか #-------------------------------------------------------------------------- def enable?(item) item && !@edit_skills[:skill1].include?(item.id) end #-------------------------------------------------------------------------- # ● スキルリストの作成 #-------------------------------------------------------------------------- def make_item_list return @data = [] unless @actor case WdTk::CharMake::SKILL1_TYPE when :actor skills = WdTk::CharMake::SKILLS1[@actor.id] when :class skills = WdTk::CharMake::SKILLS1[@actor.class_id] when :weapon skills = @actor.weapons.inject([]) do |r, weapon| weapon ? r.concat(WdTk::CharMake::SKILLS1[weapon.id]) : r end when :wtype skills = @actor.features_set(51).inject([]) do |r, wtype| r.concat(WdTk::CharMake::SKILLS1[wtype]) end when :stype skills = @actor.added_skill_types.inject([]) do |r, stype| r.concat(WdTk::CharMake::SKILLS1[stype]) end when :atype skills = @actor.features_set(52).inject([]) do |r, atype| r.concat(WdTk::CharMake::SKILLS1[atype]) end end @data = skills.collect {|id| $data_skills[id] } end #-------------------------------------------------------------------------- # ● 項目の描画 #-------------------------------------------------------------------------- def draw_item(index) skill = @data[index] if skill rect = item_rect_for_text(index) rect.width -= 4 draw_item_name(skill, rect.x, rect.y, enable?(skill)) end end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help @help_window.set_item(item) end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh make_item_list create_contents draw_all_items end end #============================================================================== # ■ Window_WTCM_Skill2List #============================================================================== class Window_WTCM_Skill2List < Window_WTCM_Skill1List #-------------------------------------------------------------------------- # ● 選択項目の有効状態を取得 #-------------------------------------------------------------------------- def current_item_enabled? item && (@edit_skills[:skill2].include?(item.id) || @edit_skills[:skill2].size < WdTk::CharMake::SKILL2_NUMBER) end #-------------------------------------------------------------------------- # ● スキルを許可状態で表示するかどうか #-------------------------------------------------------------------------- def enable?(item) item && !@edit_skills[:skill2].include?(item.id) end #-------------------------------------------------------------------------- # ● スキルリストの作成 #-------------------------------------------------------------------------- def make_item_list @data = WdTk::CharMake::SKILLS2.collect {|id| $data_skills[id] } end end #============================================================================== # ■ Window_WTCM_Confirm #============================================================================== class Window_WTCM_Confirm < Window_HorzCommand #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(y) x = (Graphics.width - window_width) / 2 super(x, y) self.openness = 0 deactivate end #-------------------------------------------------------------------------- # ● ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width Graphics.width - 160 end #-------------------------------------------------------------------------- # ● 桁数の取得 #-------------------------------------------------------------------------- def col_max item_max end #-------------------------------------------------------------------------- # ● コマンドリストの作成 #-------------------------------------------------------------------------- def make_command_list WdTk::CharMake::END_CONFIRM.each_with_index do |text, i| add_command(text, i == 0 ? :ok : :cancel) end end end #////////////////////////////////////////////////////////////////////////////// # # ▼ シーン # #////////////////////////////////////////////////////////////////////////////// #============================================================================== # ■ Scene_CharacterMake #============================================================================== class Scene_CharacterMake < Scene_MenuBase #-------------------------------------------------------------------------- # ● モジュール #-------------------------------------------------------------------------- include WdTk::CharMake #-------------------------------------------------------------------------- # ● 準備 #-------------------------------------------------------------------------- def prepare(actor_id) @actor_id = actor_id @edit_data = $game_actors[actor_id].instance_variable_get("@edit_data") if !@edit_data.include?(:gender) && $data_actors[@actor_id].gender @edit_data[:gender] = $data_actors[@actor_id].gender end @edit_data[:front_hair_number] ||= 1 @edit_data[:rear_hair_number] ||= 1 @edit_data[:cloth_number] ||= 1 Window_WTCM_MakeCommand.init_command_position end #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- def start super @actor = $game_actors[@actor_id] @edit_skills = {} @edit_skills[:base] = @actor.instance_variable_get("@skills") @edit_skills[:nickname] = [] if COMMAND.include?(:nickname) @edit_skills[:skill1] = [] if COMMAND.include?(:skill1) @edit_skills[:skill2] = [] if COMMAND.include?(:skill2) create_help_window create_command_window create_status_window create_character_sprite create_gender_window create_category_window create_chargraphic_window create_edit_window create_face_window create_nickname_window create_class_window create_class_status_window create_weapon_window create_skill1_window create_skill2_window create_confirm_window unless @edit_data.include?(:gender) @command_window.deactivate.hide command_gender @viewport.color.alpha = 0 end end #-------------------------------------------------------------------------- # ● 終了処理 #-------------------------------------------------------------------------- def terminate super @character_sprite.dispose end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super if @gender_window.active @edit_data[:gender] = @gender_window.index @character.screen_x = Graphics.width / 2 @character.screen_y = Graphics.height / 2 else pad = @status_window.standard_padding @character.screen_x = @status_window.x + pad + 48 @character.screen_y = @status_window.y + pad + 48 end @character.update @character_sprite.update end #-------------------------------------------------------------------------- # ● ビューポートの作成 #-------------------------------------------------------------------------- def create_main_viewport super @viewport.z = 80 end #-------------------------------------------------------------------------- # ● コマンドウィンドウの作成 #-------------------------------------------------------------------------- def create_command_window @command_window = Window_WTCM_MakeCommand.new @command_window.viewport = @viewport @command_window.help_window = @help_window @command_window.y = @help_window.height @command_window.set_handler(:gender, method(:command_gender)) @command_window.set_handler(:name, method(:command_name)) @command_window.set_handler(:edit, method(:command_edit)) @command_window.set_handler(:face, method(:command_face)) @command_window.set_handler(:nickname, method(:command_nickname)) @command_window.set_handler(:class, method(:command_class)) @command_window.set_handler(:weapon, method(:command_weapon)) @command_window.set_handler(:skill1, method(:command_skill1)) @command_window.set_handler(:skill2, method(:command_skill2)) @command_window.set_handler(:ok, method(:on_make_ok)) end #-------------------------------------------------------------------------- # ● ステータスウィンドウの作成 #-------------------------------------------------------------------------- def create_status_window wx = @command_window.width wy = @command_window.y @status_window = Window_WTCM_MakeStatus.new(wx, wy) @status_window.viewport = @viewport @status_window.actor = @actor @status_window.edit_skills = @edit_skills end #-------------------------------------------------------------------------- # ● キャラクタースプライトの作成 #-------------------------------------------------------------------------- def create_character_sprite @character = Game_EditCharacter.new(@actor) @character.stop_turn = true @character_sprite = Sprite_Character.new(@viewport, @character) end #-------------------------------------------------------------------------- # ● 性別選択ウィンドウの作成 #-------------------------------------------------------------------------- def create_gender_window wy = @help_window.height @gender_window = Window_WTCM_GenderCommand.new(wy) @gender_window.set_handler(:ok, method(:on_gender_ok)) @gender_window.set_handler(:cancel, method(:on_gender_cancel)) end #-------------------------------------------------------------------------- # ● カテゴリウィンドウの作成 #-------------------------------------------------------------------------- def create_category_window wx = @command_window.width wy = @command_window.y @category_window = Window_WTCM_EditCategory.new(wx, wy) @category_window.help_window = @help_window @category_window.set_handler(:ok, method(:on_category_ok)) @category_window.set_handler(:cancel, method(:on_category_cancel)) end #-------------------------------------------------------------------------- # ● キャラグラフィックウィンドウの作成 #-------------------------------------------------------------------------- def create_chargraphic_window wx = @command_window.x wy = @command_window.y @chargraphic_window = Window_WTCM_CharGraphic.new(wx, wy) @chargraphic_window.actor = @actor end #-------------------------------------------------------------------------- # ● キャラクター生成 ウィンドウの作成 #-------------------------------------------------------------------------- def create_edit_window wx = @category_window.x wy = @category_window.y + @category_window.height @edit_window = Window_WTCM_EditList.new(wx, wy) @edit_window.edit_data = @edit_data @edit_window.set_handler(:cancel, method(:on_edit_cancel)) @category_window.edit_window = @edit_window end #-------------------------------------------------------------------------- # ● 顔グラフィックウィンドウの作成 #-------------------------------------------------------------------------- def create_face_window wy = @status_window.y @face_window = Window_WTCM_FaceList.new(wy) @face_window.set_handler(:ok, method(:on_face_ok)) @face_window.set_handler(:cancel, method(:on_face_cancel)) end #-------------------------------------------------------------------------- # ● ニックネームウィンドウの作成 #-------------------------------------------------------------------------- def create_nickname_window wx = @status_window.x wy = @status_window.y @nickname_window = Window_WTCM_NickNameList.new(wx, wy) @nickname_window.help_window = @help_window @nickname_window.set_handler(:ok, method(:on_nickname_ok)) @nickname_window.set_handler(:cancel, method(:on_nickname_cancel)) end #-------------------------------------------------------------------------- # ● 職業ウィンドウの作成 #-------------------------------------------------------------------------- def create_class_window wx = @status_window.x wy = @status_window.y @class_window = Window_WTCM_ClassList.new(wx, wy) @class_window.help_window = @help_window @class_window.set_handler(:ok, method(:on_class_ok)) @class_window.set_handler(:cancel, method(:on_class_cancel)) end #-------------------------------------------------------------------------- # ● 職業ステータスウィンドウの作成 #-------------------------------------------------------------------------- def create_class_status_window wx = @class_window.x + @class_window.width wy = @status_window.y @class_status_window = Window_WTCM_ClassStatus.new(wx, wy) @class_window.status_window = @class_status_window end #-------------------------------------------------------------------------- # ● 武器ウィンドウの作成 #-------------------------------------------------------------------------- def create_weapon_window wx = @status_window.x wy = @status_window.y @weapon_window = Window_WTCM_WeaponList.new(wx, wy) @weapon_window.help_window = @help_window if WEAPON_DISPLAY == 0 @weapon_window.set_handler(:ok, method(:on_weapon_ok)) @weapon_window.set_handler(:cancel, method(:on_weapon_cancel)) end #-------------------------------------------------------------------------- # ● スキル1ウィンドウの作成 #-------------------------------------------------------------------------- def create_skill1_window wy = @status_window.y @skill1_window = Window_WTCM_Skill1List.new(0, wy) @skill1_window.help_window = @help_window @skill1_window.set_handler(:ok, method(:on_skill1_ok)) @skill1_window.set_handler(:cancel, method(:on_skill1_cancel)) @skill1_window.edit_skills = @edit_skills end #-------------------------------------------------------------------------- # ● スキル2ウィンドウの作成 #-------------------------------------------------------------------------- def create_skill2_window wy = @status_window.y @skill2_window = Window_WTCM_Skill2List.new(0, wy) @skill2_window.help_window = @help_window @skill2_window.set_handler(:ok, method(:on_skill2_ok)) @skill2_window.set_handler(:cancel, method(:on_skill2_cancel)) @skill2_window.edit_skills = @edit_skills end #-------------------------------------------------------------------------- # ● 確認ウィンドウの作成 #-------------------------------------------------------------------------- def create_confirm_window wy = @help_window.height @confirm_window = Window_WTCM_Confirm.new(wy) @confirm_window.set_handler(:ok, method(:on_confirm_ok)) @confirm_window.set_handler(:cancel, method(:on_confirm_cancel)) end #-------------------------------------------------------------------------- # ● コマンド[性別] #-------------------------------------------------------------------------- def command_gender @viewport.color.alpha = 96 @help_window.viewport = nil @help_window.set_text(GENDER_HELP) @character.stop_turn = false @character.set_direction(2) @character_sprite.viewport = nil @character_sprite.zoom_x = @character_sprite.zoom_y = 2.0 @status_window.hide @gender_window.activate.open @gender_window.select(@edit_data[:gender]) @last_gender = @edit_data[:gender] end #-------------------------------------------------------------------------- # ● コマンド[名前] #-------------------------------------------------------------------------- def command_name SceneManager.call(Scene_Name) SceneManager.scene.prepare(@actor_id, MAX_CHAR) end #-------------------------------------------------------------------------- # ● コマンド[編集] #-------------------------------------------------------------------------- def command_edit @help_window.viewport = nil @category_window.activate.open @edit_window.open @chargraphic_window.show.refresh @command_window.hide @status_window.hide @last_edit_data = @edit_data.dup end #-------------------------------------------------------------------------- # ● コマンド[顔グラフィック] #-------------------------------------------------------------------------- def command_face @viewport.color.alpha = 96 @help_window.viewport = @viewport @face_window.activate.open @face_window.actor = @actor @command_window.hide @status_window.hide end #-------------------------------------------------------------------------- # ● コマンド[二つ名] #-------------------------------------------------------------------------- def command_nickname @viewport.color.alpha = 96 @help_window.viewport = NICKNAME_SKILL.empty? ? nil : @viewport @nickname_window.activate.open @nickname_window.actor = @actor @status_window.hide unless NICKNAME_SKILL.empty? end #-------------------------------------------------------------------------- # ● コマンド[職業] #-------------------------------------------------------------------------- def command_class @viewport.color.alpha = 96 @help_window.viewport = nil @class_window.activate.open @class_window.actor = @actor @class_status_window.open @status_window.hide end #-------------------------------------------------------------------------- # ● コマンド[武器] #-------------------------------------------------------------------------- def command_weapon @viewport.color.alpha = 96 @help_window.viewport = WEAPON_DISPLAY == 0 ? nil : @viewport @weapon_window.activate.open @weapon_window.actor = @actor end #-------------------------------------------------------------------------- # ● コマンド[スキル1] #-------------------------------------------------------------------------- def command_skill1 @viewport.color.alpha = 96 @help_window.viewport = nil @status_window.viewport = nil @skill1_window.activate.open @skill1_window.actor = @actor @command_window.hide end #-------------------------------------------------------------------------- # ● コマンド[スキル2] #-------------------------------------------------------------------------- def command_skill2 @viewport.color.alpha = 96 @help_window.viewport = nil @status_window.viewport = nil @skill2_window.activate.open @skill2_window.actor = @actor @command_window.hide end #-------------------------------------------------------------------------- # ● コマンド[決定] #-------------------------------------------------------------------------- def on_make_ok COMMAND.each do |symbol| case symbol when :name next unless @actor.name.empty? when :face next unless @actor.face_name.empty? when :nickname next unless @actor.nickname.empty? when :class next unless @actor.class.name.empty? when :weapon next if @actor.weapons[0] else next end Audio.se_stop Sound.play_buzzer @command_window.activate @help_window.set_text(NAME[symbol] + NoCommandError) return end @help_window.viewport = nil @help_window.set_text(CONFIRM_HELP) @character_sprite.viewport = nil @status_window.viewport = nil @status_window.x = @confirm_window.x @status_window.y = @confirm_window.y + @confirm_window.height @confirm_window.activate.open @command_window.hide end #-------------------------------------------------------------------------- # ● カテゴリー[決定] #-------------------------------------------------------------------------- def on_category_ok if @category_window.current_symbol == :randam EDIT_PARTS.each do |sym, ary| ary.each do |parts| number, index = PARTS_DATA[parts] if number unless @edit_window.fix?(number) list = PARTS_LIST[@edit_data[:gender]][number] @edit_data[number] = list.sample || 0 end unless @edit_window.fix?(index) || index =~ /^(hair_|skin_|eyes_)/ list = PARTS_LIST[@edit_data[:gender]][index] @edit_data[index] = list.sample || 0 end else unless @edit_window.fix?(index) list = PARTS_LIST[@edit_data[:gender]][index] @edit_data[index] = list.sample || 0 end end end end @edit_data.reject! do |key, value| key != :gender && key != :cloth_number && value == 0 end @category_window.activate @edit_window.refresh elsif @category_window.current_symbol == :default @edit_data.replace(@last_edit_data) @category_window.activate @edit_window.refresh else @help_window.set_text(EDIT_HELP3) @edit_window.activate.select_last end end #-------------------------------------------------------------------------- # ● カテゴリー[キャンセル] #-------------------------------------------------------------------------- def on_category_cancel @category_window.close @edit_window.close @chargraphic_window.hide @command_window.show.activate @status_window.show end #-------------------------------------------------------------------------- # ● 編集[キャンセル] #-------------------------------------------------------------------------- def on_edit_cancel @edit_data.reject! do |key, value| key != :gender && key != :cloth_number && value == 0 end @category_window.activate end #-------------------------------------------------------------------------- # ● 性別選択[決定] #-------------------------------------------------------------------------- def on_gender_ok @viewport.color.alpha = 0 @edit_data[:gender] = @gender_window.index @gender_window.close @command_window.activate.show @status_window.show @character.stop_turn = true @character_sprite.viewport = @viewport @character_sprite.zoom_x = @character_sprite.zoom_y = 1.0 face = FACE[@edit_data[:gender]] unless face.include?(@actor.face_name) && face[@actor.face_name].include?(@actor.face_index) @actor.set_face("", 0) end refresh end #-------------------------------------------------------------------------- # ● 性別選択[キャンセル] #-------------------------------------------------------------------------- def on_gender_cancel if @last_gender @edit_data[:gender] = @last_gender else Audio.se_stop Sound.play_buzzer @gender_window.activate return end @viewport.color.alpha = 0 @gender_window.close @command_window.activate.show @status_window.show @character.stop_turn = true @character_sprite.viewport = @viewport @character_sprite.zoom_x = @character_sprite.zoom_y = 1.0 refresh end #-------------------------------------------------------------------------- # ● 顔グラフィック[決定] #-------------------------------------------------------------------------- def on_face_ok @viewport.color.alpha = 0 @actor.set_face(*@face_window.item) @face_window.close @command_window.activate.show @status_window.show refresh end #-------------------------------------------------------------------------- # ● 顔グラフィック[キャンセル] #-------------------------------------------------------------------------- def on_face_cancel @viewport.color.alpha = 0 @face_window.close @command_window.activate.show @status_window.show refresh end #-------------------------------------------------------------------------- # ● 二つ名[決定] #-------------------------------------------------------------------------- def on_nickname_ok @viewport.color.alpha = 0 @actor.nickname = @nickname_window.item @edit_skills[:nickname].each {|id| @actor.forget_skill(id) }.clear @edit_skills[:nickname] << @nickname_window.skill.id if @nickname_window.skill @edit_skills.each_value do |skills| skills.each {|id| @actor.learn_skill(id) } end @nickname_window.close @command_window.activate @status_window.show refresh end #-------------------------------------------------------------------------- # ● 二つ名[キャンセル] #-------------------------------------------------------------------------- def on_nickname_cancel @viewport.color.alpha = 0 @nickname_window.close @command_window.activate @status_window.show refresh end #-------------------------------------------------------------------------- # ● 職業[決定] #-------------------------------------------------------------------------- def on_class_ok @viewport.color.alpha = 0 @actor.force_change_class(@class_window.item.id) @class_window.close @class_status_window.close @command_window.activate @status_window.show refresh end #-------------------------------------------------------------------------- # ● 職業[キャンセル] #-------------------------------------------------------------------------- def on_class_cancel @viewport.color.alpha = 0 @class_window.close @class_status_window.close @command_window.activate @status_window.show refresh end #-------------------------------------------------------------------------- # ● 武器[決定] #-------------------------------------------------------------------------- def on_weapon_ok @viewport.color.alpha = 0 @actor.force_change_equip(0, @weapon_window.item) @actor.force_change_equip(1, @weapon_window.item) if @actor.dual_wield? @weapon_window.close @command_window.activate refresh end #-------------------------------------------------------------------------- # ● 武器[キャンセル] #-------------------------------------------------------------------------- def on_weapon_cancel @viewport.color.alpha = 0 @weapon_window.close @command_window.activate refresh end #-------------------------------------------------------------------------- # ● スキル1[決定] #-------------------------------------------------------------------------- def on_skill1_ok item_id = @skill1_window.item.id if @edit_skills[:skill1].include?(item_id) @edit_skills[:skill1].delete(item_id) @actor.forget_skill(item_id) @edit_skills.each_value do |skills| skills.each {|id| @actor.learn_skill(id) } end if !SKILL1_WEAPON.empty? && @edit_skills[:skill1].empty? @actor.force_change_equip(0, nil) @actor.force_change_equip(1, nil) if @actor.dual_wield? end else @edit_skills[:skill1] << item_id @actor.learn_skill(item_id) if @edit_skills[:skill1].size == 1 && @skill1_window.weapon @actor.force_change_equip(0, @skill1_window.weapon) @actor.force_change_equip(1, @skill1_window.weapon) if @actor.dual_wield? end end @skill1_window.activate.redraw_current_item refresh end #-------------------------------------------------------------------------- # ● スキル1[キャンセル] #-------------------------------------------------------------------------- def on_skill1_cancel @viewport.color.alpha = 0 @skill1_window.close @command_window.activate.show @status_window.viewport = @viewport end #-------------------------------------------------------------------------- # ● スキル2[決定] #-------------------------------------------------------------------------- def on_skill2_ok item_id = @skill2_window.item.id if @edit_skills[:skill2].include?(item_id) @edit_skills[:skill2].delete(item_id) @actor.forget_skill(item_id) @edit_skills.each_value do |skills| skills.each {|id| @actor.learn_skill(id) } end else @edit_skills[:skill2] << item_id @actor.learn_skill(item_id) end @skill2_window.activate.redraw_current_item refresh end #-------------------------------------------------------------------------- # ● スキル2[キャンセル] #-------------------------------------------------------------------------- def on_skill2_cancel @viewport.color.alpha = 0 @skill2_window.close @command_window.activate.show @status_window.viewport = @viewport end #-------------------------------------------------------------------------- # ● 確認[決定] #-------------------------------------------------------------------------- def on_confirm_ok @actor.recover_all $game_player.refresh return_scene end #-------------------------------------------------------------------------- # ● 確認[キャンセル] #-------------------------------------------------------------------------- def on_confirm_cancel @confirm_window.close @character_sprite.viewport = @viewport @status_window.viewport = @viewport @status_window.x = @command_window.width @status_window.y = @command_window.y @command_window.activate.show end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh @status_window.refresh @edit_window.refresh end end