O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Craft System by: Isolagc

Iniciado por Sockmoto, 10/07/2014 às 12:37

10/07/2014 às 12:37 Última edição: 20/01/2017 às 09:25 por King Gerar
Esse é um script de forja criado pelo Isolag do Mundo RPG Maker.
Infelizmente não tenho imagens mas não tem bugs.
Script
#------------------------------------------------------------------------------
#   ** Window_ForgeIng
#------------------------------------------------------------------------------
#   Janela criada para mostrar os ingredientes necessários para criar um item
# na forja. Usada dentro da Scene_Shop.
#------------------------------------------------------------------------------
 
class Window_ForgeIng < Window_Selectable
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Variáveis de Instância Pública
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  attr_accessor :price
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Constantes da Classe
  #   NÃO MEXA NISSO. Isso é uma Regular Expression usada para buscar os
  # ingredientes do item no Database.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  FORGE_ING_REGEX = /<Forge Ing:\s*(\d+),\s*(\d+),\s*(\d+)>/im
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Novo Método : initialize
  #   x       : coordenada x da janela
  #   y       : coordenada y da janela
  #   height  : altura da janela
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-  
  def initialize(x,y,height)
    super(x,y,window_width,height)
    @forge_item = nil
    @money = 0
    @price = 0
    refresh
    select(-1)
  end
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Novo Método : set
  #   set_item  : item selecionado na lista da forja
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-  
  def set(set_item)
    @forge_item=set_item
  end
   
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Novo Método : window_width
  #   Usado para definir rapidamente a largura da janela
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-    
  def window_width
    return 304
  end
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Novo Método : enable_ing?
  #   Define como o ingrediente será exibido. Se o jogador tiver o suficiente,
  # o ícone e o nome aparecerão normalmente. Caso contrário, aparecerão ligei-
  # ramente transparentes.
  #   ingredient  : ingrediente em questão
  #   qty         : quantidade necessária
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-    
  def enable_ing?(ingredient,qty)
      @in_possession = 0
      @in_possession = $game_party.item_number(ingredient)
      if @in_possession >= qty
        return true
      else
        return false
      end
  end
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Novo Método : all_enabled?
  #   Define se o jogador possui todos os ingredientes en quantidade suficiente
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def all_enabled?
    res = []
    for i in 0...@number_of_ing
       ing  = i
       res.push(enable_ing?(@ing_data[ing],@qty))
    end
    result = true
    for i in 0...res.size
        if result && res[i]
          result = true
        else
          result = false
        end
    end
    if result == true
      return result
    else
      return false
    end
  end
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Método Redefinido : refresh
  #   Basicamente o mesmo método. Apenas o comando draw_ing foi adicionado.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def refresh
    self.contents.clear
    make_item_list
    create_contents
    draw_all_items
    draw_ing
  end
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Método Redefinido : make_item_list
  #   Cria uma array com todos os ingredientes necessários para criar o item
  # ao scanear a Notebox do item no Database.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def make_item_list
    @ing_data = []
    @data = []
    @item=@forge_item
    if @item
      @Ing = @item.note.scan(FORGE_ING_REGEX)
      @number_of_ing = @Ing.size
      for i in 0...@number_of_ing
          ing  = i
          @type = @Ing[ing][0].to_i
          @id   = @Ing[ing][1].to_i
          @qty  = @Ing[ing][2].to_i
          @price= @Ing[ing][3].to_i
          case @type
          when 0;  ing2 = $data_items[@id]
          when 1;  ing2 = $data_weapons[@id]
          when 2;  ing2 = $data_armors[@id]
          end
          @ing_data.push(ing2)
      end
    end
  end
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Novo Método : draw_ing
  #   Desenha todos os ingredientes na janela.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def draw_ing
    if @number_of_ing
      draw_item_name(@item,0,0,true)
      for i in 0...@number_of_ing
        ing = i
        draw_item_name(@ing_data[ing], 24, 24*(ing+1), enable_ing?(@ing_data[ing],@qty))
        draw_icon(261,208, 0, enabled = true)
        draw_text(192,24*(ing+1),96,24,"x")
        draw_text(216,24*(ing+1),96,24,@in_possession)
        draw_text(240,24*(ing+1),96,24,"/")
        draw_text(256,24*(ing+1),96,24,@qty.to_i)    
      end
    end
  end
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Novo Método : lose_ingredients
  #   Tira os ingredientes do inventário do player.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def lose_ingredients
     if all_enabled?
       for i in 0...@number_of_ing
         ing = i
         $game_party.gain_item(@ing_data[ing],-@qty)
       end
     end    
  end
   
end
 
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# ** Window_ForgeConfirm
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#    Janela que exibe as opções da forja: Forjar e Cancelar.
#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
class Window_ForgeConfirm < Window_Command
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Novo Método : initialize
  #   x,y         : coordenadas da janela
  #   enable_flag : condição de exibição da opção Forjar
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def initialize(x,y,enable_flag)
    super(x,y)
    @enable_flag = enable_flag
    refresh
    select(0)
  end
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Novo Método : window_width
  #   Retorna a largura da janela.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def window_width
    return 304
  end
   
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Novo Método : make_command_list
  #   Cria os comandos da janela.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def make_command_list
      add_command("Fazer", :forge, @enable_flag)
      add_command("Cancelar", :cancel)
  end
 
 
end
 
#==============================================================================
# ** Window_ForgeCommand
#------------------------------------------------------------------------------
#  Janela usada para selecionar Forjar/Cancelar na Scene_Shop.
#==============================================================================
 
class Window_ForgeCommand < Window_HorzCommand
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Novo Método : initialize
  #   window_width  : largura da janela.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def initialize(window_width)
    @window_width = window_width
    super(0, 0)
  end
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Novo Método : window_width
  #   Retorna a largura da janela.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def window_width
    @window_width
  end
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Novo Método : col_max
  #   Define a quantidade de colunas da janela.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def col_max
    return 2
  end
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Novo Método : make_command_list
  #   Cria os comandos da janela.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def make_command_list
    add_command("Fazer",    :buy)
    add_command(Vocab::ShopCancel, :cancel)
  end
 
end
 
class Scene_Base
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Nova Variável Global :  $shop_type
  #   Esta variável define o tipo de loja que será aberto. Se igual a 0, abre
  # uma loja comum. Se igual a 1, abre a forja.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  $shop_type = 0
 
end
 
#==============================================================================
# ** Scene_Shop
#------------------------------------------------------------------------------
#  This class performs shop screen processing.
#==============================================================================
 
class Scene_Shop < Scene_MenuBase
  #--------------------------------------------------------------------------
  # * Métodos alias
  #--------------------------------------------------------------------------
  alias LS_forge_system_scene_shop_start_jearn start
  alias LS_forge_system_scene_base_return_scene_adsj0 return_scene
  alias LS_forge_system_scene_shop_on_buy_cancel_das9 on_buy_cancel
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Método alias  : start
  #   Cria as janelas necessárias e verifica se a loja é uma loja comum ou uma
  # forja.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def start
    LS_forge_system_scene_shop_start_jearn()
    create_command_forge_window
    case $shop_type
    when 1
      @command_forge.show.activate
      @command_window.hide.deactivate
    when 0
      @command_forge.hide.deactivate
      @command_window.show.activate
    end
  end
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Novo Método : create_command_forge_window
  #   Cria a janela de comando da forja.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def create_command_forge_window
    ww = Graphics.width - @gold_window.width
    @command_forge = Window_ForgeCommand.new(ww)
    @command_forge.y = @help_window.height
    @command_forge.set_handler(:buy,    method(:command_buy))
    @command_forge.set_handler(:cancel, method(:return_scene))
  end
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Método alias  : return_scene
  #   Reseta a variável $shop_type para que a próxima loja seja uma loja comum
  # e executa o método antigo.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def return_scene
   $shop_type = 0
   LS_forge_system_scene_base_return_scene_adsj0()
  end
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Novo Método : create_item
  #   Executado apenas se a loja é uma forja. Cria o item, retira os ingredien-
  # tes e o gold necessários.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def create_item
     @ing_window.lose_ingredients
     $game_party.gain_item(@item,1)
     $game_party.lose_gold(@goods[@item_index][3])
     @gold_window.refresh
     @confirm_window.hide
     @ing_window.hide
     @buy_window.money = $game_party.gold  
     @buy_window.show.activate
  end
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Novo Método : create_ing_window
  #   Cria a janela que mostra os ingredientes do item selecionado.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def create_ing_window
    wy = @dummy_window.y
    wh = @dummy_window.height - 24*3
    @ing_window = Window_ForgeIng.new(0,wy,wh)
    @ing_window.hide
  end
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Novo Método : create_confirm_window
  #   Cria a janela de confirmação da forja.
  #   enable_flag : condição de exibição da opção Forjar.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def create_confirm_window(enable_flag)
      @confirm_window = Window_ForgeConfirm.new(0,@ing_window.y+@ing_window.height,enable_flag)
      @confirm_window.set_handler(:forge, method(:create_item))
      @confirm_window.set_handler(:cancel, method(:return_to_buy))
  end
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Novo Método : return_to_buy
  #   Executado quando o item não é criado.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def return_to_buy
    @ing_window.hide
    @confirm_window.hide
    @buy_window.show.activate
  end
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Método Redefinido : on_buy_ok
  #   Executado ao selecionar o item na lista. Executa os métodos necessários
  # para mostrar os ingredientes corretos na janela.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-  
  def on_buy_ok
    @item = @buy_window.item
    @item_index = @buy_window.index
    @buy_window.hide
    case $shop_type
    when 1
      create_ing_window
      @ing_window.set(@item)
      @ing_window.make_item_list
      @ing_window.draw_ing
      @ing_window.show
      create_confirm_window(@ing_window.all_enabled?)
      @confirm_window.show.activate
    when 0
      @number_window.set(@item, max_buy, buying_price, currency_unit)
      @number_window.show.activate
    end
  end
 
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  # * Método alias : on_buy_cancel
  #   Se a loja é uma loja comum, apenas executa o método antigo. Se for uma
  # forja, esconde/mostra as janelas necessárias.
  #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-
  def on_buy_cancel
    case $shop_type
    when 0
      LS_forge_system_scene_shop_on_buy_cancel_das9()
    when 1
      @command_forge.activate
      @dummy_window.show
      @buy_window.hide
      @status_window.hide
      @status_window.item = nil
      @help_window.clear
    end
  end
 
end


Como usar
Para chamar a forja
Crie um evento
Coloque na 3° aba
Chamar Script
Coloque esse comando
$shop_type = 1

O 1 é para abrir a forja 0 abre uma loja comum

E abra a loja comum (Sem precisar colocar com 0) com as coisas que você pode forjar
Esse comando vai fazer com que se abra uma forja e não uma loja comum
Mas quando for abrir uma loja comum não precisa colocar com 0 isso acontece naturalmente

Para adicionar as coisas necessárias para criar o item
Vá no database
Itens
No bloco de notas do item coloque
Esse comando
<Forge Ing:0,1,1>

O primeiro número sera o item necessário
0=Itens
1=Armas
2=Armaduras

O segundo número sera o Id do item/arma/armadura necessário

O terceiro número sera o número de itens necessários

Para adicionar novos itens/armas/armaduras para poder construir
Adicione linhas como essa no bloco de notas do item/arma/armadura
E o item vai precisar de outro item/arma/armadura para ser construído

Esqueci de uma coisa: também funciona com armas e armaduras


Outras Opções para o Script:

Você pode criar um sistema de culinária com ele!
Você precisa dos ingredientes (item) e aí o evento que abre o comando pode ser um fogão.




Link Original:

http://www.mundorpgmaker.com.br/forum/index.php?topic=123744.0


Creditos:

Isolagc

Visitem a fábrica de eventos do Rayner!




Ajude a divulgar a nossa fábrica colocando este fanbar em sua assinatura.


Só uma coisa que tenho a dizer, coloque o script em code, não em spoiler. Outra coisa, não acho muito legal postar scripts dos outros sem saber quem fez  :ok:

10/07/2014 às 15:10 #2 Última edição: 07/10/2014 às 13:16 por Sockmoto
 :ded:é que eu achei o sistema tão legal e não tinha aqui na CRM que decidi postar :wow:

E sobre postar em code, é meu 1° tópico obrigado por avisar
Visitem a fábrica de eventos do Rayner!




Ajude a divulgar a nossa fábrica colocando este fanbar em sua assinatura.


Acho que o script é esse aqui. Obrigado por disponibilizar, é um script muito bom mesmo :ok:
~ Masked

É esse mesmo masked obrigado mesmo
Visitem a fábrica de eventos do Rayner!




Ajude a divulgar a nossa fábrica colocando este fanbar em sua assinatura.


É um script bacana, ele aparentemente foi feito pelo lsolagc, não se esqueça dos créditos. :XD: