Код:
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
# Бестиарий 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
Социальные закладки