Random Shop v1.0
Автор: Fhizban
Перевод: Riko
Версия: 1.0

Описание:
Скрипт рандомного магазина.Всё описание и настройки в самом скрипте.

Спойлер Код:
Код:
#===============================================================================
#                          +++ SIMPLE RANDOM SHOP +++
#===============================================================================
# + Оригинальный скрипт от Fhizban (Так же известен как Malagar).
# + Перевод Riko(Lostmaker).
# + Версия 1.0.
# + Обновлено Август 2015.
# + Для RPG Maker VX Ace.
# + Свободен для коммерческого и некоммерческого использования.
# + Не требует наличия других скриптов
#===============================================================================
#                                Информация
#===============================================================================
#  Данный скрипт позволяет создать магазин рандомных вещей,оружия и экипировки.
#===============================================================================
#                                Установка
#===============================================================================
# + Вставте скрипт в раздел "Пользовательские".
# + Заполните некоторые поля в заметках(описание ниже)вещей в базе данных.
# + Поместите новое событие на карту.
# + Настройте вызов рандомного магазина при помощи функции "Скрипт" (описание ниже).
#===============================================================================
#                                Документация
#===============================================================================
# Настройка работы скрипта состоит из трёх частей:
#   1) Добавить запись в заметках вещей в базе данных проекта.
#   2) Добавить команду вызова магазина в новое событие.
#   3) Настроить нужное во время тестов проекта.
#
# 1) Редактирование заметок:
#    Заметки редактируются для всех ВЕЩЕЙ, ОРУЖИЯ и БРОНИ,которые вы хотите внести в рандомный магазин.
#    Вещь,не имеющая записи в заметках,не будет появляться в магазине.
#
#    <family: x>                    # Группа/категория вещей.(Настройка лично для Вас,не влияет на работу скрипта)
#    <rarity: x>                    # Коеффициент редкости (1+ выше - реже)
#    <level-min: x>                 # Минимальный уровень персонажа,при котором данная вещь будет появляться в магазине (1-99)
#    <level-max: x>                 # Максимальный уровень персонажа,при котором данная вещь будет появляться в магазине (1-99)
#
#    Опциональные заметки только для ОРУЖИЯ и БРОНИ:
#
#    <lucky: x>                     # Коеффициент поймать редкую вещь в магазине.Все одетые вещи с данной заметкой суммируют шанс.
#                                   
#
#    Новые опциональные заметки для всех вещей в базе:
#
#    <noshop>      # Вещь никогда не появляется в рандомном магазине (Требуется Simple Random Shop 1.0+)
#    <noloot>      # Вещь никогда не выпадает при рандом луте (Требуется Simple Random Loot 1.4+)
#    <nodrop>      # Вещь никогда не падает с врага при рандом дропе (Требуется Simple Random Drop 1.0+)
#
# 2) Использование вызова скрипта:
#  
#    ПРИМЕР:
#
#            random_shop(0, 1, 10, 50, 1, 1)
#
#    РАСШИФРОВКА:
#
#            random_shop(тип, мин.редкость, макс.редкость, цена=0, количество=0, субтип=0, группа=0)
#
#    тип                            # Тип вещей в магазине:
#                                   # 0 = Все
#                                   # 1 = Вещи
#                                   # 2 = Броня
#                                   # 3 = Оружие
#                                   # 4 = Один рандомный тип вещей
#
#    мин.редкость                   # Минимальная и максимальная редкость вещей,генерирующихся в магазине.
#    макс.редкость                  # Например минимальная редкость = 1 а максимальная = 50.
#                                   # Скрипт генерирует случайным образом число от 1 до 50.
#                                   # В магазине появятся вещи только в пределах данного числа(50 включительно).
#
#    цена                           # ОПЦИОНАЛЬНО. Настройка цены предмета в процентах(Для более реальных торгашей).
#                                   # Кроме того можно установить отрицательное число.(Например для скидок в магазине).
#
#    количество                     # ОПЦИОНАЛЬНО. Устанавливает лимит вещей,продаваемых в магазине.
#                                   # Если не установлено,то вещи в магазине продаются неограниченным количеством.
#
#    субтип                         # ОПЦИОНАЛЬНО. Применимо только для ОРУЖИЯ или БРОНИ.
#                                   # Иные будут игнорироваться. Filters the random loot
#                                   # to drop only items of the stated type.
#                                   # (e.g. 1 = General Armour)
#
#    группа                         # ОПЦИОНАЛЬНО. Группа может быть любое число или 0.
#                                   # 0 = Показывает все вещи,не зависимо от группы.
#                                   # x = Показывает только те,которым была присвоена группа в заметках.
#
#===============================================================================
#                                Совместимость
#===============================================================================
# + Совместим с большинством других скриптов (Например YANFLY engine).
# + Может комбинироваться с другими моими скриптами:
#   + Simple Random Loot
#   + Simple Random Shop
#   + Simple Random Drop
#   + Simple Random Rarities
#===============================================================================

$imported = {} if $imported.nil?
$imported["Random_Shop"] = true
 
module Random_Shop
#===============================================================================
#  CONFIGURATION
#===============================================================================
                                      
  DEFAULT_AMOUNT = 5                        # Maximum number of different, available
                                            # Items if nothing was stated.
                                            
  SHOP_REFRESH_SWITCH = 1                   # Each time this switch is toggled, the
                                            # shops inventory is refreshed. Set to 0
                                            # to disable (this will refresh the shops
                                            # each time the players access them).
                                            
  SHOP_INVENTORY_VAR = 1
 
#===============================================================================
#  END CONFIGURATION
#===============================================================================
end
 
