¡Bienvenido a Universo Maker!
¿Es esta la primera vez que visitas el foro? Si es así te recomendamos que te registres para tener completo acceso a todas las áreas y secciones del foro, así también podrás participar activamente en la comunidad. Si ya tienes una cuenta, conectate cuanto antes.
Iniciar Sesión Registrarme

No estás conectado. Conéctate o registrate

Ver el tema anterior Ver el tema siguiente Ir abajo Mensaje [Página 1 de 1.]

#1 [RPGVXAce] Advanced Shop System el Vie Dic 06, 2013 7:49 am

youkai

avatar
Bueno a peticion de los usuarios que pudieron disfrutar de la version para XP de este script(??) adapte al mismo para que funcionara en Ace. Debo decir que me ahorre unos cuantos cientos de lineas para el Ace xD Realmente me quede sorprendido XDDD

Funcionamiento:
El mismo de la version de XP...funcionan exactamente iguales. De todas formas en el script viene explicado(lo mejor que pude) el funcionamiento del mismo.

Errores corregidos
Si, la version de XP tiene errores y bugs....los cuales detecte mientras hacia la adaptacion y corregi. Proximamente hago lo mismo con la version de XP


  • Un error en la formula del calculo de la venta de los objetos(entre mas vendias mas te pagaban :S Pero si vendias una por una no pasaba esto XDDD)
  • Corregido un bug que te hace estallar el juego al intentar refrescar las tiendas

Eso es todo, los dejo con el codigo

Script
Código:
# **/**\**/**\**/**\**/**\**/**\**/**\**/**\**/**\**/**\**/**\**/**\**/**\**/**\
#                           ADVANCED SHOP SYSTEM (VX Ace)
#         Autor: youkai
#         Version: 1.0
#         Fecha: 6/12/2013
# **/**\**/**\**/**\**/**\**/**\**/**\**/**\**/**\**/**\**/**\**/**\**/**\**/**\
=begin
  Notas del autor:
Este fue un script que me tomo al menos una semana de programacion. Su contenido
puede que resulte un poco complicado de usar ya que hay que estar bien claros
con las matematicas para no pifiar y hacer que los jugadores se hagan millonarios
solo llevando pociones de una tienda a otra XD Sin mucho mas que decir, paso a
explicar el funcionamiento del mismo.
En esta version aun no he implementado el sistema para combinar entre las tiendas
que siempre hemos llamado por los codigos del maker y este estilo. Para una proxi-
ma version me encargare de ello.
# **/**\**/**\**/**\**/**\**/**\**/**\**/**\**/**\**/**\**/**\**/**\**/**\**/**\
  Modo de uso:
 El unico modulo creado para que el usuario modifique es Shop_Base asi que a menos
que sepan lo que hacen, no vayan mucho mas alla.

# *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
 * Como configuro la tienda
Yo por defecto cree 2 tiendas(las mismas que usaba para probar xD) La configuracion
de los objetos, asi como la cantidad promedio de los mismos que tendra la tienda
se hace en Shop_Goods de la siguiente forma:
  (Todo lo que esta entre comillas[""] significa que no se modifica)
  
    "Shop_Goods = {"
    ID de la tienda "=> [" Objeto1, Objeto2, ... "],"
    ...
    "}"
    
# *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
 * Como configuro los objetos
    [tipo de objeto, ID del objeto, cantidad inicial, cantidad promedio]
  
  tipo de objeto: Esto es para diferenciar entre Items, Weapons y Armors. Como quiza
  sepan estos 3 tipos de objetos van por separados y los ID's de cada uno de ellos
  va de 1 a ... Asi que es necesaria una forma de diferenciarlos.
  
  Para decir que es un item poner: 0
  Para decir que es un arma poner: 1
  Para que sea una armadura poner: 2
  
  ID del objeto: El ID que posee dicho item/arma/armadura en la Base de Datos
  
  cantidad inicial: La cantidad con la que empezara la tienda de dicho objeto
  
  cantidad promedio: Esta es la cantidad que digamos marcara el limite de exigen-
  cia de la tienda. O sea, si la misma posee mas items que esta cantidad los pre-
  cios seran menores al (precio configurado en la Base de datos * el tax de la tienda)
  
