Skip to content

Instantly share code, notes, and snippets.

@masked-rpgmaker
Created May 16, 2020 15:47
Show Gist options
  • Save masked-rpgmaker/8305479bcd138c3df192973309d1a9f5 to your computer and use it in GitHub Desktop.
Save masked-rpgmaker/8305479bcd138c3df192973309d1a9f5 to your computer and use it in GitHub Desktop.
Script de criação de itens para RPG Maker VX Ace
#==============================================================================
# Crafting | v1.0.0 | por Brandt
#
# para RPG Maker VX Ace
#------------------------------------------------------------------------------
# Clássico script de cena de forja. Feito visando compatibilidade com a
# interface padrão do VX Ace e fácil extensibilidade.
# O script foca em crafting realizado pelos próprios membros do grupo, em
# comparação a crafting feito por um NPC. Por isso, os requisitos de criação
# de itens podem envolver atributos dos personagens como classe e nível.
#==============================================================================
#==============================================================================
# Utilização
#------------------------------------------------------------------------------
# O script é quase totalmente configurado pelas notas dos itens no banco de
# dados.
# As notas completas para um item do script respeitam o seguinte formato:
#
# [Craftable]
# Type=Magic
# Materials=W4,I21*5
# Class=1
# Rate=60%
# Break=15%
# Level=15
#
# Maiúsculas e minúsculas não são consideradas.
# Resumidamente, os campos são:
# • Type : Método de criação do item.
# • Materials : Materiais para criação do item.
# • Class : ID da classe de personagem necessária para criar o item.
# • Rate : Taxa de sucesso.
# • Break : Taxa de perda de equipamentos.
# • Level : Nível mínimo para criação do item.
#
# Para descrições detalhadas de cada campo, veja suas respectivas
# especificações abaixo.
# Para cada item, arma ou armadura do banco de dados que possa ser criada
# através da cena de Crafting, é necessário incluir no mínimo o cabeçalho
# [Craftable] e os campos Type e Materials. Todos os outros campos são
# opcionais.
#
# A forja acontece em uma cena própria, que pode ser chamada pelo seguinte
# comando de script:
#
# Crafting.call([<Type>[, <Type>[, ...]]])
#
# Onde "<Type>" identifica o tipo de item a ser criado na cena e [] indica
# argumentos opcionais. Seguem exemplos de chamadas válidas:
#
# Crafting.call('Basic') # Apenas itens normais
# Crafting.call('Basic', 'Magic') # Itens normais e mágicos
# Crafting.call('Magic', 'Potion', 'Ammo') # Itens mágicos, poções e munição
#
# O script é agnóstico aos nomes do tipos, apenas garanta que são únicos e
# que sejam exatamente iguais aos configurados no banco de dados.
#
# As configurações relacionadas à cena de criação devem ser feitas nos módulos
# Crafting::Sound (para sons) e Crafting::Vocab (para textos).
#==============================================================================
#==============================================================================
# Especificação dos Campos
#------------------------------------------------------------------------------
# • Type : Método de criação do item
#
# Esse campo determina o tipo de criação do item, e é usado para distinguir
# os itens e permitir criar unidades de forja diferentes. Por exemplo, é
# possível separar os itens em tipos 'Físico' e 'Mágico' e ter dois NPCs
# diferentes: uma bigorna, que permite criar apenas itens do tipo 'Físico', e
# um altar ou semelhante, que permite criar apenas itens do tipo 'Mágico'.
# Por versatilidade, também é possível definir que uma cena inclua mais de
# um tipo por vez.
# Esse campo não tem formato, você pode escrever o que quiser nele desde
# que caiba em uma linha. Lembre-se que maiúsculas e minúsculas não serão
# consideradas.
#
# • Materials : Materiais para criação do item
#
# Esse campo é composto por especificações de item separadas por vírgulas.
# Um "item" pode ser um item, uma arma ou uma armadura do banco de dados.
# A especificação de item é um pequeno código que indica o tipo do item
# (I = item, W = arma, A = armadura), seu ID no banco de dados e
# opcionalmente a quantidade necessária para a criação (se não especificada,
# assume-se 1). Por exemplo:
#
# I10 = 1 item de ID 10
# W3*5 = 5 armas de ID 5
# A1,I10*3 = 1 armadura de ID 1, 3 itens de ID 10
#
# • Class : ID da classe de personagem necessária para criar o item
#
# Uma particularidade do script é que ele permite escolher um personagem
# para a criação. Esse parâmetro define que o personagem precise ser de uma
# classe específica para criar um item.
# Se não especificado, assume-se que todas as classes podem criar o item.
#
# • Rate : Taxa de sucesso
#
# Esse campo define a chance de sucesso na criação do item. São permitidos
# valores de ponto flutuante entre 0 e 1 (e.g. 0.3, 0.6, etc.) ou
# porcentagens (que devem ser indicadas explicitamente com um %).
# Se não especificado, assume-se 100%.
# Em uma criação bem sucedida, perde-se todos os itens usados como material
# inclusive equipamentos.
# Em uma criação mal sucedida, perde-se todos os itens usado como material
# exceto equipamentos; para estes, aplica-se a taxa de perda.
#
# • Break : Taxa de perda de equipamentos
#
# Esse campo define a chance de perder cada equipamento usado como material
# na criação do item. O formato é o mesmo do campo Rate.
# Note que essa taxa só é aplicada caso a criação falhe, e de forma
# independente para cada equipamento usado como material.
# Se não especificado, assume-se 0%.
#
# • Level : Nível mínimo para criação do item
#
# Esse campo determina o nível mínimo que o ator que realiza a criação
# precisa ter para criar o item.
#==============================================================================
#==============================================================================
# Adicionais (Menu)
#------------------------------------------------------------------------------
# O script permite integrar a criação de itens com o menu. Você pode habilitar
# isso por padrão alterando a constante Crafting::Config::CRAFT_FROM_MENU ou
# durante o jogo, pelo comando:
#
# Crafting.enable_from_menu
#
# Ou, para desativar a opção do menu:
#
# Crafting.disable_from_menu
#
# Para habilitar ou desabilitar a opção do menu (a opção desabilitada continua
# lá, mas não é utilizável), use os seguintes comandos por script:
#
# Crafting.menu_enabled = true # Habilita (padrão)
# Crafting.menu_enabled = false # Desabilita
#
# Lembre-se de atualizar a constante MENU_CRAFTING_TYPES_DEFAULT no módulo de
# configuração e/ou habilitar tipos de criação no menu com o comando:
#
# Crafting.menu_enable_types('Type'[, 'Type'[, ...]])
#
# Também é possível desabilitar um tipo de criação pelo menu:
#
# Crafting.menu_disable_types('Type'[, 'Type'[, ...]])
#
# Exemplos:
#
# Crafting.menu_enable_types('Basic')
# Crafting.menu_enable_types('Magic', 'Potion')
#
# Crafting.menu_disable_types('Potion')
# Crafting.menu_disable_types('Basic', 'Magic')
#
# Caso não haja nenhum tipo de criação habilitada no menu, a opção é
# automaticamente desabilitada.
#==============================================================================
module Crafting
VERSION = [1, 0, 0]
end
#==============================================================================
# * Crafting::Config
#------------------------------------------------------------------------------
# Módulo de configuração geral do script.
#==============================================================================
module Crafting::Config
# Adiciona a criação no menu
CRAFT_FROM_MENU = false
# Valor padrão para estado (ativo/inativo) da opção no menu
MENU_ENABLED_DEFAULT = true
# Tipos de criação de item habilitados no menu por padrão
MENU_CRAFTING_TYPES_DEFAULT = []
end
#==============================================================================
# * Crafting::Sound
#------------------------------------------------------------------------------
# Módulo de configuração de sons do script. Define os SEs usados na cena.
#==============================================================================
module Crafting::Sound
# Sucesso
SUCCESS = 'Applause1'
# Falha
FAILURE = 'Disappointment'
# Item(ns) quebrado(s)
BREAK = 'Break'
end
#==============================================================================
# * Crafting::Vocab
#------------------------------------------------------------------------------
# Módulo de configuração de vocabulário do script. Define os termos e
# mensagens.
#==============================================================================
module Crafting::Vocab
# Título da opção no menu
MENU_OPTION = "Criação"
# Rótulo da seção de materiais na cena
MATERIALS = "Materiais"
# Texto usado quando um item pode ser criado por um ator de qualquer classe
ANY_CLASS = "Todos"
# Taxa de Sucesso
SUCCESS_RATE = "Taxa de Sucesso"
# Taxa de Perda
BREAK_RATE = "Taxa de Perda"
# Texto de confirmação de forja
CRAFT = "Criar"
# Sucesso
SUCCESS = "Sucesso"
# Falha
FAILURE = "Falha"
# Item ganho
GAINED_ITEM = "%<name>s +%<amount>d"
# Item perdido
LOST_ITEM = "%<name>s -%<amount>d"
# Item quebrado
BROKEN_ITEM = "%<name>s -%<amount>d"
end
#==============================================================================
# * Crafting
#------------------------------------------------------------------------------
# Módulo principal do script. Tem funções úteis para interagir com os objetos
# do script.
#==============================================================================
module Crafting
#--------------------------------------------------------------------------
# * Variáveis
#--------------------------------------------------------------------------
@enabled_from_menu = Crafting::Config::CRAFT_FROM_MENU
@menu_enabled = Crafting::Config::MENU_ENABLED_DEFAULT
@menu_enabled_types = Crafting::Config::MENU_CRAFTING_TYPES_DEFAULT
#--------------------------------------------------------------------------
# * Prepara e chama a cena de criação
#--------------------------------------------------------------------------
def self.call(*types)
SceneManager.call(scene)
SceneManager.scene.prepare(types)
end
#--------------------------------------------------------------------------
# * Prepara e chama a cena de criação pelo menu
#--------------------------------------------------------------------------
def self.call_from_menu
SceneManager.call(scene)
SceneManager.scene.prepare(@menu_enabled_types, false)
end
#--------------------------------------------------------------------------
# * Obtém a classe da cena de criação
#--------------------------------------------------------------------------
def self.scene
Scene_Crafting
end
#--------------------------------------------------------------------------
# * Verifica liberação da criação pelo menu
#--------------------------------------------------------------------------
def self.enabled_from_menu?
@enabled_from_menu
end
#--------------------------------------------------------------------------
# * Libera a criação pelo menu
#--------------------------------------------------------------------------
def self.enable_from_menu
@enabled_from_menu = true
end
#--------------------------------------------------------------------------
# * Bloqueia a criação pelo menu
#--------------------------------------------------------------------------
def self.disable_from_menu
@enabled_from_menu = false
end
#--------------------------------------------------------------------------
# * Estado da opção do menu
#--------------------------------------------------------------------------
def self.menu_enabled
@menu_enabled && !@menu_enabled_types.empty?
end
#--------------------------------------------------------------------------
# * Define o estado da opção do menu
#--------------------------------------------------------------------------
def self.menu_enabled=(enabled)
@menu_enabled = enabled
end
#--------------------------------------------------------------------------
# * Habilita tipos de criação no menu
#--------------------------------------------------------------------------
def self.menu_enable_types(*types)
@menu_enabled_types += types
@menu_enabled_types.uniq!
end
#--------------------------------------------------------------------------
# * Desabilita tipos de criação no menu
#--------------------------------------------------------------------------
def self.menu_disable_types(*types)
@menu_enabled_types -= types
end
#--------------------------------------------------------------------------
# * Lista de dados de itens forjáveis
#--------------------------------------------------------------------------
def self.data_craftable_items
@data_craftable_items ||= Data_CraftableItems.new
end
#--------------------------------------------------------------------------
# * Lista de objetos de itens forjáveis
#--------------------------------------------------------------------------
def self.game_craftable_items
@game_craftable_items ||= Game_CraftableItems.new
end
end
#==============================================================================
# * Crafting::CraftableItem
#------------------------------------------------------------------------------
# Classe de dados para itens que podem ser forjados. Serve como decorador para
# as classes de item padrão do RGSS.
#==============================================================================
class Crafting::CraftableItem
#--------------------------------------------------------------------------
# * Variáveis públicas
#--------------------------------------------------------------------------
attr_accessor :item # RPG::Item, RPG::Weapon ou RPG::Armor
attr_accessor :type # Tipo de forja (Básica, Mágica, etc.)
attr_accessor :level # Nível necessário (1, 0..5, 3...20, etc.)
attr_accessor :materials # Materiais necessários para a forja
attr_accessor :success_rate # Taxa de sucesso (0 a 1)
attr_accessor :break_rate # Taxa de quebra do item (após falha, 0 a 1)
attr_accessor :class_id # ID da classe necessária para criar o item
#--------------------------------------------------------------------------
# * Inicialização do objeto
#--------------------------------------------------------------------------
def initialize(item, type, level, materials, success_rate, break_rate,
class_id)
@item = item
@type = type
@level = level
@materials = materials
@success_rate = success_rate
@break_rate = break_rate
@class_id = class_id
end
end
#==============================================================================
# * Crafting::Material
#------------------------------------------------------------------------------
# Classe de dados para materiais de forja.
#==============================================================================
class Crafting::Material
#--------------------------------------------------------------------------
# * Variáveis públicas
#--------------------------------------------------------------------------
attr_accessor :item # RPG::Item, RPG::Weapon ou RPG::Armor
attr_accessor :amount # Quantidade
#--------------------------------------------------------------------------
# * Inicialização do objeto
#--------------------------------------------------------------------------
def initialize(item, amount)
@item = item
@amount = amount
end
end
#==============================================================================
# * Crafting::NoteParser_Item
#------------------------------------------------------------------------------
# Classe para processador das notas de itens. Responsável por validar e
# extrair as informações que definem os parâmetros de forja para um item.
#==============================================================================
class Crafting::NoteParser_Item
#--------------------------------------------------------------------------
# * Constantes (Expressões regulares)
#--------------------------------------------------------------------------
CRAFTABLE_REGEXP = /[craftable]/i
FIELD_REGEXP = '%<name>s\s*=\s*(?<value>.*)'
RANGE_REGEXP = /(\d+)(\.{2,3})(\d+)/
MATERIAL_REGEXP = /(?<type>I|A|W)(?<id>\d+)(?:\*(?<amount>\d+))?/i
RATE_REGEXP = /(\d+(?:\.\d+)?|\.\d+)(%)?/
#--------------------------------------------------------------------------
# * Inicialização do objeto
# item : Item do banco de dados
#--------------------------------------------------------------------------
def initialize(item)
@item = item
@note = @item.note
@start = @note.index(CRAFTABLE_REGEXP)
@start = @note.index("\n", @start) + 1 if valid?
end
#--------------------------------------------------------------------------
# * Determina se o item passado é válido para forja
#--------------------------------------------------------------------------
def valid?
!@start.nil?
end
#--------------------------------------------------------------------------
# * Processa as notas do item e retorna informações de forja
#--------------------------------------------------------------------------
def parse
Crafting::CraftableItem.new(
@item,
parse_field('Type').downcase.to_sym,
parse_level,
parse_materials,
parse_rate('Rate'),
parse_rate('Break', 0),
parse_integer('Class')
)
end
private
#--------------------------------------------------------------------------
# * Obtém o valor de um campo de configuração nas notas do item
# field : Campo a ser extraído
#--------------------------------------------------------------------------
def parse_field(field)
regexp = Regexp.compile(sprintf(FIELD_REGEXP, { name: field }), true)
return nil if @note.index(regexp, @start).nil?
Regexp.last_match(:value).strip
end
#--------------------------------------------------------------------------
# * Obtém o nível necessário para a forja
#--------------------------------------------------------------------------
def parse_level
value = parse_field('Level')
return 1 if value.nil?
if value =~ RANGE_REGEXP
return Range.new($1.to_i, $3.to_i, $2.size == 3)
end
Integer(value)
end
#--------------------------------------------------------------------------
# * Obtém os materiais necessários para a forja
#--------------------------------------------------------------------------
def parse_materials
value = parse_field('Materials')
return [] if value.nil?
value.split(',').map do |part|
parse_single_material(part)
end
end
#--------------------------------------------------------------------------
# * Processa uma especificação de material
#--------------------------------------------------------------------------
def parse_single_material(note)
unless note =~ MATERIAL_REGEXP
raise "Invalid crafting material specification `#{note}'"
end
match = Regexp.last_match
type = match[:type]
id = match[:id].to_i
item = item_of(type, id)
amount = match[:amount] || 1
Crafting::Material.new(item, amount.to_i)
end
#--------------------------------------------------------------------------
# * Obtém um item dado um identificador de tipo e ID
#--------------------------------------------------------------------------
def item_of(type, id)
case type.upcase
when 'I'
$data_items[id]
when 'A'
$data_armors[id]
when 'W'
$data_weapons[id]
end
end
#--------------------------------------------------------------------------
# * Obtém o valor de uma configuração de taxa
#--------------------------------------------------------------------------
def parse_rate(field, default = 1.0)
value = parse_field(field)
return default if value.nil?
unless value =~ RATE_REGEXP
raise "Invalid rate specification `#{value}'"
end
r = Float($1)
r *= 0.01 unless $2.nil?
r
end
#--------------------------------------------------------------------------
# * Obtém o valor de uma configuração numérica inteira
#--------------------------------------------------------------------------
def parse_integer(field)
value = parse_field(field)
return nil if value.nil?
Integer(value)
end
end
#==============================================================================
# ** Crafting::Data_CraftableItems
#------------------------------------------------------------------------------
# Classe para a lista de dados de itens que podem ser forjados. A instância
# dessa classe pode ser acessada como Crafting.data_craftable_items.
#==============================================================================
class Crafting::Data_CraftableItems
include Enumerable
#--------------------------------------------------------------------------
# * Inicialização do objeto
#--------------------------------------------------------------------------
def initialize
@data = {
RPG::Item => {},
RPG::Weapon => {},
RPG::Armor => {}
}
load
end
#--------------------------------------------------------------------------
# * Leitura de um objeto dado um tipo e um id
# type : RPG::Item, RPG::Weapon ou RPG::Armor
# id : ID do objeto
#--------------------------------------------------------------------------
def [](type, id)
@data[type][id]
end
#--------------------------------------------------------------------------
# * Leitura de um item para um id
# id : ID do item no banco de dados
#--------------------------------------------------------------------------
def item(id)
self[RPG::Item, id]
end
#--------------------------------------------------------------------------
# * Leitura de uma arma para um id
# id : ID da arma no banco de dados
#--------------------------------------------------------------------------
def weapon(id)
self[RPG::Weapon, id]
end
#--------------------------------------------------------------------------
# * Leitura de uma armadura para um id
# id : ID da armadura no banco de dados
#--------------------------------------------------------------------------
def armor(id)
self[RPG::Armor, id]
end
#--------------------------------------------------------------------------
# * Percorre os índices da lista
#--------------------------------------------------------------------------
def each_index
@data.each do |type, type_data|
type_data.each_key do |id|
yield [type, id]
end
end
end
#--------------------------------------------------------------------------
# * Percorre a lista
#--------------------------------------------------------------------------
def each(&block)
@data.each_value do |type_data|
type_data.each_value(&block)
end
end
#--------------------------------------------------------------------------
# * Tamanho da lista
#--------------------------------------------------------------------------
def size
@data.size
end
private
#--------------------------------------------------------------------------
# * Carregamento dos dados
#--------------------------------------------------------------------------
def load
all_items.each do |item|
parser = Crafting::NoteParser_Item.new(item)
next unless parser.valid?
@data[item.class][item.id] = parser.parse
end
end
#--------------------------------------------------------------------------
# * Enumerador para os objetos de dados de itens que podem ser forjados
#--------------------------------------------------------------------------
def all_items
Enumerator.new do |enum|
$data_items.compact.each { |i| enum << i }
$data_weapons.compact.each { |i| enum << i }
$data_armors.compact.each { |i| enum << i }
end
end
end
#==============================================================================
# ** Crafting::Game_CraftingResult
#------------------------------------------------------------------------------
# Classe base para um resultado de tentativa de forja. Esse objeto indica se a
# tentativa foi bem sucedida e, se não, quais itens foram perdidos e/ou ganhos.
#==============================================================================
class Crafting::Game_CraftingResult
#--------------------------------------------------------------------------
# * Variáveis públicas
#--------------------------------------------------------------------------
attr_reader :gained_items
attr_reader :used_items
attr_reader :broken_items
#--------------------------------------------------------------------------
# * Inicialização do objeto
# item : Game_CraftableItem
#--------------------------------------------------------------------------
def initialize(item)
@item = item
@gained_items = make_gained_items
@used_items = make_used_items
@broken_items = make_broken_items
end
#--------------------------------------------------------------------------
# * Verifica se a tentativa foi bem sucedida
#--------------------------------------------------------------------------
def success?
false
end
#--------------------------------------------------------------------------
# * Aplicação o resultado
#--------------------------------------------------------------------------
def apply
gained_items.each do |item, amount|
$game_party.gain_item(item, amount)
end
lost_items.each do |item, amount|
$game_party.lose_item(item, amount)
end
end
#--------------------------------------------------------------------------
# * Construção da lista de itens ganhos
#--------------------------------------------------------------------------
def make_gained_items
[]
end
#--------------------------------------------------------------------------
# * Construção da lista de itens quebrados
#--------------------------------------------------------------------------
def make_broken_items
[]
end
#--------------------------------------------------------------------------
# * Construção da lista de itens usados
#--------------------------------------------------------------------------
def make_used_items
[]
end
#--------------------------------------------------------------------------
# * Lista de itens perdidos
#--------------------------------------------------------------------------
def lost_items
used_items + broken_items
end
end
#==============================================================================
# ** Crafting::Game_CraftingSuccess
#------------------------------------------------------------------------------
# Classe de resultado para criação bem sucedida de um item.
#==============================================================================
class Crafting::Game_CraftingSuccess < Crafting::Game_CraftingResult
#--------------------------------------------------------------------------
# * Verifica se a tentativa foi bem sucedida
#--------------------------------------------------------------------------
def success?
true
end
#--------------------------------------------------------------------------
# * Construção da lista de itens ganhos
#--------------------------------------------------------------------------
def make_gained_items
[[@item.item, 1]]
end
#--------------------------------------------------------------------------
# * Construção da lista de itens usados
#--------------------------------------------------------------------------
def make_used_items
@item.materials.map do |material|
[material.item, material.amount]
end
end
end
#==============================================================================
# ** Crafting::Game_CraftingFailure
#------------------------------------------------------------------------------
# Classe de resultado para falha na criação de um item.
#==============================================================================
class Crafting::Game_CraftingFailure < Crafting::Game_CraftingResult
#--------------------------------------------------------------------------
# * Construção da lista de itens usados
#--------------------------------------------------------------------------
def make_used_items
@item.materials.map do |material|
next unless material.item.is_a?(RPG::Item)
[material.item, material.amount]
end.compact
end
#--------------------------------------------------------------------------
# * Construção da lista de itens quebrados
#--------------------------------------------------------------------------
def make_broken_items
@item.materials.map do |material|
next unless material.item.is_a?(RPG::EquipItem)
amount = calc_broken_amount(material)
next if amount.zero?
[material.item, amount]
end.compact
end
private
#--------------------------------------------------------------------------
# * Cálculo da quantidade perdida de um determinado material quebrável
# material : Material
#--------------------------------------------------------------------------
def calc_broken_amount(material)
amount = 0
material.amount.times do
amount += 1 if rand <= @item.craftable_item.break_rate
end
amount
end
end
#==============================================================================
# ** Crafting::Game_CraftableItem
#------------------------------------------------------------------------------
# Classe para um item que pode ser forjado. Enquanto os objetos de dados
# armazenam as informações sobre um item, essa classe tem os métodos que
# controlam a lógica da forja no jogo.
#==============================================================================
class Crafting::Game_CraftableItem
#--------------------------------------------------------------------------
# * Variáveis públicas
#--------------------------------------------------------------------------
attr_reader :craftable_item
#--------------------------------------------------------------------------
# * Inicialização do objeto
# craftable_item : Crafting::CraftableItem
#--------------------------------------------------------------------------
def initialize(craftable_item)
@craftable_item = craftable_item
end
#--------------------------------------------------------------------------
# * Determina se o item pode ser construído por um ator
# actor : Game_Actor
#--------------------------------------------------------------------------
def craftable?(actor)
return false if actor.level < @craftable_item.level
if !@craftable_item.class_id.nil?
return false unless actor.class_id == @craftable_item.class_id
end
enough_materials?
end
#--------------------------------------------------------------------------
# * Objeto de dados do item
#--------------------------------------------------------------------------
def item
@craftable_item.item
end
#--------------------------------------------------------------------------
# * Materiais do item
#--------------------------------------------------------------------------
def materials
@craftable_item.materials
end
#--------------------------------------------------------------------------
# * Lista dos materiais que são equipamentos
#--------------------------------------------------------------------------
def equip_materials
materials.select { |material| material.item.is_a?(RPG::EquipItem) }
end
#--------------------------------------------------------------------------
# * Determina se o grupo tem materiais suficientes
#--------------------------------------------------------------------------
def enough_materials?
@craftable_item.materials.all? do |material|
$game_party.item_number(material.item) >= material.amount
end
end
#--------------------------------------------------------------------------
# * Calcula uma tentativa de criar o item
#--------------------------------------------------------------------------
def try_craft
if rand <= @craftable_item.success_rate
Crafting::Game_CraftingSuccess.new(self)
else
Crafting::Game_CraftingFailure.new(self)
end
end
end
#==============================================================================
# ** Crafting::Game_CraftableItems
#------------------------------------------------------------------------------
# Classe para a lista de itens que podem ser forjados. A instância dessa
# classe pode ser acessada como Crafting.game_craftable_items.
#==============================================================================
class Crafting::Game_CraftableItems
include Enumerable
#--------------------------------------------------------------------------
# * Inicialização do objeto
#--------------------------------------------------------------------------
def initialize
@data = {
RPG::Item => {},
RPG::Weapon => {},
RPG::Armor => {}
}
end
#--------------------------------------------------------------------------
# * Leitura de um objeto dado um tipo e um id
# type : RPG::Item, RPG::Weapon ou RPG::Armor
# id : ID do objeto
#--------------------------------------------------------------------------
def [](type, id)
unless @data[type].key?(id)
craftable_item = Crafting.data_craftable_items[type, id]
@data[type][id] = Crafting::Game_CraftableItem.new(craftable_item)
end
@data[type][id]
end
#--------------------------------------------------------------------------
# * Leitura de um item para um id
# id : ID do item no banco de dados
#--------------------------------------------------------------------------
def item(id)
self[RPG::Item, id]
end
#--------------------------------------------------------------------------
# * Leitura de uma arma para um id
# id : ID da arma no banco de dados
#--------------------------------------------------------------------------
def weapon(id)
self[RPG::Weapon, id]
end
#--------------------------------------------------------------------------
# * Leitura de uma armadura para um id
# id : ID da armadura no banco de dados
#--------------------------------------------------------------------------
def armor(id)
self[RPG::Armor, id]
end
#--------------------------------------------------------------------------
# * Percorre a lista
#--------------------------------------------------------------------------
def each(&block)
Crafting.data_craftable_items.each_index do |type, id|
yield self[type, id]
end
end
#--------------------------------------------------------------------------
# * Tamanho da lista
#--------------------------------------------------------------------------
def size
Crafting.data_craftable_items.size
end
end
#==============================================================================
# ** Crafting::Window_CraftingActor
#------------------------------------------------------------------------------
# Esta janela controla a seleção do ator para a cena de forja.
#==============================================================================
class Crafting::Window_CraftingActor < Window_Selectable
#--------------------------------------------------------------------------
# * Inicialização do objeto
#--------------------------------------------------------------------------
def initialize
super(0, 0, window_width, window_height)
refresh
select(0)
end
#--------------------------------------------------------------------------
# * Aquisição da largura da janela
#--------------------------------------------------------------------------
def window_width
Graphics.width
end
#--------------------------------------------------------------------------
# * Aquisição da altura da janela
#--------------------------------------------------------------------------
def window_height
fitting_height(4)
end
#--------------------------------------------------------------------------
# * Aquisição do número máximo de itens
#--------------------------------------------------------------------------
def item_max
$game_party.members.size
end
#--------------------------------------------------------------------------
# * Aquisição do número máximo de colunas
#--------------------------------------------------------------------------
def col_max
(width + spacing) / (item_width + spacing)
end
#--------------------------------------------------------------------------
# * Aquisição da largura os itens
#--------------------------------------------------------------------------
def item_width
220
end
#--------------------------------------------------------------------------
# * Aquisição de altura do item
#--------------------------------------------------------------------------
def item_height
height - standard_padding * 2
end
#--------------------------------------------------------------------------
# * Aquisição do espaçamento entre os itens
#--------------------------------------------------------------------------
def spacing
return 8
end
#--------------------------------------------------------------------------
# * Cálculo da altura do conteúdo da janela
#--------------------------------------------------------------------------
def contents_width
(item_width + spacing) * item_max - spacing
end
#--------------------------------------------------------------------------
# * Cálculo da altura do conteúdo da janela
#--------------------------------------------------------------------------
def contents_height
item_height
end
#--------------------------------------------------------------------------
# * Aquisição da primeira coluna
#--------------------------------------------------------------------------
def top_col
@top_col ||= 0
end
#--------------------------------------------------------------------------
# * Definição da primeira coluna
# col : coluna
#--------------------------------------------------------------------------
def top_col=(col)
col = 0 if col < 0
col = item_max - 1 if col > item_max - 1
@top_col = col
self.ox = [col * (item_width + spacing), ox_max].min
end
#--------------------------------------------------------------------------
# * Aquisição do offset horizontal máximo
#--------------------------------------------------------------------------
def ox_max
contents_width - (width - standard_padding * 2)
end
#--------------------------------------------------------------------------
# * Aquisição da última coluna
#--------------------------------------------------------------------------
def bottom_col
top_col + col_max - 1
end
#--------------------------------------------------------------------------
# * Definição da última coluna
# col : coluna
#--------------------------------------------------------------------------
def bottom_col=(col)
self.top_col = col - (col_max - 1)
end
#--------------------------------------------------------------------------
# * Confirmação de visibilidade do cursor
#--------------------------------------------------------------------------
def ensure_cursor_visible
self.top_col = index if index < top_col
self.bottom_col = index if index > bottom_col
end
#--------------------------------------------------------------------------
# * Aquisição do retangulo para desenhar o item
# index : índice do item
#--------------------------------------------------------------------------
def item_rect(index)
rect = super
rect.x = index * (item_width + spacing)
rect.y = 0
rect
end
#--------------------------------------------------------------------------
# * Desenho de um item
# index : índice do item
#--------------------------------------------------------------------------
def draw_item(index)
actor = $game_party.members[index]
rect = item_rect(index)
draw_actor_face(actor, rect.x + 1, rect.y)
rect.x += 108
draw_actor_name(actor, rect.x, rect.y)
draw_actor_class(actor, rect.x, rect.y + line_height * 1)
draw_actor_level(actor, rect.x, rect.y + line_height * 2)
end
#--------------------------------------------------------------------------
# * Aquisição do ator selecionado para a janela
#--------------------------------------------------------------------------
def actor
$game_party.members[index]
end
end
#==============================================================================
# ** Crafting::Window_CraftingItemInfo
#------------------------------------------------------------------------------
# Classe base para janelas que mostram as informações de um item escolhido
# para criação.
#==============================================================================
class Crafting::Window_CraftingItemInfo < Window_Base
#--------------------------------------------------------------------------
# * Aquisição do ator selecionado para a janela
#--------------------------------------------------------------------------
def actor=(actor)
@actor = actor
refresh
end
#--------------------------------------------------------------------------
# * Define o item para o qual mostrar os materiais
# item : CraftableItem
#--------------------------------------------------------------------------
def set_item(item)
@item = item
refresh
end
#--------------------------------------------------------------------------
# * Renovação
#--------------------------------------------------------------------------
def refresh
contents.clear
return if @item.nil? || @actor.nil?
refresh_contents
end
#--------------------------------------------------------------------------
# * Renovação do conteúdo
#--------------------------------------------------------------------------
def refresh_contents
draw_header(0)
draw_horz_line(line_height)
end
#--------------------------------------------------------------------------
# * Desenho do cabeçalho
#--------------------------------------------------------------------------
def draw_header(y)
draw_item_name(@item.item, 0, y, true, width)
end
#--------------------------------------------------------------------------
# * Desenho de uma linha horzontal
#--------------------------------------------------------------------------
def draw_horz_line(y)
line_y = y + line_height / 2 - 1
contents.fill_rect(0, line_y, contents_width, 2, line_color)
end
#--------------------------------------------------------------------------
# * Aquisção da cor da linha horizontal
#--------------------------------------------------------------------------
def line_color
color = normal_color
color.alpha = 48
color
end
end
#==============================================================================
# ** Crafting::Window_Materials
#------------------------------------------------------------------------------
# Esta janela exibe a lista de requisitos para a criação de um item, como
# class, nível, materiais, etc. Infelizmente, não consegui pensar em um nome
# melhor.
#==============================================================================
class Crafting::Window_Materials < Crafting::Window_CraftingItemInfo
#--------------------------------------------------------------------------
# * Renovação
#--------------------------------------------------------------------------
def refresh_contents
super
draw_class(line_height * 2)
draw_min_level(line_height * 3)
draw_horz_line(line_height * 4)
draw_materials(line_height * 5)
end
#--------------------------------------------------------------------------
# * Desenho do nível mínimo necessário
#--------------------------------------------------------------------------
def draw_min_level(y)
if @actor.level < @item.level
color1 = crisis_color
change_color(unsatisfied_color)
else
color1 = normal_color
change_color(system_color)
end
draw_text(0, y, width / 2, line_height, Vocab.level)
draw_current_and_max_values(contents_width - 96, y, 96, @actor.level,
@item.level, color1, normal_color)
end
#--------------------------------------------------------------------------
# * Desenho da classe necessária
#--------------------------------------------------------------------------
def draw_class(y)
if !@item.class_id.nil? && @actor.class_id != @item.class_id
change_color(crisis_color)
end
class_name = @item.class_id.nil? ? Crafting::Vocab::ANY_CLASS :
$data_classes[@item.class_id].name
draw_text(0, y, width / 2, line_height, class_name)
end
#--------------------------------------------------------------------------
# * Desenho dos materiais
#--------------------------------------------------------------------------
def draw_materials(y)
label_color = system_color
@item.materials.each_with_index do |material, i|
iy = y + (i + 1) * line_height
draw_item_name(material.item, 0, iy, true, contents_width - 96)
amount = $game_party.item_number(material.item)
if amount < material.amount
label_color = unsatisfied_color
color1 = crisis_color
else
color1 = normal_color
end
draw_current_and_max_values(contents_width - 96, iy, 96, amount,
material.amount, color1, normal_color)
end
change_color(label_color)
draw_text(0, y, width, line_height, Crafting::Vocab::MATERIALS)
end
#--------------------------------------------------------------------------
# * Aquisição da cor para condição não satisfeita
#--------------------------------------------------------------------------
def unsatisfied_color
crisis_color
end
end
#==============================================================================
# ** Crafting::Window_CraftableItems
#------------------------------------------------------------------------------
# Esta janela lista os itens que podem ser forjados na tela de forja.
#==============================================================================
class Crafting::Window_CraftableItems < Window_Selectable
#--------------------------------------------------------------------------
# * Inicialização do objeto
# x : coordenada X
# y : coordenada Y
# width : largura
# height : altura
# types : filtro de tipos de item
#--------------------------------------------------------------------------
def initialize(x, y, width, height, types)
@data = Crafting.game_craftable_items.select do |item|
types.include?(item.craftable_item.type)
end.to_a
super(x, y, width, height)
refresh
end
#--------------------------------------------------------------------------
# * Define a janela de lista de materiais
# window : Window_CraftingMaterials
#--------------------------------------------------------------------------
def materials_window=(window)
@materials_window = window
@materials_window.actor = @actor
update_materials
end
#--------------------------------------------------------------------------
# * Define a janela de informações do item
# window : Window_CraftingItemInfo
#--------------------------------------------------------------------------
def item_info_window=(window)
@item_details_window = window
@item_details_window.actor = @actor
end
#--------------------------------------------------------------------------
# * Aquisição das informações do item selecionado
#--------------------------------------------------------------------------
def craftable_item
@data[index]
end
#--------------------------------------------------------------------------
# * Aquisição do número máximo de itens
#--------------------------------------------------------------------------
def item_max
@data.size
end
#--------------------------------------------------------------------------
# * Definição do ator selecionado para a janela
#--------------------------------------------------------------------------
def actor=(actor)
@actor = actor
@materials_window.actor = @actor if @materials_window
@item_details_window.actor = @actor if @item_details_window
refresh
end
#--------------------------------------------------------------------------
# * Determina se um item está habilitado
# index : Índice do item
#--------------------------------------------------------------------------
def enable?(index)
return false if @actor.nil?
@data[index].craftable?(@actor)
end
#--------------------------------------------------------------------------
# * Definição de habilitação de seleção
#--------------------------------------------------------------------------
def current_item_enabled?
enable?(index)
end
#--------------------------------------------------------------------------
# * Desenho de um item
# index : índice do item
#--------------------------------------------------------------------------
def draw_item(index)
item = @data[index].item
rect = item_rect(index)
draw_item_name(item, rect.x, rect.y, enable?(index), width)
end
#--------------------------------------------------------------------------
# * Atualização da janela de ajuda
#--------------------------------------------------------------------------
def update_help
@help_window.set_item(@data[index].item) if @help_window
update_materials
end
#--------------------------------------------------------------------------
# * Atualização da janela de materiais
#--------------------------------------------------------------------------
def update_materials
if @materials_window
@materials_window.set_item(@data[index].craftable_item)
end
if @item_details_window
@item_details_window.set_item(@data[index].craftable_item)
end
end
end
#==============================================================================
# ** Crafting::Window_CraftingItemDetails
#------------------------------------------------------------------------------
# Esta janela mostra os detalhes de um equipamento escolhido para forja, como
# taxas de sucesso e perda. Para equipamentos, mostra também os atributos.
#==============================================================================
class Crafting::Window_CraftingItemDetails < Crafting::Window_CraftingItemInfo
#--------------------------------------------------------------------------
# * Renovação
#--------------------------------------------------------------------------
def refresh_contents
super
draw_success_rate(line_height * 2)
draw_break_rate(line_height * 3)
if @item.item.is_a?(RPG::EquipItem)
draw_horz_line(line_height * 4)
draw_item_params(line_height * 5)
end
end
#--------------------------------------------------------------------------
# * Desenho da taxa de sucesso
#--------------------------------------------------------------------------
def draw_success_rate(y)
change_color(system_color)
draw_text(0, y, 150, line_height, Crafting::Vocab::SUCCESS_RATE)
change_color(normal_color)
draw_text(150, y, contents_width - 150, line_height,
sprintf('%.1f%%', @item.success_rate * 100), 2)
end
#--------------------------------------------------------------------------
# * Desenho da taxa de perda
#--------------------------------------------------------------------------
def draw_break_rate(y)
change_color(system_color)
draw_text(0, y, 150, line_height, Crafting::Vocab::BREAK_RATE)
change_color(normal_color)
draw_text(150, y, contents_width - 150, line_height,
sprintf('%.1f%%', (1 - @item.success_rate) * @item.break_rate * 100), 2)
end
#--------------------------------------------------------------------------
# * Desenho da taxa de sucesso
#--------------------------------------------------------------------------
def draw_item_params(y)
for i in 0..7
change_color(system_color)
draw_text(0, y, 180, line_height, Vocab.param(i))
change_color(normal_color)
draw_text(180, y, contents_width - 180, line_height,
@item.item.params[i], 2)
y += line_height
end
end
end
#==============================================================================
# ** Crafting::Window_CraftingConfirm
#------------------------------------------------------------------------------
# Janela de confirmação de criação de item.
#==============================================================================
class Crafting::Window_CraftingConfirm < Window_Command
#--------------------------------------------------------------------------
# * Inicialização do objeto
# x : coordenada X
# y : coordenada Y
#--------------------------------------------------------------------------
def initialize(x, y)
super
self.openness = 0
end
#--------------------------------------------------------------------------
# * Criação da lista de comandos
#--------------------------------------------------------------------------
def make_command_list
add_command(Crafting::Vocab::CRAFT, :ok)
add_command(Vocab.cancel, :cancel)
end
end
#==============================================================================
# ** Crafting::Window_CraftingResult
#------------------------------------------------------------------------------
# Janela de resultado de criação de item.
#==============================================================================
class Crafting::Window_CraftingResult < Window_Base
#--------------------------------------------------------------------------
# * Inicialização do objeto
#--------------------------------------------------------------------------
def initialize(x, y, width, height)
super
@handler = nil
@result = nil
self.pause = true
self.openness = 0
end
#--------------------------------------------------------------------------
# * Atualização da tela
#--------------------------------------------------------------------------
def update
super
return unless open? && active
@handler.call if Input.trigger?(:B) || Input.trigger?(:C)
end
#--------------------------------------------------------------------------
# * Definição do resultado
#--------------------------------------------------------------------------
def result=(result)
@result = result
refresh
end
#--------------------------------------------------------------------------
# * Definição do procedimento após confirmação
#--------------------------------------------------------------------------
def set_handler(handler)
@handler = handler
end
#--------------------------------------------------------------------------
# * Renovação
#--------------------------------------------------------------------------
def refresh
contents.clear
if @result.success?
draw_success
else
draw_failure
end
draw_result
end
#--------------------------------------------------------------------------
# * Desenho das informações de sucesso
#--------------------------------------------------------------------------
def draw_success
change_color(text_color(3))
draw_text(0, 0, contents_width, line_height, Crafting::Vocab::SUCCESS)
end
#--------------------------------------------------------------------------
# * Desenho das informações de falha
#--------------------------------------------------------------------------
def draw_failure
change_color(text_color(2))
draw_text(0, 0, contents_width, line_height, Crafting::Vocab::FAILURE)
end
#--------------------------------------------------------------------------
# * Desenho dos resultados
#--------------------------------------------------------------------------
def draw_result
change_color(normal_color)
y = line_height * 2
@result.gained_items.each do |item, amount|
draw_gained_item(y, item, amount)
y += line_height
end
@result.used_items.each do |item, amount|
draw_used_item(y, item, amount)
y += line_height
end
@result.broken_items.each do |item, amount|
draw_broken_item(y, item, amount)
y += line_height
end
end
#--------------------------------------------------------------------------
# * Desenho de uma linha de item
#--------------------------------------------------------------------------
def draw_item_line(y, format, item, amount, icon_enabled = true)
draw_icon(item.icon_index, 0, y, icon_enabled)
line = format_line(format, item, amount)
draw_text(28, y, width - 28, line_height, line)
end
#--------------------------------------------------------------------------
# * Desenho de um item ganho
#--------------------------------------------------------------------------
def draw_gained_item(y, item, amount)
draw_item_line(y, Crafting::Vocab::GAINED_ITEM, item, amount)
end
#--------------------------------------------------------------------------
# * Desenho de um item usado
#--------------------------------------------------------------------------
def draw_used_item(y, item, amount)
draw_item_line(y, Crafting::Vocab::LOST_ITEM, item, amount, false)
end
#--------------------------------------------------------------------------
# * Desenho de um item perdido
#--------------------------------------------------------------------------
def draw_broken_item(y, item, amount)
draw_item_line(y, Crafting::Vocab::BROKEN_ITEM, item, amount, false)
end
private
#--------------------------------------------------------------------------
# * Formatação de linha de item ganho/perdido
#--------------------------------------------------------------------------
def format_line(line_format, item, amount)
sprintf(line_format, {
name: item.name,
amount: amount
})
end
end
#==============================================================================
# ** Crafting::Scene_Crafting
#------------------------------------------------------------------------------
# Classe para a cena de forja.
#==============================================================================
class Crafting::Scene_Crafting < Scene_MenuBase
#--------------------------------------------------------------------------
# * Preparação
#--------------------------------------------------------------------------
def prepare(types, pick_actor = true)
@types = types.map(&:downcase).map(&:to_sym)
@pick_actor = pick_actor
end
#--------------------------------------------------------------------------
# * Inicialização da cena
#--------------------------------------------------------------------------
def start
super
create_actor_window if @pick_actor
create_help_window
create_items_window
create_materials_window
create_item_info_window
create_confirm_window
create_result_window
update_all_windows
end
#--------------------------------------------------------------------------
# * Criação da janela de atores
#--------------------------------------------------------------------------
def create_actor_window
@actor_window = Crafting::Window_CraftingActor.new
@actor_window.z = 200
@actor_window.select(0)
@actor_window.activate
@actor_window.set_handler(:ok, method(:on_actor_ok))
@actor_window.set_handler(:cancel, method(:return_scene))
end
#--------------------------------------------------------------------------
# * Criação da janela de itens
#--------------------------------------------------------------------------
def create_items_window
x = 0
y = @help_window.y + @help_window.height
width = Graphics.width / 2
height = Graphics.height - y
@items_window = Crafting::Window_CraftableItems.new(x, y, width, height,
@types)
@items_window.set_handler(:ok, method(:on_craft_ok))
@items_window.set_handler(:cancel, method(:on_craft_cancel))
@items_window.help_window = @help_window
unless @pick_actor
@items_window.select(0)
@items_window.activate
@items_window.actor = @actor
end
end
#--------------------------------------------------------------------------
# * Criação da janela de materiais
#--------------------------------------------------------------------------
def create_materials_window
x = @items_window.width
y = @help_window.y + @help_window.height
width = Graphics.width - x
height = Graphics.height - y
@materials_window = Crafting::Window_Materials.new(x, y, width, height)
@items_window.materials_window = @materials_window
end
#--------------------------------------------------------------------------
# * Criação da janela de informações de item
#--------------------------------------------------------------------------
def create_item_info_window
x = @items_window.width
y = @help_window.y + @help_window.height
width = Graphics.width - x
height = Graphics.height - y
@item_details_window = Crafting::Window_CraftingItemDetails.new(x, y,
width, height)
@item_details_window.hide
@items_window.item_info_window = @item_details_window
end
#--------------------------------------------------------------------------
# * Criação da janela de confirmação
#--------------------------------------------------------------------------
def create_confirm_window
x = 0
y = @help_window.y + @help_window.height
@confirm_window = Crafting::Window_CraftingConfirm.new(x, y)
@confirm_window.set_handler(:ok, method(:on_confirm_ok))
@confirm_window.set_handler(:cancel, method(:on_confirm_cancel))
end
#--------------------------------------------------------------------------
# * Criação da janela de resultado
#--------------------------------------------------------------------------
def create_result_window
x = @items_window.width
y = @help_window.y + @help_window.height
width = Graphics.width - x
height = Graphics.height - y
@result_window = Crafting::Window_CraftingResult.new(x, y, width, height)
@result_window.z = 200
@result_window.set_handler(method(:on_result_ok))
end
#--------------------------------------------------------------------------
# * Ator [Confirmação]
#--------------------------------------------------------------------------
def on_actor_ok
@actor = @actor_window.actor
on_actor_change
@actor_window.close
@actor_window.deactivate
@items_window.select(0)
@items_window.activate
end
#--------------------------------------------------------------------------
# * Forja [Confirmação]
#--------------------------------------------------------------------------
def on_craft_ok
@items_window.close
@confirm_window.select(0)
@confirm_window.open
@confirm_window.activate
@materials_window.hide
@item_details_window.show
end
#--------------------------------------------------------------------------
# * Forja [Cancelamento]
#--------------------------------------------------------------------------
def on_craft_cancel
return return_scene unless @pick_actor
@items_window.unselect
@actor_window.open
@actor_window.activate
@actor = nil
on_actor_change
end
#--------------------------------------------------------------------------
# * Confirmação [Confirmação]
#--------------------------------------------------------------------------
def on_confirm_ok
@confirm_window.close
@item_details_window.hide
do_crafting
end
#--------------------------------------------------------------------------
# * Confirmação [Cancelamento]
#--------------------------------------------------------------------------
def on_confirm_cancel
@confirm_window.close
@items_window.open
@items_window.activate
@materials_window.show
@item_details_window.hide
end
#--------------------------------------------------------------------------
# * Resultado [Confirmação]
#--------------------------------------------------------------------------
def on_result_ok
@result_window.hide
@result_window.close
@materials_window.show
@items_window.open
@items_window.select(0)
@items_window.activate
end
#--------------------------------------------------------------------------
# * Processo da mudança de herói
#--------------------------------------------------------------------------
def on_actor_change
@items_window.actor = @actor
end
#--------------------------------------------------------------------------
# * Execução da criação de item
#--------------------------------------------------------------------------
def do_crafting
Audio.se_stop
result = @items_window.craftable_item.try_craft
result.apply
on_result(result)
end
#--------------------------------------------------------------------------
# * Tratamento de resultado da criação
#--------------------------------------------------------------------------
def on_result(result)
@result_window.result = result
@result_window.show
@result_window.open
if result.success?
on_success
else
on_failure(result)
end
@items_window.refresh
end
#--------------------------------------------------------------------------
# * Sucesso na criação
#--------------------------------------------------------------------------
def on_success
RPG::SE.new(Crafting::Sound::SUCCESS).play
end
#--------------------------------------------------------------------------
# * Falha na criação
#--------------------------------------------------------------------------
def on_failure(result)
if result.broken_items.empty?
RPG::SE.new(Crafting::Sound::FAILURE).play
else
RPG::SE.new(Crafting::Sound::BREAK).play
end
end
end
#==============================================================================
# ** Window_MenuCommand
#------------------------------------------------------------------------------
# Esta janela exibe os comandos do menu.
#==============================================================================
class Window_MenuCommand < Window_Command
#--------------------------------------------------------------------------
# * Adição dos comandos principais
#--------------------------------------------------------------------------
alias add_main_commands_without_crafting add_main_commands
def add_main_commands
add_main_commands_without_crafting
return unless Crafting.enabled_from_menu?
add_command(Crafting::Vocab::MENU_OPTION, :crafting, crafting_enabled)
end
#--------------------------------------------------------------------------
# * Definição de habilitação de criação
#--------------------------------------------------------------------------
def crafting_enabled
Crafting.menu_enabled
end
end
#==============================================================================
# ** Scene_Menu
#------------------------------------------------------------------------------
# Esta classe executa o processamento da tela de menu.
#==============================================================================
class Scene_Menu < Scene_MenuBase
#--------------------------------------------------------------------------
# * Criação da janela de comando
#--------------------------------------------------------------------------
alias create_command_window_without_crafting create_command_window
def create_command_window
create_command_window_without_crafting
@command_window.set_handler(:crafting, method(:command_personal))
end
#--------------------------------------------------------------------------
# * Comandos individuais [Confirmação]
#--------------------------------------------------------------------------
alias on_personal_ok_without_crafting on_personal_ok
def on_personal_ok
case @command_window.current_symbol
when :crafting
Crafting.call_from_menu
else
on_personal_ok_without_crafting
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment