Войти на сайт

Авторизация, ждите ...
×

ТЕМА: (VX) EK Items Menu 1.4b

(VX) EK Items Menu 1.4b 15 года 11 мес. назад #20486

  • Equilibrium Keeper
  • Equilibrium Keeper аватар
  • Вне сайта
  • Мастер
  • Скриптер
  • Сообщений: 119
  • Спасибо получено: 3
EK Items Menu 1.4b

Описание
Скрипт изменяет структуру меню предметов, добавляя фильтрацию по различным критериям

Скриншоты



Внимание!!!
Скрипт использует мой кривенький аддончег, так что его цепляем в обязательном порядке. Траблы возможны только в том случае, если ваши кастомные скрипты будут менять тоже, что и мои.

Аддончег
#==============================================================================
# EK Addon v.1.00b
#------------------------------------------------------------------------------
# Created by: Equilibrium Keeper [[email protected]]
# 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 [[email protected]]
# 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
Авторы и Благодарности

Equilibrium Keeper
Кодер
Рольф
Консультант
insider
Консультант
ANNxiousity
Переводчик

Примечание автора
Мой второй скрипт. Пожелания и критика приветствуются!
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Администратор запретил публиковать записи гостям.

(VX) EK Items Menu 1.00b 15 года 11 мес. назад #20490

  • Arykray
  • Arykray аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 595
  • Спасибо получено: 52
Довольно не плохой скрипт, особенно если учесть, что на VX. Ошибок пока в работе не заметил.

Наконец-то скриптеры на портал подтягиваются, так держать!
Чем сложнее задача - тем проще ее не решать.

Администратор запретил публиковать записи гостям.

(VX) EK Items Menu 1.00b 15 года 11 мес. назад #20493

  • Equilibrium Keeper
  • Equilibrium Keeper аватар
  • Вне сайта
  • Мастер
  • Скриптер
  • Сообщений: 119
  • Спасибо получено: 3
Есть они. =\ Совсем забыл на радостях! В скрипте есть ошибка. Он отрисовывает новые экраны предметов по нажатию вправо или влево, но если их зажать - начинает немного сходить с ума. Как это исправить - не знаю. Видимо что нить iskerpress? return? Хотя хотелось бы что бы он продолжал их перебирать, но с некоторой задержкой.
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Администратор запретил публиковать записи гостям.

(VX) EK Items Menu 1.00b 15 года 11 мес. назад #20495

  • Arykray
  • Arykray аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 595
  • Спасибо получено: 52
По моему заморочка в блокох Update Command Selection
  #--------------------------------------------------------------------------
  # * 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.dispose
      @item_window = Window_Item.new(0, 112, 544, 304, @command_window.index)
      @item_window.active = false
      @item_window.help_window = @help_window
      @item_window.update_help
    end
  end

и include?()
  #--------------------------------------------------------------------------
  # * Whether or not to include in item list
  #     item : item
  #--------------------------------------------------------------------------
  def include?(item)
    @item_id = item.id
    return false if item == nil
    if $game_temp.in_battle
      return false unless item.is_a?(RPG::Item)
    end
     case @type
      when 0
        return false if item.is_a?(RPG::Weapon) || item.is_a?(RPG::Armor)
        return false unless $data_items[@item_id].menu_ok?
      when 1
        return false if item.is_a?(RPG::Weapon) || item.is_a?(RPG::Armor)
        return false if $data_items[@item_id].menu_ok?
        return false unless $data_items[@item_id].battle_ok?
      when 2
        return false unless item.is_a?(RPG::Weapon) || item.is_a?(RPG::Armor)
      when 3
        return false if item.is_a?(RPG::Weapon) || item.is_a?(RPG::Armor)
        return false if $data_items[@item_id].menu_ok? || $data_items[@item_id].battle_ok?
      end
      return true
  end

Может это привычка, оставшаяся у меня от XP, но я бы сделал из этих блоков один, так как именно в блоке include?() у тебя идет обновление команд.
Чем сложнее задача - тем проще ее не решать.

Администратор запретил публиковать записи гостям.

(VX) EK Items Menu 1.4b 15 года 11 мес. назад #20599

  • Equilibrium Keeper
  • Equilibrium Keeper аватар
  • Вне сайта
  • Мастер
  • Скриптер
  • Сообщений: 119
  • Спасибо получено: 3
Update ... Selection, во всяком случае в VX, отвечает только за считывание нажатия кнопок, соответственно и обновляется постоянно. Если совместить эти блоки, то мукер надолго и капитально повиснет. ^^
А тот ужос в инклюде я сейчас разгребаю (будет еще хуже) - осталось только понять - как выудить подстроку из строки. Видимо я что-то не то пишу в аргументах метода .sub - находит он ее только если она стоит в начале файла x_x
Обновил версию. Добавил возможность кастомизации фильтров и привел царящий в скрипте хаос в относительный беспорядок. Тестируйте! ^_^

Осталось только найти нормальный способ избавиться от бага с зажиманием кнопки...
Обновил версию. Поправил баг из 1.1b
Обновил до 1.3. Теперь InMenu и иже с ним будут игнорировать предметы экипировки, что бы исключить их из списка придется воспользоваться опцией Equipment! . Это так же исправит баг, когда InMenu и Equipment использовались вместе. (Спасибо, insider)
Обновлено до версии 1.4b. Оптимизация. Спасибо, insider!
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Администратор запретил публиковать записи гостям.

(VX) EK Items Menu 1.4b 15 года 11 мес. назад #20616

  • Fizmatik
  • Fizmatik аватар
  • Вне сайта
  • Администратор
  • Сообщений: 1886
  • Спасибо получено: 99
  • Ветеран
Браво - хорошее начало для скриптера.
Так держать и мы будем публиковать твои скрипты в файловом архиве! ;)
Администратор запретил публиковать записи гостям.

(VX) EK Items Menu 1.4b 15 года 11 мес. назад #20618

  • Equilibrium Keeper
  • Equilibrium Keeper аватар
  • Вне сайта
  • Мастер
  • Скриптер
  • Сообщений: 119
  • Спасибо получено: 3
Спасибо! И спасибо всем тем кто помогал! ^_^
Пойду дальше скриптить... *sochin*
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Администратор запретил публиковать записи гостям.
Модераторы: NeKotZima
Время создания страницы: 0.426 секунд