NOTA: Si no se configura una cantidad promedio el item se tratara como un item
temporal, el cual puede desaparecen en cualquier momento que se refresquen los
suministros de la tienda. Este es el caso de los items que le vendemos a la tienda,
los cuales por defecto toman a 99 la cantidad promedio.

# *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
 * Como configuro el tax
El tax digamos que es el impuesto que pone la tienda sobre el precio estandar(el
definido en la Base de Datos) del objeto. Para mejor comprension de esto dejo la
formula: (precio * tax)
Entonces, para configurarlo es en Shop_Tax y de la siguiente forma:

  "Shop_Tax = {"
  ID de la tienda "=>" tax ","
 ...
  "}"
  
# *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
 * Como configurar el flujo del precio
El flujo del precio es la variacion que tendra dicho objeto en su precio(xD) a
medida que el mismo se vaya acabando/repletando. En resumen, lo que hace es que
entre menos producto, mayor precio; y entre mas producto, menos vale.
Para este calculo se usa la cantidad promedio que especifiques en la configuracion
del objeto. El objeto tendra su precio real(modificado por el tax) cuando la canti-
dad en posesion del mismo por la tienda sea igual o muy cerca de la cantidad
promedio.
Para configurarlo es en Shop_PriceFlow de la siguiente forma:

  "Shop_PriceFlow = {"
  ID de la tienda "=>" flujo del precio ","
 ...
  "}"

NOTA: Han de tener el cuenta que con un flujo igual a 1.0 duplicaria el precio del
objeto cuando solo quede un ejemplar en la tienda y en caso de que la cantidad que
posea la tienda sea el doble a la cantidad promedio el precio reduciria al doble de
su precio original, asi que por favor tengan todo esto en cuenta.

# *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
 * Forma de llamar la tienda
Para eso debemos agregar en un comando Llamar Script:

  start_shop(ID de la tienda)

El ID de la tienda va en correspondencia con el ID que le das a la tienda en la
configuracion.

# *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
  * Forma de reabastecer la/s tienda/s
Para eso debemos agregar en un comando Llamar Script:

  reset_shop{([ID's de las tiendas])}
 
Lo que señalo entre llaves significa que es opcional. O sea, bien podemos poner
solo reset_shop y el script reabastecera todas las tiendas pero si solo queremos
que, por ejemplo, solo lo haga con la tienda 3 entonces ponemos:

  reset_shop([3])
 
Y si quieremos que sea con las tiendas 1, 2 y 3 solamente, pues:

  reset_shop([1, 2, 3])

Este "reabastecimiento" es relativo ya que el script lo que hace es sumarle o
restarle cantidad al azar a los items que posea la tienda. Los items predefinidos
para la tienda nunca se perderan de ella mientras que los que les vendamos tienen
una posibilidad de 3 en 10 de desaparecer. Recuerden que si en el calculo de la
cantidad se produce una resta y la cantidad del item llega a 0, este no se mostra-
ra, no importa si es predefinido o no.
# *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
=end
# -------------- Eso es todo, los dejo con las configuraciones --------------- #

module Shop_Base
  Shop_Goods = {
  1 => [[0, 1, 56, 70], [0, 2, 34, 81]],
 2 => [[0, 1, 60, 35], [0, 5, 62, 99], [0, 2, 34, 34], [2, 1, 20, 40], [1, 2, 34, 60]],
  }
  Shop_Tax = {
  1 => 1.3,
 2 => 1.0,
  }
  
  Shop_PriceFlow = {
  1 => 1.5,
 2 => 1.0,
  }
  def self.make_data
    $data_shops = []
    Shop_Goods.each_key{|i|
    $data_shops[i] = RPG::Shop.new
    $data_shops[i].items = Shop_Goods[i]
    $data_shops[i].tax = Shop_Tax[i]
    $data_shops[i].price_flow = Shop_PriceFlow[i]
    $data_shops[i].items.sort!
    }
  end
end

module RPG
  class Item
    def type
      0
    end
  end
  
  class Weapon
    def type
      1
    end
  end
  
  class Armor
    def type
      2
    end
  end
end


class Game_Temp
  attr_accessor :shop_id
  alias shop_system_temp_initialize initialize
  def initialize
    shop_system_temp_initialize
    @shop_id = nil
  end
end

module RPG
  class Shop
    attr_accessor :items
    attr_accessor :price_flow
    attr_accessor :tax
    def initialize
      @items = []
      @price_flow = 1.0
      @tax = 1.0
    end
  end
end

module DataManager
  #--------------------------------------------------------------------------
  # * Criação dos objetos do jogo
  #--------------------------------------------------------------------------
  def self.create_game_objects
    Shop_Base.make_data
    $game_temp          = Game_Temp.new
    $game_system        = Game_System.new
    $game_timer         = Game_Timer.new
    $game_message       = Game_Message.new
    $game_switches      = Game_Switches.new
    $game_variables     = Game_Variables.new
    $game_self_switches = Game_SelfSwitches.new
    $game_actors        = Game_Actors.new
    $game_party         = Game_Party.new
    $game_troop         = Game_Troop.new
    $game_map           = Game_Map.new
    $game_player        = Game_Player.new
  end  
  #--------------------------------------------------------------------------
  # * Salvar a criação de conteúdo
  #--------------------------------------------------------------------------
  def self.make_save_contents
    contents = {}
    contents[:system]        = $game_system
    contents[:timer]         = $game_timer
    contents[:message]       = $game_message
    contents[:switches]      = $game_switches
    contents[:variables]     = $game_variables
    contents[:self_switches] = $game_self_switches
    contents[:actors]        = $game_actors
    contents[:party]         = $game_party
    contents[:troop]         = $game_troop
    contents[:map]           = $game_map
    contents[:player]        = $game_player
    contents[:shop]          = $data_shops
    contents
  end
  #--------------------------------------------------------------------------
  # * Extrair conteúdo salvo
  #--------------------------------------------------------------------------
  def self.extract_save_contents(contents)
    $game_system        = contents[:system]
    $game_timer         = contents[:timer]
    $game_message       = contents[:message]
    $game_switches      = contents[:switches]
    $game_variables     = contents[:variables]
    $game_self_switches = contents[:self_switches]
    $game_actors        = contents[:actors]
    $game_party         = contents[:party]
    $game_troop         = contents[:troop]
    $game_map           = contents[:map]
    $game_player        = contents[:player]
    $data_shops         = contents[:shop]
  end
end

#==============================================================================
# ** Window_ShopBuy
#------------------------------------------------------------------------------
#  Esta janela exibe bens compráveis na tela de loja.
#==============================================================================

class Window_ShopBuy < Window_Selectable
  #--------------------------------------------------------------------------
  # * Variáveis públicas
  #--------------------------------------------------------------------------
  attr_reader   :status_window            # Janela de atributos
  attr_reader   :data
  #--------------------------------------------------------------------------
  # * Inicialização do objeto
  #     x          : coordenada X
  #     y          : coordenada Y
  #     height     : altura
  #     shop_goods : lista de itens da loja
  #--------------------------------------------------------------------------
  def initialize(x, y, height, shop_goods)
    super(x, y, window_width, height)
    @shop_goods = shop_goods
    @shop_id = $game_temp.shop_id
    @money = 0
    refresh
    select(0)
  end
  #--------------------------------------------------------------------------
  # * Aquisição das informações do item
  #--------------------------------------------------------------------------
  def item
    return @data[self.index].nil? ? nil : @data[self.index][0]
  end
  
  def amount
    return @data[self.index][1]
  end
  
  def amount=(val)
    @data[self.index][1] = val
    $data_shops[@shop_id].items[self.index][2] = val
    item = $data_shops[@shop_id].items[self.index]
    if item[2] == 0
      $data_shops[@shop_id].items.delete(item)
      $data_shops[@shop_id].items.push(item)
    end
  end
  #--------------------------------------------------------------------------
  # * Definição de habilitação de seleção
  #--------------------------------------------------------------------------
  def current_item_enabled?
   @data[index] ? enable?(@data[index][0]) : false
  end
  #--------------------------------------------------------------------------
  # * Aquisição do preço do item
  #     item : item
  #--------------------------------------------------------------------------
  def price(item)
    item.price * $data_shops[@shop_id].tax
  end
  #--------------------------------------------------------------------------
  # * Definição de habilitação do item
  #     item : item
  #--------------------------------------------------------------------------
  def enable?(item)
    price = (item.price * $data_shops[@shop_id].tax) - ((item.price * $data_shops[@shop_id].tax) * ((amount - 1) /
   (prom / $data_shops[@shop_id].price_flow) - $data_shops[@shop_id].price_flow)).ceil
    item && price <= @money && !$game_party.item_max?(item)
  end
  #--------------------------------------------------------------------------
  # * Criação da lista de itens
  #--------------------------------------------------------------------------
  def make_item_list
    @data = []
    @price = {}
    @shop_goods.each do |goods|
      case goods[0]
      when 0;  item = [$data_items[goods[1]], goods[2]]
      when 1;  item = [$data_weapons[goods[1]], goods[2]]
      when 2;  item = [$data_armors[goods[1]], goods[2]]
      end
      if item
        @data.push(item) unless item[1] == 0
      end
    end
  end
  
  def prom
    $data_shops[@shop_id].items[index][3] ? $data_shops[@shop_id].items[index][3].to_f : 99.0
  end
  #--------------------------------------------------------------------------
  # * Desenho de um item
  #     index : índice do item
  #--------------------------------------------------------------------------
  def draw_item(index)
    item = @data[index][0]
    amount = @data[index][1]
    price = (item.price * $data_shops[@shop_id].tax) - ((item.price * $data_shops[@shop_id].tax) * ((amount - 1) /
   (prom / $data_shops[@shop_id].price_flow) - $data_shops[@shop_id].price_flow)).ceil
    rect = item_rect(index)
    draw_item_name(item, rect.x + 20, rect.y, enable?(item))
    draw_text(rect.x + 4, rect.y, rect.width, rect.height, amount)
    rect.width -= 4
    draw_text(rect, price.round, 2)
  end
end

#==============================================================================
# ** Window_ShopNumber
#------------------------------------------------------------------------------
#  Esta janela é para entrada da quantia de itens que será comprada ou
# vendida na tela de loja.
#==============================================================================

class Window_ShopNumber < Window_Selectable
  #--------------------------------------------------------------------------
  # * Variáveis públicas
  #--------------------------------------------------------------------------
  attr_reader   :number                   # Número digitado
  attr_reader   :total_price
  #--------------------------------------------------------------------------
  # * Inicialização do objeto
  #     x      : coordenada X
  #     y      : coordenada Y
  #     height : altura
  #--------------------------------------------------------------------------
  def initialize(x, y, height)
    super(x, y, window_width, height)
    @item = nil
    @max = 1
    @price = 0
    @number = 1
    @members = []
    @currency_unit = Vocab::currency_unit
  end
  #--------------------------------------------------------------------------
  # * Definição de itens, quantia máxima, preço e unidade monetária
  #     item          : item
  #     max           : quantia máxima
  #     price         : preço
  #     currency_unit : unidade mo
  #--------------------------------------------------------------------------
  def set(item, max, price, phase, currency_unit = nil, *fMembers)
    @item = item
    @max = max
    @price = price
    @currency_unit = currency_unit if currency_unit
    @number = 1
    @phase = phase
    @members = fMembers
    refresh
  end
  #--------------------------------------------------------------------------
  # * Desenho do preço total
  #--------------------------------------------------------------------------
  def draw_total_price
    width = contents_width - 8
    @total_price = 0
    if @phase == 0
      @number.times{|i|
      @total_price += @price - (@price * ((@members[0] - i.succ) / (@members[2] / @members[1]) - @members[1])).ceil}      
    else
      @number.times{|i|
      @total_price += @price - (@price / ((@members[0] - i.succ) / (@members[2] / @members[1]) - @members[1])).ceil}      
    end
    draw_currency_value(@total_price.round, @currency_unit, 4, price_y, width)
  end
end

#==============================================================================
# ** Scene_Shop
#------------------------------------------------------------------------------
#  Esta classe executa o processamento da tela de loja.
#==============================================================================

class Scene_Shop < Scene_MenuBase
  #--------------------------------------------------------------------------
  # * Preparação
  #--------------------------------------------------------------------------
  def prepare(goods, purchase_only)
    @goods = goods
    @purchase_only = purchase_only
    @shop_id = $game_temp.shop_id
  end
  #--------------------------------------------------------------------------
  # * Compra [Confirmação]
  #--------------------------------------------------------------------------
  def on_buy_ok
    @item = @buy_window.item
    shop_id = @shop_id
    @buy_window.hide
    @number_window.set(@item, max_buy, buying_price, 0, currency_unit,
    @buy_window.amount, $data_shops[@shop_id].price_flow, @buy_window.prom)
    @number_window.show.activate
  end
  #--------------------------------------------------------------------------
  # * Venda [Confirmação]
  #--------------------------------------------------------------------------
  def on_sell_ok
    @item = @sell_window.item
    number = 0
    sell = [@item.type, @item.id]
    $data_shops[@shop_id].items.each{|item|
    if item[0, 2] == sell
      number = item[2]
      break
    end}
    @status_window.item = @item
    @category_window.hide
    @sell_window.hide
    @number_window.set(@item, max_sell, selling_price, 1, currency_unit, number,
    $data_shops[@shop_id].price_flow, @buy_window.prom)
    @number_window.show.activate
    @status_window.show
  end
  #--------------------------------------------------------------------------
  # * Execução da compra
  #     number : número de itens
  #--------------------------------------------------------------------------
  def do_buy(number)
    $game_party.lose_gold(@number_window.total_price.round)
    @buy_window.amount -= number
    $game_party.gain_item(@item, number)
    @buy_window.index -= 1 if @buy_window.amount == 0 && @buy_window.data.size - 1 == @buy_window.index &&
                              @buy_window.index > 0
    @buy_window.refresh
  end
  #--------------------------------------------------------------------------
  # * Execução da venda
  #     number : número de itens
  #--------------------------------------------------------------------------
  def do_sell(number)
    sell = [@item.type, @item.id]
    result = false
    $data_shops[@shop_id].items.each{|item|
    if item[0, 2] == sell
      item[2] += number
      result = true
      break
    end}
    unless result
      $data_shops[@shop_id].items.push([@item.type, @item.id, number])
    end
    $data_shops[@shop_id].items.sort!
    $game_party.gain_gold(@number_window.total_price.round)
    $game_party.lose_item(@item, number)
    @sell_window.refresh
  end
  #--------------------------------------------------------------------------
  # * Aquisição do número máximo disponível para compra
  #--------------------------------------------------------------------------
  def max_buy
    price = @item.price * $data_shops[@shop_id].tax
    prom = @buy_window.prom
    if @item.price == 0        
      max = 99
   else
      val = 0
      @buy_window.amount.times{|i|
      val += price - (price * ((@buy_window.amount - i.succ) /
     (prom / $data_shops[@shop_id].price_flow) - $data_shops[@shop_id].price_flow)).ceil
      if val >= $game_party.gold
        max = i.succ == @buy_window.amount || val == $game_party.gold ? i.succ : i
        break
      end
      max = i.succ}        
    end
    number = $game_party.max_item_number(@item) - $game_party.item_number(@item)
    max = [max, number].min
    max = [max, @buy_window.amount].min
    buying_price == 0 ? 99 : max
  end
end

class Game_Interpreter
  def start_shop(shop_id)
    $game_temp.shop_id = shop_id
    goods = $data_shops[shop_id].items
    SceneManager.call(Scene_Shop)
    SceneManager.scene.prepare(goods, false)
    Fiber.yield
  end
  
  def reset_shop(id = [])
    if id.empty?
      $data_shops.each_index{|shop_id|
      next if $data_shops[shop_id].nil?
      $data_shops[shop_id].items.each{|item|
      if item[3] != nil
       item[2] = item[3] + rand(30) - 15
      else
        if rand(10) > 6
          $data_shops[shop_id].items.delete(item)
          next
        end
        item[2] += rand(30) - 15
      end
      item[2] = item[2] > 99 ? 99 : item[2] < 0 ? 0 : item[2]
      $data_shops[shop_id].items.sort!}}
    else
      id.each{|shop_id|
      next if $data_shops[shop_id].nil?
      $data_shops[shop_id].items.each{|item|
      if item[3] != nil
       item[2] = item[3] + rand(20) - 40
      else
        if rand(10) > 6
          $data_shops[shop_id].items.delete(item)
          next
        end
        item[2] += rand(30) - 15
      end
      item[2] = item[2] > 99 ? 99 : item[2] < 0 ? 0 : item[2]
      $data_shops[shop_id].items.sort!}}
    end
  end
end



Última edición por youkai el Dom Dic 08, 2013 10:06 pm, editado 1 vez

#2 Re: [RPGVXAce] Advanced Shop System el Sáb Dic 07, 2013 1:58 am

Zoldier Xavy

avatar
Buen aporte amigo, yo ya lo tenia en mi proyecto pero lo borre porque no lo use mucho pero es muy bueno lo recomiendo Ópalo Contento Ópalo Contento Ópalo Contento 

#3 Re: [RPGVXAce] Advanced Shop System el Sáb Dic 07, 2013 9:08 am

youkai

avatar
eh, Eh, EH??!! Que ya lo tenias en tu proyecto??? What da faqin faq??? XDDDDD
Ese script lo hice yo y publique ayer(o podria decir hoy pero ya son las 3am...asi que lo correcto es ayer xD) Acaso ya existia algo similar?(no lo dudo, la verdad)

En fin...ya paso la parte de la confusion y la euforia(?) Les pido que prueben por mi el script y me digan si le encuentran algun bug escondido y si tienen ideas/sugerencias/loquesea me las digan para mejorar el codigo =DD
Saludos,
¥oukai

#4 Re: [RPGVXAce] Advanced Shop System el Sáb Dic 07, 2013 6:51 pm

Zoldier Xavy

avatar
youkai escribió:eh, Eh, EH??!! Que ya lo tenias en tu proyecto??? What da faqin faq??? XDDDDD
Ese script lo hice yo y publique ayer(o podria decir hoy pero ya son las 3am...asi que lo correcto es ayer xD) Acaso ya existia algo similar?(no lo dudo, la verdad)

En fin...ya paso la parte de la confusion y la euforia(?) Les pido que prueben por mi el script y me digan si le encuentran algun bug escondido y si tienen ideas/sugerencias/loquesea me las digan para mejorar el codigo =DD
Saludos,
¥oukai

Si es que no lo encontre aqui pero si en otros foros pero igual amigo como te dije es un buen aporte Ópalo Contento Ópalo Guiño 

#5 Re: [RPGVXAce] Advanced Shop System el Dom Dic 08, 2013 4:55 am

orochii

avatar
Quién los entiende... \(-_-)/
===
¿No tendrás alguna screen por ahí Youkaimon? Es que... nnngh, qué lio meterme al Ace para probar esto :'D (y por eso preferiré esperarme n días). Cough, nah, eh, igual se ve interesante, aunque no use Ace y mi tiendita está intocable forever.

Que haya paz,
Orochii Zouveleki

Contenido patrocinado


Ver el tema anterior Ver el tema siguiente Volver arriba  Mensaje [Página 1 de 1.]

Permisos de este foro:
No puedes responder a temas en este foro.