Бестиарий
Автор Blizzard
Версия 2.3b
На русский язык перевел Devillion (немного криво)

Bestiary - Это скрипт,который показывает ПОЛНУЮ информацию о врагах, с которыми столкнулся игрок(на манер покедекса из покемонов)

- Очень легко настраиваемый с подробным описанием
- Возможность отключить показ различной информации
- Совместим с некоторыми другими скриптами от данного разработчика

И многое другое!

Вставить над Main

Код:
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
# Бестиарий by Blizzard
# Версия: 2.3b
# Перевод Devillion
# Тип: Каталог всех врагов
# Дата выпуска: 5.7.2006
# Дата v1.1: 18.9.2006
# Дата v1.2b: 23.2.2007
# Дата v1.3b: 7.7.2007
# Дата v2.0b: 12.7.2007
# Дата v2.1b: 6.8.2007
# Дата v2.2b: 24.9.2007
# Дата v2.21b: 8.4.2008
# Дата v2.3b: 28.7.2009
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#   
#  Эта работа находится под защитой следующих линцензий:
# #----------------------------------------------------------------------------
# #  
# #  Creative Commons - Attribution-NonCommercial-ShareAlike 3.0 Unported
# #  ( http://creativecommons.org/licenses/by-nc-sa/3.0/ )
# #  
# #  Вы можете заниматься:
# #  
# #  Совместным использованием - копировать,распостранять и передавать работу
# #  Переделывать работу
# #  
# #  При соблюдении следующих условий:
# #  
# #  Атрибуция.Вы должны указывать автора данной работы.
# #  
# #  Некоммерческое.Вы не можете использовать это в коммерческих целях.
# #  
# #----------------------------------------------------------------------------
# 
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
# 
# Совместимость:
# 
#   98% совместимость с SDK v1.x. 70% совместимость с SDK v2.x. Могут возникнуть
#   проблемы совместимости с экзотическими CBS. Старые сохранения не работают.
# 
# 
# Особенности:
# 
#   - Дисплей с полной информацией о враге
#   - Возможность отключить показ различной информации
#   - Встроенная поддержка скрипта "Advanced Analyze System"
#   - Нажать SHIFT/ENTER чтобы изменить внешний вид окна Бестиария
#   - Используйте Верх\Вниз\Влево\Вправо для навигации по базе данных
# 
# Новое в v1.1b:
#   - исправлены баги
# 
# Новое в v1.2b:
#   - улучшение кода(использует меньше оперативной памяти,обрабатывает быстрее)
# 
# Новое в v1.3b:
#   - улучшенная совместимость
# 
# Новое в v2.0b:
#   - полностью переделаны и исправлены проблемы с совместимостью
# 
# Новое в v2.1b:
#   - добавлена возможность пользовательской информации
# 
# Новое в v2.2b:
#   - переписаны условия с использованием классического синтаксиса,
#     чтобы избежать RGSS ошибку кондиционирования
#   - добавлена ​​опция SORT_BEASTS
#   - улучшен код
# 
# Новое в v2.21b:
#   - улучшен код
# 
# Новое в v2.3b:
#   - улучшен код
# 
# 
# Инструкция:
# 
# - Описание:
# 
#   Этот скрипт позволяет получать информацию о враге, с которым игрок хоть
#   раз встретился.Он так же имеет встроенную совместимость с моим скриптом
#   "Advanced Analyze System".Очень удобный скрипт который можно использовать
#   в играх типа серии Покемонов.
#
# - Настройка:
# 
#   Часть настроек ниже используется для анализа того,какими способностями. 
#   пользуется враг.Нужно добавить идентификаторы с припиской ANALYZE_IDS. 
#   и разделить их запятыми.Если у вас есть один или несколько сценариев 
#   использования фиктивных элементов, не забудьте включить каждый 
#   ID элемента с припиской ELM_DUMMIES, а также через запятую. 
#   Ниже все объясняется,как установить бестиарий вверх.Он имеет дополнительные 
#   параметры для показа одного или всех врагов "Неизвестная" и 
#   добавление их в бестиарий. Позже вы можете использовать 
#   синтаксис, описанный ниже, для отображения их информации.Вы можете 
#   использовать $ game_system.bestiary_missing? чтобы проверить,какие враги
#   не были добавлены в бестиарий. Если вы хотите увидеть, какие враги 
#   были добавлены, используйте $ game_system.beasts.size
# 
# Важные замечания:
# 
#   Вы должны настроить написанное ниже,если у вас есть скрипты,которые 
#   используют фиктивные элементы. Нельзя давать врагам более 11 статус эффектов
#   одного типа (например,12 элементов поглощения), потому что 12 и следующие
#   статусы\эффекты не будут отображаться на экране.
# 
# Обо всех найденных багах, пишите сюда:
# http://www.chaosproject.co.nr
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=

#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Начало настройки
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

ELM_DUMMIES = [] # включает КАЖДЫЙ ID элемента,используемый другими скриптами
STA_DUMMIES = [] # включает КАЖДЫЙ ID статус эффекта, используемый вами
EVASION = 'Страх' # надпись "Страх"
MAP_BACKGROUND = true # true показывает карту на фоне,ошибки не будет.
BESTIARY_SIZE = 999 # установка размера бестиария
NEVER_ADD = [] # включает идентификаторы врагов, которые никогла не будут 
#                добавлены
SORT_BEASTS = true # Установите значение false,если вы не хотите чтобы все враги 
#                    были отсортированы по ID
# идентификатор от врагов которые неизвестны(например, боссы),чтобы враг
# враг остался неизвестным,вызовите скрипт $game_system.enable(ENEMY_ID)

if $override_bestiary
  UNKNOWN = [4] # Переопределяет команды которые находятся ниже
else
  UNKNOWN = [] # НЕ ТРОГАТЬ ЭТО
end

# Каждый враг первоначально неизвестен,так что вам не придется
# вводить все IDs в базу данных

ALL_UNKNOWN = false

# введите true чтобы отключить отображение основной информации
DISABLE_BEAST_BASIC = false
# введите true чтобы отключить отображение основной статистики
DISABLE_BEAST_STATS = false
# введите true чтобы отключить отображение расширенной статистики
DISABLE_BEAST_EXTSTATS = false
# введите true чтобы отключить отображение крайних слабостей
DISABLE_BEAST_XTRWEAK = false
# введите true чтобы отключить отображение слабостей
DISABLE_BEAST_WEAK = false
# введите true чтобы отключить отображение элементов сопротивления
DISABLE_BEAST_RESIST = false
# введите true чтобы отключить отображение недействующих элементов
DISABLE_BEAST_NULLIFY = false
# введите true чтобы отключить отображение элементов поглощения
DISABLE_BEAST_ABSORB = false
# введите true чтобы отключить отображение крайних слабостей
DISABLE_BEAST_XTRWEAK_S = false
# введите true чтобы отключить отображение слабости
DISABLE_BEAST_WEAK_S = false
# введите true чтобы отключить отображение элементов сопротивления
DISABLE_BEAST_RESIST_S = false
# введите true чтобы отключить отображение статуса смерти
DISABLE_BEAST_NULLIFY_S = false
# введите true чтобы отключить отображение статусов поглощения
DISABLE_BEAST_ABSORB_S = false
# введите false чтобы включить пользовательский дисплей
DISABLE_BEAST_CUSTOM = false

#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Конец настройки
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

if $DUMMY_ELEMENTS == nil
  $DUMMY_ELEMENTS = ELM_DUMMIES.clone
else
  $DUMMY_ELEMENTS |= ELM_DUMMIES
end
ELM_DUMMIES = nil
if $DUMMY_STATES == nil
  $DUMMY_STATES = STA_DUMMIES.clone
else
  $DUMMY_STATES |= STA_DUMMIES
end
STA_DUMMIES = nil

$bestiary_enabled = 2.3

#==============================================================================
# Game_System
#==============================================================================

class Game_System
  
  attr_accessor :window_mode
  attr_accessor :known
  
  def get_bestiary_info(id)
    return get_analyze_info(id) if $override_bestiary_info
    case id
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Информация по настройке описания монстров
# 
# Используйте следующий шаблон,чтобы добавить описание монстров:
# 
#    when ID then return "Описание"
# 
# Где ID - ID врага в базе данных.
# Где Описание - пишем описание к нашему врагу(примеры вы видите ниже)
# Описание нужно писать на одной строке, иначе оно будет отображаться неправильно
# Нужно использовать двойные кавычки при вводе описания
# Если нужно использовать косую черту (\),но вылезает ошибка или она не отображается
# Сделайте ее в другую сторону (/)
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    when 1 then return "Я ненавижу призраков!Убейте их за меня!"
    when 2 then return "Этот монстр похож на медузу-горгону и я его ненавижу!"
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# Конец информации по настройке базы данных
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    end
    return 'Отсутствует'
  end

  alias init_beast_later initialize
  def initialize
    init_beast_later
    @window_mode, @beasts, @known = 0, [], []
  end
  
  def beasts
    return ($bestiary_override ? @analyzed : @beasts) - NEVER_ADD
  end
  
  def add_beast(beast)
    unless @beasts.include?(beast)
      @beasts.push(beast)
      @beasts.sort! if SORT_BEASTS
    end
  end
  
  def bestiary_missing?
    return (BESTIARY_SIZE - @beasts.size)
  end
  
  def enable(id)
    $game_system.known.push(id) unless $game_system.known.include?(id)
    return
  end
  
end

#==============================================================================
# RPG::Enemy
#==============================================================================

class RPG::Enemy
  
  def known
    return ($game_system.known.include?(self.id)) if ALL_UNKNOWN
    return (!UNKNOWN.include?(self.id))
  end
  
end

#==============================================================================
# Window_Base
#==============================================================================

class Window_Base
  
  def draw_bestiary_battler(enemy, w, h)
    bitmap = RPG::Cache.battler(enemy.battler_name, enemy.battler_hue)
    bitmap_w = bitmap.width / 2
    bitmap_h = bitmap.height / 2
    src_rect = Rect.new(0, 0, bitmap.width, bitmap.height)
    self.contents.blt(w/2 - bitmap_w, h/2 - bitmap_h, bitmap, src_rect, 192)
  end
  
end

#==============================================================================
# Bitmap
#==============================================================================

class Bitmap
  
  def slice_text(text, width)
    words = text.split(' ')
    return words if words.size == 1
    result, current_text = [], words.shift
    words.each_index {|i|
        if self.text_size("#{current_text} #{words[i]}").width > width
          result.push(current_text)
          current_text = words[i]
        else
          current_text = "#{current_text} #{words[i]}"
        end
        result.push(current_text) if i >= words.size - 1}
    return result
  end
  
end

#==============================================================================
# Window_Beast
#==============================================================================

