Плохо! Плохо!:  0
Показано с 1 по 10 из 10

Тема: Нужна помощь со скриптом. (Crafting System By Szyu)

  1. #1
    Хранитель Аватар для Темный
    Информация о пользователе
    Регистрация
    13.05.2011
    Сообщений
    2,449
    Записей в дневнике
    20
    Репутация: 50 Добавить или отнять репутацию

    По умолчанию Нужна помощь со скриптом. (Crafting System By Szyu)

    Есть очень простенький вот такой скрипт крафт системы сбое и вылетов при его использование
    не выявлено. Он легко встраивается в меню и легок в использованье.
    Но хотелось бы добавить в него всего одну вещь.
    Чтоб когда у игрока нет рецептов пункт меню "Крафта" был темным и нельзя было
    войти в экран крафта. А как рецепт появиться так пункт активизировался бы.
    Кто сможет доработать буду благодарен.


    Спойлер Скрипт:
    #================================================= =============================
    # Crafting System
    # Version 1.9
    # By Szyu
    #
    # About:
    # Craft items, weapons and armors.
    #
    # Instructions:
    # - Place below "? Materials" but above "? Main Process".
    # - Call global Crafting List by "SceneManager.call(Scene_Crafting)" or
    # "SceneManager.call(Scene_Crafting, -1)".
    # For categorized Crafting Lists use "SceneManager.call(Scene_Crafting, x)"
    #
    # How to Use:
    # - "<ingredients> content </ingredients>" marks the area for ingredients
    # example:
    # <ingredients>
    # i: 3x 5 => 3 items of item_id 5
    # w: 2x 7 => 2 weapons of weapon_id 7
    # a: 1x 2 => 1 armor of armor_id 2
    # </ingredients>
    #
    # - "<recipe book>" marks the item as a recipe book, able to hold recipes
    # - "<category: x>" marks a recipe book as category x. You can call seperate
    # category crafting lists by SceneManager.call(Scene_Crafting, x)
    #
    # - "<recipes> content </recipes>" marks the area for recipes if the
    # item is a crafting book
    # example:
    # <recipes>
    # i: 5 => ability to craft the item with id 5
    # w: 7 => ability to craft the weapon with id 7
    # a: 2 - 20 => ability to craft armors from id 2 to id 20
    # </recipes>
    #
    # - "$data_items[book_id].add_recipe("i/w/a: id")" adds a new recipe to a book
    # - "$data_items[book_id].add_recipe("i/w/a: id1 - id2")" adds a new recipe to a book
    # - "$data_items[book_id].remove_recipe("i/w/a: id")" removes a recipe from a book
    # - "$data_items[book_id].remove_recipe("i/w/a: id1 - id2")" removes a recipe from a book
    #
    # Requires:
    # - RPG Maker VX Ace
    #
    # Terms of Use:
    # - Free for commercal and non-commercial use. Please list me
    # in the credits to support my work.
    #
    # Pastebin:
    # http://pastebin.com/CxB8F8T5
    #
    #================================================= =============
    # * Configuration
    #================================================= =============

    # Term used for crafting from recipe books
    INGREDIENTS_TERM = "Компоненты:"
    CR_WEAPON_TYPE_TERM = "Clase de arma"
    CR_ARMOR_TYPE_TERM = "Clase de armadura"

    CRAFTING_CATEGORIES = ["Alchemy","Blacksmithing"]

    # Custom crafting sounds by category
    CUSTOM_CRAFT_SOUNDS_BY_CAT = ["Saint5", "Bell2"]
    # Custom crafting sounds for RPG::Item, RPG::Weapon, RPG::Armor if no special cat
    CUSTOM_CRAFT_SOUNDS_BY_TYPE = ["Saint5", "Bell2", "Bell3"]

    # If you want to use crafting from the menu, set this to true, else false
    CRAFTING_IN_MENU = true
    MENU_CRAFTING_VOCAB = "Синтез"


    # Vocabs used in status section for crafted items
    CRAFTING_ITEM_STATUS ={
    :empty => "-", # Text used when nothing is shown.
    :hp_recover => "HP Леч.", # Text used for HP Recovery.
    :mp_recover => "MP Леч.", # Text used for MP Recovery.
    :tp_recover => "TP Леч.", # Text used for TP Recovery.
    :tp_gain => "TP Доб.", # Text used for TP Gain.
    :applies => "Добавляет", # Text used for applied states and buffs.
    :removes => "Снимает", # Text used for removed states and buffs.
    }

    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    #================================================= =============
    # * Scene_Crafting
    #================================================= =============
    class Scene_Crafting < Scene_ItemBase

    def initialize()
    @cr_category = SceneManager.scene_param[0] ? SceneManager.scene_param[0] : -1
    end

    def start
    super
    create_help_window
    create_category_window
    create_ingredients_window
    create_item_window
    end

    def create_category_window
    @category_window = Window_CraftingCategory.new
    @category_window.viewport = @viewport
    @category_window.help_window = @help_window
    @category_window.y = @help_window.height
    @category_window.set_handler(k, method(n_category_ok))
    @category_window.set_handler(:cancel, method(:return_scene))
    end

    def create_ingredients_window
    wx = 240
    wy = @category_window.y + @category_window.height
    ww = Graphics.width - wx
    wh = Graphics.height - wy
    @ingredients_window = Window_CraftingIngredients.new(wx,wy,ww,wh)
    @ingredients_window.viewport = @viewport
    end

    def create_item_window
    wy = @category_window.y + @category_window.height
    wh = Graphics.height - wy
    @item_window = Window_CraftingItemList.new(0, wy, 240, wh)
    @item_window.cr_category = @cr_category
    @item_window.viewport = @viewport
    @item_window.help_window = @help_window
    @item_window.set_handler(k, method(n_item_ok))
    @item_window.set_handler(:cancel, method(n_item_cancel))
    @item_window.set_handler(:right, method(:ingredients_show_stats))
    @item_window.set_handler(:left, method(:ingredients_show_ingredients))
    @item_window.ingredients_window = @ingredients_window
    @category_window.item_window = @item_window
    end

    def on_category_ok
    @item_window.activate
    @item_window.select_last
    end

    def on_item_ok
    determine_crafting
    end

    def on_item_cancel
    @item_window.unselect
    @category_window.activate
    end

    def determine_crafting
    craft_item if @item_window.item.match_ingredients?
    end

    def craft_item
    item = @item_window.item
    item.ingredients.each do |ing|
    if ing[0].is_a?(RPG::BaseItem)
    $game_party.lose_item(ing[0],ing[1])
    else
    $game_party.lose_gold(ing[1])
    end
    end
    $game_party.gain_item(item,1)

    if @cr_category != -1
    csf = CUSTOM_CRAFT_SOUNDS_BY_CAT[@cr_category]
    else
    if item.is_a?(RPG::Item)
    csf = CUSTOM_CRAFT_SOUNDS_BY_TYPE[0]
    elsif item.is_a?(RPG::Weapon)
    csf = CUSTOM_CRAFT_SOUNDS_BY_TYPE[1]
    elsif item.is_a?(RPG::Armor)
    csf = CUSTOM_CRAFT_SOUNDS_BY_TYPE[2]
    end
    end
    RPG::SE.new(csf, 100, 50).play

    @item_window.refresh
    @item_window.activate
    end

    def ingredients_show_ingredients
    @ingredients_window.showtype = 0
    end

    def ingredients_show_stats
    @ingredients_window.showtype = 1
    end
    end

    #================================================= =============
    # * Scene_Menu
    #================================================= =============
    class Scene_Menu < Scene_MenuBase
    alias add_crafting_menu_entry create_command_window

    def create_command_window
    add_crafting_menu_entry
    @command_window.set_handler(:crafting, method(pen_crafting)) if CRAFTING_IN_MENU
    end

    def open_crafting
    SceneManager.call(Scene_Crafting, -1)
    end
    end

    #================================================= =============
    # * Window_CraftingCategory
    #================================================= =============
    class Window_CraftingCategory < Window_HorzCommand
    attr_reader :item_window

    def initialize
    super(0, 0)
    end

    def window_width
    Graphics.width
    end

    def col_max
    return 3
    end

    def update
    super
    @item_window.category = current_symbol if @item_window
    end

    def make_command_list
    add_command(Vocab::item, :item)
    add_command(Vocab::weapon, :weapon)
    add_command(Vocab::armor, :armor)
    end

    def item_window=(item_window)
    @item_window = item_window
    update
    end
    end

    #================================================= =============
    # * Window_CraftingCategory
    #================================================= =============
    class Window_CraftingItemList < Window_Selectable
    attr_reader :ingredients_window
    attr_accessor :cr_category

    def initialize(x, y, width, height)
    super
    @category = :none
    @data = []
    end

    def category=(category)
    return if @category == category
    @category = category
    refresh
    self.oy = 0
    end

    def col_max
    return 1
    end

    def item_max
    @data ? @data.size : 1
    end

    def item
    @data && index >= 0 ? @data[index] : nil
    end

    def current_item_enabled?
    return false unless @data[index]
    @data[index].match_ingredients?
    end

    def include?(item)
    case @category
    when :item
    item.is_a?(RPG::Item)
    when :weapon
    item.is_a?(RPG::Weapon)
    when :armor
    item.is_a?(RPG::Armor)
    else
    false
    end
    end

    def enable?(item)
    $game_party.usable?(item)
    end

    def make_item_list
    rbooks = $game_party.all_items.select {|item| item.recipe_book}
    rbooks.delete_if {|x| x.cr_category != @cr_category} if @cr_category != -1
    @data = []
    rbooks.each do |book|
    sdata = book.recipes.select {|recipe| include?(recipe) }
    @data.concat sdata
    end
    @data.push(nil) if include?(nil)
    end

    def select_last
    select(@data.index($game_party.last_item.object) || 0)
    end

    def draw_item(index)
    item = @data[index]
    if item
    rect = item_rect(index)
    rect.width -= 4
    draw_item_name(item, rect.x, rect.y, item.match_ingredients?, width-70)
    draw_item_number(rect, item)
    end
    end

    def draw_item_number(rect, item)
    draw_text(rect, sprintf(":%2d", $game_party.item_number(item)), 2)
    end

    def update_help
    @help_window.set_item(item)
    @ingredients_window.item = item if @ingredients_window
    end

    def refresh
    make_item_list
    create_contents
    draw_all_items
    end

    def ingredients_window=(ingredients_window)
    @ingredients_window = ingredients_window
    update
    end

    def process_ok
    if current_item_enabled?
    Input.update
    deactivate
    call_ok_handler
    else
    Sound.play_buzzer
    end
    end

    alias cr_us_win unselect
    def unselect
    cr_us_win
    @ingredients_window.contents.clear
    end
    end

    #================================================= =============
    # * Window_MenuCraftingList
    #================================================= =============
    class Window_MenuCraftingList < Window_Selectable

    attr_reader :ingredients_window
    attr_reader :book

    alias cr_ing_help call_update_help
    alias cr_ing_hide hide

    def initialize(book,y)
    @book = book
    super(0,y, 240, Graphics.height-y)
    self.visible = false
    refresh
    end

    def window_height
    Graphics.height-self.y
    end

    def item_max
    @book.recipes.size
    end

    def item_height
    line_height+4
    end

    def draw_item(index)
    recipe = @book.recipes[index]
    rect = item_rect(index)
    draw_icon(recipe.icon_index, rect.x+2, rect.y+2)
    draw_text(rect.x+30,rect.y+2,width-75, line_height, recipe.name)
    draw_text(rect.x-30,rect.y+2,width, line_height, sprintf(":%2d", $game_party.item_number(@item)), 2)
    end

    def process_ok
    super
    $game_party.menu_actor = $game_party.members[index]
    end

    def select_last
    select($game_party.menu_actor.index || 0)
    end

    def select_for_item(item)
    select(0)
    @book = item
    end

    def ingredients_window=(ingredients_window)
    @ingredients_window = ingredients_window
    update
    end

    def call_update_help
    cr_ing_help
    @ingredients_window.item = @book.recipes[@index] if @ingredients_window && @index >= 0
    end

    def hide
    cr_ing_hide
    @ingredients_window.hide.deactivate
    end
    end

    #================================================= =============
    # * Window_CraftingIngredients
    #================================================= =============
    class Window_CraftingIngredients < Window_Selectable
    def initialize(x,y,w,h)
    super(x,y,w,h)
    @item = nil
    @showtype=0
    end

    def item=(item)
    @item = item
    refresh
    end

    def refresh
    contents.clear
    return if !@item
    case @showtype
    when 1
    #draw_stats_item if @item.is_a?(RPG::Item)
    draw_stats
    else
    draw_ingredients
    end
    end

    def draw_ingredients
    change_color(system_color)
    draw_text(125,line_height*0,width,line_height, INGREDIENTS_TERM)
    i = 1
    @item.ingredients.each do |ing|
    change_color(normal_color)
    change_color(normal_color)
    if ing[0].is_a?(String)
    draw_icon(361,0,line_height*i)
    draw_text(24,line_height*i, width,line_height, ing[0])
    inumber = $game_party.gold
    else
    draw_icon(ing[0].icon_index,0,line_height*i)
    draw_text(24,line_height*i, width,line_height, ing[0].name)
    inumber = $game_party.item_number(ing[0])
    end

    change_color(crisis_color) if inumber < ing[1]
    change_color(knockout_color) if inumber == 0
    change_color(power_up_color) if inumber >= ing[1]

    txt = sprintf("%d/%d",inumber, ing[1])
    draw_text(-24,line_height*i,width-4,line_height,txt,2)
    i += 1
    end
    change_color(normal_color)
    end

    def draw_stats
    draw_item_stats
    draw_item_effects
    end

    def showtype=(st)
    @showtype = st
    refresh
    end

    def draw_background_box(dx, dy, dw)
    colour = Color.new(0, 0, 0, translucent_alpha/2)
    rect = Rect.new(dx+1, dy+1, dw-2, line_height-2)
    contents.fill_rect(rect, colour)
    end

    def draw_item_stats
    return unless @item.is_a?(RPG::Weapon) || @item.is_a?(RPG::Armor)
    dx = 0; dy = 0
    dw = (contents.width) / 2
    for i in 0...8
    draw_equip_param(i, dx, dy, dw)
    dx = dx >= dw ? 0 : dw
    dy += line_height if dx == 0
    end
    end

    def draw_equip_param(param_id, dx, dy, dw)
    draw_background_box(dx, dy, dw)
    change_color(system_color)
    draw_text(dx+4, dy, dw-8, line_height, Vocab:aram(param_id))
    draw_set_param(param_id, dx, dy, dw)
    end

    def draw_set_param(param_id, dx, dy, dw)
    value = @item.params[param_id]
    change_color(param_change_color(value), value != 0)
    text = value.to_s
    text = "+" + text if value > 0
    draw_text(dx+4, dy, dw-8, line_height, text, 2)
    return text
    end

    def draw_percent_param(param_id, dx, dy, dw)
    value = @item.per_params[param_id]
    change_color(param_change_color(value))
    text = (@item.per_params[param_id] * 100).to_i.to_s + "%"
    text = "+" + text if @item.per_params[param_id] > 0
    draw_text(dx+4, dy, dw-8, line_height, text, 2)
    return text
    end

    def draw_item_effects
    return unless @item.is_a?(RPG::Item)
    dx = 0; dy = 0
    dw = (contents.width) / 2
    draw_hp_recover(dx, dy + line_height * 0, dw)
    draw_mp_recover(dx, dy + line_height * 1, dw)
    draw_tp_recover(dx + dw, dy + line_height * 0, dw)
    draw_tp_gain(dx + dw, dy + line_height * 1, dw)
    dw = contents.width
    draw_applies(dx, dy + line_height * 2, dw)
    draw_removes(dx, dy + line_height * 3, dw)
    end

    def draw_hp_recover(dx, dy, dw)
    draw_background_box(dx, dy, dw)
    change_color(system_color)
    draw_text(dx+4, dy, dw-8, line_height, CRAFTING_ITEM_STATUS[:hp_recover])
    per = 0
    set = 0
    for effect in @item.effects
    next unless effect.code == 11
    per += (effect.value1 * 100).to_i
    set += effect.value2.to_i
    end
    if per != 0 && set != 0
    change_color(param_change_color(set))
    text = set > 0 ? sprintf("+%s", set.to_s) : set.to_s
    draw_text(dx+4, dy, dw-8, line_height, text, 2)
    dw -= text_size(text).width
    change_color(param_change_color(per))
    text = per > 0 ? sprintf("+%s%%", per.to_s) : sprintf("%s%%", per.to_s)
    draw_text(dx+4, dy, dw-8, line_height, text, 2)
    return
    elsif per != 0
    change_color(param_change_color(per))
    text = per > 0 ? sprintf("+%s%%", per.to_s) : sprintf("%s%%", per.to_s)
    elsif set != 0
    change_color(param_change_color(set))
    text = set > 0 ? sprintf("+%s", set.to_s) : set.to_s
    else
    change_color(normal_color, false)
    text = CRAFTING_ITEM_STATUS[:empty]
    end
    draw_text(dx+4, dy, dw-8, line_height, text, 2)
    end

    def draw_mp_recover(dx, dy, dw)
    draw_background_box(dx, dy, dw)
    change_color(system_color)
    draw_text(dx+4, dy, dw-8, line_height, CRAFTING_ITEM_STATUS[:mp_recover])
    per = 0
    set = 0
    for effect in @item.effects
    next unless effect.code == 12
    per += (effect.value1 * 100).to_i
    set += effect.value2.to_i
    end
    if per != 0 && set != 0
    change_color(param_change_color(set))
    text = set > 0 ? sprintf("+%s", set.to_s) : set.to_s
    draw_text(dx+4, dy, dw-8, line_height, text, 2)
    dw -= text_size(text).width
    change_color(param_change_color(per))
    text = per > 0 ? sprintf("+%s%%", per.to_s) : sprintf("%s%%", per.to_s)
    draw_text(dx+4, dy, dw-8, line_height, text, 2)
    return
    elsif per != 0
    change_color(param_change_color(per))
    text = per > 0 ? sprintf("+%s%%", per.to_s) : sprintf("%s%%", per.to_s)
    elsif set != 0
    change_color(param_change_color(set))
    text = set > 0 ? sprintf("+%s", set.to_s) : set.to_s
    else
    change_color(normal_color, false)
    text = CRAFTING_ITEM_STATUS[:empty]
    end
    draw_text(dx+4, dy, dw-8, line_height, text, 2)
    end

    def draw_tp_recover(dx, dy, dw)
    draw_background_box(dx, dy, dw)
    change_color(system_color)
    draw_text(dx+4, dy, dw-8, line_height, CRAFTING_ITEM_STATUS[:tp_recover])
    set = 0
    for effect in @item.effects
    next unless effect.code == 13
    set += effect.value1.to_i
    end
    if set != 0
    change_color(param_change_color(set))
    text = set > 0 ? sprintf("+%s", set.to_s) : set.to_s
    else
    change_color(normal_color, false)
    text = CRAFTING_ITEM_STATUS[:empty]
    end
    draw_text(dx+4, dy, dw-8, line_height, text, 2)
    end

    def draw_tp_gain(dx, dy, dw)
    draw_background_box(dx, dy, dw)
    change_color(system_color)
    draw_text(dx+4, dy, dw-8, line_height, CRAFTING_ITEM_STATUS[:tp_gain])
    set = @item.tp_gain
    if set != 0
    change_color(param_change_color(set))
    text = set > 0 ? sprintf("+%s", set.to_s) : set.to_s
    else
    change_color(normal_color, false)
    text = CRAFTING_ITEM_STATUS[:empty]
    end
    draw_text(dx+4, dy, dw-8, line_height, text, 2)
    end

    def draw_applies(dx, dy, dw)
    draw_background_box(dx, dy, dw)
    change_color(system_color)
    draw_text(dx+4, dy, dw-8, line_height, CRAFTING_ITEM_STATUS[:applies])
    icons = []
    for effect in @item.effects
    case effect.code
    when 21
    next unless effect.value1 > 0
    next if $data_states[effect.value1].nil?
    icons.push($data_states[effect.data_id].icon_index)
    when 31
    icons.push($game_actors[1].buff_icon_index(1, effect.data_id))
    when 32
    icons.push($game_actors[1].buff_icon_index(-1, effect.data_id))
    end
    icons.delete(0)
    break if icons.size >= 10
    end
    draw_icons(dx, dy, dw, icons)
    end

    def draw_removes(dx, dy, dw)
    draw_background_box(dx, dy, dw)
    change_color(system_color)
    draw_text(dx+4, dy, dw-8, line_height, CRAFTING_ITEM_STATUS[:removes])
    icons = []
    for effect in @item.effects
    case effect.code
    when 22
    next unless effect.value1 > 0
    next if $data_states[effect.value1].nil?
    icons.push($data_states[effect.data_id].icon_index)
    when 33
    icons.push($game_actors[1].buff_icon_index(1, effect.data_id))
    when 34
    icons.push($game_actors[1].buff_icon_index(-1, effect.data_id))
    end
    icons.delete(0)
    break if icons.size >= 10
    end
    draw_icons(dx, dy, dw, icons)
    end

    def draw_icons(dx, dy, dw, icons)
    dx += dw - 4
    dx -= icons.size * 24
    for icon_id in icons
    draw_icon(icon_id, dx, dy)
    dx += 24
    end
    if icons.size == 0
    change_color(normal_color, false)
    text = CRAFTING_ITEM_STATUS[:empty]
    draw_text(4, dy, contents.width-8, line_height, text, 2)
    end
    end
    end

    #================================================= =============
    # * Window_MenuCommand
    #================================================= =============
    class Window_MenuCommand < Window_Command
    alias add_crafting_menu_entry add_main_commands

    def add_main_commands
    add_crafting_menu_entry
    add_command(MENU_CRAFTING_VOCAB, :crafting) if CRAFTING_IN_MENU
    end
    end

    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    #================================================= =============
    # * Initialize BaseItems
    #================================================= =============
    module DataManager
    class << self
    alias load_db_sz_crafting load_database
    alias save_crafting_recipe_books make_save_contents
    alias load_crafting_recipe_books extract_save_contents
    end

    def self.load_database
    load_db_sz_crafting
    load_crafting_item_notetags
    end

    def self.load_crafting_item_notetags
    groups = [$data_items, $data_weapons, $data_armors]
    for group in groups
    for obj in group
    next if obj.nil?
    obj.load_crafting_notetags_sz
    end
    end
    end


    def self.make_save_contents
    contents = save_crafting_recipe_books
    recipe_books = {}
    for item in $data_items
    next if item.nil?
    next if not item.recipe_book
    recipe_books[item.id] = item.recipes
    end

    contents[:recipe_books] = recipe_books
    contents
    end

    def self.extract_save_contents(contents)
    load_crafting_recipe_books(contents)
    recipe_books = contents[:recipe_books]

    recipe_books.each do |id, recipes|
    $data_items[id].recipes = recipes
    end
    end
    end

    #================================================= =============
    # * Call Scene with Parameters
    #================================================= =============
    class << SceneManager
    alias call_scene_crafting call

    attr_accessor :scene_param

    def call(scene_class, *param)
    @scene_param = param
    call_scene_crafting(scene_class)
    end
    end

    #================================================= =============
    # * List Recipes of a Book
    #================================================= =============
    class Scene_Item < Scene_ItemBase
    alias sz_crafting_determitem determine_item

    def determine_item
    if item.recipe_book
    create_crafting_item_window
    show_crafting_sub_window(@crafting_item_window)
    else
    sz_crafting_determitem
    end
    end

    def create_crafting_item_window
    wy = @help_window.height+@category_window.height
    @crafting_item_window = Window_MenuCraftingList.new(item,wy)
    @crafting_item_window.set_handler(:cancel, method(n_sz_item_cancel))
    @crafting_item_window.set_handler(:left, method(:ingredients_show_ingredients))
    @crafting_item_window.set_handler(:right, method(:ingredients_show_stats))

    ww = Graphics.width - @crafting_item_window.width
    wh = Graphics.height - wy
    @ingredients_window = Window_CraftingIngredients.new(240, wy,ww,wh)
    @ingredients_window.viewport
    @crafting_item_window.ingredients_window = @ingredients_window
    end

    def on_sz_item_cancel
    hide_crafting_sub_window(@crafting_item_window)
    end


    def show_crafting_sub_window(window)
    height_remain = @help_window.height+@category_window.height
    @viewport.rect.height = height_remain
    window.show.activate
    end

    def hide_crafting_sub_window(window)
    @viewport.rect.y = @viewport.oy = 0
    @viewport.rect.height = Graphics.height
    window.hide.deactivate
    activate_item_window
    end

    def ingredients_show_ingredients
    @ingredients_window.showtype = 0
    end

    def ingredients_show_stats
    @ingredients_window.showtype = 1
    end
    end


    class Window_Selectable < Window_Base
    alias :sz_cr_input_handler_process_handling rocess_handling

    def process_handling
    return unless open? && active
    sz_cr_input_handler_process_handling
    return call_handler(:left) if handle?(:left) && Input.trigger?(:LEFT)
    return call_handler(:right) if handle?(:right) && Input.trigger?(:RIGHT)
    end
    end

    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    #================================================= =============
    # * Content of Crafting Items
    #================================================= =============
    class RPG::BaseItem
    attr_accessor :ingredients
    attr_accessor :recipe_book
    attr_accessor :recipes
    attr_accessor :cr_category


    def load_crafting_notetags_sz
    @ingredients = []
    @recipe_book = false
    @recipes = []
    @cr_category = -1

    @scan_ingredients = false
    @scan_recipes = false

    self.note.split(/[\r\n]+/).each do |line|
    case line.downcase
    # Ingredients
    when /<(?:ingredients?)>/i
    @scan_ingredients = true
    when /<\/(?:ingredients?)>/i
    @scan_ingredients = false
    # Recipes
    when /<(?:recipes?)>/i
    @scan_recipes = true
    when /<\/(?:recipes?)>/i
    @scan_recipes = false
    # Crafting Book
    when /<(?:recipe book)>/i
    @recipe_book = true
    @itype_id = 2
    when /<category:\s*?(\d+)>/i
    @cr_category = $1.to_i if @recipe_book
    else
    scan_ingredients(line) if @scan_ingredients
    scan_recipes(line) if @scan_recipes
    end
    end
    end

    def scan_ingredients(line)
    return if @crafting_book
    return unless line =~ /(\w+):\s*?(\d+)[x]?\s*(\d+)?/i ? true : false
    case $1
    when "c"
    @ingredients.push([Vocab::currency_unit,$2.to_i])
    when "i"
    @ingredients.push([$data_items[$3.to_i], $2.to_i])
    when "w"
    @ingredients.push([$data_weapons[$3.to_i], $2.to_i])
    when "a"
    @ingredients.push([$data_armors[$3.to_i], $2.to_i])
    end
    end

    def scan_recipes(line)
    return unless line =~ /(\w+):\s*(\d+)\s*-?\s*(\d+)?/i ? true : false
    from = $2.to_i
    if $3 == nil
    til = from
    else
    til = $3.to_i
    end

    for i in from..til
    case $1
    when "i"
    @recipes.push($data_items[i])
    when "w"
    @recipes.push($data_weapons[i])
    when "a"
    @recipes.push($data_armors[i])
    end
    end
    @recipes = @recipes.sort_by {|x| [x.class.to_s, x.id]}
    end


    def match_ingredients?
    @ingredients.each do |ing|
    icount = ing[0].is_a?(RPG::BaseItem) ? $game_party.item_number(ing[0]) : $game_party.gold
    return false if icount < ing[1]
    end
    return true
    end

    def add_recipe(type)
    return unless @recipe_book
    return unless type =~ /(\w+):\s*(\d+)\s*-?\s*(\d+)?/i ? true : false
    from = $2.to_i
    if $3 == nil
    til = from
    else
    til = $3.to_i
    end

    for i in from..til
    case $1
    when "i"
    return if @recipes.include?($data_items[i])
    @recipes.push($data_items[i])
    when "w"
    return if @recipes.include?($data_weapons[i])
    @recipes.push($data_weapons[i])
    when "a"
    return if @recipes.include?($data_armors[i])
    @recipes.push($data_armors[i])
    end
    end

    @recipes = @recipes.sort_by {|x| [x.class.to_s, x.id]}
    end

    def remove_recipe(type)
    return unless @recipe_book
    return unless type =~ /(\w+):\s*(\d+)\s*-?\s*(\d+)?/i ? true : false
    from = $2.to_i
    if $3 == nil
    til = from
    else
    til = $3.to_i
    end

    for i in from..til
    case $1
    when "i"
    return if not @recipes.include?($data_items[i])
    @recipes.delete($data_items[i])
    when "w"
    return if not @recipes.include?($data_weapons[i])
    @recipes.delete($data_weapons[i])
    when "a"
    return if not @recipes.include?($data_armors[i])
    @recipes.delete($data_armors[i])
    end
    end

    @recipes = @recipes.sort_by {|x| [x.class.to_s, x.id]}
    end
    end



  2. #2

    По умолчанию

    Пользуйте тэг [CODE] когда вставляете скрипт, а то форум перелопачивает связки некоторых символов в смайлики и при копировании могут возникнуть проблемы.

  3. #3
    Супер-модератор Аватар для dirge
    Информация о пользователе
    Регистрация
    25.02.2013
    Сообщений
    923
    Репутация: 78 Добавить или отнять репутацию

    По умолчанию

    Попробуй, не до конца уверен, что работает на 100%, но по идее должно.
    Спойлер Скрипт:
    Код:
    #==============================================================================
    # Crafting System
    # Version 1.9
    # By Szyu
    #
    # About:
    # Craft items, weapons and armors.
    #
    # Instructions:
    # - Place below "? Materials" but above "? Main Process".
    # - Call global Crafting List by "SceneManager.call(Scene_Crafting)" or 
    #       "SceneManager.call(Scene_Crafting, -1)".
    #   For categorized Crafting Lists use "SceneManager.call(Scene_Crafting, x)"
    #
    # How to Use:
    # - "<ingredients> content </ingredients>" marks the area for ingredients
    # example:
    #   <ingredients>
    #   i: 3x 5   => 3 items of item_id 5
    #   w: 2x 7   => 2 weapons of weapon_id 7
    #   a: 1x 2   => 1 armor of armor_id 2
    #   </ingredients>
    #
    # - "<recipe book>" marks the item as a recipe book, able to hold recipes
    # - "<category: x>" marks a recipe book as category x. You can call seperate 
    #               category crafting lists by SceneManager.call(Scene_Crafting, x)
    # 
    # - "<recipes> content </recipes>" marks the area for recipes if the 
    #                                  item is a crafting book
    # example:
    #   <recipes>
    #   i: 5   => ability to craft the item with id 5 
    #   w: 7   => ability to craft the weapon with id 7
    #   a: 2 - 20   => ability to craft armors from id 2 to id 20
    #   </recipes>
    #
    # - "$data_items[book_id].add_recipe("i/w/a: id")" adds a new recipe to a book
    # - "$data_items[book_id].add_recipe("i/w/a: id1 - id2")" adds a new recipe to a book
    # - "$data_items[book_id].remove_recipe("i/w/a: id")" removes a recipe from a book
    # - "$data_items[book_id].remove_recipe("i/w/a: id1 - id2")" removes a recipe from a book
    #
    # Requires:
    # - RPG Maker VX Ace
    #
    # Terms of Use:
    # - Free for commercal and non-commercial use. Please list me
    #   in the credits to support my work.
    #
    # Pastebin:
    # http://pastebin.com/CxB8F8T5
    #
    #==============================================================
    #   * Configuration
    #==============================================================
    
    # Term used for crafting from recipe books
    INGREDIENTS_TERM = "Ingredientes"
    CR_WEAPON_TYPE_TERM = "Clase de arma"
    CR_ARMOR_TYPE_TERM = "Clase de armadura"
    
    CRAFTING_CATEGORIES = ["Alchemy","Blacksmithing"]
    
    # Custom crafting sounds by category
    CUSTOM_CRAFT_SOUNDS_BY_CAT = ["Saint5", "Bell2"]
    # Custom crafting sounds for RPG::Item, RPG::Weapon, RPG::Armor if no special cat
    CUSTOM_CRAFT_SOUNDS_BY_TYPE = ["Saint5", "Bell2", "Bell3"]
    
    # If you want to use crafting from the menu, set this to true, else false
    CRAFTING_IN_MENU = true
    MENU_CRAFTING_VOCAB = "Crafting"
    
    
    # Vocabs used in status section for crafted items
    CRAFTING_ITEM_STATUS ={
          :empty      => "-",     # Text used when nothing is shown.
          :hp_recover => "HP",      # Text used for HP Recovery.
          :mp_recover => "MP",      # Text used for MP Recovery.
          :tp_recover => "TP",      # Text used for TP Recovery.
          :tp_gain    => "TP gain", # Text used for TP Gain.
          :applies    => "applies", # Text used for applied states and buffs.
          :removes    => "removes", # Text used for removed states and buffs.
        }
    
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    #==============================================================
    #   * Scene_Crafting
    #==============================================================
    class Scene_Crafting < Scene_ItemBase
      
      def initialize()
        @cr_category = SceneManager.scene_param[0] ? SceneManager.scene_param[0] : -1
      end
      
      def start
        super
        create_help_window
        create_category_window
        create_ingredients_window
        create_item_window
      end
      
      def create_category_window
        @category_window = Window_CraftingCategory.new
        @category_window.viewport = @viewport
        @category_window.help_window = @help_window
        @category_window.y = @help_window.height
        @category_window.set_handler(:ok,     method(:on_category_ok))
        @category_window.set_handler(:cancel, method(:return_scene))
      end
      
      def create_ingredients_window
        wx = 240
        wy = @category_window.y + @category_window.height
        ww = Graphics.width - wx
        wh = Graphics.height - wy
        @ingredients_window = Window_CraftingIngredients.new(wx,wy,ww,wh)
        @ingredients_window.viewport = @viewport
      end
      
      def create_item_window
        wy = @category_window.y + @category_window.height
        wh = Graphics.height - wy
        @item_window = Window_CraftingItemList.new(0, wy, 240, wh)
        @item_window.cr_category = @cr_category
        @item_window.viewport = @viewport
        @item_window.help_window = @help_window
        @item_window.set_handler(:ok,     method(:on_item_ok))
        @item_window.set_handler(:cancel, method(:on_item_cancel))
        @item_window.set_handler(:right, method(:ingredients_show_stats))
        @item_window.set_handler(:left, method(:ingredients_show_ingredients))
        @item_window.ingredients_window = @ingredients_window
        @category_window.item_window = @item_window
      end
      
      def on_category_ok
        @item_window.activate
        @item_window.select_last
      end
      
      def on_item_ok
        determine_crafting
      end
      
      def on_item_cancel
        @item_window.unselect
        @category_window.activate
      end
      
      def determine_crafting
        craft_item if @item_window.item.match_ingredients?
      end
      
      def craft_item
        item = @item_window.item
        item.ingredients.each do |ing|
          if ing[0].is_a?(RPG::BaseItem)
            $game_party.lose_item(ing[0],ing[1])
          else
            $game_party.lose_gold(ing[1])
          end
        end
        $game_party.gain_item(item,1)
        
        if @cr_category != -1
          csf = CUSTOM_CRAFT_SOUNDS_BY_CAT[@cr_category]
        else
          if item.is_a?(RPG::Item)
            csf = CUSTOM_CRAFT_SOUNDS_BY_TYPE[0]
          elsif item.is_a?(RPG::Weapon)
            csf = CUSTOM_CRAFT_SOUNDS_BY_TYPE[1]
          elsif item.is_a?(RPG::Armor)
            csf = CUSTOM_CRAFT_SOUNDS_BY_TYPE[2]
          end
        end
        RPG::SE.new(csf, 100, 50).play
        
        @item_window.refresh
        @item_window.activate
      end
      
      def ingredients_show_ingredients
        @ingredients_window.showtype = 0
      end
      
      def ingredients_show_stats
        @ingredients_window.showtype = 1
      end
    end
    
    #==============================================================
    #   * Scene_Menu
    #==============================================================
    class Scene_Menu < Scene_MenuBase
      alias add_crafting_menu_entry create_command_window
      
      def create_command_window
        add_crafting_menu_entry
        @command_window.set_handler(:crafting,      method(:open_crafting)) if CRAFTING_IN_MENU
      end
      
      def open_crafting
        SceneManager.call(Scene_Crafting, -1)
      end
    end
    
    #==============================================================
    #   * Window_CraftingCategory
    #==============================================================
    class Window_CraftingCategory < Window_HorzCommand
      attr_reader   :item_window
      
      def initialize
        super(0, 0)
      end
      
      def window_width
        Graphics.width
      end
      
      def col_max
        return 3
      end
      
      def update
        super
        @item_window.category = current_symbol if @item_window
      end
      
      def make_command_list
        add_command(Vocab::item,     :item)
        add_command(Vocab::weapon,   :weapon)
        add_command(Vocab::armor,    :armor)
      end
      
      def item_window=(item_window)
        @item_window = item_window
        update
      end
    end
    
    #==============================================================
    #   * Window_CraftingCategory
    #==============================================================
    class Window_CraftingItemList < Window_Selectable
      attr_reader :ingredients_window
      attr_accessor :cr_category
      
      def initialize(x, y, width, height)
        super
        @category = :none
        @data = []
      end
      
      def category=(category)
        return if @category == category
        @category = category
        refresh
        self.oy = 0
      end
      
      def col_max
        return 1
      end
      
      def item_max
        @data ? @data.size : 1
      end
      
      def item
        @data && index >= 0 ? @data[index] : nil
      end
      
      def current_item_enabled?
        return false unless @data[index]
        @data[index].match_ingredients?
      end
      
      def include?(item)
        case @category
        when :item
          item.is_a?(RPG::Item)
        when :weapon
          item.is_a?(RPG::Weapon)
        when :armor
          item.is_a?(RPG::Armor)
        else
          false
        end
      end
      
      def enable?(item)
        $game_party.usable?(item)
      end
      
      def make_item_list
        rbooks = $game_party.all_items.select {|item| item.recipe_book}
        rbooks.delete_if {|x| x.cr_category != @cr_category} if @cr_category != -1
        @data = []
        rbooks.each do |book|
          sdata = book.recipes.select {|recipe| include?(recipe) }
          @data.concat sdata
        end
        @data.push(nil) if include?(nil)
      end
      
      def select_last
        select(@data.index($game_party.last_item.object) || 0)
      end
      
      def draw_item(index)
        item = @data[index]
        if item
          rect = item_rect(index)
          rect.width -= 4
          draw_item_name(item, rect.x, rect.y, item.match_ingredients?, width-70)
          draw_item_number(rect, item)
        end
      end
      
      def draw_item_number(rect, item)
        draw_text(rect, sprintf(":%2d", $game_party.item_number(item)), 2)
      end
      
      def update_help
        @help_window.set_item(item)
        @ingredients_window.item = item if @ingredients_window
      end
      
      def refresh
        make_item_list
        create_contents
        draw_all_items
      end
      
      def ingredients_window=(ingredients_window)
        @ingredients_window = ingredients_window
        update
      end
      
      def process_ok
        if current_item_enabled?
          Input.update
          deactivate
          call_ok_handler
        else
          Sound.play_buzzer
        end
      end
      
      alias cr_us_win unselect
      def unselect
        cr_us_win
        @ingredients_window.contents.clear
      end
    end
    
    #==============================================================
    #   * Window_MenuCraftingList
    #==============================================================
    class Window_MenuCraftingList < Window_Selectable
      
      attr_reader :ingredients_window
      attr_reader :book
      
      alias cr_ing_help call_update_help
      alias cr_ing_hide hide
      
      def initialize(book,y)
        @book = book
        super(0,y, 240, Graphics.height-y)
        self.visible = false
        refresh
      end
      
      def window_height
        Graphics.height-self.y
      end
      
      def item_max
        @book.recipes.size
      end
      
      def item_height
        line_height+4
      end
      
      def draw_item(index)
        recipe = @book.recipes[index]
        rect = item_rect(index)
        draw_icon(recipe.icon_index, rect.x+2, rect.y+2)
        draw_text(rect.x+30,rect.y+2,width-75, line_height, recipe.name)
        draw_text(rect.x-30,rect.y+2,width, line_height, sprintf(":%2d", $game_party.item_number(@item)), 2)
      end
      
      def process_ok
        super
        $game_party.menu_actor = $game_party.members[index]
      end
      
      def select_last
        select($game_party.menu_actor.index || 0)
      end
      
      def select_for_item(item)
        select(0)
        @book = item
      end
      
      def ingredients_window=(ingredients_window)
        @ingredients_window = ingredients_window
        update
      end
      
      def call_update_help
        cr_ing_help
        @ingredients_window.item = @book.recipes[@index] if @ingredients_window && @index >= 0
      end
      
      def hide
        cr_ing_hide
        @ingredients_window.hide.deactivate
      end
    end
    
    #==============================================================
    #   * Window_CraftingIngredients
    #==============================================================
    class Window_CraftingIngredients < Window_Selectable
      def initialize(x,y,w,h)
        super(x,y,w,h)
        @item = nil
        @showtype=0
      end
      
      def item=(item)
        @item = item
        refresh
      end
      
      def refresh
        contents.clear
        return if !@item
        case @showtype
        when 1
          #draw_stats_item if @item.is_a?(RPG::Item)
          draw_stats
        else
          draw_ingredients
        end
      end
      
      def draw_ingredients
        change_color(system_color)
        draw_text(0,line_height*0,width,line_height, INGREDIENTS_TERM)
        i = 1
        @item.ingredients.each do |ing|
          change_color(normal_color)
          change_color(normal_color)
          if ing[0].is_a?(String)
            draw_icon(361,0,line_height*i)
            draw_text(24,line_height*i, width,line_height, ing[0])
            inumber = $game_party.gold
          else
            draw_icon(ing[0].icon_index,0,line_height*i)
            draw_text(24,line_height*i, width,line_height, ing[0].name)
            inumber = $game_party.item_number(ing[0])
          end
          
          change_color(crisis_color) if inumber < ing[1]
          change_color(hp_gauge_color1) if inumber == 0
          change_color(tp_gauge_color2) if inumber >= ing[1]
          
          txt = sprintf("%d/%d",inumber, ing[1])
          draw_text(-24,line_height*i,width-4,line_height,txt,2)
          i += 1
        end
        change_color(normal_color)
      end
      
      def draw_stats
        draw_item_stats
        draw_item_effects
      end
      
      def showtype=(st)
        @showtype = st
        refresh
      end
      
      def draw_background_box(dx, dy, dw)
        colour = Color.new(0, 0, 0, translucent_alpha/2)
        rect = Rect.new(dx+1, dy+1, dw-2, line_height-2)
        contents.fill_rect(rect, colour)
      end
          
      def draw_item_stats
        return unless @item.is_a?(RPG::Weapon) || @item.is_a?(RPG::Armor)
        dx = 0; dy = 0
        dw = (contents.width) / 2
        for i in 0...8
          draw_equip_param(i, dx, dy, dw)
          dx = dx >= dw ? 0 : dw
          dy += line_height if dx == 0
        end
      end
          
      def draw_equip_param(param_id, dx, dy, dw)
        draw_background_box(dx, dy, dw)
        change_color(system_color)
        draw_text(dx+4, dy, dw-8, line_height, Vocab::param(param_id))
        draw_set_param(param_id, dx, dy, dw)
      end
         
      def draw_set_param(param_id, dx, dy, dw)
        value = @item.params[param_id]
        change_color(param_change_color(value), value != 0)
        text = value.to_s
        text = "+" + text if value > 0
        draw_text(dx+4, dy, dw-8, line_height, text, 2)
        return text
      end
    
      def draw_percent_param(param_id, dx, dy, dw)
        value = @item.per_params[param_id]
        change_color(param_change_color(value))
        text = (@item.per_params[param_id] * 100).to_i.to_s + "%"
        text = "+" + text if @item.per_params[param_id] > 0
        draw_text(dx+4, dy, dw-8, line_height, text, 2)
        return text
      end
          
      def draw_item_effects
        return unless @item.is_a?(RPG::Item)
        dx = 0; dy = 0
        dw = (contents.width) / 2
        draw_hp_recover(dx, dy + line_height * 0, dw)
        draw_mp_recover(dx, dy + line_height * 1, dw)
        draw_tp_recover(dx + dw, dy + line_height * 0, dw)
        draw_tp_gain(dx + dw, dy + line_height * 1, dw)
        dw = contents.width
        draw_applies(dx, dy + line_height * 2, dw)
        draw_removes(dx, dy + line_height * 3, dw)
      end
    
      def draw_hp_recover(dx, dy, dw)
        draw_background_box(dx, dy, dw)
        change_color(system_color)
        draw_text(dx+4, dy, dw-8, line_height, CRAFTING_ITEM_STATUS[:hp_recover])
        per = 0
        set = 0
        for effect in @item.effects
          next unless effect.code == 11
          per += (effect.value1 * 100).to_i
          set += effect.value2.to_i
        end
        if per != 0 && set != 0
          change_color(param_change_color(set))
          text = set > 0 ? sprintf("+%s", set.to_s) : set.to_s
          draw_text(dx+4, dy, dw-8, line_height, text, 2)
          dw -= text_size(text).width
          change_color(param_change_color(per))
          text = per > 0 ? sprintf("+%s%%", per.to_s) : sprintf("%s%%", per.to_s)
          draw_text(dx+4, dy, dw-8, line_height, text, 2)
          return
        elsif per != 0
          change_color(param_change_color(per))
          text = per > 0 ? sprintf("+%s%%", per.to_s) : sprintf("%s%%", per.to_s)
        elsif set != 0
          change_color(param_change_color(set))
          text = set > 0 ? sprintf("+%s", set.to_s) : set.to_s
        else
          change_color(normal_color, false)
          text = CRAFTING_ITEM_STATUS[:empty]
        end
        draw_text(dx+4, dy, dw-8, line_height, text, 2)
      end
    
      def draw_mp_recover(dx, dy, dw)
        draw_background_box(dx, dy, dw)
        change_color(system_color)
        draw_text(dx+4, dy, dw-8, line_height, CRAFTING_ITEM_STATUS[:mp_recover])
        per = 0
        set = 0
        for effect in @item.effects
          next unless effect.code == 12
          per += (effect.value1 * 100).to_i
          set += effect.value2.to_i
        end
        if per != 0 && set != 0
          change_color(param_change_color(set))
          text = set > 0 ? sprintf("+%s", set.to_s) : set.to_s
          draw_text(dx+4, dy, dw-8, line_height, text, 2)
          dw -= text_size(text).width
          change_color(param_change_color(per))
          text = per > 0 ? sprintf("+%s%%", per.to_s) : sprintf("%s%%", per.to_s)
          draw_text(dx+4, dy, dw-8, line_height, text, 2)
          return
        elsif per != 0
          change_color(param_change_color(per))
          text = per > 0 ? sprintf("+%s%%", per.to_s) : sprintf("%s%%", per.to_s)
        elsif set != 0
          change_color(param_change_color(set))
          text = set > 0 ? sprintf("+%s", set.to_s) : set.to_s
        else
          change_color(normal_color, false)
          text = CRAFTING_ITEM_STATUS[:empty]
        end
        draw_text(dx+4, dy, dw-8, line_height, text, 2)
      end
    
      def draw_tp_recover(dx, dy, dw)
        draw_background_box(dx, dy, dw)
        change_color(system_color)
        draw_text(dx+4, dy, dw-8, line_height, CRAFTING_ITEM_STATUS[:tp_recover])
        set = 0
        for effect in @item.effects
          next unless effect.code == 13
          set += effect.value1.to_i
        end
        if set != 0
          change_color(param_change_color(set))
          text = set > 0 ? sprintf("+%s", set.to_s) : set.to_s
        else
          change_color(normal_color, false)
          text = CRAFTING_ITEM_STATUS[:empty]
        end
        draw_text(dx+4, dy, dw-8, line_height, text, 2)
      end
    
      def draw_tp_gain(dx, dy, dw)
        draw_background_box(dx, dy, dw)
        change_color(system_color)
        draw_text(dx+4, dy, dw-8, line_height, CRAFTING_ITEM_STATUS[:tp_gain])
        set = @item.tp_gain
        if set != 0
          change_color(param_change_color(set))
          text = set > 0 ? sprintf("+%s", set.to_s) : set.to_s
        else
          change_color(normal_color, false)
          text = CRAFTING_ITEM_STATUS[:empty]
        end
        draw_text(dx+4, dy, dw-8, line_height, text, 2)
      end
    
      def draw_applies(dx, dy, dw)
        draw_background_box(dx, dy, dw)
        change_color(system_color)
        draw_text(dx+4, dy, dw-8, line_height, CRAFTING_ITEM_STATUS[:applies])
        icons = []
        for effect in @item.effects
          case effect.code
          when 21
            next unless effect.value1 > 0
            next if $data_states[effect.value1].nil?
            icons.push($data_states[effect.data_id].icon_index)
          when 31
            icons.push($game_actors[1].buff_icon_index(1, effect.data_id))
          when 32
            icons.push($game_actors[1].buff_icon_index(-1, effect.data_id))
          end
          icons.delete(0)
          break if icons.size >= 10
        end
        draw_icons(dx, dy, dw, icons)
      end
    
      def draw_removes(dx, dy, dw)
        draw_background_box(dx, dy, dw)
        change_color(system_color)
        draw_text(dx+4, dy, dw-8, line_height, CRAFTING_ITEM_STATUS[:removes])
        icons = []
        for effect in @item.effects
          case effect.code
          when 22
            next unless effect.value1 > 0
            next if $data_states[effect.value1].nil?
            icons.push($data_states[effect.data_id].icon_index)
          when 33
            icons.push($game_actors[1].buff_icon_index(1, effect.data_id))
          when 34
            icons.push($game_actors[1].buff_icon_index(-1, effect.data_id))
          end
          icons.delete(0)
          break if icons.size >= 10
        end
        draw_icons(dx, dy, dw, icons)
      end
      
      def draw_icons(dx, dy, dw, icons)
        dx += dw - 4
        dx -= icons.size * 24
        for icon_id in icons
          draw_icon(icon_id, dx, dy)
          dx += 24
        end
        if icons.size == 0
          change_color(normal_color, false)
          text = CRAFTING_ITEM_STATUS[:empty]
          draw_text(4, dy, contents.width-8, line_height, text, 2)
        end
      end
    end
    
    
    
    #==============================================================
    #   * Window_MenuCommand
    #==============================================================
    class Window_MenuCommand < Window_Command
      
      alias add_crafting_menu_entry add_main_commands
      def add_main_commands
        add_crafting_menu_entry
        add_command(MENU_CRAFTING_VOCAB, :crafting, craft_enabled) if CRAFTING_IN_MENU
      end
      
      def craft_enabled
        return $recipe_list > 0
      end
      
    end
    
    class Scene_Menu < Scene_MenuBase
      alias list_start start
      def start
        list_check
        list_start
        @command_window.refresh
      end
      
      def list_check
        rbooks = $game_party.all_items.select {|item| item.recipe_book}
        @data_check = []
        rbooks.each do |book|
          sdata = book.recipes
          @data_check.concat sdata
        end
        $recipe_list = @data_check.size
      end
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    #==============================================================
    #   * Initialize BaseItems
    #==============================================================
    module DataManager
      class << self
        alias load_db_sz_crafting load_database
        alias save_crafting_recipe_books make_save_contents
        alias load_crafting_recipe_books extract_save_contents
      end
      
      def self.load_database
        load_db_sz_crafting
        load_crafting_item_notetags
      end
      
      def self.load_crafting_item_notetags
        groups = [$data_items, $data_weapons, $data_armors]
        for group in groups
          for obj in group
            next if obj.nil?
            obj.load_crafting_notetags_sz
          end
        end
      end
      
      
      def self.make_save_contents
        contents = save_crafting_recipe_books
        recipe_books = {}
        for item in $data_items
          next if item.nil?
          next if not item.recipe_book
          recipe_books[item.id] = item.recipes
        end
        
        contents[:recipe_books] = recipe_books
        contents
      end
      
      def self.extract_save_contents(contents)
        load_crafting_recipe_books(contents)
        recipe_books = contents[:recipe_books]
        
        recipe_books.each do |id, recipes|
          $data_items[id].recipes = recipes
        end
      end
    end
    
    #==============================================================
    #   * Call Scene with Parameters
    #==============================================================
    class << SceneManager
      alias call_scene_crafting call
      
      attr_accessor :scene_param
      
      def call(scene_class, *param)
        @scene_param = param
        call_scene_crafting(scene_class)
      end
    end
    
    #==============================================================
    #   * List Recipes of a Book
    #==============================================================
    class Scene_Item < Scene_ItemBase
      alias sz_crafting_determitem determine_item
    
      def determine_item
        if item.recipe_book
          create_crafting_item_window
          show_crafting_sub_window(@crafting_item_window)
        else
          sz_crafting_determitem
        end
      end
      
      def create_crafting_item_window
        wy = @help_window.height+@category_window.height
        @crafting_item_window = Window_MenuCraftingList.new(item,wy)
        @crafting_item_window.set_handler(:cancel, method(:on_sz_item_cancel))
        @crafting_item_window.set_handler(:left, method(:ingredients_show_ingredients))
        @crafting_item_window.set_handler(:right, method(:ingredients_show_stats))
        
        ww = Graphics.width - @crafting_item_window.width
        wh = Graphics.height - wy
        @ingredients_window = Window_CraftingIngredients.new(240, wy,ww,wh)
        @ingredients_window.viewport
        @crafting_item_window.ingredients_window = @ingredients_window
      end
    
      def on_sz_item_cancel
        hide_crafting_sub_window(@crafting_item_window)
      end
      
      
      def show_crafting_sub_window(window)
        height_remain = @help_window.height+@category_window.height
        @viewport.rect.height = height_remain
        window.show.activate
      end
      
      def hide_crafting_sub_window(window)
        @viewport.rect.y = @viewport.oy = 0
        @viewport.rect.height = Graphics.height
        window.hide.deactivate
        activate_item_window
      end
      
      def ingredients_show_ingredients
        @ingredients_window.showtype = 0
      end
      
      def ingredients_show_stats
        @ingredients_window.showtype = 1
      end
    end
    
    
    
    class Window_Selectable < Window_Base
      alias :sz_cr_input_handler_process_handling :process_handling
      
      def process_handling
        return unless open? && active
        sz_cr_input_handler_process_handling
        return call_handler(:left) if handle?(:left) && Input.trigger?(:LEFT)
        return call_handler(:right) if handle?(:right) && Input.trigger?(:RIGHT)
      end
    end
    
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    #==============================================================
    #   * Content of Crafting Items
    #==============================================================
    class RPG::BaseItem
      attr_accessor :ingredients
      attr_accessor :recipe_book
      attr_accessor :recipes
      attr_accessor :cr_category
      
      
      def load_crafting_notetags_sz
        @ingredients = []
        @recipe_book = false
        @recipes = []
        @cr_category = -1
        
        @scan_ingredients = false
        @scan_recipes = false
        
        self.note.split(/[\r\n]+/).each do |line|
          case line.downcase
          # Ingredients
          when /<(?:ingredients?)>/i
            @scan_ingredients = true
          when /<\/(?:ingredients?)>/i
            @scan_ingredients = false
          # Recipes
          when /<(?:recipes?)>/i
            @scan_recipes = true
          when /<\/(?:recipes?)>/i
            @scan_recipes = false
          # Crafting Book
          when /<(?:recipe book)>/i
            @recipe_book = true
            @itype_id = 2
          when /<category:\s*?(\d+)>/i
            @cr_category = $1.to_i if @recipe_book
          else
            scan_ingredients(line) if @scan_ingredients
            scan_recipes(line) if @scan_recipes
          end
        end
      end
      
      def scan_ingredients(line)
        return if @crafting_book
        return unless line =~ /(\w+):\s*?(\d+)[x]?\s*(\d+)?/i ? true : false
        case $1
        when "c"
          @ingredients.push([Vocab::currency_unit,$2.to_i])
        when "i"
          @ingredients.push([$data_items[$3.to_i], $2.to_i])
        when "w"
          @ingredients.push([$data_weapons[$3.to_i], $2.to_i])
        when "a"
          @ingredients.push([$data_armors[$3.to_i], $2.to_i])
        end
      end
      
      def scan_recipes(line)
        return unless line =~ /(\w+):\s*(\d+)\s*-?\s*(\d+)?/i ? true : false
        from = $2.to_i
        if $3 == nil
          til = from
        else
          til = $3.to_i
        end
        
        for i in from..til
          case $1
          when "i"
            @recipes.push($data_items[i])
          when "w"
            @recipes.push($data_weapons[i])
          when "a"
            @recipes.push($data_armors[i])
          end
        end
        @recipes = @recipes.sort_by {|x| [x.class.to_s, x.id]}
      end
      
      
      def match_ingredients?
        @ingredients.each do |ing|
          icount = ing[0].is_a?(RPG::BaseItem) ? $game_party.item_number(ing[0]) : $game_party.gold
          return false if icount < ing[1] 
        end
        return true
      end
      
      def add_recipe(type)
        return unless @recipe_book
        return unless type =~ /(\w+):\s*(\d+)\s*-?\s*(\d+)?/i ? true : false
        from = $2.to_i
        if $3 == nil
          til = from
        else
          til = $3.to_i
        end
        
        for i in from..til
          case $1
          when "i"
            return if @recipes.include?($data_items[i])
            @recipes.push($data_items[i])
          when "w"
            return if @recipes.include?($data_weapons[i])
            @recipes.push($data_weapons[i])
          when "a"
            return if @recipes.include?($data_armors[i])
            @recipes.push($data_armors[i])
          end
        end
        
        @recipes = @recipes.sort_by {|x| [x.class.to_s, x.id]}
      end
      
      def remove_recipe(type)
        return unless @recipe_book
        return unless type =~ /(\w+):\s*(\d+)\s*-?\s*(\d+)?/i ? true : false
        from = $2.to_i
        if $3 == nil
          til = from
        else
          til = $3.to_i
        end
        
        for i in from..til
          case $1
          when "i"
            return if not @recipes.include?($data_items[i])
            @recipes.delete($data_items[i])
          when "w"
            return if not @recipes.include?($data_weapons[i])
            @recipes.delete($data_weapons[i])
          when "a"
            return if not @recipes.include?($data_armors[i])
            @recipes.delete($data_armors[i])
          end
        end
        
        @recipes = @recipes.sort_by {|x| [x.class.to_s, x.id]}
      end
    end

    И да, как сказал Липтон, в будущем вставляй с тегом код, а то пришлось юзать гугл.
    Последний раз редактировалось dirge; 15.02.2015 в 15:04.

  4. #4
    Хранитель Аватар для Темный
    Информация о пользователе
    Регистрация
    13.05.2011
    Сообщений
    2,449
    Записей в дневнике
    20
    Репутация: 50 Добавить или отнять репутацию

    По умолчанию

    По умолчанию
    Попробуй, не до конца уверен, что работает на 100%, но по идее должно.
    Неа не работает, пункт Синтеза как горел в меню без рецептов так и горит. Но все равно спасибо за попытку.



  5. #5
    Супер-модератор Аватар для dirge
    Информация о пользователе
    Регистрация
    25.02.2013
    Сообщений
    923
    Репутация: 78 Добавить или отнять репутацию

    По умолчанию

    хм, может я не до конца понимаю работу скрипта, или ты как-то иначе вызываешь. Вот скрипт в чистом проекте - https://yadi.sk/d/8bfjP-knegfT7
    Вроде тухнет и опять появляется, посмотри правильно ли я понял все.

  6. #6
    Хранитель Аватар для Темный
    Информация о пользователе
    Регистрация
    13.05.2011
    Сообщений
    2,449
    Записей в дневнике
    20
    Репутация: 50 Добавить или отнять репутацию

    По умолчанию

    Хм... Скрипт работает но удивительно что с меню Ace Menu Engine v1.07
    перестает.



  7. #7
    Супер-модератор Аватар для dirge
    Информация о пользователе
    Регистрация
    25.02.2013
    Сообщений
    923
    Репутация: 78 Добавить или отнять репутацию

    По умолчанию

    мм, наоборот, ничего удивительного. Ace Menu Engine - переписывает сцену меню и там совсем другой вызов. Сделай демку с всегда горящим пунктом крафта, с этими двумя скриптами, а я уже тогда посмотрю.

  8. #8
    Хранитель Аватар для Темный
    Информация о пользователе
    Регистрация
    13.05.2011
    Сообщений
    2,449
    Записей в дневнике
    20
    Репутация: 50 Добавить или отнять репутацию

    По умолчанию

    сейчас сделаю)



  9. #9
    Супер-модератор Аватар для dirge
    Информация о пользователе
    Регистрация
    25.02.2013
    Сообщений
    923
    Репутация: 78 Добавить или отнять репутацию

    По умолчанию

    В общем, посмотрел еще немного, вот
    Спойлер Скрипт:
    Код:
    #==============================================================================
    # Crafting System
    # Version 1.9
    # By Szyu
    #
    # About:
    # Craft items, weapons and armors.
    #
    # Instructions:
    # - Place below "? Materials" but above "? Main Process".
    # - Call global Crafting List by "SceneManager.call(Scene_Crafting)" or 
    #       "SceneManager.call(Scene_Crafting, -1)".
    #   For categorized Crafting Lists use "SceneManager.call(Scene_Crafting, x)"
    #
    # How to Use:
    # - "<ingredients> content </ingredients>" marks the area for ingredients
    # example:
    #   <ingredients>
    #   i: 3x 5   => 3 items of item_id 5
    #   w: 2x 7   => 2 weapons of weapon_id 7
    #   a: 1x 2   => 1 armor of armor_id 2
    #   </ingredients>
    #
    # - "<recipe book>" marks the item as a recipe book, able to hold recipes
    # - "<category: x>" marks a recipe book as category x. You can call seperate 
    #               category crafting lists by SceneManager.call(Scene_Crafting, x)
    # 
    # - "<recipes> content </recipes>" marks the area for recipes if the 
    #                                  item is a crafting book
    # example:
    #   <recipes>
    #   i: 5   => ability to craft the item with id 5 
    #   w: 7   => ability to craft the weapon with id 7
    #   a: 2 - 20   => ability to craft armors from id 2 to id 20
    #   </recipes>
    #
    # - "$data_items[book_id].add_recipe("i/w/a: id")" adds a new recipe to a book
    # - "$data_items[book_id].add_recipe("i/w/a: id1 - id2")" adds a new recipe to a book
    # - "$data_items[book_id].remove_recipe("i/w/a: id")" removes a recipe from a book
    # - "$data_items[book_id].remove_recipe("i/w/a: id1 - id2")" removes a recipe from a book
    #
    # Requires:
    # - RPG Maker VX Ace
    #
    # Terms of Use:
    # - Free for commercal and non-commercial use. Please list me
    #   in the credits to support my work.
    #
    # Pastebin:
    # http://pastebin.com/CxB8F8T5
    #
    #==============================================================
    #   * Configuration
    #==============================================================
    
    # Term used for crafting from recipe books
    INGREDIENTS_TERM = "Ingredientes"
    CR_WEAPON_TYPE_TERM = "Clase de arma"
    CR_ARMOR_TYPE_TERM = "Clase de armadura"
    
    CRAFTING_CATEGORIES = ["Alchemy","Blacksmithing"]
    
    # Custom crafting sounds by category
    CUSTOM_CRAFT_SOUNDS_BY_CAT = ["Saint5", "Bell2"]
    # Custom crafting sounds for RPG::Item, RPG::Weapon, RPG::Armor if no special cat
    CUSTOM_CRAFT_SOUNDS_BY_TYPE = ["Saint5", "Bell2", "Bell3"]
    
    # If you want to use crafting from the menu, set this to true, else false
    CRAFTING_IN_MENU = true
    MENU_CRAFTING_VOCAB = "Crafting"
    
    CRAFTING_ENABLE_SWITCH = 81 # указать номер переключателся, который будет следить
    # за тем, есть ли рецепты в инвентаре.
    
    # Vocabs used in status section for crafted items
    CRAFTING_ITEM_STATUS ={
          :empty      => "-",     # Text used when nothing is shown.
          :hp_recover => "HP",      # Text used for HP Recovery.
          :mp_recover => "MP",      # Text used for MP Recovery.
          :tp_recover => "TP",      # Text used for TP Recovery.
          :tp_gain    => "TP gain", # Text used for TP Gain.
          :applies    => "applies", # Text used for applied states and buffs.
          :removes    => "removes", # Text used for removed states and buffs.
        }
    
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    #==============================================================
    #   * Scene_Crafting
    #==============================================================
    class Scene_Crafting < Scene_ItemBase
      
      def initialize()
        @cr_category = SceneManager.scene_param[0] ? SceneManager.scene_param[0] : -1
      end
      
      def start
        super
        create_help_window
        create_category_window
        create_ingredients_window
        create_item_window
      end
      
      def create_category_window
        @category_window = Window_CraftingCategory.new
        @category_window.viewport = @viewport
        @category_window.help_window = @help_window
        @category_window.y = @help_window.height
        @category_window.set_handler(:ok,     method(:on_category_ok))
        @category_window.set_handler(:cancel, method(:return_scene))
      end
      
      def create_ingredients_window
        wx = 240
        wy = @category_window.y + @category_window.height
        ww = Graphics.width - wx
        wh = Graphics.height - wy
        @ingredients_window = Window_CraftingIngredients.new(wx,wy,ww,wh)
        @ingredients_window.viewport = @viewport
      end
      
      def create_item_window
        wy = @category_window.y + @category_window.height
        wh = Graphics.height - wy
        @item_window = Window_CraftingItemList.new(0, wy, 240, wh)
        @item_window.cr_category = @cr_category
        @item_window.viewport = @viewport
        @item_window.help_window = @help_window
        @item_window.set_handler(:ok,     method(:on_item_ok))
        @item_window.set_handler(:cancel, method(:on_item_cancel))
        @item_window.set_handler(:right, method(:ingredients_show_stats))
        @item_window.set_handler(:left, method(:ingredients_show_ingredients))
        @item_window.ingredients_window = @ingredients_window
        @category_window.item_window = @item_window
      end
      
      def on_category_ok
        @item_window.activate
        @item_window.select_last
      end
      
      def on_item_ok
        determine_crafting
      end
      
      def on_item_cancel
        @item_window.unselect
        @category_window.activate
      end
      
      def determine_crafting
        craft_item if @item_window.item.match_ingredients?
      end
      
      def craft_item
        item = @item_window.item
        item.ingredients.each do |ing|
          if ing[0].is_a?(RPG::BaseItem)
            $game_party.lose_item(ing[0],ing[1])
          else
            $game_party.lose_gold(ing[1])
          end
        end
        $game_party.gain_item(item,1)
        
        if @cr_category != -1
          csf = CUSTOM_CRAFT_SOUNDS_BY_CAT[@cr_category]
        else
          if item.is_a?(RPG::Item)
            csf = CUSTOM_CRAFT_SOUNDS_BY_TYPE[0]
          elsif item.is_a?(RPG::Weapon)
            csf = CUSTOM_CRAFT_SOUNDS_BY_TYPE[1]
          elsif item.is_a?(RPG::Armor)
            csf = CUSTOM_CRAFT_SOUNDS_BY_TYPE[2]
          end
        end
        RPG::SE.new(csf, 100, 50).play
        
        @item_window.refresh
        @item_window.activate
      end
      
      def ingredients_show_ingredients
        @ingredients_window.showtype = 0
      end
      
      def ingredients_show_stats
        @ingredients_window.showtype = 1
      end
    end
    
    #==============================================================
    #   * Scene_Menu
    #==============================================================
    class Scene_Menu < Scene_MenuBase
      alias add_crafting_menu_entry create_command_window
      
      def create_command_window
        add_crafting_menu_entry
        @command_window.set_handler(:crafting,      method(:open_crafting)) if CRAFTING_IN_MENU
      end
      
      def open_crafting
        SceneManager.call(Scene_Crafting, -1)
      end
    end
    
    #==============================================================
    #   * Window_CraftingCategory
    #==============================================================
    class Window_CraftingCategory < Window_HorzCommand
      attr_reader   :item_window
      
      def initialize
        super(0, 0)
      end
      
      def window_width
        Graphics.width
      end
      
      def col_max
        return 3
      end
      
      def update
        super
        @item_window.category = current_symbol if @item_window
      end
      
      def make_command_list
        add_command(Vocab::item,     :item)
        add_command(Vocab::weapon,   :weapon)
        add_command(Vocab::armor,    :armor)
      end
      
      def item_window=(item_window)
        @item_window = item_window
        update
      end
    end
    
    #==============================================================
    #   * Window_CraftingCategory
    #==============================================================
    class Window_CraftingItemList < Window_Selectable
      attr_reader :ingredients_window
      attr_accessor :cr_category
      
      def initialize(x, y, width, height)
        super
        @category = :none
        @data = []
      end
      
      def category=(category)
        return if @category == category
        @category = category
        refresh
        self.oy = 0
      end
      
      def col_max
        return 1
      end
      
      def item_max
        @data ? @data.size : 1
      end
      
      def item
        @data && index >= 0 ? @data[index] : nil
      end
      
      def current_item_enabled?
        return false unless @data[index]
        @data[index].match_ingredients?
      end
      
      def include?(item)
        case @category
        when :item
          item.is_a?(RPG::Item)
        when :weapon
          item.is_a?(RPG::Weapon)
        when :armor
          item.is_a?(RPG::Armor)
        else
          false
        end
      end
      
      def enable?(item)
        $game_party.usable?(item)
      end
      
      def make_item_list
        rbooks = $game_party.all_items.select {|item| item.recipe_book}
        rbooks.delete_if {|x| x.cr_category != @cr_category} if @cr_category != -1
        @data = []
        rbooks.each do |book|
          sdata = book.recipes.select {|recipe| include?(recipe) }
          @data.concat sdata
        end
        @data.push(nil) if include?(nil)
      end
      
      def select_last
        select(@data.index($game_party.last_item.object) || 0)
      end
      
      def draw_item(index)
        item = @data[index]
        if item
          rect = item_rect(index)
          rect.width -= 4
          draw_item_name(item, rect.x, rect.y, item.match_ingredients?, width-70)
          draw_item_number(rect, item)
        end
      end
      
      def draw_item_number(rect, item)
        draw_text(rect, sprintf(":%2d", $game_party.item_number(item)), 2)
      end
      
      def update_help
        @help_window.set_item(item)
        @ingredients_window.item = item if @ingredients_window
      end
      
      def refresh
        make_item_list
        create_contents
        draw_all_items
      end
      
      def ingredients_window=(ingredients_window)
        @ingredients_window = ingredients_window
        update
      end
      
      def process_ok
        if current_item_enabled?
          Input.update
          deactivate
          call_ok_handler
        else
          Sound.play_buzzer
        end
      end
      
      alias cr_us_win unselect
      def unselect
        cr_us_win
        @ingredients_window.contents.clear
      end
    end
    
    #==============================================================
    #   * Window_MenuCraftingList
    #==============================================================
    class Window_MenuCraftingList < Window_Selectable
      
      attr_reader :ingredients_window
      attr_reader :book
      
      alias cr_ing_help call_update_help
      alias cr_ing_hide hide
      
      def initialize(book,y)
        @book = book
        super(0,y, 240, Graphics.height-y)
        self.visible = false
        refresh
      end
      
      def window_height
        Graphics.height-self.y
      end
      
      def item_max
        @book.recipes.size
      end
      
      def item_height
        line_height+4
      end
      
      def draw_item(index)
        recipe = @book.recipes[index]
        rect = item_rect(index)
        draw_icon(recipe.icon_index, rect.x+2, rect.y+2)
        draw_text(rect.x+30,rect.y+2,width-75, line_height, recipe.name)
        draw_text(rect.x-30,rect.y+2,width, line_height, sprintf(":%2d", $game_party.item_number(@item)), 2)
      end
      
      def process_ok
        super
        $game_party.menu_actor = $game_party.members[index]
      end
      
      def select_last
        select($game_party.menu_actor.index || 0)
      end
      
      def select_for_item(item)
        select(0)
        @book = item
      end
      
      def ingredients_window=(ingredients_window)
        @ingredients_window = ingredients_window
        update
      end
      
      def call_update_help
        cr_ing_help
        @ingredients_window.item = @book.recipes[@index] if @ingredients_window && @index >= 0
      end
      
      def hide
        cr_ing_hide
        @ingredients_window.hide.deactivate
      end
    end
    
    #==============================================================
    #   * Window_CraftingIngredients
    #==============================================================
    class Window_CraftingIngredients < Window_Selectable
      def initialize(x,y,w,h)
        super(x,y,w,h)
        @item = nil
        @showtype=0
      end
      
      def item=(item)
        @item = item
        refresh
      end
      
      def refresh
        contents.clear
        return if !@item
        case @showtype
        when 1
          #draw_stats_item if @item.is_a?(RPG::Item)
          draw_stats
        else
          draw_ingredients
        end
      end
      
      def draw_ingredients
        change_color(system_color)
        draw_text(0,line_height*0,width,line_height, INGREDIENTS_TERM)
        i = 1
        @item.ingredients.each do |ing|
          change_color(normal_color)
          change_color(normal_color)
          if ing[0].is_a?(String)
            draw_icon(361,0,line_height*i)
            draw_text(24,line_height*i, width,line_height, ing[0])
            inumber = $game_party.gold
          else
            draw_icon(ing[0].icon_index,0,line_height*i)
            draw_text(24,line_height*i, width,line_height, ing[0].name)
            inumber = $game_party.item_number(ing[0])
          end
          
          change_color(crisis_color) if inumber < ing[1]
          change_color(hp_gauge_color1) if inumber == 0
          change_color(tp_gauge_color2) if inumber >= ing[1]
          
          txt = sprintf("%d/%d",inumber, ing[1])
          draw_text(-24,line_height*i,width-4,line_height,txt,2)
          i += 1
        end
        change_color(normal_color)
      end
      
      def draw_stats
        draw_item_stats
        draw_item_effects
      end
      
      def showtype=(st)
        @showtype = st
        refresh
      end
      
      def draw_background_box(dx, dy, dw)
        colour = Color.new(0, 0, 0, translucent_alpha/2)
        rect = Rect.new(dx+1, dy+1, dw-2, line_height-2)
        contents.fill_rect(rect, colour)
      end
          
      def draw_item_stats
        return unless @item.is_a?(RPG::Weapon) || @item.is_a?(RPG::Armor)
        dx = 0; dy = 0
        dw = (contents.width) / 2
        for i in 0...8
          draw_equip_param(i, dx, dy, dw)
          dx = dx >= dw ? 0 : dw
          dy += line_height if dx == 0
        end
      end
          
      def draw_equip_param(param_id, dx, dy, dw)
        draw_background_box(dx, dy, dw)
        change_color(system_color)
        draw_text(dx+4, dy, dw-8, line_height, Vocab::param(param_id))
        draw_set_param(param_id, dx, dy, dw)
      end
         
      def draw_set_param(param_id, dx, dy, dw)
        value = @item.params[param_id]
        change_color(param_change_color(value), value != 0)
        text = value.to_s
        text = "+" + text if value > 0
        draw_text(dx+4, dy, dw-8, line_height, text, 2)
        return text
      end
    
      def draw_percent_param(param_id, dx, dy, dw)
        value = @item.per_params[param_id]
        change_color(param_change_color(value))
        text = (@item.per_params[param_id] * 100).to_i.to_s + "%"
        text = "+" + text if @item.per_params[param_id] > 0
        draw_text(dx+4, dy, dw-8, line_height, text, 2)
        return text
      end
          
      def draw_item_effects
        return unless @item.is_a?(RPG::Item)
        dx = 0; dy = 0
        dw = (contents.width) / 2
        draw_hp_recover(dx, dy + line_height * 0, dw)
        draw_mp_recover(dx, dy + line_height * 1, dw)
        draw_tp_recover(dx + dw, dy + line_height * 0, dw)
        draw_tp_gain(dx + dw, dy + line_height * 1, dw)
        dw = contents.width
        draw_applies(dx, dy + line_height * 2, dw)
        draw_removes(dx, dy + line_height * 3, dw)
      end
    
      def draw_hp_recover(dx, dy, dw)
        draw_background_box(dx, dy, dw)
        change_color(system_color)
        draw_text(dx+4, dy, dw-8, line_height, CRAFTING_ITEM_STATUS[:hp_recover])
        per = 0
        set = 0
        for effect in @item.effects
          next unless effect.code == 11
          per += (effect.value1 * 100).to_i
          set += effect.value2.to_i
        end
        if per != 0 && set != 0
          change_color(param_change_color(set))
          text = set > 0 ? sprintf("+%s", set.to_s) : set.to_s
          draw_text(dx+4, dy, dw-8, line_height, text, 2)
          dw -= text_size(text).width
          change_color(param_change_color(per))
          text = per > 0 ? sprintf("+%s%%", per.to_s) : sprintf("%s%%", per.to_s)
          draw_text(dx+4, dy, dw-8, line_height, text, 2)
          return
        elsif per != 0
          change_color(param_change_color(per))
          text = per > 0 ? sprintf("+%s%%", per.to_s) : sprintf("%s%%", per.to_s)
        elsif set != 0
          change_color(param_change_color(set))
          text = set > 0 ? sprintf("+%s", set.to_s) : set.to_s
        else
          change_color(normal_color, false)
          text = CRAFTING_ITEM_STATUS[:empty]
        end
        draw_text(dx+4, dy, dw-8, line_height, text, 2)
      end
    
      def draw_mp_recover(dx, dy, dw)
        draw_background_box(dx, dy, dw)
        change_color(system_color)
        draw_text(dx+4, dy, dw-8, line_height, CRAFTING_ITEM_STATUS[:mp_recover])
        per = 0
        set = 0
        for effect in @item.effects
          next unless effect.code == 12
          per += (effect.value1 * 100).to_i
          set += effect.value2.to_i
        end
        if per != 0 && set != 0
          change_color(param_change_color(set))
          text = set > 0 ? sprintf("+%s", set.to_s) : set.to_s
          draw_text(dx+4, dy, dw-8, line_height, text, 2)
          dw -= text_size(text).width
          change_color(param_change_color(per))
          text = per > 0 ? sprintf("+%s%%", per.to_s) : sprintf("%s%%", per.to_s)
          draw_text(dx+4, dy, dw-8, line_height, text, 2)
          return
        elsif per != 0
          change_color(param_change_color(per))
          text = per > 0 ? sprintf("+%s%%", per.to_s) : sprintf("%s%%", per.to_s)
        elsif set != 0
          change_color(param_change_color(set))
          text = set > 0 ? sprintf("+%s", set.to_s) : set.to_s
        else
          change_color(normal_color, false)
          text = CRAFTING_ITEM_STATUS[:empty]
        end
        draw_text(dx+4, dy, dw-8, line_height, text, 2)
      end
    
      def draw_tp_recover(dx, dy, dw)
        draw_background_box(dx, dy, dw)
        change_color(system_color)
        draw_text(dx+4, dy, dw-8, line_height, CRAFTING_ITEM_STATUS[:tp_recover])
        set = 0
        for effect in @item.effects
          next unless effect.code == 13
          set += effect.value1.to_i
        end
        if set != 0
          change_color(param_change_color(set))
          text = set > 0 ? sprintf("+%s", set.to_s) : set.to_s
        else
          change_color(normal_color, false)
          text = CRAFTING_ITEM_STATUS[:empty]
        end
        draw_text(dx+4, dy, dw-8, line_height, text, 2)
      end
    
      def draw_tp_gain(dx, dy, dw)
        draw_background_box(dx, dy, dw)
        change_color(system_color)
        draw_text(dx+4, dy, dw-8, line_height, CRAFTING_ITEM_STATUS[:tp_gain])
        set = @item.tp_gain
        if set != 0
          change_color(param_change_color(set))
          text = set > 0 ? sprintf("+%s", set.to_s) : set.to_s
        else
          change_color(normal_color, false)
          text = CRAFTING_ITEM_STATUS[:empty]
        end
        draw_text(dx+4, dy, dw-8, line_height, text, 2)
      end
    
      def draw_applies(dx, dy, dw)
        draw_background_box(dx, dy, dw)
        change_color(system_color)
        draw_text(dx+4, dy, dw-8, line_height, CRAFTING_ITEM_STATUS[:applies])
        icons = []
        for effect in @item.effects
          case effect.code
          when 21
            next unless effect.value1 > 0
            next if $data_states[effect.value1].nil?
            icons.push($data_states[effect.data_id].icon_index)
          when 31
            icons.push($game_actors[1].buff_icon_index(1, effect.data_id))
          when 32
            icons.push($game_actors[1].buff_icon_index(-1, effect.data_id))
          end
          icons.delete(0)
          break if icons.size >= 10
        end
        draw_icons(dx, dy, dw, icons)
      end
    
      def draw_removes(dx, dy, dw)
        draw_background_box(dx, dy, dw)
        change_color(system_color)
        draw_text(dx+4, dy, dw-8, line_height, CRAFTING_ITEM_STATUS[:removes])
        icons = []
        for effect in @item.effects
          case effect.code
          when 22
            next unless effect.value1 > 0
            next if $data_states[effect.value1].nil?
            icons.push($data_states[effect.data_id].icon_index)
          when 33
            icons.push($game_actors[1].buff_icon_index(1, effect.data_id))
          when 34
            icons.push($game_actors[1].buff_icon_index(-1, effect.data_id))
          end
          icons.delete(0)
          break if icons.size >= 10
        end
        draw_icons(dx, dy, dw, icons)
      end
      
      def draw_icons(dx, dy, dw, icons)
        dx += dw - 4
        dx -= icons.size * 24
        for icon_id in icons
          draw_icon(icon_id, dx, dy)
          dx += 24
        end
        if icons.size == 0
          change_color(normal_color, false)
          text = CRAFTING_ITEM_STATUS[:empty]
          draw_text(4, dy, contents.width-8, line_height, text, 2)
        end
      end
    end
    
    
    
    #==============================================================
    #   * Window_MenuCommand
    #==============================================================
    class Window_MenuCommand < Window_Command
      
      alias add_crafting_menu_entry add_main_commands
      def add_main_commands
        add_crafting_menu_entry
        add_command(MENU_CRAFTING_VOCAB, :crafting) if CRAFTING_IN_MENU
      end
      
    end
    
    class Scene_Menu < Scene_MenuBase
      alias list_start start
      def start
        list_check
        list_start
      end
      
      def list_check
        rbooks = $game_party.all_items.select {|item| item.recipe_book}
        @data_check = []
        rbooks.each do |book|
          sdata = book.recipes
          @data_check.concat sdata
        end
        $game_switches[CRAFTING_ENABLE_SWITCH] = @data_check.size > 0
      end
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    #==============================================================
    #   * Initialize BaseItems
    #==============================================================
    module DataManager
      class << self
        alias load_db_sz_crafting load_database
        alias save_crafting_recipe_books make_save_contents
        alias load_crafting_recipe_books extract_save_contents
      end
      
      def self.load_database
        load_db_sz_crafting
        load_crafting_item_notetags
      end
      
      def self.load_crafting_item_notetags
        groups = [$data_items, $data_weapons, $data_armors]
        for group in groups
          for obj in group
            next if obj.nil?
            obj.load_crafting_notetags_sz
          end
        end
      end
      
      
      def self.make_save_contents
        contents = save_crafting_recipe_books
        recipe_books = {}
        for item in $data_items
          next if item.nil?
          next if not item.recipe_book
          recipe_books[item.id] = item.recipes
        end
        
        contents[:recipe_books] = recipe_books
        contents
      end
      
      def self.extract_save_contents(contents)
        load_crafting_recipe_books(contents)
        recipe_books = contents[:recipe_books]
        
        recipe_books.each do |id, recipes|
          $data_items[id].recipes = recipes
        end
      end
    end
    
    #==============================================================
    #   * Call Scene with Parameters
    #==============================================================
    class << SceneManager
      alias call_scene_crafting call
      
      attr_accessor :scene_param
      
      def call(scene_class, *param)
        @scene_param = param
        call_scene_crafting(scene_class)
      end
    end
    
    #==============================================================
    #   * List Recipes of a Book
    #==============================================================
    class Scene_Item < Scene_ItemBase
      alias sz_crafting_determitem determine_item
    
      def determine_item
        if item.recipe_book
          create_crafting_item_window
          show_crafting_sub_window(@crafting_item_window)
        else
          sz_crafting_determitem
        end
      end
      
      def create_crafting_item_window
        wy = @help_window.height+@category_window.height
        @crafting_item_window = Window_MenuCraftingList.new(item,wy)
        @crafting_item_window.set_handler(:cancel, method(:on_sz_item_cancel))
        @crafting_item_window.set_handler(:left, method(:ingredients_show_ingredients))
        @crafting_item_window.set_handler(:right, method(:ingredients_show_stats))
        
        ww = Graphics.width - @crafting_item_window.width
        wh = Graphics.height - wy
        @ingredients_window = Window_CraftingIngredients.new(240, wy,ww,wh)
        @ingredients_window.viewport
        @crafting_item_window.ingredients_window = @ingredients_window
      end
    
      def on_sz_item_cancel
        hide_crafting_sub_window(@crafting_item_window)
      end
      
      
      def show_crafting_sub_window(window)
        height_remain = @help_window.height+@category_window.height
        @viewport.rect.height = height_remain
        window.show.activate
      end
      
      def hide_crafting_sub_window(window)
        @viewport.rect.y = @viewport.oy = 0
        @viewport.rect.height = Graphics.height
        window.hide.deactivate
        activate_item_window
      end
      
      def ingredients_show_ingredients
        @ingredients_window.showtype = 0
      end
      
      def ingredients_show_stats
        @ingredients_window.showtype = 1
      end
    end
    
    
    
    class Window_Selectable < Window_Base
      alias :sz_cr_input_handler_process_handling :process_handling
      
      def process_handling
        return unless open? && active
        sz_cr_input_handler_process_handling
        return call_handler(:left) if handle?(:left) && Input.trigger?(:LEFT)
        return call_handler(:right) if handle?(:right) && Input.trigger?(:RIGHT)
      end
    end
    
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    #==============================================================
    #   * Content of Crafting Items
    #==============================================================
    class RPG::BaseItem
      attr_accessor :ingredients
      attr_accessor :recipe_book
      attr_accessor :recipes
      attr_accessor :cr_category
      
      
      def load_crafting_notetags_sz
        @ingredients = []
        @recipe_book = false
        @recipes = []
        @cr_category = -1
        
        @scan_ingredients = false
        @scan_recipes = false
        
        self.note.split(/[\r\n]+/).each do |line|
          case line.downcase
          # Ingredients
          when /<(?:ingredients?)>/i
            @scan_ingredients = true
          when /<\/(?:ingredients?)>/i
            @scan_ingredients = false
          # Recipes
          when /<(?:recipes?)>/i
            @scan_recipes = true
          when /<\/(?:recipes?)>/i
            @scan_recipes = false
          # Crafting Book
          when /<(?:recipe book)>/i
            @recipe_book = true
            @itype_id = 2
          when /<category:\s*?(\d+)>/i
            @cr_category = $1.to_i if @recipe_book
          else
            scan_ingredients(line) if @scan_ingredients
            scan_recipes(line) if @scan_recipes
          end
        end
      end
      
      def scan_ingredients(line)
        return if @crafting_book
        return unless line =~ /(\w+):\s*?(\d+)[x]?\s*(\d+)?/i ? true : false
        case $1
        when "c"
          @ingredients.push([Vocab::currency_unit,$2.to_i])
        when "i"
          @ingredients.push([$data_items[$3.to_i], $2.to_i])
        when "w"
          @ingredients.push([$data_weapons[$3.to_i], $2.to_i])
        when "a"
          @ingredients.push([$data_armors[$3.to_i], $2.to_i])
        end
      end
      
      def scan_recipes(line)
        return unless line =~ /(\w+):\s*(\d+)\s*-?\s*(\d+)?/i ? true : false
        from = $2.to_i
        if $3 == nil
          til = from
        else
          til = $3.to_i
        end
        
        for i in from..til
          case $1
          when "i"
            @recipes.push($data_items[i])
          when "w"
            @recipes.push($data_weapons[i])
          when "a"
            @recipes.push($data_armors[i])
          end
        end
        @recipes = @recipes.sort_by {|x| [x.class.to_s, x.id]}
      end
      
      
      def match_ingredients?
        @ingredients.each do |ing|
          icount = ing[0].is_a?(RPG::BaseItem) ? $game_party.item_number(ing[0]) : $game_party.gold
          return false if icount < ing[1] 
        end
        return true
      end
      
      def add_recipe(type)
        return unless @recipe_book
        return unless type =~ /(\w+):\s*(\d+)\s*-?\s*(\d+)?/i ? true : false
        from = $2.to_i
        if $3 == nil
          til = from
        else
          til = $3.to_i
        end
        
        for i in from..til
          case $1
          when "i"
            return if @recipes.include?($data_items[i])
            @recipes.push($data_items[i])
          when "w"
            return if @recipes.include?($data_weapons[i])
            @recipes.push($data_weapons[i])
          when "a"
            return if @recipes.include?($data_armors[i])
            @recipes.push($data_armors[i])
          end
        end
        
        @recipes = @recipes.sort_by {|x| [x.class.to_s, x.id]}
      end
      
      def remove_recipe(type)
        return unless @recipe_book
        return unless type =~ /(\w+):\s*(\d+)\s*-?\s*(\d+)?/i ? true : false
        from = $2.to_i
        if $3 == nil
          til = from
        else
          til = $3.to_i
        end
        
        for i in from..til
          case $1
          when "i"
            return if not @recipes.include?($data_items[i])
            @recipes.delete($data_items[i])
          when "w"
            return if not @recipes.include?($data_weapons[i])
            @recipes.delete($data_weapons[i])
          when "a"
            return if not @recipes.include?($data_armors[i])
            @recipes.delete($data_armors[i])
          end
        end
        
        @recipes = @recipes.sort_by {|x| [x.class.to_s, x.id]}
      end
    end

    Укажи удобный тебе номер переключателя в "CRAFTING_ENABLE_SWITCH" в настройках скрипта, а потом просто укажи в Ace Menu Engine, там где ты создаешь команду крафта, этот номер переключателя в EnableSwitch. По идее все должно работать.

  10. #10
    Хранитель Аватар для Темный
    Информация о пользователе
    Регистрация
    13.05.2011
    Сообщений
    2,449
    Записей в дневнике
    20
    Репутация: 50 Добавить или отнять репутацию

    По умолчанию

    Все работает как надо! Спасибо и лови репу!



Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Нужна помощь со скриптом. (Crafting System By Szyu)