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

Scene ShopVariable

Iniciado por Raizen, 28/03/2014 às 17:29

28/03/2014 às 17:29 Última edição: 28/03/2014 às 17:36 por Raizen
[box class=catbg2]Scene ShopVariable
[/box]
Autor: Kyo Panda
Versão: 1.1 - Lançado em: 04 de Outubro de 2010

[box class=catbg2]Sobre:[/box]
Cria uma loja em seu jogo, mas ao invés de usar dinheiro, a unidade monetária é definida por uma variável.

[box class=catbg2]Agradecimentos:[/box]

  • pedro_severo: Pela idealização e melhorias do script.

[box class=catbg2]Instalação:[/box]

  • Cole o script acima do ▼ Principal e abaixo dos ▼ Scripts Adicionais no Editor de Scripts  do RPG Maker VX.
  • Configure o script na guia configuração do mesmo.

[box class=catbg2]Utilização:[/box]

Utilize estes códigos com o Comando de Evento Chamar Script em um evento qualquer:

• Para definir a variável da loja:

VShop.var = ID da variável


• Para ligar a função da loja por variável:

VShop.on


• Para desligar a função da loja por variável:

VShop.off


• Para mudar a cifra da loja por variável:

VShop.symbol = "Cifra"


• Para mudar o texto de compra da loja por variável:

VShop.buy_string = "Texto"


• Para mudar o texto de venda da loja por variável:

VShop.sell_string = "Texto"


• Para mudar o texto de saída da loja por variável:

VShop.exit_string = "Texto"


• Para exibir ou não a cifra ao lado dos preços dos itens na hora da compra:
- Defina true para exibir e false para não exibir.


VShop.show_symbol = true / false


• Para ocultar a opção de compra da loja:
- Defina true para ocultar e false para não ocultar.


VShop.hidden_buy = true / false


• Para ocultar a opção de venda da loja:
-  Defina true para ocultar e false para não ocultar.


VShop.hidden_sell = true / false


[box class=catbg2]Script:[/box]
Script
#==============================================================================
# Scene_ShopVariable [VX]
#------------------------------------------------------------------------------
# Cria uma loja em seu jogo, mas ao invés de usar dinheiro, a unidade 
# monetária é definida por uma variável.
#------------------------------------------------------------------------------
# Site       : http://www.centrorpg.com/
# Autor      : Kyo Panda
# Lançado em : 04 de Outubro de 2010
# Versão     : 1.1
#==============================================================================

#==============================================================================
# Agradecimentos:
#------------------------------------------------------------------------------
# • pedro_severo : Pela idealização e melhorias do script.
#==============================================================================

#==============================================================================
# Como usar:
#------------------------------------------------------------------------------
# 
# #--------------------------------------------------------------------------
# # Instalação
# #--------------------------------------------------------------------------
#
# • Cole o script acima do "▼ Principal" e abaixo dos "▼ Scripts Adicionais"
#   no Editor de Scripts do RPG Maker VX.
# 
# • Configure o script no guia "Configuração" logo abaixo.
#
# #--------------------------------------------------------------------------
# # Utilização
# #--------------------------------------------------------------------------
# 
# Utilize estes códigos com o "Comando de Evento" "Chamar Script" em um 
# evento qualquer:
#
# • Para definir a variável da loja
#   VShop.var = ID da variável
#
# • Para ligar a função da loja por variável
#   VShop.on
#
# • Para desligar a função da loja por variável
#   VShop.off
#
# • Para mudar a cifra da loja por variável
#   VShop.symbol = "Cifra"
#
# • Para mudar o texto de compra da loja por variável
#   VShop.buy_string = "Texto"
#
# • Para mudar o texto de venda da loja por variável
#   VShop.sell_string = "Texto"
#
# • Para mudar o texto de saída da loja por variável
#   VShop.exit_string = "Texto"
#
# • Para exibir ou não a cifra ao lado dos preços dos itens na hora da compra
#   Defina true para exibir e false para não exibir
#   VShop.show_symbol = true / false
#
# • Para ocultar a opção de compra da loja
#   Defina true para ocultar e false para não ocultar
#   VShop.hidden_buy = true / false
#
# • Para ocultar a opção de venda da loja
#   Defina true para ocultar e false para não ocultar
#   VShop.hidden_sell = true / false
#
#==============================================================================

#==============================================================================
# Histórico de versões:
#------------------------------------------------------------------------------
# • Versão 1.1: 05 de Outubro de 2010
#   * Adicionada a opção de mudar os textos de compra, venda e saída.
#   * Adicionada a opção de exibir ou não a cifra ao lado dos itens na hora da
#     compra.
#   * Adicionada a opção de ocultar as opções de compra e venda.
# • Versão 1.0: 04 de Outubro de 2010
#   * Primeira versão do script.
#==============================================================================

