=begin ◆概要 キャラ図鑑っぽい何かを作ります。 ◆機能 ・SceneManager.call(Scene_CharacterDictionary)でキャラ図鑑っぽい何かを 呼び出せます。 ・情報は名前と説明文、グラフィックのみ。 ◆仕様 ・テキストも適当にアレしてるので多分違う仕様かも。 ◆使用上の注意 ・再定義なし。エイリアスあり。 =end module FAI_CharaDicthionary # 設定項目:アクターのデータを流用する # trueにするとID、名前、説明文、グラフィックが自動で「データベースの」 # アクターデータから流用できます。 # グラフィックですが、Graphics/Pictureに「(顔グラの画像名)-(インデックス)」って # 画像を用意してください。 # 例:ラルフの顔グラ(Actor1の最初のヤツ)→Actor1-1 # また、下の設定項目で流用データに沿わないものも設定できます。 # falseにすると全部手動で設定するハメになります。 USE_ACTOR_DATA = true CHARA_NAME = {} # 設定項目:アクターの名前 # 無いと自動で欠番になります。 CHARA_NAME[1] = "ラルフ" CHARA_NAME[2] = "ウルリカ" CHARA_TEXT = {} # 設定項目:アクターの名前 # 無いと自動で欠番になります。 CHARA_TEXT[1] = "勇者。\r\n強い。" CHARA_TEXT[2] = "女戦士。" CHARA_GRAPHICS = {} # 設定項目:アクターの画像名 # アクターの名前がないと意味がありません。無いと何も表示しません。 CHARA_GRAPHICS[1] = "Actor1-1" CHARA_GRAPHICS[2] = "Actor1-4" # 設定項目:仲間にしたアクターのIDの図鑑フラグを自動でONにする CHARA_FLAG_ADD_PARTY = true # 設定項目:フラグが立っていないアクターをリストに表示する CHARA_NO_FLAG_SHOW = true # 設定項目:フラグがたっていないアクターの名前 # 1文字にすると名前分繰り返し、2文字以上は繰り返しなし CHARA_NO_FLAG_NAME = "?" # 設定項目:達成率のテキスト CHARA_CR_TXT = "達成率 %s%" end class Game_DictionaryData include FAI_CharaDicthionary attr_accessor :data def initialize reset_data end def reset_data @data = {} if USE_ACTOR_DATA $data_actors.each_with_index{|actor, i| next if !actor || actor.name.empty? des = actor.description @data[i] = [actor.name, des, "#{actor.face_name}-#{actor.face_index}"] } end CHARA_NAME.each{|i, name| @data[i] = [] if !@data[i]; @data[i][0] = (name.empty? ? nil : name) } CHARA_TEXT.each{|i, name| next if !@data[i]; @data[i][1]=name if @data[i][0] && !@data[i][0].empty? } CHARA_GRAPHICS.each{|i, name| next if !@data[i]; @data[i][2]=name if @data[i][0] && !@data[i][0].empty? } end def check_actor_data return if !USE_ACTOR_DATA reset_data if @data.keys.max != $data_actors.compact.size end def [](id) @data[id] end def size @data.keys.size end def keys @data.keys end end class Game_System include FAI_CharaDicthionary attr_reader :charadic_flag attr_reader :charadic_data alias fai_cd_initialize initialize def initialize fai_cd_initialize clear_charadic_flag end def clear_charadic_flag @charadic_flag = [] @charadic_data = Game_DictionaryData.new end def add_charadic(id) clear_charadic_flag if !@charadic_flag @charadic_flag |= [id] @charadic_flag.sort end def delete_charadic(id) @charadic_flag.delete(id) end def check_cd_actor_data @charadic_data.check_actor_data end def cd_complete_rate @charadic_flag.size * 100 / @charadic_data.size end def cd_name(id) name = @charadic_data[id][0] return name if @charadic_flag.include?(id) CHARA_NO_FLAG_NAME * (CHARA_NO_FLAG_NAME.size == 1 ? name.size : 1) end def cd_txt(id) @charadic_flag.include?(id) ? @charadic_data[id][1] : "" end def cd_gra(id) @charadic_flag.include?(id) ? @charadic_data[id][2] : "" end #-------------------------------------------------------------------------- # ● ロード後の処理 #-------------------------------------------------------------------------- alias fai_cd_on_after_load on_after_load def on_after_load fai_cd_on_after_load check_cd_actor_data end end class Game_Party < Game_Unit #-------------------------------------------------------------------------- # ● 初期パーティのセットアップ #-------------------------------------------------------------------------- alias fai_cd_setup_starting_members setup_starting_members def setup_starting_members fai_cd_setup_starting_members @actors.each{|actor_id|$game_system.add_charadic(actor_id)} end #-------------------------------------------------------------------------- # ● アクターを加える #-------------------------------------------------------------------------- alias fai_cd_add_actor add_actor def add_actor(actor_id) fai_cd_add_actor(actor_id) if FAI_CharaDicthionary::CHARA_FLAG_ADD_PARTY && @actors.include?(actor_id) $game_system.add_charadic(actor_id) end end end class Window_CD_NameList < Window_Selectable include FAI_CharaDicthionary def initialize super(0, 0, Graphics.width - 320, Graphics.height) make_data refresh self.active = true self.index = 0 end def item_max (@data || [0]).size end def make_data @data = [] if CHARA_NO_FLAG_SHOW $game_system.charadic_data.keys.each{|id|@data << id} else $game_system.charadic_flag.each{|id|@data << id} end @item_max = @data.size end def draw_item(index) id = @data[index] wlh = line_height draw_text(0, wlh * index, contents.width, wlh, $game_system.cd_name(id)) end def refresh create_contents (0...@data.size).each{|i|draw_item(i)} end def actor @data[index] end end class Window_CD_Graphics < Window_Base def initialize super(Graphics.width - 320, 0, 320, Graphics.height - (line_height + 24)) @actor = nil end def actor=(id) return if @actor == id @actor = id refresh end def refresh return if !@actor contents.clear name = sprintf("No.%03d ", @actor) + $game_system.cd_name(@actor) draw_text(0, 0, self.width, line_height, name) description = $game_system.cd_txt(@actor) draw_text_ex(0, line_height, description) bitmap = Cache.picture($game_system.cd_gra(@actor)) rescue return x = (contents.width - bitmap.width) / 2 y = [contents.height - bitmap.height, line_height].max contents.blt(x, y, bitmap, bitmap.rect) end end class Window_CD_CompleteRate < Window_Base def initialize super(0, 0, 160, line_height + 24) self.x = Graphics.width - self.width self.y = Graphics.height - self.height rate = $game_system.cd_complete_rate text = sprintf(FAI_CharaDicthionary::CHARA_CR_TXT, rate) draw_text(0, 0, width, line_height, text) end end class Scene_CharacterDictionary < Scene_MenuBase #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- def start super #~ create_menu_background @list_window = Window_CD_NameList.new @list_window.set_handler(:cancel, method(:return_scene)) @gra_window = Window_CD_Graphics.new @gra_window.actor = @list_window.actor @cr_window = Window_CD_CompleteRate.new end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super @gra_window.actor = @list_window.actor end end