Скрипт изменяет структуру меню предметов, добавляя фильтрацию по различным критериям
Скрипт использует мой кривенький аддончег, так что его цепляем в обязательном порядке. Траблы возможны только в том случае, если ваши кастомные скрипты будут менять тоже, что и мои.
Код:
#==============================================================================
# EK Addon v.1.0b
#------------------------------------------------------------------------------
# Created by: Equilibrium Keeper [equilibriumkeeper@inbox.com]
# Created on: 25.05.2008 22:20:49
#==============================================================================
# Description: The given package of scripts expands opportunities of original
# functions. All made changes are described below. Problems can arise only in
# the event that you use the scripts changing теже the functions.
#------------------------------------------------------------------------------
# Install: Make a new blank script page above main and copy this script.
#==============================================================================
# Window_Command:
# 1. Procedure of a call is changed:
# (width, commands, column_max = 1, row_max = 0, spacing = 32, textalign = 0)
# textalign << Change text align (0 - Left; 1 - Center; 2 - Right)
#
#------------------------------------------------------------------------------
# Window_Help:
# 1. Procedure of a call is changed:
# (x = 0, y = 0, width = 544, height = WLH + 32)
#==============================================================================
class Window_Command < Window_Selectable
def initialize(width, commands, column_max = 1, row_max = 0, spacing = 32, textalign = 0)
if row_max == 0
row_max = (commands.size + column_max - 1) / column_max
end
super(0, 0, width, row_max * WLH + 32, spacing)
@commands = commands
@item_max = commands.size
@column_max = column_max
@textalign = textalign
refresh
self.index = 0
end
def draw_item(index, enabled = true)
rect = item_rect(index)
rect.x += 4
rect.width -= 8
self.contents.clear_rect(rect)
self.contents.font.color = normal_color
self.contents.font.color.alpha = enabled ? 255 : 128
self.contents.draw_text(rect, @commands[index], @textalign)
end
end
#==============================================================================
class Window_Help < Window_Base
def initialize(x = 0, y = 0, width = 544, height = WLH + 32)
super(x, y, width, height)
end
end
#==============================================================================
Код:
#==============================================================================
# EK Items Menu v.1.4b
#------------------------------------------------------------------------------
# Created by: Equilibrium Keeper [equilibriumkeeper@inbox.com]
# Created on: 26.05.2008 17:29:18
# Отдельное спасибо: Рольф, ANNxiousity, insider
# А так же: rpgmaker.sk6.ru, rpg-maker.info, rpgmakervx.net
#==============================================================================
# Описание: Скрипт изменяет структуру меню предметов, добавляя фильтрацию
# по различным критериям
#------------------------------------------------------------------------------
# Требования: Addon Equilibrium Keeper'а версии 1.00 или выше
# Установка: В редакторе скриптов создайте чистую страницу над "Main" и
# скопируйте туда данный скрипт.
#==============================================================================
# Инструкция: В массив ITEMS_TYPE (строка 43) впишите названия желаемых
# разделов. В двумерный массив ITEMS_FILTRARION (строка 44) впишите критерии
# отбора из списка ниже или задайте свои. ПРИМЕЧАНИЕ: Одномерные массивы
# (критерии отбора) в массиве ITEM_FILTRATION должны следовать именно в том
# порядке, в котором следуют соответствующие им категории в ITEMS_TYPE!
#------------------------------------------------------------------------------
# Список стандартных критериев отбора (по умолчанию отрисовываются все предметы):
# "Usable" - Предметы, которые можно использовать либо в меню, либо в бою, либо и там и там
# "Usable!" - Предметы, которые нельзя использовать никогда
# "Equipment" - Предметы экипировки - оружие или броня (или и то и другое о.О)
# "Equipment!" - Предметы, не являющиеся частью экипировки
# "InMenu" - Предметы, которые можно использовать в меню
# "InMenu!" - Предметы, которые нельзя использовать в меню
# "InBattle" - Предметы, которые можно использовать в бою
# "InBattle!" - Предметы, которые нельзя использовать в бою
#------------------------------------------------------------------------------
# Для того, что бы создать свой собственный критерий отбора следует:
# 1)Вписать название новой категории в массив ITEMS_TYPE, в качестве нового
# значения или заменив уже существующее.
# 2)Придумать тег, например "\alch" и вписать его в поле "Note" оружия,
# доспеха или предмета, который вы решили отнести к новой категории.
# 3)Вписать этот тег, заменив \ на \\ в массив ITEMS_FILTRATION, как новое
# условие или заменив им уже существующие.
# 4)В блок GetItemType, в конец case'а (ст.178) добавить блок кода, аналогичный
# строкам 151...178, заменив "\\alch" и "\\alch!" на ваш тег и тег отрицающий.
#==============================================================================
module EKScripts
ITEMS_TYPE = ["Usable", "Battle Only", "Equipment", "Other", "Alchemistry"]
ITEMS_FILTRARION = [
["InMenu", "Equipment!", "\\alch!"], # Usable
["InBattle", "InMenu!", "Equipment!"], # Battle Only
["Equipment"], # Equipment
["Usable!", "Equipment!", "\\alch!"], # Other
["\\alch"] # For example: Alchemistry
] # ← Do not delete
end
class Window_Item < Window_Selectable
#--------------------------------------------------------------------------
attr_writer :type
#--------------------------------------------------------------------------
# * Object Initialization
# x : window x-coordinate
# y : window y-coordinate
# width : window width
# height : window height
# type : item type
#--------------------------------------------------------------------------
def initialize(x, y, width, height, type = -1)
super(x, y, width, height)
@items_notes = []
for i in 1..$data_items.size - 1
@items_notes[i] = $data_items[i].note
end
@weapons_notes = []
for i in 1..$data_weapons.size - 1
@weapons_notes[i] = $data_weapons[i].note
end
@armors_notes = []
for i in 1..$data_armors.size - 1
@armors_notes[i] = $data_armors[i].note
end
@type = type
@items_filtrarion = EKScripts::ITEMS_FILTRARION
@column_max = 2
self.index = 0
refresh
end
#--------------------------------------------------------------------------
# * Whether or not to include in item list
# item : item
#--------------------------------------------------------------------------
def include?(item)
return false if item == nil
if $game_temp.in_battle
return false unless item.is_a?(RPG::Item)
else
return false if GetItemType(item) == false
end
return true
end
#--------------------------------------------------------------------------
# * Whether or not to include in valid items list
# item : item
#--------------------------------------------------------------------------
def GetItemType(item)
@item = item
@return = true
for i in 0..@items_filtrarion[@type].size - 1
if @return == true
case @items_filtrarion[@type][i]
when "Usable"
if !(item.is_a?(RPG::Armor) || item.is_a?(RPG::Weapon))
unless $data_items[item.id].menu_ok? || $data_items[item.id].battle_ok?
@return = false
end
end
when "Usable!"
if !(item.is_a?(RPG::Armor) || item.is_a?(RPG::Weapon))
if $data_items[item.id].menu_ok? || $data_items[item.id].battle_ok?
@return = false
end
end
when "InMenu"
if !(item.is_a?(RPG::Armor) || item.is_a?(RPG::Weapon))
unless $data_items[item.id].menu_ok?
@return = false
end
end
when "InMenu!"
if !(item.is_a?(RPG::Armor) || item.is_a?(RPG::Weapon))
if $data_items[item.id].menu_ok?
@return = false
end
end
when "InBattle"
if !(item.is_a?(RPG::Armor) || item.is_a?(RPG::Weapon))
unless $data_items[item.id].battle_ok?
@return = false
end
end
when "InBattle!"
if !(item.is_a?(RPG::Armor) || item.is_a?(RPG::Weapon))
if $data_items[item.id].battle_ok?
@return = false
end
end
when "Equipment"
unless item.is_a?(RPG::Armor) || item.is_a?(RPG::Weapon)
@return = false
end
when "Equipment!"
if item.is_a?(RPG::Armor) || item.is_a?(RPG::Weapon)
@return = false
end
when "IsWeapon"
unless item.is_a?(RPG::Weapon)
@return = false
end
when "IsWeapon!"
if item.is_a?(RPG::Weapon)
@return = false
end
when "IsArmor"
unless item.is_a?(RPG::Armor)
@return = false
end
when "IsArmor!"
if item.is_a?(RPG::Armor)
@return = false
end
when "\\alch"
if item.is_a?(RPG::Weapon)
if @weapons_notes[item.id].index("\\alch") == nil
@return = false
end
elsif item.is_a?(RPG::Armor)
if @armors_notes[item.id].index("\\alch") == nil
@return = false
end
else
if @items_notes[item.id].index("\\alch") == nil
@return = false
end
end
when "\\alch!"
if item.is_a?(RPG::Weapon)
if @weapons_notes[item.id].index("\\alch") != nil
@return = false
end
elsif item.is_a?(RPG::Armor)
if @armors_notes[item.id].index("\\alch") != nil
@return = false
end
else
if @items_notes[item.id].index("\\alch") != nil
@return = false
end
end
end
end
end
return @return
end
end
class Scene_Item < Scene_Base
#--------------------------------------------------------------------------
# * Start processing
#--------------------------------------------------------------------------
def start
super
create_menu_background
@items_type = EKScripts::ITEMS_TYPE
@spacing = 32 - (@items_type.size - 4) * 8
if @spacing <= 0
@spacing = 8
end
@command_window = Window_Command.new(544, @items_type, @items_type.size, 0, @spacing, 1)
@command_window.index = 0
@viewport = Viewport.new(0, 0, 544, 416)
@help_window = Window_Help.new (0, 56)
@help_window.viewport = @viewport
@item_window = Window_Item.new(0, 112, 544, 304, 0)
@item_window.viewport = @viewport
@item_window.help_window = @help_window
@item_window.active = false
@target_window = Window_MenuStatus.new(0, 0)
hide_target_window
@command_window.active = true
@item_window.active = false
end
#--------------------------------------------------------------------------
# * Termination Processing
#--------------------------------------------------------------------------
def terminate
super
dispose_menu_background
@command_window.dispose
@viewport.dispose
@help_window.dispose
@item_window.dispose
@target_window.dispose
end
#--------------------------------------------------------------------------
# * Update Frame
#--------------------------------------------------------------------------
def update
super
update_menu_background
@command_window.update
@help_window.update
@item_window.update
@target_window.update
if @command_window.active
update_command_selection
elsif @item_window.active
update_item_selection
elsif @target_window.active
update_target_selection
end
end
#--------------------------------------------------------------------------
# * Update Command Selection
#--------------------------------------------------------------------------
def update_command_selection
if Input.trigger?(Input::B)
Sound.play_cancel
return_scene
elsif Input.trigger?(Input::C)
Sound.play_decision
@command_window.active = false
@item_window.active = true
elsif Input.trigger?(Input::RIGHT) || Input.trigger?(Input::LEFT)
@item_window.type = @command_window.index
@item_window.refresh
@item_window.update_help
end
end
#--------------------------------------------------------------------------
# * Update Item Selection
#--------------------------------------------------------------------------
def update_item_selection
if Input.trigger?(Input::B)
Sound.play_decision
@item_window.active = false
@command_window.active = true
Sound.play_cancel
elsif Input.trigger?(Input::C)
@item = @item_window.item
if @item != nil
$game_party.last_item_id = @item.id
end
if $game_party.item_can_use?(@item)
Sound.play_decision
determine_item
else
Sound.play_buzzer
end
end
end
#--------------------------------------------------------------------------
# * Show(Recreate) Target Window
# right : Right justification flag (if false, left justification)
#--------------------------------------------------------------------------
def show_target_window(right)
@item_window.active = false
@target_window.dispose
@target_window = Window_MenuStatus.new(0, 0)
width_remain = 544 - @target_window.width
@target_window.x = right ? width_remain : 0
@target_window.visible = true
@target_window.active = true
if right
@viewport.rect.set(0, 0, width_remain, 416)
@viewport.ox = 0
else
@viewport.rect.set(@target_window.width, 0, width_remain, 416)
@viewport.ox = @target_window.width
end
end
end
Мой второй скрипт. Пожелания и критика приветствуются!
Социальные закладки