Para usá-lo, basta adicionar o script acima do Main.
A forma como o script funciona é que contém um módulo (no topo do script) em que você declare cada receita, e criar um item no banco de dados para a receita. O formato para cada receita é a seguinte:
product_type - este é o número de ID correspondente em "tipo" guia de banco de dados para produto acabado.
material_1_type - primeira necessitavam de um material "tipo"; 0 = item; 1 = arma =, 2 = armadura.
material_1_id - este é o número de ID correspondente em "tipo" guia de banco de dados para material de primeira.
material_1_qty - a quantidade necessária de material em primeiro lugar a criação de produtos.
Este script suporta qualquer número de materiais necessários para cada receita, simplesmente
escrever em materiais extras, seguindo o mesmo formato EX.:
o primeiro elemento a ser item_id banco de dados correspondente, o segundo elemento sendo os dados de produtos acabados, e cada um dos elementos a seguir corresponde com os materiais necessários para criar tal receita.
Eu também incluiu uma opção RESIZE_MENU no módulo, quando true os menus de crafting irá redimensionar-se de acordo para ajustar o número de itens e desenhar o mapa atrás deles (isso funcionaria bem se você já está usando um menu que exibe o mapa como fundo )
Screenshots:
Script:
Créditos:
Leandro(EU) - 50% do Script
Jeff(Amigo Meu) - 50% do Script tbm =)
A forma como o script funciona é que contém um módulo (no topo do script) em que você declare cada receita, e criar um item no banco de dados para a receita. O formato para cada receita é a seguinte:
- Código:
RECIPE[index] = [recipe_id, [product_type, product_id], [material_1_type, material_1_id, material_1_qty], ...]
product_type - este é o número de ID correspondente em "tipo" guia de banco de dados para produto acabado.
material_1_type - primeira necessitavam de um material "tipo"; 0 = item; 1 = arma =, 2 = armadura.
material_1_id - este é o número de ID correspondente em "tipo" guia de banco de dados para material de primeira.
material_1_qty - a quantidade necessária de material em primeiro lugar a criação de produtos.
Este script suporta qualquer número de materiais necessários para cada receita, simplesmente
escrever em materiais extras, seguindo o mesmo formato EX.:
- Código:
RECIPE[4] = [37, [2, 32], [2, 26, 1], [2, 30, 1], [2, 29, 1], [0, 14, 1]]
o primeiro elemento a ser item_id banco de dados correspondente, o segundo elemento sendo os dados de produtos acabados, e cada um dos elementos a seguir corresponde com os materiais necessários para criar tal receita.
Eu também incluiu uma opção RESIZE_MENU no módulo, quando true os menus de crafting irá redimensionar-se de acordo para ajustar o número de itens e desenhar o mapa atrás deles (isso funcionaria bem se você já está usando um menu que exibe o mapa como fundo )
Screenshots:
- Spoiler:
criação Prompt
Script:
- Código:
=begin
-----------------------------------------------------------------------------
*** RECIPE CONFIGURATION ****************************************************
-----------------------------------------------------------------------------
INSTRUÇÕES:
Este módulo contém as variáveis ??constantes usados ??para cada receita
formato:
RECIPE[index] = [recipe_id, [product_type, product_id],
[material_1_type, material_1_id, material_1_qty], ...]
recipe_id : este é o número de ID em "itens" guia de banco de dados
product_type : este é o número de ID correspondente em "tipo" guia de banco de dados para produto acabado.
: 0 = item; 1 = arma =, 2 = armadura.
product_id : este é o número de ID correspondente em "tipo" guia de banco de dados
: para o produto acabado
material_1_type : primeira necessitavam de um material "tipo"
: 0 = item; 1 = arma =, 2 = armadura.
material_1_id : este é o número de ID correspondente em "tipo" guia de banco de dados
: por primeiro material
material_1_qty : a quantidade necessária de material em primeiro lugar a criação de produtos
*NOTA:*
Este script suporta qualquer número de materiais necessários para cada receita, simplesmente
escrever em materiais extras, seguindo o mesmo formato
EX. RECIPE[0] = [1, [0, 25], [0, 15, 5], [0, 12, 2], [0, 5, 1]]
essa receita seria encontrado como o primeiro item no banco de dados, criaria
item # 25 na base de dados de itens, e requer 5 item#15, 2 item#12 and 1 item#5
=end
module Crafting
# Estilo de menu, true - desenhar janelas mapa e redimensionar para caber o conteúdo
# false - desenhar janelas completos
RESIZE_MENU = false
# Criar matriz para armazenar dados de receita
RECIPE = []
# Criar receitas abaixo
# High Potion
RECIPE[0] = [33, [0, 2], [0, 1, 2], [0, 17, 1]]
# Full Potion
RECIPE[1] = [34, [0, 3], [0, 2, 1], [0, 28, 1]]
# High Perfume
RECIPE[2] = [35, [0, 5], [0, 4, 2], [0, 18, 1]]
# Iron Sword
RECIPE[3] = [36, [1, 2], [1, 1, 1], [0, 13, 5], [0, 23, 5]]
# Ring of Water
RECIPE[4] = [37, [2, 32], [2, 26, 1], [2, 30, 1], [2, 29, 1], [0, 14, 1]]
end
#============================================================================
# ** Window_Prompt
#----------------------------------------------------------------------------
# Esta janela pergunta ao usuário se ele gostaria de criar o item
#============================================================================
class Window_Prompt < Window_Command
#--------------------------------------------------------------------------
# * Object Initialization
# item : item que será criado
#--------------------------------------------------------------------------
def initialize
super(200, ['Create', 'Cancel'])
self.x += 16
self.y += 80
self.z += 100
end
end
#============================================================================
# ** Window_Materials
#----------------------------------------------------------------------------
# Esta janela exibe materiais necessários para sintetizar receita
#============================================================================
class Window_Materials < Window_Selectable
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize(recipe)
super(320, 64, 320, 416)
refresh(recipe)
self.index = -1
self.active = false
end
#--------------------------------------------------------------------------
# * Current Item
#--------------------------------------------------------------------------
def item
return @data[self.index]
end
#--------------------------------------------------------------------------
# * Refresh Contents
#--------------------------------------------------------------------------
def refresh(recipe)
@recipe = recipe
if self.contents != nil
self.contents.clear
self.contents = nil
end
# Se há receitas são possuídos não desenhar item
@data = []
if @recipe == nil
self.height = 96 if Crafting::RESIZE_MENU
self.contents = Bitmap.new(self.width - 32, self.height - 32)
# Memorize o tamanho da fonte
font_size = self.contents.font.size
# Desenhe cabeçalho
self.contents.font.color = system_color
self.contents.draw_text(4, 0, 212, 32, 'Ingredients')
self.contents.font.size = 14
self.contents.draw_text(204, 0, 24, 32, 'need', 2)
self.contents.draw_text(252, 0, 24, 32, 'held', 2)
# Restaurar tamanho da fonte
self.contents.font.size = font_size
self.contents.draw_text(228, 0, 16, 32, '/', 1)
return
end
@qty_req = []
# Adicionar itens necessários
for i in [Tens de ter uma conta e sessão iniciada para poderes visualizar este link]
case @recipe[i][0]
when 0 # Item
@data.push($data_items[@recipe[i][1]])
when 1 # Weapon
@data.push($data_weapons[@recipe[i][1]])
when 2 # Armor
@data.push($data_armors[@recipe[i][1]])
end
@qty_req.push(@recipe[i][2])
end
@item_max = @data.size
# Redimensionar lista de ingredientes
if Crafting::RESIZE_MENU
self.height = @item_max * 32 + 64
self.height = 416 if self.height > 416
end
# Desenhe itens necessários
self.contents = Bitmap.new(self.width - 32, @item_max * 32 + 32)
for i in 0...@item_max
draw_item(i)
end
# Memorize o tamanho da fonte
font_size = self.contents.font.size
# Desenhe cabeçalho
self.contents.font.color = system_color
self.contents.draw_text(4, 0, 212, 32, 'Ingredients')
self.contents.font.size = 14
self.contents.draw_text(204, 0, 24, 32, 'need', 2)
self.contents.draw_text(252, 0, 24, 32, 'held', 2)
# Restaurar tamanho da fonte
self.contents.font.size = font_size
self.contents.draw_text(228, 0, 16, 32, '/', 1)
end
#-------------------------------------------------------------------------
# * Draw Ingredients
#-------------------------------------------------------------------------
def draw_item(index)
item = @data[index]
x = 4
y = index * 32 + 32
# obter o número de pontos que
case item
when RPG::Item
number = $game_party.item_number(item.id)
when RPG::Weapon
number = $game_party.weapon_number(item.id)
when RPG::Armor
number = $game_party.armor_number(item.id)
end
self.contents.font.color = number >= @qty_req[index] ?
normal_color : disabled_color
rect = Rect.new(x, y, self.width - 32, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
bitmap = RPG::Cache.icon(item.icon_name)
opacity = self.contents.font.color == normal_color ? 255 : 128
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
self.contents.draw_text(x + 28, y, 212, 32, item.name)
self.contents.draw_text(x + 200, y, 24, 32, @qty_req[index].to_s, 2)
self.contents.draw_text(x + 224, y, 16, 32, '/', 1)
self.contents.draw_text(x + 248, y, 24, 32, number.to_s, 2)
end
#--------------------------------------------------------------------------
# * Update Cursor Rectangle
#--------------------------------------------------------------------------
def update_cursor_rect
# Se a posição do cursor é inferior a 0
if @index < 0
self.cursor_rect.empty
return
end
# Obter linha atual
row = @index
# Se a linha atual é antes linha superior
if row < self.top_row
# Rolar para que a carreira atual torna-se linha superior
self.top_row = row
end
# Se a linha atual é mais para fazer do que fila de trás
if row > self.top_row + (self.page_row_max - 1)
# Scroll para que a carreira atual torna-se fileira de trás
self.top_row = row - (self.page_row_max - 1)
end
# Calcular largura do cursor
cursor_width = self.width - 32
# Calcular as coordenadas do cursor
x = 0
y = @index * 32 - self.oy + 32
# Atualize retângulo cursor
self.cursor_rect.set(x, y, cursor_width, 32)
end
#--------------------------------------------------------------------------
# * Help Text Update
#--------------------------------------------------------------------------
def update_help
@help_window.set_text(self.item == nil ? "" : self.item.description)
end
end
#============================================================================
# ** Window_Recipe
#----------------------------------------------------------------------------
# Esta janela apresenta receitas atualmente em posse
#============================================================================
class Window_Recipe < Window_Selectable
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
def initialize
super(0, 64, 320, 416)
refresh
self.index = 0
end
#--------------------------------------------------------------------------
# * Current Recipe
#--------------------------------------------------------------------------
def recipe
return @data[self.index]
end
#--------------------------------------------------------------------------
# * Refresh Contents
#--------------------------------------------------------------------------
def refresh
if self.contents != nil
self.contents.clear
self.contents = nil
end
@data = []
# Adicionar Receitas em posse
for i in 0...Crafting::RECIPE.size
recipe_id = Crafting::RECIPE[i][0]
if $game_party.item_number(recipe_id) > 0
@data.push(Crafting::RECIPE[i])
end
end
@item_max = @data.size
# Redimensionar a janela receita
if Crafting::RESIZE_MENU
self.height = @data[0] == nil ? 96 : @item_max * 32 + 64
self.height = 416 if self.height > 416
end
# Se Todas as receitas estão possuídos, atraí-los
if @item_max > 0
self.contents = Bitmap.new(width - 32, @item_max * 32 + 32)
for i in 0...@item_max
draw_recipes(i)
end
else
self.contents = Bitmap.new(width - 32, height - 32)
end
# Desenhe cabeçalho
self.contents.font.color = system_color
self.contents.draw_text(4, 0, 268, 32, 'Recipes Held', 1)
end
#-------------------------------------------------------------------------
# * Draw Recipes
#-------------------------------------------------------------------------
def draw_recipes(index)
recipe = @data[index]
x = 4
y = index * 32 + 32
# verificar se a receita é pode ser criado
self.contents.font.color = recipe_can_create?(recipe) ?
normal_color : disabled_color
rect = Rect.new(x, y, self.width - 32, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
bitmap = RPG::Cache.icon($data_items[recipe[0]].icon_name)
opacity = self.contents.font.color == normal_color ? 255 : 128
self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
self.contents.draw_text(x + 28, y, 212, 32, $data_items[recipe[0]].name)
end
#--------------------------------------------------------------------------
# * Receita pode ser criada
# recipe : matriz com os dados de receita
#--------------------------------------------------------------------------
def recipe_can_create?(recipe)
return false unless recipe
for i in 2...recipe.size
case recipe[i][0]
when 0 # Item
unless $game_party.item_number(recipe[i][1]) >= recipe[i][2]
return false
end
when 1 # Weapon
unless $game_party.weapon_number(recipe[i][1]) >= recipe[i][2]
return false
end
when 2 # Armor
unless $game_party.armor_number(recipe[i][1]) >= recipe[i][2]
return false
end
end
end
return true
end
#--------------------------------------------------------------------------
# * Update Cursor Rectangle
#--------------------------------------------------------------------------
def update_cursor_rect
# Se a posição do cursor é inferior a 0
if @index < 0
self.cursor_rect.empty
return
end
# Obter linha atual
row = @index
# Se a linha atual é antes linha superior
if row < self.top_row
# Rolar para que a carreira atual torna-se linha superior
self.top_row = row
end
# Se a linha atual é mais para fazer do que fila de trás
if row > self.top_row + (self.page_row_max - 1)
# Scroll para que a carreira atual torna-se fileira de trás
self.top_row = row - (self.page_row_max - 1)
end
# Calcular largura do cursor
cursor_width = self.width - 32
# Calcular as coordenadas do cursor
x = 0
y = @index * 32 - self.oy + 32
# Atualize retângulo cursor
self.cursor_rect.set(x, y, cursor_width, 32)
end
#--------------------------------------------------------------------------
# * Help Text Update
#--------------------------------------------------------------------------
def update_help
if self.recipe == nil
item = nil
@help_window.set_text('')
else
case self.recipe[1][0]
when 0 # item
item = $data_items[self.recipe[1][1]]
when 1 # weapon
item = $data_weapons[self.recipe[1][1]]
when 2 # armor
item = $data_armors[self.recipe[1][1]]
end
bitmap = RPG::Cache.icon(item.icon_name)
@help_window.set_text('Creates ' + item.name)
@help_window.contents.blt(78, 4, bitmap, Rect.new(0, 0, 24, 24))
end
end
end
#============================================================================
# ** Scene_Crafting
#----------------------------------------------------------------------------
# Esta cena lida com o menu usado para a elaboração de novos itens
#============================================================================
class Scene_Crafting
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
def main
# Desenhe mapa no fundo
map = Spriteset_Map.new if Crafting::RESIZE_MENU
# criar o Windows
@recipe_window = Window_Recipe.new
@index = 0
@material_index = 0
@material_window = Window_Materials.new(@recipe_window.recipe)
@help_window = Window_Help.new
# Associar janela de ajuda
@material_window.help_window = @help_window
@recipe_window.help_window = @help_window
# executar transição
Graphics.transition
# loop principal
loop do
# Update Graphics
Graphics.update
# Update Input
Input.update
# Update Frame
update
# If scene has changed
if $scene != self
break
end
end
# Dispose windows
map.dispose if Crafting::RESIZE_MENU
@recipe_window.dispose
@material_window.dispose
@help_window.dispose
end
#--------------------------------------------------------------------------
# * Update Frame
#--------------------------------------------------------------------------
def update
# Update current window
@help_window.update
if @recipe_window.active
@recipe_window.update
@material_window.refresh(@recipe_window.recipe)
update_recipe
return
else
@material_window.update
update_material
return
end
end
#--------------------------------------------------------------------------
# * Update Recipe Window
#--------------------------------------------------------------------------
def update_recipe
# Se o botão B é pressionado
if Input.trigger?(Input::B)
# Jogar cancelar SE
$game_system.se_play($data_system.cancel_se)
# Voltar ao menu principal
$scene = Scene_Menu.new(4)
return
end
# Se o botão C for pressionado
if Input.trigger?(Input::C)
# obter receita
recipe = @recipe_window.recipe
# verificar se a receita pode ser criada
if @recipe_window.recipe_can_create?(recipe)
# Jogar decisão SE
$game_system.se_play($data_system.decision_se)
# jogador Prompt
create_item_prompt(recipe)
return
else
# Jogar campainha SE
$game_system.se_play($data_system.buzzer_se)
end
return
end
# se o botão direito é pressionado
if Input.trigger?(Input::RIGHT)
# Jogue SE cursor
$game_system.se_play($data_system.cursor_se)
# Switch Materiais para janela
@index = @recipe_window.index
@recipe_window.index = -1
@recipe_window.active = false
@material_window.active = true
@material_window.index = @material_index
return
end
end
#--------------------------------------------------------------------------
# * Update Material Window
#--------------------------------------------------------------------------
def update_material
# Se o botão B é pressionado
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# Voltar ao menu principal
$scene = Scene_Menu.new
return
end
# se o botão esquerdo é pressionado
if Input.trigger?(Input::LEFT)
# Play cursor SE
$game_system.se_play($data_system.cursor_se)
# Switch a janela de receitas
@material_index = @material_window.index
@material_window.index = -1
@material_window.active = false
@recipe_window.index = @index
@recipe_window.active = true
return
end
end
#--------------------------------------------------------------------------
# * Create Item Prompt
#--------------------------------------------------------------------------
def create_item_prompt(recipe)
# Criar item Prompt
command = Window_Prompt.new
# Desativar janela receita
@recipe_window.active = false
# Repetir até que a seleção é feita
loop do
# Update Graphics
Graphics.update
# Update input
Input.update
# Update commands
command.update
# Se o botão B é pressionado
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# Retornar à janela receita
break
end
# Se o botão C for pressionado
if Input.trigger?(Input::C)
case command.index
when 0 # criar
# Play create SE
$game_system.se_play($data_system.equip_se)
# Adicionar item ao inventário
case recipe[1][0]
when 0 # item
$game_party.gain_item(recipe[1][1], 1)
when 1 # weapon
$game_party.gain_weapon(recipe[1][1], 1)
when 2 # armor
$game_party.gain_armor(recipe[1][1], 1)
end
# Remove ingredients
for i in 2...recipe.size
case recipe[i][0]
when 0 # item
# MODIFICAÇÃO BREWMEISTER para consumable/non-consumable items
if $data_items[recipe[i][1]].consumable ##BREW
$game_party.lose_item(recipe[i][1], recipe[i][2])
end ##BREW
# FIM DA MODIFICAÇÃO
when 1 # weapon
$game_party.lose_weapon(recipe[i][1], recipe[i][2])
when 2 # armor
$game_party.lose_armor(recipe[i][1], recipe[i][2])
end
end
# Refresh recipe window
@recipe_window.refresh
break
when 1 # cancelar
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# Retornar à janela receita
break
end
end
end
command.dispose
@recipe_window.active = true
end
end
Créditos:
Leandro(EU) - 50% do Script
Jeff(Amigo Meu) - 50% do Script tbm =)