class Window_Beast < Window_Base

  attr_accessor :mode
  
  def initialize
    super(0, 0, 576, 416)
    @index_enemy = 0
    @index_page = 0
    @d = [DISABLE_BEAST_BASIC, DISABLE_BEAST_STATS, DISABLE_BEAST_EXTSTATS,
          DISABLE_BEAST_XTRWEAK, DISABLE_BEAST_WEAK, DISABLE_BEAST_RESIST,
          DISABLE_BEAST_NULLIFY, DISABLE_BEAST_ABSORB, DISABLE_BEAST_XTRWEAK_S,
          DISABLE_BEAST_WEAK_S, DISABLE_BEAST_RESIST_S, DISABLE_BEAST_NULLIFY_S,
          DISABLE_BEAST_ABSORB_S, DISABLE_BEAST_CUSTOM]
    @pages = 14 - ((0..13).find_all {|i| @d[i]}).size
    @mode = $game_system.window_mode
    @enemies = []
    for id in ($override_bestiary ? $game_system.analyzed : $game_system.beasts)
      @enemies.push($data_enemies[id]) if id != nil
    end
    self.contents = Bitmap.new(width - 32, height - 32)
    if $fontface != nil
      self.contents.font.name = $fontface
      self.contents.font.size = $fontsize
    elsif $defaultfonttype != nil
      self.contents.font.name = $defaultfonttype
      self.contents.font.size = $defaultfontsize
    end
    self.x = 320 - self.width / 2
    self.y = 240 - self.height / 2
    refresh
  end
  
  def update
    return if @enemies.size == 0
    if Input.trigger?(Input::RIGHT)
      $game_system.se_play($data_system.cursor_se)
      @index_enemy = (@index_enemy + 1) % @enemies.size
      refresh
    elsif Input.trigger?(Input::LEFT)
      $game_system.se_play($data_system.cursor_se)
      @index_enemy = (@index_enemy + @enemies.size - 1) % @enemies.size
      refresh
    elsif Input.trigger?(Input::DOWN)
      $game_system.se_play($data_system.cursor_se)
      @index_page = (@index_page + 1) % @pages
      refresh
    elsif Input.trigger?(Input::UP)
      $game_system.se_play($data_system.cursor_se)
      @index_page = (@index_page + @pages - 1) % @pages
      refresh
    end
  end
  
  def refresh
    self.contents.clear
    x = y = 0
    ox = x + 64
    enemy = @enemies[@index_enemy]
    if enemy == nil
      self.contents.draw_text(0, 64, 544, 32, 'Бестиарий пуст', 1)
      return
    end
    self.contents.draw_text(0, 0, 544, 32, "#{enemy.id}.  #{enemy.name}", 1)
    draw_bestiary_battler(enemy, self.width, self.height)
    if enemy.known
      case @index_page
      when (0 - ((0..0).find_all {|i| @d[i]}).size)
        if enemy.item_id > 0
          drop = $data_items[enemy.item_id]
          t = "#{drop.name} (#{enemy.treasure_prob}% chance)"
        elsif enemy.weapon_id > 0
          drop = $data_weapons[enemy.weapon_id]
          t = "#{drop.name} (#{enemy.treasure_prob}% chance)"
        elsif enemy.armor_id > 0
          drop = $data_armors[enemy.armor_id]
          t = "#{drop.name} (#{enemy.treasure_prob}% chance)"
        end
        self.contents.draw_text(x, 32, 128, 32, $data_system.words.hp)
        self.contents.draw_text(x, 96, 128, 32, $data_system.words.sp)
        self.contents.draw_text(x, 160, 128, 32, 'Опыт')
        self.contents.draw_text(x, 224, 128, 32, $data_system.words.gold)
        self.contents.draw_text(x, 288, 128, 32, 'Вещи')
        self.contents.draw_text(ox, 64, 256, 32, enemy.maxhp.to_s)
        self.contents.draw_text(ox, 128, 256, 32, enemy.maxsp.to_s)
        self.contents.draw_text(ox, 192, 256, 32, enemy.exp.to_s)
        self.contents.draw_text(ox, 256, 256, 32, enemy.gold.to_s)
        self.contents.draw_text(ox, 320, 256, 32, (drop != nil ? t : 'Ничего'))
      when (1 - ((0..1).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 128, 32, $data_system.words.str)
        self.contents.draw_text(x, 96, 128, 32, $data_system.words.dex)
        self.contents.draw_text(x, 160, 128, 32, $data_system.words.agi)
        self.contents.draw_text(x, 224, 128, 32, $data_system.words.int)
        self.contents.draw_text(ox, 64, 256, 32, enemy.str.to_s)
        self.contents.draw_text(ox, 128, 256, 32, enemy.dex.to_s)
        self.contents.draw_text(ox, 256, 256, 32, enemy.agi.to_s)
        self.contents.draw_text(ox, 192, 256, 32, enemy.int.to_s)
      when (2 - ((0..2).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 128, 32, $data_system.words.atk)
        self.contents.draw_text(x, 96, 128, 32, $data_system.words.pdef)
        self.contents.draw_text(x, 160, 128, 32, $data_system.words.mdef)
        self.contents.draw_text(x, 224, 128, 32, EVASION)
        self.contents.draw_text(ox, 64, 256, 32, enemy.atk.to_s)
        self.contents.draw_text(ox, 128, 256, 32, enemy.pdef.to_s)
        self.contents.draw_text(ox, 192, 256, 32, enemy.mdef.to_s)
        self.contents.draw_text(ox, 256, 256, 32, enemy.eva.to_s)
      when (3 - ((0..3).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Супер эффективный элемент:')
        draw_elements(enemy, x, 1)
      when (4 - ((0..4).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Эффективный элемент:')
        draw_elements(enemy, x, 2)
      when (5 - ((0..5).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Сопротивление элементу:')
        draw_elements(enemy, x, 4)
      when (6 - ((0..6).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Элемент не действует:')
        draw_elements(enemy, x, 5)
      when (7 - ((0..7).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Элемент поглощается:')
        draw_elements(enemy, x, 6)
      when (8 - ((0..8).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Супер эффективные статусы:')
        draw_states(enemy, x, 1)
      when (9 - ((0..9).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Эффективные статусы:')
        draw_states(enemy, x, 2)
      when (10 - ((0..10).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Сопротивление к статусам:')
        draw_states(enemy, x, 4)
      when (11 - ((0..11).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Сильное сопротивление к статусам:')
        draw_states(enemy, x, 5)
      when (12 - ((0..12).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Имуннитет к статусам:')
        draw_states(enemy, x, 6)
      when (13 - ((0..13).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Информация:')
        draw_info(enemy, x)
      end
    else
      self.contents.draw_text(0, 64, 544, 32, 'Отсутствует', 1)
    end
  end
  
  def draw_elements(enemy, x, index)
    elements = []
    (1...$data_system.elements.size).each {|id|
        if !$DUMMY_ELEMENTS.include?(id) &&
            index == $data_enemies[@enemies[@index_enemy].id].element_ranks[id]
          elements.push($data_system.elements[id])
        end}
    elements = ['Ничего'] if elements.size == 0
    elements.each_index {|i|
        self.contents.draw_text(x, 64 + i * 32, 544, 32, elements[i])}
  end
    
  def draw_states(enemy, x, index)
    states = []
    (1...$data_states.size).each {|id|
        if !$DUMMY_STATES.include?(id) &&
            index == $data_enemies[@enemies[@index_enemy].id].state_ranks[id]
          states.push($data_states[id].name)
        end}
    states = ['Ничего'] if states.size == 0
    states.each_index {|i|
        self.contents.draw_text(x, 64 + i * 32, 544, 32, states[i])}
  end
  
  def draw_info(enemy, x)
    text = self.contents.slice_text($game_system.get_bestiary_info(enemy.id), 528)
    text.each_index {|i|
        self.contents.draw_text(x, 64 + i*32, 544, 32, text[i])}
  end
    
end

#==============================================================================
# Scene_Bestiary
#==============================================================================

class Scene_Bestiary
  
  def main
    @spriteset = Spriteset_Map.new if MAP_BACKGROUND
    @beast_window = Window_Beast.new
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      break if $scene != self
    end
    Graphics.freeze
    @spriteset.dispose if MAP_BACKGROUND
    @beast_window.dispose
  end
  
  def update
    @beast_window.update
    if MAP_BACKGROUND && (Input.trigger?(Input::A) || Input.trigger?(Input::C))
      Graphics.freeze
      $game_system.se_play($data_system.cursor_se)
      case @beast_window.mode
      when 0 then @beast_window.back_opacity = 128
      when 1 then @beast_window.opacity = 0
      when 2 then @beast_window.opacity = @beast_window.back_opacity = 255
      end
      $game_system.window_mode = ($game_system.window_mode+1) % 3
      @beast_window.mode = $game_system.window_mode
      Graphics.transition(5)
    end
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Map.new
    end
  end


end
  
#==============================================================================
# Scene_Battle
#==============================================================================

class Scene_Battle
  
  alias update_beast_later update
  def update
    if @log == nil && !$override_bestiary
      @log = true
      $game_troop.enemies.each {|enemy| $game_system.add_beast(enemy.id)}
    end
    update_beast_later
  end
  
end
Untitled-1.jpgUntitled-2.jpgUntitled-3.jpg