#==============================================================================
# VShop_Config
#------------------------------------------------------------------------------
# Classe de configuração do script Scene_ShopVariable.
#==============================================================================

module VShop_Config
  #--------------------------------------------------------------------------
  # Configuração
  #--------------------------------------------------------------------------
  
  # Defina aqui o ID da variável padrão da loja.
  DEFAULT_VARIABLE = 1
  
  # Defina aqui a cifra padrão que aparecerá na loja.
  # O nome deve estar entre aspas ("") ou apóstrofes ('').
  DEFAULT_SYMBOL = "P"
  
  # Defina aqui o estado padrão da loja, se está ligado ou não.
  # Defina true para ligado e false para desligado.
  DEFAULT_STATE = false
  
  # Defina aqui os textos padrões que serão exibidos na tela de loja.
  # Os textos devem estar entre aspas ("") ou apóstrofes ('').
  DEFAULT_BUY  = "Comprar"   # Comprar
  DEFAULT_SELL = "Vender"    # Vender 
  DEFAULT_EXIT = "Sair"      # Sair
  
  # Defina aqui se deseja exibir as cifras ao lado dos preços dos itens
  # vendidos na loja, por padrão.
  # Defina true para sim e false para não.
  DEFAULT_SHOW_SYMBOL = true
  
  # Defina aqui se você deseja ocultar as opções de compra ou venda por 
  # padrão.
  # Defina true para sim e false para não
  DEFAULT_HIDDEN_BUY = false
  DEFAULT_HIDDEN_SELL = false
  
  #--------------------------------------------------------------------------
  # Fim da configuração
  #--------------------------------------------------------------------------
end

  #--------------------------------------------------------------------------
  # Define a chave "Scene_ShopVariable" na hash $kpanda_scripts como true
  #--------------------------------------------------------------------------
$kpanda_scripts = {} if $kpanda_scripts.nil?
$kpanda_scripts["Scene_ShopVariable"] = true

#==============================================================================
# VShop
#------------------------------------------------------------------------------
# Classe de operações do script Scene_ShopVariable.
#==============================================================================

module VShop
  #--------------------------------------------------------------------------
  # Definição da variável da loja por variável
  #     variable_id : ID da variável
  #--------------------------------------------------------------------------
  def self.var=(variable_id)
    return $game_temp.vshop_variable = variable_id
  end
  #--------------------------------------------------------------------------
  # Ligar loja por variável
  #--------------------------------------------------------------------------
  def self.on
    return $game_temp.vshop_active = true
  end
  #--------------------------------------------------------------------------
  # Desligar loja por variável
  #--------------------------------------------------------------------------
  def self.off
    return $game_temp.vshop_active = false
  end
  #--------------------------------------------------------------------------
  # Definição da cifra da loja por variável
  #     symbol : Nova cifra
  #--------------------------------------------------------------------------
  def self.symbol=(symbol)
    return $game_temp.vshop_symbol = symbol
  end
  #--------------------------------------------------------------------------
  # Troca do nome de compra da loja por variável
  #     string : Nova String
  #--------------------------------------------------------------------------
  def self.buy_string=(string)
    return $game_temp.vshop_buy_string = string
  end
  #--------------------------------------------------------------------------
  # Troca do nome de venda da loja por variável
  #     string : Nova String
  #--------------------------------------------------------------------------
  def self.sell_string=(string)
    return $game_temp.vshop_sell_string = string
  end
  #--------------------------------------------------------------------------
  # Troca do nome de saída  da loja por variável
  #     string : Nova String
  #--------------------------------------------------------------------------
  def self.exit_string=(string)
    return $game_temp.vshop_exit_string = string
  end
  #--------------------------------------------------------------------------
  # Exibir a cifra ao lado dos itens da loja
  #     state : Novo estado
  #--------------------------------------------------------------------------
  def self.show_symbol=(state)
    return $game_temp.vshop_show_symbol = state
  end
  #--------------------------------------------------------------------------
  # Ocultar a compra da loja
  #     state : Novo estado
  #--------------------------------------------------------------------------
  def self.hidden_buy=(state)
    return $game_temp.vshop_hidden_buy = state
  end
  #--------------------------------------------------------------------------
  # Ocultar a venda da loja
  #     state : Novo estado
  #--------------------------------------------------------------------------
  def self.hidden_sell=(state)
    return $game_temp.vshop_hidden_sell = state
  end
