Код:
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
#
# Pokemon Menu v2.00
#
# By Ryex
# Переведено Devillion
#==============================================================================
#
# Особенности:
# * Карта на фоне меню
# * Меню в стиле игр покемонов
# * Нет экипировки
# * Меню со способностями используется в списке покемонов
# * Модифицирован экран статуса
# * Количество жизни отображается полосой градиента
#
#==============================================================================
#
# Инструкция:
# Создайте новый скрипт над Main
#
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
#==============================================================================
# ** Window_Command
#------------------------------------------------------------------------------
# Это окно связано с выбором команды
#==============================================================================
class Window_Command_pokemon < Window_Selectable
#--------------------------------------------------------------------------
# * Инициализация объекта
# width : Ширина окна
# commands : Команда текстовой строки
#--------------------------------------------------------------------------
def initialize(commands, type)
# Командой вычисляется высота окна
if type == 0
super(480, 0, 160, commands.size * 32 + 32)
elsif type == 1
super(240, 176, 160, commands.size * 32 + 32)
end
self.z = 200
@item_max = commands.size
@commands = commands
self.contents = Bitmap.new(width - 32, @item_max * 32)
refresh
self.index = 0
end
#--------------------------------------------------------------------------
# * Обновление
#--------------------------------------------------------------------------
def refresh
self.contents.clear
for i in 0...@item_max
draw_item(i, normal_color)
end
end
#--------------------------------------------------------------------------
# * Рисунок предмета
# index : Номер предмета
# color : Цвет текста
#--------------------------------------------------------------------------
def draw_item(index, color)
self.contents.font.color = color
rect = Rect.new(4, 32 * index, self.contents.width - 8, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
self.contents.draw_text(rect, @commands[index])
end
#--------------------------------------------------------------------------
# * Отсутствие предмета
# index : Номер предмета
#--------------------------------------------------------------------------
def disable_item(index)
draw_item(index, disabled_color)
end
end
#==============================================================================
# ** Scene_Menu
#------------------------------------------------------------------------------
# Этот класс выполняет обработку меню
#==============================================================================
class Scene_Menu
#--------------------------------------------------------------------------
# * Инициализация объекта
# menu_index : Начальная позиция курсора в меню
#--------------------------------------------------------------------------
def initialize(menu_index = 0)
@menu_index = menu_index
end
#--------------------------------------------------------------------------
# * Основная обработка
#--------------------------------------------------------------------------
def main
# Эта команда делает карту на заднем фоне
@map = Spriteset_Map.new
# Эта команда вызывает окно
s1 = $data_system.words.item
s2 = "Покемоны"
s3 = "Сохранить"
s4 = "Выход"
@command_window = Window_Command_pokemon.new([s1, s2, s3, s4], 0)
@command_window.index = @menu_index
# Если членов партии равно 0
if $game_party.actors.size == 0
# Отстутствие предметов,способностей, экипировки и статуса
@command_window.disable_item(0)
@command_window.disable_item(1)
end
# Если сохранение запрещено
if $game_system.save_disabled
# Отключение сохрания
@command_window.disable_item(2)
end
# Выполнение перехода
Graphics.transition
# Основной цикл
loop do
# Обновление игрового экрана
Graphics.update
# Обновление входящей информации
Input.update
# Обновление кадров
update
# Прерывание цикла, если экран изменился
if $scene != self
break
end
end
# Подготовка к переходу
Graphics.freeze
# Утилизация окна
@command_window.dispose
@map.dispose
end
#--------------------------------------------------------------------------
# * Обновление кадров
#--------------------------------------------------------------------------
def update
# Обновление окна
@command_window.update
@map.update
# Если команда в активном режиме, то вызывается update_command
if @command_window.active
update_command
return
end
end
#--------------------------------------------------------------------------
# * Обновление кадров(если команда активна)
#--------------------------------------------------------------------------
def update_command
# Если была нажата кнопка B
if Input.trigger?(Input::B)
# Отмена проигрывания SE
$game_system.se_play($data_system.cancel_se)
# Перейти на экран карты
$scene = Scene_Map.new
return
end
# Если была нажата кнопка С
if Input.trigger?(Input::C)
# Если команда, кроме сохранения или в конце игры, и члены партии = 0
if $game_party.actors.size == 0 and @command_window.index < 4
# Проигрывание SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Отделение командой позиции курсора в окне
case @command_window.index
when 0 # Вещи
# Проиграть SE
$game_system.se_play($data_system.decision_se)
# Перейти в инвентарь
$scene = Scene_Item.new
when 1 # Статус
# Проиграть SE
$game_system.se_play($data_system.decision_se)
# Сделать статус активного окна
$scene = Scene_Status.new
when 2 # save
# Если сохранение запрещено
if $game_system.save_disabled
# Проиграть SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Проиграть SE
$game_system.se_play($data_system.decision_se)
# Перейти нв экран сохранения
$scene = Scene_Save.new
when 3 # Конец игры
# Проиграть SE
$game_system.se_play($data_system.decision_se)
# Перейсти на экран конца игры
$scene = Scene_End.new
end
return
end
end
end
class Window_Base < Window
#----------------------------------------------------------------------------
# x: x
# y: y
# m: Максимальная ширина
# a: Актер
#----------------------------------------------------------------------------
def draw_actor_hp_bar_ryex(x, y, m, actor)
gray = Color.new(100, 100, 100)
h = 10
p = actor.hp.to_f / actor.maxhp
for i in 0...(h - 2)
self.contents.fill_rect(x + (h - i - 1), y + i, m - h, 1, Color.new(0, 0, 0))
end
for i in 0...(h - 2)
ty = y + (h - 2) - (i + 1)
gr = gray.red * i / (h - 2)
gg = gray.green * i / (h - 2)
gb = gray.blue * i / (h - 2)
self.contents.fill_rect(x + (h + i - 1) - 6, ty, m - h - 2, 1, Color.new(gr, gg, gb, 192))
end
if p > 0.5
c = Color.new(0, 255, 0)
elsif p < 0.1
c = Color.new(255, 0, 0)
elsif p < 0.5
c = Color.new(255, 100, 0)
end
for i in 0...(h - 2)
r = c.red * i / (h - 2)
g = c.green * i / (h - 2)
b = c.blue * i / (h - 2)
self.contents.fill_rect(x + (h - i - 1), y + i, p * (m - h - 2), 1, Color.new(r, g, b))
end
end
def draw_actor_sp_bar_ryex(x, y, m, actor)
gray = Color.new(100, 100, 100)
h = 10
p = actor.sp.to_f / actor.maxsp
for i in 0...(h - 2)
self.contents.fill_rect(x + (h - i - 1), y + i, m - h, 1, Color.new(0, 0, 0))
end
for i in 0...(h - 2)
ty = y + (h - 2) - (i + 1)
gr = gray.red * i / (h - 2)
gg = gray.green * i / (h - 2)
gb = gray.blue * i / (h - 2)
self.contents.fill_rect(x + (h + i - 1) - 6, ty, m - h - 2, 1, Color.new(gr, gg, gb, 192))
end
c = Color.new(0, 0, 255)
for i in 0...(h - 2)
r = c.red * i / (h - 2)
g = c.green * i / (h - 2)
b = c.blue * i / (h - 2)
self.contents.fill_rect(x + (h - i - 1), y + i, p * (m - h - 2), 1, Color.new(r, g, b))
end
end
def draw_actor_exp_bar_ryex(x, y, m, actor)
gray = Color.new(100, 100, 100)
h = 10
p = actor.exp.to_f / actor.next_exp_s.to_i
for i in 0...(h - 2)
self.contents.fill_rect(x + (h - i - 1), y + i, m - h, 1, Color.new(0, 0, 0))
end
for i in 0...(h - 2)
ty = y + (h - 2) - (i + 1)
gr = gray.red * i / (h - 2)
gg = gray.green * i / (h - 2)
gb = gray.blue * i / (h - 2)
self.contents.fill_rect(x + (h + i - 1) - 6, ty, m - h - 2, 1, Color.new(gr, gg, gb, 192))
end
c = Color.new(255, 255, 0)
for i in 0...(h - 2)
r = c.red * i / (h - 2)
g = c.green * i / (h - 2)
b = c.blue * i / (h - 2)
self.contents.fill_rect(x + (h - i - 1), y + i, p * (m - h - 2), 1, Color.new(r, g, b))
end
end
end
#==============================================================================
# ** Window_MenuStatus
#------------------------------------------------------------------------------
# Это окно показывает статус партии в меню
#==============================================================================
class Window_MenuStatus < Window_Selectable
#--------------------------------------------------------------------------
# * Инициализация обьекта
#--------------------------------------------------------------------------
def initialize
super(0, 0, 640, 480)
self.contents = Bitmap.new(width - 32, height - 32)
refresh
self.active = false
self.index = -1
end
#--------------------------------------------------------------------------
# * Обновление
#--------------------------------------------------------------------------
def refresh
self.contents.clear
@item_max = $game_party.actors.size
for i in 0...$game_party.actors.size
x = 64
y = i * 76
actor = $game_party.actors[i]
draw_actor_graphic(actor, x - 40, y + 64 )
draw_actor_name(actor, x, y)
draw_actor_class(actor, x + 200, y)
draw_actor_level(actor, x + 400, y)
draw_actor_state(actor, x + 100, y )
draw_actor_exp_bar_ryex(x + 400, y + 45, 120, actor)
draw_actor_hp_bar_ryex(x + 10, y + 45, 120, actor)
draw_actor_hp(actor, x, y + 34)
draw_actor_sp_bar_ryex(x + 200, y + 45, 120, actor)
draw_actor_sp(actor, x + 200, y + 34)
end
end
#--------------------------------------------------------------------------
# * Обновление курсора
#--------------------------------------------------------------------------
def update_cursor_rect
if @index < 0
self.cursor_rect.empty
else
self.cursor_rect.set(0, @index * 76, self.width - 32, 80)
end
end
end
class Window_stats_Pokemon < Window_Selectable
def initialize(actor_index = nil)
super(208, 48, 224, 384)
self.contents = Bitmap.new(width - 32, height - 32)
if actor_index != nil
@actor = $game_party.actors[actor_index]
else
@actor = nil
end
refresh
self.active = false
self.z = 99
end
def refresh
self.contents.clear
if @actor != nil
draw_actor_name(@actor, 0, 0)
draw_actor_class(@actor, 0, 32)
draw_actor_parameter(@actor, 0, 128, 0)
draw_actor_parameter(@actor, 0, 160, 1)
draw_actor_parameter(@actor, 0, 192, 2)
draw_actor_parameter(@actor, 0, 224, 3)
draw_actor_parameter(@actor, 0, 256, 4)
draw_actor_parameter(@actor, 0, 288, 5)
draw_actor_parameter(@actor, 0, 320, 6)
end
end
end
#==============================================================================
# ** Scene_Status
#------------------------------------------------------------------------------
# Этот класс выполняет обработку состояния экрана
#==============================================================================
class Scene_Status
#--------------------------------------------------------------------------
# * Инициализация обьекта
# actor_index : Номер актера
#--------------------------------------------------------------------------
def initialize(actor_index = 0, equip_index = 0)
@actor_index = actor_index
end
#--------------------------------------------------------------------------
# * Главная обработка
#--------------------------------------------------------------------------
def main
# Создание командного окна
s1 = "Статус"
s2 = "Способности"
@command_window = Window_Command_pokemon.new([s1, s2], 1)
if $game_party.actors.size == 0
# Отстутствие предметов, способностей,экипировки и статуса
@command_window.disable_item(0)
@command_window.disable_item(1)
@command_window.disable_item(2)
end
# Создания окна статуса
@status_window = Window_MenuStatus.new
@stat_window = Window_stats_Pokemon.new
# Выполнение перехода
Graphics.transition
# Главный цикл
loop do
# Обновление игрового экрана
Graphics.update
# Обновление ввода информации
Input.update
# Обновление кадров
update
# Прерываение цикла,если экран изменился
if $scene != self
break
end
end
# Подготовка к переходу
Graphics.freeze
# Утилизация окна
@command_window.dispose
@status_window.dispose
@stat_window.dispose
end
#--------------------------------------------------------------------------
# * Обновление кадров
#--------------------------------------------------------------------------
def update
# Обновление окна
@command_window.update
@status_window.update
@stat_window.update
# Если командное окно активно: call update_command
if @command_window.active
update_command
return
end
# Если окно статуса активно: call update_status
if @status_window.active
update_status
return
end
if @stat_window.active
update_stat
return
end
end
def update_command
# Если нажата кнопка В
if Input.trigger?(Input::B)
# Отмена проигрывания SE
$game_system.se_play($data_system.cancel_se)
# Перейти на экран карты
$scene = Scene_Menu.new
return
end
# Если нажата кнопка С
if Input.trigger?(Input::C)
# Если команда, кроме сохранения или в конце игры, и члены партии = 0
if $game_party.actors.size == 0 and @command_window.index < 4
# Проигрывание SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Отделение командой позиции курсора в окне
case @command_window.index
when 0 # status
# Проигрывание SE
$game_system.se_play($data_system.decision_se)
# Создание статуса в активном окне
@command_window.active = false
@command_window.z = 50
@status_window.active = true
@status_window.index = 0
when 1 # Способность
# Проиграть SE
$game_system.se_play($data_system.decision_se)
# Создание статуса в активном окне
@command_window.active = false
@command_window.z = 50
@status_window.active = true
@status_window.index = 0
end
return
end
end
#--------------------------------------------------------------------------
# * Обновление кадров(если команда активна)
#--------------------------------------------------------------------------
def update_status
# Если нажата кнопка В
if Input.trigger?(Input::B)
# Отмена проигрывания SE
$game_system.se_play($data_system.cancel_se)
# СОздание команды в активном окне
@command_window.active = true
@command_window.z = 200
@status_window.active = false
@status_window.index = -1
return
end
# Если нажата кнопка С
if Input.trigger?(Input::C)
# Отделение командой позиции курсора в окне
case @command_window.index
when 0 # Статус
# Проиграть SE
$game_system.se_play($data_system.decision_se)
# Перейти на экран статуса
@status_window.active = false
@stat_window.dispose
@stat_window = Window_stats_Pokemon.new(@status_window.index)
@stat_window.active = true
@stat_window.z = 200
when 1 # Способности
# Если предел действий этого актера 2 и более
if $game_party.actors[@status_window.index].restriction >= 2
# Проиграть SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Проиграть SE
$game_system.se_play($data_system.decision_se)
# Перейти на экран способностей
$scene = Scene_Skill.new(@status_window.index)
end
return
end
end
def update_stat
# Если нажата кнопка В
if Input.trigger?(Input::B)
# Отмена проигрывания SE
$game_system.se_play($data_system.cancel_se)
# Создание команды в активном окне
@status_window.active = true
@stat_window.dispose
@stat_window = Window_stats_Pokemon.new
@stat_window.z = 50
@stat_window.active = false
return
end
end
end
#==============================================================================
# ** Window_Target
#------------------------------------------------------------------------------
# Это окно выбора цели для актера в инвентаре и меню способностей
#==============================================================================
class Window_Target < Window_Selectable
#--------------------------------------------------------------------------
# * Обновление
#--------------------------------------------------------------------------
def refresh
self.contents.clear
for i in 0...$game_party.actors.size
x = 4
y = i * 116
actor = $game_party.actors[i]
draw_actor_name(actor, x, y)
draw_actor_class(actor, x + 144, y)
draw_actor_level(actor, x + 8, y + 32)
draw_actor_state(actor, x + 8, y + 64)
draw_actor_hp_bar_ryex(x + 152, y + 44, 120, actor)
draw_actor_hp(actor, x + 152, y + 32)
draw_actor_sp_bar_ryex(x + 152, y + 76, 120, actor)
draw_actor_sp(actor, x + 152, y + 64)
end
end
end
#==============================================================================
# ** Window_SkillStatus
#------------------------------------------------------------------------------
# Это окно показывает уровень способности персонажа на экране способностей
#==============================================================================
class Window_SkillStatus < Window_Base
#--------------------------------------------------------------------------
# * Обновление
#--------------------------------------------------------------------------
def refresh
self.contents.clear
draw_actor_name(@actor, 4, 0)
draw_actor_state(@actor, 140, 0)
draw_actor_hp_bar_ryex(284, 12, 120, @actor)
draw_actor_hp(@actor, 284, 0)
draw_actor_sp_bar_ryex(460, 12, 120, @actor)
draw_actor_sp(@actor, 460, 0)
end
end
#==============================================================================
# ** Scene_Skill
#------------------------------------------------------------------------------
# Этот класс выполняет обработку способностей на экране
#==============================================================================
class Scene_Skill
#--------------------------------------------------------------------------
# * Обновление кадров (если окно способностей активно)
#--------------------------------------------------------------------------
def update_skill
# Если нажата кнопка В
if Input.trigger?(Input::B)
# Отмена проигрывания SE
$game_system.se_play($data_system.cancel_se)
# Перейти в главное меню
$scene = Scene_Status.new
return
end
# Если нажата кнопка С
if Input.trigger?(Input::C)
# Получение данных по выбранной способности
@skill = @skill_window.skill
# Если нельзя использовать
if @skill == nil or not @actor.skill_can_use?(@skill.id)
# Проиграть SE
$game_system.se_play($data_system.buzzer_se)
return
end
# Проиграть SE
$game_system.se_play($data_system.decision_se)
# Если используется на союзника
if @skill.scope >= 3
# Активация цели в окне
@skill_window.active = false
@target_window.x = (@skill_window.index + 1) % 2 * 304
@target_window.visible = true
@target_window.active = true
# Установка курсора на месте использования (один\все)
if @skill.scope == 4 || @skill.scope == 6
@target_window.index = -1
elsif @skill.scope == 7
@target_window.index = @actor_index - 10
else
@target_window.index = 0
end
# Если эффект использования не нужен союзнику
else
# Если ID общего события действительно
if @skill.common_event_id > 0
# Команда вызова общего события
$game_temp.common_event_id = @skill.common_event_id
# Проиграть SE используемой способности
$game_system.se_play(@skill.menu_se)
# Использоать SP
@actor.sp -= @skill.sp_cost
# Восстановление содержания каждого окна
@status_window.refresh
@skill_window.refresh
@target_window.refresh
# Перейти на экра карты
$scene = Scene_Map.new
return
end
end
return
end
# Если нажата кнопка R
if Input.trigger?(Input::R)
# Проиграть SE
$game_system.se_play($data_system.cursor_se)
# К следующему актеру
@actor_index += 1
@actor_index %= $game_party.actors.size
# Перейти на другой экран способностей
$scene = Scene_Skill.new(@actor_index)
return
end
# Если нажата кнопка L
if Input.trigger?(Input::L)
# Проиграть SE
$game_system.se_play($data_system.cursor_se)
# Предыдущий актер
@actor_index += $game_party.actors.size - 1
@actor_index %= $game_party.actors.size
# Перейти на другой экран способностей
$scene = Scene_Skill.new(@actor_index)
return
end
end
end
#==============================================================================
# ** Scene_Save
#------------------------------------------------------------------------------
# Этот класс выполняет вызов жкрана сохранения игры
#==============================================================================
class Scene_Save < Scene_File
#--------------------------------------------------------------------------
# * Обработка решения
#--------------------------------------------------------------------------
def on_decision(filename)
# Проиграть SE сохранения
$game_system.se_play($data_system.save_se)
# Запись сохраненного файла
file = File.open(filename, "wb")
write_save_data(file)
file.close
# Если вызвано событие
if $game_temp.save_calling
# Очистка сохранения
$game_temp.save_calling = false
# Перейти на экран карты
$scene = Scene_Map.new
return
end
# Перейти в меню
$scene = Scene_Menu.new(1)
end
#--------------------------------------------------------------------------
# * Отмена процесса
#--------------------------------------------------------------------------
def on_cancel
# Проиграть SE отмены
$game_system.se_play($data_system.cancel_se)
# Если вызвано событие
if $game_temp.save_calling
# Очистка сохранения
$game_temp.save_calling = false
# Перейти на экран карты
$scene = Scene_Map.new
return
end
# Перейти в меню
$scene = Scene_Menu.new(1)
end
end
#==============================================================================
# ** Scene_End
#------------------------------------------------------------------------------
# Этот класс обрабатывает экран окончания игры
#==============================================================================
class Scene_End
#--------------------------------------------------------------------------
# * Обновление кадров
#--------------------------------------------------------------------------
def update
# Обновление командного окна
@command_window.update
# Если нажата кнопка В
if Input.trigger?(Input::B)
# Проиграть SE отмены
$game_system.se_play($data_system.cancel_se)
# Перейти в меню
$scene = Scene_Menu.new(0)
return
end
# Если нажата кнопка С
if Input.trigger?(Input::C)
# Отделение командой позиции курсора в окне
case @command_window.index
when 0 # В меню
command_to_title
when 1 # Выход из игры
command_shutdown
when 2 # Отмена
command_cancel
end
return
end
end
#--------------------------------------------------------------------------
# * Процесс при выборе команды [Отмена]
#--------------------------------------------------------------------------
def command_cancel
# Проиграть SE
$game_system.se_play($data_system.decision_se)
# Переход в главное меню
$scene = Scene_Menu.new(0)
end
end
Социальные закладки