#===============================================================================
module Random_Shop_Notetags
  def loot_rarity
    if @loot_rarity.nil?
      if @note =~ /<rarity: (.*)>/i
        @loot_rarity = $1.to_i
      else
        @loot_rarity = 0
      end
    end
    @loot_rarity
  end
  def loot_level_min
    if @loot_level_min.nil?
      if @note =~ /<level-min: (.*)>/i
        @loot_level_min = $1.to_i
      else
        @loot_level_min = 0
      end
    end
    @loot_level_min
  end
  def loot_level_max
    if @loot_level_max.nil?
      if @note =~ /<level-max: (.*)>/i
        @loot_level_max = $1.to_i
      else
        @loot_level_max = 0
      end
    end
    @loot_level_max
  end
  def loot_lucky
    if @loot_lucky.nil?
      if @note =~ /<lucky: (.*)>/i
        @loot_lucky = $1.to_i
      else
        @loot_lucky = 0
      end
    end
    @loot_lucky
  end
  def loot_family
    if @loot_family.nil?
      if @note =~ /<family: (.*)>/i
        @loot_family = $1.to_i
      else
        @loot_family = 0
      end
    end
    @loot_family
  end
  def loot_noshop
    if @loot_noshop.nil?
      if @note =~ /<noshop>/i
        @loot_noshop = true
      else
        @loot_noshop = false
      end
    end
    @loot_noshop
  end
  def loot_noloot
    if @loot_noloot.nil?
      if @note =~ /<noloot>/i
        @loot_noloot = true
      else
        @loot_noloot = false
      end
    end
    @loot_noloot
  end
  def loot_nodrop
    if @loot_nodrop.nil?
      if @note =~ /<nodrop>/i
        @loot_nodrop = true
      else
        @loot_nodrop = false
      end
    end
    @loot_nodrop
  end
  end # Random_Shop_Notetags
#===============================================================================
 
class RPG::Item
  include Random_Shop_Notetags
end
class RPG::Armor
  include Random_Shop_Notetags
end
class RPG::Weapon
  include Random_Shop_Notetags
end
 
#===============================================================================
class Game_Interpreter
 
  def populate_shop(id)
    
    
    
    
  end
  
  
  def random_shop(type, rarity_min, rarity_max, price=0, amount=0, subtype=0, family=0)
   
    @goods = []
    @loot = []
    
    #--- Determine Type
    if type == 0
      @loot = $data_items + $data_armors + $data_weapons
      subtype = 0
    elsif type == 1
      @loot = $data_items
      @itemtype = 0
      subtype = 0
    elsif type == 2
      @loot = $data_armors
      @itemtype = 2
    elsif type == 3
      @loot = $data_weapons
      @itemtype = 1
    else
      @loot = $data_items | $data_armors | $data_weapons
      subtype = 0
    end
 
    #--- Preperations
    @loot.shuffle
    rarity_max = rarity_min if rarity_max < rarity_min
    amount = Random_Shop::DEFAULT_AMOUNT if amount < 1
    subtype = 0 if subtype < 0 || subtype > 99
    subtype = 0 if family < 0 || family > 99
  
    #--- Determine Party Luck Bonus
    mem = 0
    eqs = 0
    luck_bonus = 0
    i = 0
    no_equips = $game_party.members.count * $game_party.members[0].equips.count
    $game_party.members.each do |mem|
      mem.equips.each do |eq|
        next if eq.nil?
        luck_bonus += eq.loot_lucky
      end
    end
        
    #--- Determine Rarity Chance
    checked = 0
    inventory = 0
    itemprice = 0
    duplicates = []
    restart = false
    continue = true
    no_items = @loot.count - 1
    rare_chance = rand(rarity_max - rarity_min) + rarity_min + luck_bonus + 1
    random_item = rand(no_items) + 1
    begin_count = rand(no_items) + 1
   
    #--- Determine Random Item
    no_items.times do |i|
      i = i + random_item
      begin_count += 1 if restart
      if i > no_items
        i = i - i + rand(no_items) + 1
        restart = true
      end
    
      #--- Get Random Item
      if family != 0 && @loot[i].loot_family != family
        continue = false
      end
      if subtype != 0 && type == 2
        if @loot[i].atype_id == subtype
          continue = false
        end
      end
      if subtype != 0 && type == 3
        if @loot[i].wtype_id == subtype
          continue = false
        end
      end

      #--- Setup Shop Inventory
      if continue
        next if @loot[i].nil?
        next if @loot[i].loot_noshop
        if @loot[i].loot_level_max >= $game_party.leader.level && @loot[i].loot_level_min <= $game_party.leader.level
          if @loot[i].loot_rarity <= rare_chance
            if checked < no_items && inventory < amount
              if !duplicates.include?(@loot[i].id)
                
                #--- Recheck Item Type
                if @loot[i].is_a?(RPG::Item)
                  @itemtype = 0
                elsif @loot[i].is_a?(RPG::Weapon)
                  @itemtype = 1
                elsif @loot[i].is_a?(RPG::Armor)
                  @itemtype = 2
                end
                
                #--- Check Item Price
                if price != 0
                  itemprice = @loot[i].price + (@loot[i].price * (price/100))
                end
                if price <= 0
                  @goods.push([@itemtype, @loot[i].id, 0])
                else
                  @goods.push([@itemtype, @loot[i].id, 1, itemprice])
                end
                duplicates.push(@loot[i].id)
                inventory += 1
              end
            else
              break
            end
          end
        end
      end
      checked += 1
    end
    
    if @goods.size > 0
      @goods.shuffle
      SceneManager.call(Scene_Shop)
      SceneManager.scene.prepare(@goods, true)
    end
    
  end
   
end # Game_Interpreter
 
#===============================================================================
# END OF SCRIPT
#===============================================================================