end
    
#==============================================================================
# Game_Temp
#------------------------------------------------------------------------------
# Esta classe controla dados que não são salvos pelo jogo, os dados temporários
# Pode ser acessada utilizando $game_temp
#==============================================================================

class Game_Temp
  #--------------------------------------------------------------------------
  # Variáveis públicas
  #--------------------------------------------------------------------------
  attr_accessor :vshop_active          # Atividade da loja por variável
  attr_accessor :vshop_symbol          # Cifra da loja por variável
  attr_accessor :vshop_variable        # Variável da loja por variável
  attr_accessor :vshop_buy_string      # Texto de compra
  attr_accessor :vshop_sell_string     # Texto de venda
  attr_accessor :vshop_exit_string     # Texto de saída
  attr_accessor :vshop_show_symbol     # Exibição das cifras nos itens
  attr_accessor :vshop_hidden_buy      # Definição da compra oculta 
  attr_accessor :vshop_hidden_sell     # Definição da vendfa oculta
  #--------------------------------------------------------------------------
  # Alias da inicialização do objeto
  #--------------------------------------------------------------------------
  alias kpnsvs0001_initialize initialize
  #--------------------------------------------------------------------------
  # Inicialização do objeto
  #--------------------------------------------------------------------------
  def initialize
    @vshop_active = VShop_Config::DEFAULT_STATE
    @vshop_symbol = VShop_Config::DEFAULT_SYMBOL
    @vshop_variable = VShop_Config::DEFAULT_VARIABLE
    @vshop_buy_string = VShop_Config::DEFAULT_BUY
    @vshop_sell_string = VShop_Config::DEFAULT_SELL
    @vshop_exit_string = VShop_Config::DEFAULT_EXIT
    @vshop_show_symbol = VShop_Config::DEFAULT_SHOW_SYMBOL
    @vshop_hidden_buy = VShop_Config::DEFAULT_HIDDEN_BUY
    @vshop_hidden_sell = VShop_Config::DEFAULT_HIDDEN_SELL
    kpnsvs0001_initialize
  end
end
    
#==============================================================================
# Window_Base
#------------------------------------------------------------------------------
# Esta é a classe superior à todas as classes de janelas do jogo.
#==============================================================================

class Window_Base < Window
  #--------------------------------------------------------------------------
  # Exibição da unidade monetária com valor em posse especial
  #     value  : Valor em posse
  #     x      : Exibe na coordenada X
  #     y      : Exibe na coordenada Y
  #     width  : Largura
  #     symbol : Símbolo que determina a moeda
  #--------------------------------------------------------------------------
  def draw_currency_value_ex(value, x, y, width, symbol = Vocab::gold)
    cx = contents.text_size(symbol).width
    self.contents.font.color = normal_color
    self.contents.draw_text(x, y, width - cx - 2, WLH, value, 2)
    self.contents.font.color = system_color
    self.contents.draw_text(x, y, width, WLH, symbol, 2)
  end
end

#==============================================================================
# Window_ShopVariable
#------------------------------------------------------------------------------
# Janela responsável pela exibição do valor de determinada cariável.
#==============================================================================

class Window_ShopVariable < Window_Base
  #--------------------------------------------------------------------------
  # Variáveis públicas
  #--------------------------------------------------------------------------
  attr_accessor :variable                  # Variável da janela
  attr_accessor :symbol                    # Cifra da janela
  #--------------------------------------------------------------------------
  # Inicialização do objeto
  #     x        : Coordenada X da janela
  #     y        : Coordenada Y da janela
  #     variable : Variável que será desenhada
  #     symbol   : Cifra que será desenhada
  #--------------------------------------------------------------------------
  def initialize(x, y, variable, symbol)
    super(x, y, 160, WLH + 32)
    @variable = variable
    @symbol = symbol
    refresh
  end
  #--------------------------------------------------------------------------
  # Atualização
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    draw_currency_value_ex(@variable, 4, 0, 120, @symbol)
  end
end

#==============================================================================
# Window_ShopBuy
#------------------------------------------------------------------------------
# Janela que exibe a mercadoria que é permitida ao jogador comprar.
#==============================================================================

class Window_ShopBuy < Window_Selectable
  #--------------------------------------------------------------------------
  # Alias do desenho do item
  #--------------------------------------------------------------------------
  alias kpnsvs0001_draw_item draw_item 
  #--------------------------------------------------------------------------
  # Desenho do item
  #     index : número de items
  #--------------------------------------------------------------------------
  def draw_item(index)
    if $game_temp.vshop_active
      item = @data[index]
      number = $game_party.item_number(item)
      enabled = (item.price <= $game_variables[$game_temp.vshop_variable] and 
      number < 99)
      rect = item_rect(index)
      self.contents.clear_rect(rect)
      draw_item_name(item, rect.x, rect.y, enabled)
      rect.width -= 4
      if $game_temp.vshop_show_symbol
        rect.width -= self.contents.text_size($game_temp.vshop_symbol).width
        rect.width -= 4
      end
      self.contents.draw_text(rect, item.price, 2)
      if $game_temp.vshop_show_symbol
        rect.width += self.contents.text_size($game_temp.vshop_symbol).width
        rect.width += 4
        self.contents.font.color = system_color
        self.contents.draw_text(rect, $game_temp.vshop_symbol, 2)
        self.contents.font.color = normal_color
      end
    else
      kpnsvs0001_draw_item(index)
    end
  end
end

#==============================================================================
# Window_ShopNumber
#------------------------------------------------------------------------------
# Janela responsável pelos valores numéricos inseridos na hora da compra ou
# venda.
#==============================================================================

class Window_ShopNumber < Window_Base
  #--------------------------------------------------------------------------
  # Alias da atualização
  #--------------------------------------------------------------------------
  alias kpnsvs0001_refresh refresh
  #--------------------------------------------------------------------------
  # Atualização
  #--------------------------------------------------------------------------
  def refresh
    if $game_temp.vshop_active
      y = 96
      self.contents.clear
      draw_item_name(@item, 0, y)
      self.contents.font.color = normal_color
      self.contents.draw_text(212, y, 20, WLH, "×")
      self.contents.draw_text(248, y, 20, WLH, @number, 2)
      self.cursor_rect.set(244, y, 28, WLH)
      draw_currency_value_ex(@price * @number, 4, y + WLH * 2, 264,
      $game_temp.vshop_symbol)
    else
      kpnsvs0001_refresh
    end
  end
end

#==============================================================================
# Scene_Shop
#------------------------------------------------------------------------------
# Classe responsável pelo gerenciamento de lojas.
#==============================================================================

class Scene_Shop < Scene_Base
  #--------------------------------------------------------------------------
  # Alias da inicialização do processo
  #--------------------------------------------------------------------------
  alias kpnsvs0001_start start
  #--------------------------------------------------------------------------
  # Inicialização do processo
  #--------------------------------------------------------------------------
  def start
    kpnsvs0001_start
    if $game_temp.vshop_active
      @gold_window = Window_ShopVariable.new(384, 56,
      $game_variables[$game_temp.vshop_variable], $game_temp.vshop_symbol)
    end
  end
  #--------------------------------------------------------------------------
  # Alias da criação da janela de comandos
  #--------------------------------------------------------------------------
  alias kpnsvs0001_create_command_window create_command_window
  #--------------------------------------------------------------------------
  # Criação da janela de comandos
  #--------------------------------------------------------------------------
  def create_command_window
    if $game_temp.vshop_active
      commands = []
      s1 = $game_temp.vshop_buy_string
      s2 = $game_temp.vshop_sell_string
      s3 = $game_temp.vshop_exit_string
      commands << s1 unless $game_temp.vshop_hidden_buy
      commands << s2 unless $game_temp.vshop_hidden_sell
      commands << s3 
      @command_window = Window_Command.new(384, commands, commands.size)
      @command_window.y = 56
      if $game_temp.shop_purchase_only
        @command_window.commands.each_index do |i|
          if @command_window.commands[i] == $game_temp.vshop_sell_string
            @command_window.draw_item(i, false)
          end
        end
      end
    else
      kpnsvs0001_create_command_window
    end
  end
  #--------------------------------------------------------------------------
  # Alias da atualização da seleção de comando
  #--------------------------------------------------------------------------
  alias kpnsvs0001_update_command_selection update_command_selection
  #--------------------------------------------------------------------------
  # Atualização da seleção de comando
  #--------------------------------------------------------------------------
  def update_command_selection
    if $game_temp.vshop_active
      if Input.trigger?(Input::B)
        Sound.play_cancel
        $scene = Scene_Map.new
      elsif Input.trigger?(Input::C)
        case @command_window.commands[@command_window.index]
        when $game_temp.vshop_buy_string # Comprar
          Sound.play_decision
          @command_window.active = false
          @dummy_window.visible = false
          @buy_window.active = true
          @buy_window.visible = true
          @buy_window.refresh
          @status_window.visible = true
        when $game_temp.vshop_sell_string  # Vender
          if $game_temp.shop_purchase_only
            Sound.play_buzzer
          else
            Sound.play_decision
            @command_window.active = false
            @dummy_window.visible = false
            @sell_window.active = true
            @sell_window.visible = true
            @sell_window.refresh
          end
        when $game_temp.vshop_exit_string  # Sair
          Sound.play_decision
          $scene = Scene_Map.new
        end
      end
    else
      kpnsvs0001_update_command_selection
    end
  end
  #--------------------------------------------------------------------------
  # Alias da atualização da seleção: Comprar
  #--------------------------------------------------------------------------
  alias kpnsvs0001_update_buy_selection update_buy_selection
  #--------------------------------------------------------------------------
  # Atualização da seleção: Comprar
  #--------------------------------------------------------------------------
  def update_buy_selection
    if $game_temp.vshop_active
      @status_window.item = @buy_window.item
      if Input.trigger?(Input::B)
        Sound.play_cancel
        @command_window.active = true
        @dummy_window.visible = true
        @buy_window.active = false
        @buy_window.visible = false
        @status_window.visible = false
        @status_window.item = nil
        @help_window.set_text("")
        return
      end
      if Input.trigger?(Input::C)
        @item = @buy_window.item
        number = $game_party.item_number(@item)
        if @item == nil or @item.price > 
          $game_variables[$game_temp.vshop_variable] or number == 99
          Sound.play_buzzer
        else
          Sound.play_decision
          max = @item.price == 0 ? 99 : 
          $game_variables[$game_temp.vshop_variable] / @item.price
          max = [max, 99 - number].min
          @buy_window.active = false
          @buy_window.visible = false
          @number_window.set(@item, max, @item.price)
          @number_window.active = true
          @number_window.visible = true
        end
      end
    else
      kpnsvs0001_update_buy_selection
    end
  end  
  #--------------------------------------------------------------------------
  # Alias da atualização da seleção: Vender
  #--------------------------------------------------------------------------
  alias kpnsvs0001_update_sell_selection update_sell_selection
  #--------------------------------------------------------------------------
  # Atualizaão da seleção: Vender
  #--------------------------------------------------------------------------
  def update_sell_selection
    if $game_temp.vshop_active
      if Input.trigger?(Input::B)
        Sound.play_cancel
        @command_window.active = true
        @dummy_window.visible = true
        @sell_window.active = false
        @sell_window.visible = false
        @status_window.item = nil
        @help_window.set_text("")
      elsif Input.trigger?(Input::C)
        @item = @sell_window.item
        @status_window.item = @item
        if @item == nil or @item.price == 0
          Sound.play_buzzer
        else
          Sound.play_decision
          max = $game_party.item_number(@item)
          @sell_window.active = false
          @sell_window.visible = false
          @number_window.set(@item, max, @item.price / 2)
          @number_window.active = true
          @number_window.visible = true
          @status_window.visible = true
        end
      end
    else
      kpnsvs0001_update_sell_selection
    end
  end
  #--------------------------------------------------------------------------
  # Alias da decisão do número inserido
  #--------------------------------------------------------------------------
  alias kpnsvs0001_decide_number_input decide_number_input
  #--------------------------------------------------------------------------
  # Decisão do número inserido
  #--------------------------------------------------------------------------
  def decide_number_input
    if $game_temp.vshop_active
      Sound.play_shop
      @number_window.active = false
      @number_window.visible = false
      case @command_window.index
      when 0  # Comprando
        $game_variables[$game_temp.vshop_variable] -= 
        @number_window.number * @item.price
        $game_party.gain_item(@item, @number_window.number)
        @gold_window.variable = $game_variables[$game_temp.vshop_variable]
        @gold_window.refresh
        @buy_window.refresh
        @status_window.refresh
        @buy_window.active = true
        @buy_window.visible = true
      when 1  # Vendendo
        $game_variables[$game_temp.vshop_variable] += 
        @number_window.number * (@item.price / 2)
        $game_party.lose_item(@item, @number_window.number)
        @gold_window.variable = $game_variables[$game_temp.vshop_variable]
        @gold_window.refresh
        @sell_window.refresh
        @status_window.refresh
        @sell_window.active = true
        @sell_window.visible = true
        @status_window.visible = false
      end
    else
      kpnsvs0001_decide_number_input
    end
  end
end
[close]

[box class=catbg2]Demo:[/box]
Em anexo.

[box class=catbg2]Screenshots:[/box]
Desde que as mudanças não são visuais no script, ou seja, a função da loja é o que muda, seria irrelevante utilizar screenshots.

[box class=catbg2]Histórico de versões:[/box]

  • Versão 1.1: 05 de Outubro de 2010
    Spoiler
    * Adicionada a opção de mudar os textos de compra, venda e saída.
    * Adicionada a opção de exibir ou não a cifra ao lado dos itens na hora da compra.
    * Adicionada a opção de ocultar as opções de compra e venda.
    [close]
  • Versão 1.0: 04 de Outubro de 2010
    Spoiler
    * Primeira versão do script.
    [close]

[box class=catbg2]Finalização:[/box]
Qualquer dúvida, erro ou sugestão quanto ao script comunique-me ou ao Kyo, que eu faremos o possível para atendê-lo.

Olá, gostei muito deste roteiro. É útil, exceto que existe alguma maneira de alterar o preço para outro valor? Talvez algo especificado em notas para cada item?

02/09/2022 às 13:19 #2 Última edição: 02/09/2022 às 13:24 por Kyo Panda
Adiciona esse script abaixo do script da loja:

if $kpanda_scripts.nil? || !$kpanda_scripts["Scene_ShopVariable"]
  raise "The script Scene_ShopVariable was not found."
end

#==============================================================================
# ** RPG::Item
#------------------------------------------------------------------------------
#  This class represents the items in game.
#==============================================================================

class RPG::Item
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :vshop_price

  #--------------------------------------------------------------------------
  # * Object Initialization alias
  #--------------------------------------------------------------------------
  alias :initialize_202209021234 :initialize

  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(*args)
    initialize_202209021234(*args)
    
    @vshop_price = nil
  end

  #--------------------------------------------------------------------------
  # * Price
  #--------------------------------------------------------------------------
  def price
    return @vshop_price if $game_temp.vshop_active && !@vshop_price.nil?
    
    @price
  end
end

#==============================================================================
# ** VShop
#------------------------------------------------------------------------------
#  This module holds the Scene_SchopVariable operations.
#==============================================================================

module VShop
  #--------------------------------------------------------------------------
  # * Constants
  #--------------------------------------------------------------------------
  ITEM_PRICE_REGEX = /<vshop:item-price>([^<]*)<\/vshop>/i
  
  #--------------------------------------------------------------------------
  # * Process item notes
  #--------------------------------------------------------------------------
  def self.process_item_notes
    $data_items[1..-1].each do |item|
      match = item.note.match(ITEM_PRICE_REGEX)
      
      item.vshop_price = match[1].to_i if match
    end
  end
end

#==============================================================================
# ** Scene_Title
#------------------------------------------------------------------------------
#  This class performs the title screen processing.
#==============================================================================

class Scene_Title < Scene_Base
  #--------------------------------------------------------------------------
  # * Load Database alias
  #--------------------------------------------------------------------------
  alias load_database_202209021211 load_database

  #--------------------------------------------------------------------------
  # * Load Database
  #--------------------------------------------------------------------------
  def load_database(*args)
    load_database_202209021211(*args)
    
    VShop.process_item_notes
  end
end


Para definir o preço do item, adiciona na nota dele:

<vshop:item-price>1</vshop>


Mudando o número para o valor que você quer.

Se a loja estiver desativada (usando o Vshop.off, por exemplo), ou se o item não tiver um valor definido nas notas dele, o valor do banco de dados será usado.

Nota que como o script mexe com o valor do item, se realizar alguma operação fora da loja que utiliza o preço do item como referência, ele pegará o preço do item do Vshop e não do banco de dados. Então use o Vshop.off sempre que precisar interagir com o preço do item do banco de dados.

Muito obrigado! É muito bom. Mais uma pergunta, é possível adicionar EquipItem (weapon and armor) ao script também?

eu agradeço a ajuda!

03/09/2022 às 04:08 #4 Última edição: 03/09/2022 às 04:41 por Kyo Panda
Tá na mão:

if $kpanda_scripts.nil? || !$kpanda_scripts["Scene_ShopVariable"]
  raise "The script Scene_ShopVariable was not found."
end

#==============================================================================
# ** RPG::PurchasableItem
#------------------------------------------------------------------------------
#  Module used to define the price of purchasable items.
#==============================================================================

module RPG::PurchasableItem
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :vshop_price
  
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    @vshop_price = nil
  end
  
  #--------------------------------------------------------------------------
  # * Price
  #--------------------------------------------------------------------------
  def self.included(base)
    base.class_eval do
      def price
        return @vshop_price if $game_temp.vshop_active && !@vshop_price.nil?
        
        @price
      end
    end
  end
end

#==============================================================================
# ** RPG::Item
#------------------------------------------------------------------------------
#  Data class for items.
#==============================================================================

class RPG::Item
  #--------------------------------------------------------------------------
  # * Include RPG::PurchasableItem
  #--------------------------------------------------------------------------
  include RPG::PurchasableItem
end

#==============================================================================
# ** RPG::Weapon
#------------------------------------------------------------------------------
#  Data class for weapons.
#==============================================================================

class RPG::Weapon
  #--------------------------------------------------------------------------
  # * Include RPG::PurchasableItem
  #--------------------------------------------------------------------------
  include RPG::PurchasableItem
end

#==============================================================================
# ** RPG::Armor
#------------------------------------------------------------------------------
#  Data class for armors.
#==============================================================================

class RPG::Armor
  #--------------------------------------------------------------------------
  # * Include RPG::PurchasableItem
  #--------------------------------------------------------------------------
  include RPG::PurchasableItem
end

#==============================================================================
# ** VShop
#------------------------------------------------------------------------------
#  This module holds the Scene_SchopVariable operations.
#==============================================================================

module VShop
  #--------------------------------------------------------------------------
  # * Constants
  #--------------------------------------------------------------------------
  ITEM_PRICE_REGEX = /<vshop:item-price>([^<]*)<\/vshop>/i
  
  #--------------------------------------------------------------------------
  # * Process item notes
  #--------------------------------------------------------------------------
  def self.process_item_notes
    [$data_items, $data_weapons, $data_armors].each do |database|
      database[1..-1].each do |item|
        match = item.note.match(ITEM_PRICE_REGEX)
      
        item.vshop_price = match[1].to_i if match
      end
    end
  end
end

#==============================================================================
# ** Scene_Title
#------------------------------------------------------------------------------
#  This class performs the title screen processing.
#==============================================================================

class Scene_Title < Scene_Base
  #--------------------------------------------------------------------------
  # * Load Database alias
  #--------------------------------------------------------------------------
  alias load_database_202209021211 load_database
  
  #--------------------------------------------------------------------------
  # * Load Database
  #--------------------------------------------------------------------------
  def load_database(*args)
    load_database_202209021211(*args)
    
    VShop.process_item_notes
  end
end

 :<3: :<3:

Obrigada!! Eu estava tentando fazer isso sozinho, mas não conseguiu localizar como obter o preço das armas.

Você é o melhor! Este é o script mais útil que já usei!

04/09/2022 às 23:21 #6 Última edição: 06/09/2022 às 00:13 por siemic
Citação de: Kyo Panda online 03/09/2022 às 04:08
Tá na mão:

if $kpanda_scripts.nil? || !$kpanda_scripts["Scene_ShopVariable"]
  raise "The script Scene_ShopVariable was not found."
end

#==============================================================================
# ** RPG::PurchasableItem
#------------------------------------------------------------------------------
#  Module used to define the price of purchasable items.
#==============================================================================

module RPG::PurchasableItem
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :vshop_price
  
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    @vshop_price = nil
  end
  
  #--------------------------------------------------------------------------
  # * Price
  #--------------------------------------------------------------------------
  def self.included(base)
    base.class_eval do
      def price
        return @vshop_price if $game_temp.vshop_active && !@vshop_price.nil?
        
        @price
      end
    end
  end
end

#==============================================================================
# ** RPG::Item
#------------------------------------------------------------------------------
#  Data class for items.
#==============================================================================

class RPG::Item
  #--------------------------------------------------------------------------
  # * Include RPG::PurchasableItem
  #--------------------------------------------------------------------------
  include RPG::PurchasableItem
end

#==============================================================================
# ** RPG::Weapon
#------------------------------------------------------------------------------
#  Data class for weapons.
#==============================================================================

class RPG::Weapon
  #--------------------------------------------------------------------------
  # * Include RPG::PurchasableItem
  #--------------------------------------------------------------------------
  include RPG::PurchasableItem
end

#==============================================================================
# ** RPG::Armor
#------------------------------------------------------------------------------
#  Data class for armors.
#==============================================================================

class RPG::Armor
  #--------------------------------------------------------------------------
  # * Include RPG::PurchasableItem
  #--------------------------------------------------------------------------
  include RPG::PurchasableItem
end

#==============================================================================
# ** VShop
#------------------------------------------------------------------------------
#  This module holds the Scene_SchopVariable operations.
#==============================================================================

module VShop
  #--------------------------------------------------------------------------
  # * Constants
  #--------------------------------------------------------------------------
  ITEM_PRICE_REGEX = /<vshop:item-price>([^<]*)<\/vshop>/i
  
  #--------------------------------------------------------------------------
  # * Process item notes
  #--------------------------------------------------------------------------
  def self.process_item_notes
    [$data_items, $data_weapons, $data_armors].each do |database|
      database[1..-1].each do |item|
        match = item.note.match(ITEM_PRICE_REGEX)
      
        item.vshop_price = match[1].to_i if match
      end
    end
  end
end

#==============================================================================
# ** Scene_Title
#------------------------------------------------------------------------------
#  This class performs the title screen processing.
#==============================================================================

class Scene_Title < Scene_Base
  #--------------------------------------------------------------------------
  # * Load Database alias
  #--------------------------------------------------------------------------
  alias load_database_202209021211 load_database
  
  #--------------------------------------------------------------------------
  # * Load Database
  #--------------------------------------------------------------------------
  def load_database(*args)
    load_database_202209021211(*args)
    
    VShop.process_item_notes
  end
end


bom dia, desculpe incomodá-lo com isso novamente.. quando eu adicioná-lo ao meu projeto

eu recebi:

"Script 'VShop Mod' line 30: NoMethodError occurred. undefined method 'vshop active' for nil:NilClass"


Com apenas esses dois scripts:



O jogo carrega normalmente:



O que quer dizer que algum outro script está tentando acessar a propriedade price de um item antes do $game_temp ser carregado pelo jogo.

Eu adicionei um check para a existência do $game_temp antes de retornar o valor, mas isso significa que esse script que está tentando acessar esse valor usará o valor do database e não o do Vshop.

if $kpanda_scripts.nil? || !$kpanda_scripts["Scene_ShopVariable"]
  raise "The script Scene_ShopVariable was not found."
end

#==============================================================================
# ** RPG::PurchasableItem
#------------------------------------------------------------------------------
#  Module used to define the price of purchasable items.
#==============================================================================

module RPG::PurchasableItem
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :vshop_price
  
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    @vshop_price = nil
  end
  
  #--------------------------------------------------------------------------
  # * Price
  #--------------------------------------------------------------------------
  def self.included(base)
    base.class_eval do
      def price
        if !$game_temp.nil? && $game_temp.vshop_active && !@vshop_price.nil?
          return @vshop_price 
        end
        
        @price
      end
    end
  end
end

#==============================================================================
# ** RPG::Item
#------------------------------------------------------------------------------
#  Data class for items.
#==============================================================================

class RPG::Item
  #--------------------------------------------------------------------------
  # * Include RPG::PurchasableItem
  #--------------------------------------------------------------------------
  include RPG::PurchasableItem
end

#==============================================================================
# ** RPG::Weapon
#------------------------------------------------------------------------------
#  Data class for weapons.
#==============================================================================

class RPG::Weapon
  #--------------------------------------------------------------------------
  # * Include RPG::PurchasableItem
  #--------------------------------------------------------------------------
  include RPG::PurchasableItem
end

#==============================================================================
# ** RPG::Armor
#------------------------------------------------------------------------------
#  Data class for armors.
#==============================================================================

class RPG::Armor
  #--------------------------------------------------------------------------
  # * Include RPG::PurchasableItem
  #--------------------------------------------------------------------------
  include RPG::PurchasableItem
end

#==============================================================================
# ** VShop
#------------------------------------------------------------------------------
#  This module holds the Scene_SchopVariable operations.
#==============================================================================

module VShop
  #--------------------------------------------------------------------------
  # * Constants
  #--------------------------------------------------------------------------
  ITEM_PRICE_REGEX = /<vshop:item-price>([^<]*)<\/vshop>/i
  
  #--------------------------------------------------------------------------
  # * Process item notes
  #--------------------------------------------------------------------------
  def self.process_item_notes
    [$data_items, $data_weapons, $data_armors].each do |database|
      database[1..-1].each do |item|
        match = item.note.match(ITEM_PRICE_REGEX)
      
        item.vshop_price = match[1].to_i if match
      end
    end
  end
end

#==============================================================================
# ** Scene_Title
#------------------------------------------------------------------------------
#  This class performs the title screen processing.
#==============================================================================

class Scene_Title < Scene_Base
  #--------------------------------------------------------------------------
  # * Load Database alias
  #--------------------------------------------------------------------------
  alias load_database_202209021211 load_database
  
  #--------------------------------------------------------------------------
  # * Load Database
  #--------------------------------------------------------------------------
  def load_database(*args)
    load_database_202209021211(*args)
    
    VShop.process_item_notes
  end
end


Aí dependendo se precisar que esse script fução acesse o valor do Vshop ou do database, podemos fazer uns contornos.


Eu adicionei este novo script sem mover a posição no banco de dados e está funcionando agora. Obrigado!