把你填
|
#****************************************************************************** # # * モンスター図鑑 #2 # # -------------------------------------------------------------------------- # バージョン : 1.0.2 # 対 応 : RPGツクールVX : RGSS2 # 制 作 者 : CACAO # 配 布 元 : http://cacaosoft.web.fc2.com/ # 連 絡 先 : [email protected] # -------------------------------------------------------------------------- # == 概要 == # # : モンスター図鑑の機能を追加します。 # # -------------------------------------------------------------------------- # == 注意事項 == # # ※ 別途、コメントを定義する必要があります。サイトの説明をご覧ください。 # ※ このスクリプトの使用には、基本的なRGSS2の知識が必要となります。 # # -------------------------------------------------------------------------- # == 使用方法 == # # ★ 図鑑の起動 # $game_temp.next_scene = "mbook" # # ★ メニューからの起動 # start_mbook # # ★ 閲覧可能範囲の変更 # $game_system.mbook[n].entry = value # n = エネミーのID # value = 0:閲覧不可, 1:遭遇, 2:勝利, 3:解析 # # ★ 閲覧の可否の変更 # $game_system.mbook[n].hidden = value # n = エネミーのID # value = true:閲覧不可, false:閲覧可能 # # ★ 初期登録 # エネミーのメモ欄に <MB:初期登録○> と記述 # ○ = 初期登録時の閲覧可能範囲。半角数字で記述 # # ★ 初期閲覧不可 # エネミーのメモ欄に <MB:閲覧禁止> と記述 # # ★ 完全非表示 # エネミーのメモ欄に <MB:図鑑除外> と記述 # # -------------------------------------------------------------------------- # == 画像規格 == # # ★ 有効度の詳細画像 # 属性・ステートアイコンの上に表示します。有効度を見分けるための画像です。 # 144 x 48 の画像(WeakIcon)を "Graphics/System" にご用意ください。 # # ★ 図鑑背景画像 # 図鑑全体の画像です。 # 544 x 416 の画像(BackMBook)を "Graphics/System" にご用意ください。 # ※ ステータス背景を使用する場合は、ステータス部分を透過してください。 # # ★ ステータス背景画像 # ステータス部分の背景です。 # 左からコメント、ステータス、属性・ステート画面となっています。 # 896 x 272 の画像(BackMBookS)を "Graphics/System" にご用意ください。 # # ※ 詳細はサイトの説明をご覧ください。 # また、画像を使用しない設定の場合は、必要ありません。 # ユーザー設定で個別に設定できます。 # # #****************************************************************************** #============================================================================== # ◆ ユーザー設定 #============================================================================== module CAO module MB #-------------------------------------------------------------------------- # ◇ 閲覧可能にする情報(閲覧可能範囲、閲覧レベル) # (:name, :graphics, :params1, :drop, :params2, :weak, :come) #-------------------------------------------------------------------------- ACCESS_PERMIT = [ [3], # <= 消さないように注意! # 遭遇 Lv 1 [:name, :graphics], # 勝利 Lv 2 [:name, :graphics, :params1, :drop], # 解析 Lv 3 [:name, :graphics, :params1, :drop, :params2, :weak, :come] ] #-------------------------------------------------------------------------- # ◇ 図鑑完成率の算出方法(閲覧レベルで指定) #-------------------------------------------------------------------------- COMPLETE_NUMBER = nil #-------------------------------------------------------------------------- # ◇ 図鑑完成率の色変え(100%時) #-------------------------------------------------------------------------- COMPLETE_COLOR = true #-------------------------------------------------------------------------- # ◇ 自動登録する #-------------------------------------------------------------------------- AUTO_ENTRY = true #-------------------------------------------------------------------------- # ◇ 敗北しても登録する # true : 戦闘で負けても、倒した敵の加算と図鑑登録を行います。 # false : 戦闘に負けた場合は、何も行いません。 #-------------------------------------------------------------------------- AUTO_ENTRY_LOSE = false #-------------------------------------------------------------------------- # ◇ 倒した敵のみ自動登録する # true : 敵を倒すと閲覧レベル1 # false : 遭遇でレベル1、倒すとレベル2 #-------------------------------------------------------------------------- AUTO_ENTRY_DEFEATED = false #-------------------------------------------------------------------------- # ◇ 表示するステート #-------------------------------------------------------------------------- ACTIVE_STATE = [2, 3, 4, 5, 6, 7, 8] #-------------------------------------------------------------------------- # ◇ 表示する属性 #-------------------------------------------------------------------------- ACTIVE_ELEMENT = [7, 8, 9, 10, 11, 12, 13, 14] #-------------------------------------------------------------------------- # ◇ 属性を1文字で表示する # true : 属性の最初の1文字のみを表示する。 # false : 指定されたアイコンで表示する。 #-------------------------------------------------------------------------- ONE_NAME_ELEMENT = false #-------------------------------------------------------------------------- # ◇ 属性のアイコン #-------------------------------------------------------------------------- ICON_ELEMENT = [104, 105, 106, 107, 108, 109, 110, 111] #-------------------------------------------------------------------------- # ◇ 耐性表示の色分けをする # true : 有効度の画像を使用します。 # false : アイコンのみを表示します。 #-------------------------------------------------------------------------- WEAK_PONIT_COLOR = false #-------------------------------------------------------------------------- # ◇ ウィンドウを消す #-------------------------------------------------------------------------- NO_WINDOW_GRAPHICS = false #-------------------------------------------------------------------------- # ◇ システム文字を非表示にする #-------------------------------------------------------------------------- NO_SYSTEM_FONT = false #-------------------------------------------------------------------------- # ◇ パラメータの項目 # HP, MP, ATK, DEF, SPI, AGI, HIT, EVA, EXP, GOLD, DROPITEM #-------------------------------------------------------------------------- TEXT_STATUS = ["H P", "M P", "攻击力", "防御力", "精神力", "敏捷力", "命中率", "回避率", "经验值", "游戏币", "掉落物品"] #-------------------------------------------------------------------------- # ◇ 耐性の項目 # 有効属性、有効ステート、耐性属性、耐性ステート #-------------------------------------------------------------------------- TEXT_WEAK_POINT = ["弱点属性", "弱点状态", "耐性属性", "耐性状态"] end end #/////////////////////////////////////////////////////////////////////////////# # # # 下記のスクリプトを変更する必要はありません。 # # # #/////////////////////////////////////////////////////////////////////////////# module CAO class MonsterBook attr_accessor :entry attr_accessor :hidden attr_accessor :unread attr_accessor :defeat attr_accessor :encounter attr_reader :id def initialize(id) @id = id @entry = 0 @hidden = false @unread = true @defeat = 0 @encounter = false end def data return $data_enemies[@id] end end end class Game_System attr_accessor :mbook end class Scene_Title < Scene_Base alias :_cao_command_new_game_mbook :command_new_game def command_new_game _cao_command_new_game_mbook CAO::MB::Commands.reset_mbook end end class Scene_Map < Scene_Base alias :_cao_update_scene_change_mbook :update_scene_change def update_scene_change return if $game_player.moving? if $game_temp.next_scene == "mbook" $game_temp.next_scene = nil $scene = Scene_MonsterBook.new end _cao_update_scene_change_mbook end end class Scene_Menu < Scene_Base def start_mbook $scene = Scene_MonsterBook.new(@command_window.index) end end module CAO::MB::Commands module_function def unrestraint_array return $game_system.mbook.compact end def unrestraint_number return unrestraint_array.size end def unrestraint_enemy(data_id) for enemy in unrestraint_array return enemy if enemy.id == data_id end end def reset_mbook $game_system.mbook = [] for i in 1...$data_enemies.size unless /^<MB:圖鑑除外>/ =~ $data_enemies.note $game_system.mbook = CAO::MonsterBook.new($data_enemies.id) end end reset_entry reset_hidden reset_unread reset_defeat end def reset_entry for i in 1...$data_enemies.size next if $game_system.mbook == nil if /^<MB:初期登錄(\d)>/ =~ $data_enemies.note $game_system.mbook.entry = $1.to_i else $game_system.mbook.entry = 0 end end end def reset_hidden for i in 1...$data_enemies.size next if $game_system.mbook == nil if /^<MB:閱讀禁止>/ =~ $data_enemies.note $game_system.mbook.hidden = true else $game_system.mbook.hidden = false end end end def reset_unread for i in 1...$data_enemies.size next if $game_system.mbook == nil $game_system.mbook.unread = true end end def reset_defeat for i in 1...$data_enemies.size next if $game_system.mbook == nil $game_system.mbook.unread = 0 end end def change_entry(id, val) $game_system.mbook[id].entry = val end def get_encounter_number count = 0 for enemy in unrestraint_array count += 1 if enemy.encounter end return count end def get_encounter_percent return cget_encounter_number * 100 / unrestraint_number end def get_entry_number(entry_type = nil) count = 0 if entry_type for enemy in unrestraint_array count += 1 if enemy.entry >= entry_type end else for enemy in unrestraint_array count += enemy.entry end count /= 3 end return count end def get_entry_percent(entry_type = nil) return get_entry_number(entry_type) * 100 / unrestraint_number end def complete_entry(entry_type) for enemy in unrestraint_array enemy.entry = entry_type end end def clear_entry for enemy in unrestraint_array enemy.entry = 0 end end end class Window_MbookCommand < Window_Selectable def initialize super(8, 72, 200, 272) self.opacity = CAO::MB::NO_WINDOW_GRAPHICS ? 0 : 255 @enemy = CAO::MB::Commands.unrestraint_array @item_max = CAO::MB::Commands.unrestraint_number refresh self.index = 0 end def create_contents self.contents.dispose h = [height - 32, $game_system.mbook.size * WLH].max self.contents = Bitmap.new(width - 32, h) end def refresh self.contents.clear for i in 0...@item_max draw_item(i) end end def draw_item(index) rect = item_rect(index) rect.x += 4 rect.width -= 8 self.contents.clear_rect(rect) self.contents.font.color = normal_color self.contents.draw_text(rect, sprintf("%03d", index + 1)) if @enemy[index].hidden || @enemy[index].entry == 0 self.contents.draw_text(rect, "????????????", 2) else rect.x = 32 rect.width -= 28 self.contents.font.color = Color.new(102,204,64) if @enemy[index].unread self.contents.draw_text(rect, @enemy[index].data.name, 2) end end end class Window_MbookStatus < Window_Base SLIDE_SPEED = 36 def initialize super(216, 72, 320, 272) @enemy = CAO::MB::Commands.unrestraint_array[0] self.opacity = CAO::MB::NO_WINDOW_GRAPHICS ? 0 : 255 self.ox = 288 @page = 1 @slide_left = false @slide_right = false refresh end def create_contents self.contents.dispose self.contents = Bitmap.new((width - 32) * 3, height - 32) if CAO::MB::NO_SYSTEM_FONT @back_sprite = Sprite.new @back_sprite.bitmap = Cache.system("BackMBookS") @back_sprite.x = 216 @back_sprite.y = 72 @back_sprite.z = 0 @back_sprite.ox = 288 end end def refresh @enemy.unread = false if @enemy.entry > 0 self.contents.clear_rect(288 * @page, 0, 288, 240) case @page when 0 draw_comments when 1 x = 288 self.contents.font.color = normal_color if CAO::MB::ACCESS_PERMIT[@enemy.entry].include?(:name) self.contents.draw_text(x + 4, 0, 280, WLH, @enemy.data.name) else self.contents.draw_text(x + 4, 0, 280, WLH, "????????") end draw_enemy_parameter(x, 33) unless CAO::MB::NO_SYSTEM_FONT self.contents.font.color = system_color self.contents.draw_text(x, 168, 160, WLH, CAO::MB::TEXT_STATUS[10]) end draw_drop_item(@enemy.data.drop_item1, x + 24, 192) draw_drop_item(@enemy.data.drop_item2, x + 24, 216) when 2 draw_weak_point(576) end end def draw_comments return unless CAO::MB::ACCESS_PERMIT[@enemy.entry].include?(:come) if CAO::MB::COMMENT.has_key?(@enemy.data.id) self.contents.font.color = normal_color come = CAO::MB::COMMENT[@enemy.data.id] for i in 0...come.size update_message(come.clone, WLH * i) end end end def update_message(text, y) text.gsub!(/\\V\[([0-9]+)\]/i) { $game_variables[$1.to_i] } text.gsub!(/\\N\[([0-9]+)\]/i) { $game_actors[$1.to_i].name } text.gsub!(/\\C\[([0-9]+)\]/i) { "\x01[#{$1}]" } text.gsub!(/\\\\/) { "\\" } x = 0 loop do c = text.slice!(/./m) case c when nil break when "\x01" text.sub!(/\[([0-9]+)\]/, "") contents.font.color = text_color($1.to_i) next else contents.draw_text(x, y, 40, WLH, c) x += contents.text_size(c).width end end end def draw_enemy_parameter(x, y) params = [ @enemy.data.maxhp, @enemy.data.maxmp, @enemy.data.atk,@enemy.data.def, @enemy.data.spi, @enemy.data.agi, @enemy.data.hit, @enemy.data.eva, ] for i in 0...8 xx = x + i % 2 * 152 yy = y + i / 2 * WLH unless CAO::MB::NO_SYSTEM_FONT self.contents.font.color = system_color self.contents.draw_text(xx, yy, 60, WLH, CAO::MB::TEXT_STATUS) end self.contents.font.color = normal_color if CAO::MB::ACCESS_PERMIT[@enemy.entry].include?(:params1) self.contents.draw_text(xx + 60, yy, 72, WLH, params, 2) else self.contents.draw_text(xx + 60, yy, 72, WLH, "???", 2) end end unless CAO::MB::NO_SYSTEM_FONT self.contents.font.color = system_color self.contents.draw_text(x, 135, 60, WLH, CAO::MB::TEXT_STATUS[8]) self.contents.draw_text(x + 152, 135, 60, WLH, CAO::MB::TEXT_STATUS[9]) end self.contents.font.color = normal_color if CAO::MB::ACCESS_PERMIT[@enemy.entry].include?(:params2) self.contents.draw_text(x + 60, 135, 72, WLH, @enemy.data.exp, 2) self.contents.draw_text(x + 212, 135, 72, WLH, @enemy.data.gold, 2) else self.contents.draw_text(x + 60, 135, 72, WLH, "??????", 2) self.contents.draw_text(x + 212, 135, 72, WLH, "??????", 2) end end def draw_drop_item(drop_item, x, y) case drop_item.kind when 0 item = nil when 1 item = $data_items[drop_item.item_id] when 2 item = $data_weapons[drop_item.weapon_id] when 3 item = $data_armors[drop_item.armor_id] end self.contents.font.color = normal_color if CAO::MB::ACCESS_PERMIT[@enemy.entry].include?(:drop) if item == nil self.contents.draw_text(x + 2, y, 230, WLH, "× --------------") else draw_icon(item.icon_index, x, y) self.contents.draw_text(x + 26, y, 230, WLH, item.name) end else self.contents.draw_text(x, y, 230, WLH, "? --------------") end end def draw_weak_point(x) unless CAO::MB::NO_SYSTEM_FONT self.contents.font.color = system_color for i in 0...4 self.contents.draw_text(x+4, 60*i, 280, WLH, CAO::MB::TEXT_WEAK_POINT) end end if CAO::MB::ACCESS_PERMIT[@enemy.entry].include?(:weak) draw_element_icon(x + 28, 24) draw_state_icon(x + 28, 84) else self.contents.font.color = normal_color for i in 0...4 self.contents.draw_text(x+36, 60*i+24, 240, WLH, "? ? ? ? ? ? ?") end end end def draw_element_icon(x, y) count = 0 for i in 0...CAO::MB::ACTIVE_ELEMENT.size if @enemy.data.element_ranks[CAO::MB::ACTIVE_ELEMENT] < 3 if CAO::MB::ONE_NAME_ELEMENT rank = @enemy.data.element_ranks[CAO::MB::ACTIVE_ELEMENT] text = $data_system.elements[CAO::MB::ACTIVE_ELEMENT][/./] draw_weak_icon(text, x + 26 * count, y, rank) else icon_index = CAO::MB::ICON_ELEMENT rank = @enemy.data.element_ranks[CAO::MB::ACTIVE_ELEMENT] draw_weak_icon(icon_index, x + 26 * count, y, rank) end count += 1 end end count = 0 for i in 0...CAO::MB::ACTIVE_ELEMENT.size if @enemy.data.element_ranks[CAO::MB::ACTIVE_ELEMENT] > 3 if CAO::MB::ONE_NAME_ELEMENT rank = @enemy.data.element_ranks[CAO::MB::ACTIVE_ELEMENT] text = $data_system.elements[CAO::MB::ACTIVE_ELEMENT][/./] draw_weak_icon(text, x + 26 * count, y + 120, rank) else icon_index = CAO::MB::ICON_ELEMENT rank = @enemy.data.element_ranks[CAO::MB::ACTIVE_ELEMENT] draw_weak_icon(icon_index, x + 26 * count, y + 120, rank) end count += 1 end end end def draw_state_icon(x, y) weak_ranks = [] strong_ranks = [] for en in CAO::MB::ACTIVE_STATE if @enemy.data.state_ranks[en] < 3 weak_ranks << en elsif @enemy.data.state_ranks[en] > 3 strong_ranks << en end end self.contents.font.color = normal_color for i in 0...weak_ranks.size icon_index = $data_states[weak_ranks].icon_index rank = @enemy.data.state_ranks[weak_ranks] + 6 draw_weak_icon(icon_index, x + 26 * i, y, rank) end for i in 0...strong_ranks.size icon_index = $data_states[strong_ranks].icon_index rank = @enemy.data.state_ranks[strong_ranks] + 6 draw_weak_icon(icon_index, x + 26 * i, y + 120, rank) end end def draw_weak_icon(icon_index, x, y, rank = 0) if icon_index.class == String case rank when 1 self.contents.font.color = Color.new(240, 32, 8) when 5 self.contents.font.color = Color.new(48, 128, 248) when 6 self.contents.font.color = Color.new(200, 64, 200) else self.contents.font.color = normal_color end self.contents.draw_text(x, y, 24, WLH, icon_index, 1) else bitmap = Cache.system("Iconset") rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24) self.contents.blt(x, y, bitmap, rect) if CAO::MB::WEAK_PONIT_COLOR rect.set((rank - 1) % 6 * 24, (rank - 1) / 6 * 24, 24, 24) self.contents.blt(x, y, Cache.system("WeakIcon"), rect) end end end def enemy=(enemy_id) @enemy = CAO::MB::Commands.unrestraint_array[enemy_id] refresh end def terminate super @back_sprite.dispose if CAO::MB::NO_SYSTEM_FONT end def update super unless @slide_left && @slide_right last_index = @page if Input.trigger?(Input::RIGHT) @page = [@page + 1, 2].min @slide_right = @page != last_index end if Input.trigger?(Input::LEFT) @page = [@page - 1, 0].max @slide_left = @page != last_index end if @page != last_index Sound.play_cursor refresh end end update_page end def update_page if @slide_left self.ox -= SLIDE_SPEED @back_sprite.ox -= SLIDE_SPEED if CAO::MB::NO_SYSTEM_FONT @slide_left = !(self.ox == (288 * @page)) end if @slide_right self.ox += SLIDE_SPEED @back_sprite.ox += SLIDE_SPEED if CAO::MB::NO_SYSTEM_FONT @slide_right = !(self.ox == (288 * @page)) end end end class Window_MBookHelp < Window_Base include CAO::MB::Commands def initialize super(8, 352, 528, 56) self.opacity = CAO::MB::NO_WINDOW_GRAPHICS ? 0 : 255 @enemy = unrestraint_array @item_max = unrestraint_number refresh end def refresh self.contents.clear unless CAO::MB::NO_SYSTEM_FONT self.contents.font.color = system_color self.contents.draw_text(7, 0, 100, WLH, "击败数") self.contents.draw_text(147, 0, 30, WLH, "次", 2) self.contents.draw_text(193, 0, 70, WLH, "遭遇率") self.contents.draw_text(303, 0, 30, WLH, "%", 2) self.contents.draw_text(349, 0, 70, WLH, "完成率") self.contents.draw_text(459, 0, 30, WLH, "%", 2) end self.contents.font.color = normal_color draw_defeated_number(107, 0, 40, WLH, 1) self.contents.draw_text(263, 0, 40, WLH, get_encounter_number, 2) text = get_entry_percent(CAO::MB::COMPLETE_NUMBER) if text == 100 && CAO::MB::COMPLETE_COLOR self.contents.font.color.set(240, 36, 12) end self.contents.draw_text(419, 0, 40, WLH, text, 2) end def draw_defeated_number(x, y, w, h, enemy_id) self.contents.clear_rect(x, y, w, h) self.contents.font.color = normal_color self.contents.draw_text(x, y, w, h, @enemy[enemy_id].defeat, 2) end end class Scene_MonsterBook < Scene_Base def initialize(menu_index = -1) @menu_index = menu_index end def start super create_menu_background create_title_window create_command_window create_graphic_sprite @status_window = Window_MbookStatus.new @help_window = Window_MBookHelp.new end def terminate super dispose_menu_background @command_window.dispose @title_window.dispose @status_window.dispose @help_window.dispose @graphic_sprite.dispose end def update super if Input.trigger?(Input::C) Sound.play_decision draw_enemy_graphics @graphic_sprite.visible ^= true @command_window.active ^= true end return unless @command_window.active current_id = @command_window.index @command_window.update @status_window.update if Input.trigger?(Input::B) Sound.play_cancel $scene = @menu_index < 0 ? Scene_Map.new : Scene_Menu.new(@menu_index) end if @command_window.index != current_id @status_window.enemy = @command_window.index @help_window.draw_defeated_number(107, 0, 40, 24, @command_window.index) end end if CAO::MB::NO_WINDOW_GRAPHICS def create_menu_background @menuback_sprite = Sprite.new @menuback_sprite.bitmap = Cache.system("BackMBook") @menuback_sprite.z = 1 update_menu_background end end def create_title_window @title_window = Window_Base.new(0, 8, 180, 56) @title_window.opacity = CAO::MB::NO_WINDOW_GRAPHICS ? 0 : 255 unless CAO::MB::NO_SYSTEM_FONT @title_window.contents.font.color = @title_window.normal_color @title_window.contents.draw_text(0, 0, 148, 24, "怪物图鉴", 1) end end def create_command_window @command_window = Window_MbookCommand.new @command_window.index = 0 end def create_graphic_sprite @graphic_sprite = Sprite.new @graphic_sprite.visible = false @graphic_sprite.bitmap = Bitmap.new(512, 384) @graphic_sprite.x = 16 @graphic_sprite.y = 16 @graphic_sprite.z = 200 end def draw_enemy_graphics enemy = CAO::MB::Commands.unrestraint_array[@command_window.index] @graphic_sprite.bitmap.clear @graphic_sprite.bitmap.fill_rect(0, 0, 512, 384, Color.new(0, 0, 0, 128)) bitmap = Cache.battler(enemy.data.battler_name, 0) if CAO::MB::ACCESS_PERMIT[enemy.entry].include?(:graphics) @graphic_sprite.color = Color.new(0, 0, 0, 0) else @graphic_sprite.color = Color.new(0, 0, 0) end x = (512 - bitmap.width) / 2 y = (384 - bitmap.height) / 2 @graphic_sprite.bitmap.blt( x, y, bitmap, bitmap.rect) end end class Scene_Battle < Scene_Base alias :_cao_battle_end_mbook :battle_end def battle_end(result) if result != 2 || CAO::MB::AUTO_ENTRY_LOSE for en in $game_troop.members enemy = CAO::MB::Commands.unrestraint_enemy(en.enemy_id) enemy.defeat += 1 if en.dead? if CAO::MB::AUTO_ENTRY && enemy.entry < 2 if CAO::MB::AUTO_ENTRY_DEFEATED enemy.entry = 1 if en.dead? else enemy.entry = en.dead? ? 2 : 1 end end end end _cao_battle_end_mbook(result) end alias :_cao_display_action_effects_mbook :display_action_effects def display_action_effects(target, obj = nil) if obj && /^<MB:解析>/ =~ obj.note unless target.skipped line_number = @message_window.line_number wait(5) display_critical(target, obj) display_damage(target, obj) display_state_changes(target, obj) if line_number == @message_window.line_number $game_system.mbook[target.enemy_id].entry = 3 @message_window.add_instant_text("#{target.name}を解析した。") end if line_number != @message_window.line_number wait(30) end @message_window.back_to(line_number) end else _cao_display_action_effects_mbook(target, obj) end end end |
你发一下你用的怪物图鉴脚本 |
|
|
站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作
GMT+8, 2025-1-9 02:15
Powered by Discuz! X3.1
© 2001-2013 Comsenz Inc.