Últimos temas
» Cese de actividad del foro
por Muzgar Ayer a las 10:50 pm

» Escaping From The Dark - Juego de Misterio y Terror - [MZ] - Descarga disponible
por rstudios Jue Abr 15, 2021 11:27 pm

» Concursos anuales del foro 2021 [Resultados]
por Vesper Lun Abr 12, 2021 12:24 am

» Concursos anuales del foro 2021 [Votaciones]
por Lenny Sáb Abr 03, 2021 7:36 pm

» "El Destino de los 5 Libros"(Alfa)
por ShinZeta Jue Abr 01, 2021 4:56 am

» La Brújula de Zaza (JUEGO COMPLETO) (VXACE)
por Pocari Miér Mar 31, 2021 6:45 pm

» Ayuda con los puzzles de mi juego
por Chadoumaru Mar Mar 23, 2021 12:18 am

» RPGXP La maldición de Grim
por Alex1633 Sáb Mar 20, 2021 9:54 pm

» [VX] Jikan: La Bruja del Tiempo
por Aymar Sáb Mar 20, 2021 6:05 pm

» ¡Eventos y concursos anuales del foro! [2021]
por Lenny Sáb Mar 13, 2021 1:33 pm

» Los guerreros iluminados (Juego completo)
por CalamarRojo Sáb Mar 13, 2021 12:14 am

» Laminación: Al otro lado de la brecha (NUEVO PROYECTO)
por Pocari Dom Mar 07, 2021 8:27 pm


[ACE] TheoAllen - Chest System

Ir abajo

[ACE] TheoAllen - Chest System Empty [ACE] TheoAllen - Chest System

Mensaje por SAMAKER2103 Dom Ene 05, 2020 7:22 am

Título del script:TheoAllen - Chest System
Autor: TheoAllen

Este script te permite crear unos cofres para guardar los objetos que obtengas en el juego.

Para que se pueda entender mejor me tome la tarea de traducir el script.

IMAGENES
IMAGENES:
[ACE] TheoAllen - Chest System Theo_c10

Aqui esta el script:

Código:
# =============================================================================
# TheoAllen - Chest System
# Version : 1.1
# Contacto : www.rpgmakerid.com (o) http://theolized.blogspot.com
# (Este script fue traducido por AbsoluteIce)
# (Este script fue traducido al español por SAMAKER2103)
# =============================================================================
($imported ||= {})[:Theo_ChestSystem] = true
# =============================================================================
# CAMBIO DE REGISTROS:
# -----------------------------------------------------------------------------
# 2013.06.28 - Añadido nombre de cofre personalizado
# 2013.06.01 - Ajustado control y GUI
# 2013.05.24 - Script Finalizado
# 2013.05.23 - Script comenzado
# =============================================================================
=begin

  #Introducción:
  Este script te permite abrir un cofre. Te permite sacar o depositar elementos
  de tu inventario, Similar al juego RPG occidental, Elder Scrolls.
  
  #Cómo utilizar :
  Ponga este script debajo de "materials", y arriba de "main" en la sección de
  scripts.
 
  Use un comentario en el evento en este formato antes de hacer una 
  "llamada de script" para agregar objetos iniciales al cofre.
  
  para objetos
  <item: id, cantidad>
  
  para armas
  <weapon: id, cantidad>
  
  para armaduras
  <armor: id, cantidad>
 
  #Explicación de Id:
  id >> id del objeto, arma o armadura
  cantidad >> numero de item(s), arma(s) o armadura(s)
 
  #Después de usar el comentario, use esta "llamada de script" para abrir el
  cofre (tambien se puede usar sin los comentarios de objetos para que el
  cofre aparezca vacio):
  open_chest
  
  #Para darle un nombre personalizado a el cofre, puede usar esta
  "llamada de script". Por ejemplo :
  open_chest("Basura")
  open_chest("Cofre de Erick")
 
  #nota: cada comentario en cada evento se lee una vez. Asegúrate de ponerlo
  antes de la llamada de script.
 
  #Términos de Uso :
  Darme credito, TheoAllen. Usted es libre de editar por su cuenta siempre y 
  cuando no reclame que es suyo. Si desea utilizar para un proyecto comercial,
  comparta las ganancias conmigo. Y no olvides darme una copia gratuita del 
  juego.

=end
# =============================================================================
# Configuracion :
# =============================================================================
module THEO
  module CHEST
    # =========================================================================
    # Vocabulario
    # -------------------------------------------------------------------------
      AMOUNT_VOCAB  = "Cantidad :"    # Nombre para dicha cantidad.
      ALL_VOCAB     = "Todo"         # Nombre para todas las categorías.
      INV_VOCAB     = "Inventario"   # Nombre para el inventario.
      ST_VOCAB      = "Reserva"       # Nombre para Reserva/Almacenamiento.
    # =========================================================================
   
    # =========================================================================
      TRIGGER_GAIN_ALL  = :CTRL
    # -------------------------------------------------------------------------
    # Disparador para tomar todos los artículos. Si escribe: CTRL, se tomarán 
    # todos los elementos si presiona CTRL + Confirmar (z) se transferiran.
    # =========================================================================
   
    # =========================================================================
      SHOW_AMOUNT_MIN   = 10
    # -------------------------------------------------------------------------
    # cantidad mínima de objetos para ver la ventana de cantidades.
    # =========================================================================
   
  end
end
# =============================================================================
# Fin de la configuración (no edite si no sabe lo que está haciendo)
# =============================================================================
module THEO
  module CHEST
  module REGEXP
    
    ITEM_REGEX   = /<(?:ITEM|item):[ ]*[ ]*(\d+\s*,\s*\d*)>/i
    WEAPON_REGEX = /<(?:WEAPON|weapon):[ ]*[ ]*(\d+\s*,\s*\d*)>/i
    ARMOR_REGEX  = /<(?:ARMOR|armor):[ ]*[ ]*(\d+\s*,\s*\d*)>/i
    
  end
  end
end

class Scene_Chest < Scene_MenuBase
  
  include THEO::CHEST
  
  def initialize(key,st_vocab)
    $game_party.init_chest_cursors
    @last_active = :stash
    @key = key
    @st_vocab = st_vocab
  end
  
  def start
    super
    create_header_windows
    create_footer_window
    create_main_windows
    create_amount_window
    prepare
  end
  
  def create_header_windows
    create_help_window
    create_category_window
  end
  
  def create_main_windows
    create_inventory_window
    create_stash_window
  end
  
  def create_help_window
    @help = Window_Help.new
    @help.viewport = @viewport
  end
  
  def create_category_window
    @category = Window_ChestCategory.new
    @category.viewport = @viewport
    @category.y = @help.height
    @category.set_handler(:ok, method(:on_category_ok))
    @category.set_handler(:cancel, method(:return_scene))
  end
  
  def create_footer_window
    create_inv_footer
    create_st_footer
  end
  
  def create_inv_footer
    @inv_footer = Window_ChestFooter.new(INV_VOCAB,$game_party,0)
    @inv_footer.viewport = @viewport
  end
  
  def create_st_footer
    @st_footer = Window_ChestFooter.new(@st_vocab,$game_chests[@key],1)
    @st_footer.viewport = @viewport
  end
  
  def create_inventory_window
    x = 0
    y = @help.height + @category.height
    w = Graphics.width/2
    h = Graphics.height - y - @inv_footer.height
    @inventory = Window_Inventory.new(x,y,w,h)
    @inventory.viewport = @viewport
    @inventory.set_handler(:ok, method(:item_inventory_ok))
    @inventory.set_handler(:cancel, method(:on_inventory_cancel))
    @inventory.help_window = @help
    @category.item_window = @inventory
  end
  
  def create_stash_window
    x = Graphics.width / 2
    y = @inventory.y
    w = x
    h = @inventory.height
    @stash = Window_Stash.new(x,y,w,h,@key)
    @stash.viewport = @viewport
    @stash.set_handler(:ok, method(:item_stash_ok))
    @stash.set_handler(:cancel, method(:on_stash_cancel))
    @stash.help_window = @help
    @category.stash_window = @stash
  end
  
  def create_amount_window
    @amount = Window_ChestAmount.new
    @amount.viewport = @viewport
  end
  
  # for future plan ~
  def refresh_all_footers
    @inv_footer.refresh
    @st_footer.refresh
  end
  
  def prepare
    unselect_all
    @category.show
    @category.activate
    @item_phase = false
    deactivate_item_windows
    hide_amount
  end
  
  def deactivate_item_windows
    @inventory.deactivate
    @stash.deactivate
  end
  
  def on_category_ok
    @category.deactivate
    activate_itemlist
    @item_phase = true
  end
  
  def item_inventory_ok
    unless @inventory.item
      @inventory.activate
      return
    end
    if @inventory.item_number < SHOW_AMOUNT_MIN
      store_items(1)
      @inventory.activate
      refresh_itemlist
    else
      @last_active = :inventory
      input_amount(@inventory)
    end
  end
  
  def item_stash_ok
    unless @stash.item
      @stash.activate
      return
    end
    if @stash.item_number < SHOW_AMOUNT_MIN
      gain_items(1)
      @stash.activate
      refresh_itemlist
    else
      @last_active = :stash
      input_amount(@stash)
    end
  end
  
  def on_stash_cancel
    @last_active = :stash
    memorize_st
    prepare
  end
  
  def on_inventory_cancel
    @last_active = :inventory
    memorize_inv
    prepare
  end
  
  def input_amount(window)
    memorize_all
    if window.equal?(@stash)
      @inventory.unselect
    else
      @stash.unselect
    end
    @amount.open
    @amount.item_window = window
    deactivate_item_windows
  end
  
  def hide_amount
    Sound.play_cancel
    @amount.close
  end
  
  def update
    super
    select_item_phase if @item_phase
    input_amount_phase if @amount.open?
  end
  
  def select_item_phase
    gain_all_items if trigger_gain_all_item?
    switch_window if Input.repeat?(:RIGHT) || Input.repeat?(:LEFT)
  end
  
  def input_amount_phase
    activate_itemlist if Input.trigger?(:B)
    if @amount.item_window.equal?(@stash) && Input.trigger?(:C)
      gain_items(@amount.amount)
    elsif @amount.item_window.equal?(@inventory) && Input.trigger?(:C)
      store_items(@amount.amount)
    end
  end
  
  def switch_window
    if @inventory.active
      switch_stash
    elsif @stash.active
      switch_inventory
    end
  end
  
  def switch_inventory
    memorize_st
    @stash.deactivate
    @stash.unselect
    @inventory.activate
    inv_select
  end
  
  def switch_stash
    @stash.activate
    st_select
    memorize_inv
    @inventory.deactivate
    @inventory.unselect
  end
  
  def gain_all_items
    if @stash.active
      @stash.data.each do |item|
        gain_items(@stash.item_number(item),item)
      end
      @stash.select(0)
    else
      @inventory.data.each do |item|
        store_items(@inventory.item_number(item),item)
      end
      @inventory.select(0)
    end
    refresh_itemlist
  end
  
  def trigger_gain_all_item?
    Input.press?(THEO::CHEST::TRIGGER_GAIN_ALL) && Input.trigger?(:C)
  end
  
  def gain_items(amount, item = @stash.item)
    $game_party.gain_item(item,amount)
    $game_chests[@key].lose_item(item,amount)
    on_amount_confirm if @amount.open?
  end
  
  def store_items(amount, item = @inventory.item)
    $game_chests[@key].gain_item(item,amount)
    $game_party.lose_item(item,amount)
    on_amount_confirm if @amount.open?
  end
  
  def refresh_itemlist
    @stash.refresh    
    @inventory.refresh
  end
  
  def on_amount_confirm
    Sound.play_ok
    refresh_itemlist
    unselect_all
    activate_itemlist
  end
  
  def activate_itemlist
    hide_amount
    case @last_active
    when :stash
      activate_stash
    when :inventory
      activate_inventory
    end
    @item_phase = true
  end
  
  def activate_inventory
    @inventory.activate
    @stash.unselect
    inv_select
  end
  
  def activate_stash
    @stash.activate
    @inventory.unselect
    st_select
  end
  
  def memorize_inv
    $game_party.last_inv = @inventory.index
  end
  
  def memorize_st
    $game_party.last_st = @stash.index
  end
  
  def inv_select
    @inventory.index = [[$game_party.last_inv,@inventory.item_max-1].min,0].max
  end
  
  def st_select
    @stash.index = [[$game_party.last_st,@stash.item_max-1].min,0].max
  end
  
  def unselect_all
    @inventory.unselect
    @stash.unselect
  end
  
  def memorize_all
    memorize_inv
    memorize_st
  end
  
end

class Window_ChestCategory < Window_ItemCategory
  attr_reader :stash_window
  
  def col_max
    return 4
  end
  
  def update
    super
    @stash_window.category = current_symbol if @stash_window
  end
  
  def make_command_list
    add_command(THEO::CHEST::ALL_VOCAB, :all)
    add_command(Vocab::item,     :item)
    add_command(Vocab::weapon,   :weapon)
    add_command(Vocab::armor,    :armor)
  end
  
  def stash_window=(stash_window)
    @stash_window = stash_window
    update
  end
  
end

class Window_Inventory < Window_ItemList
  attr_reader :data
  
  def col_max
    return 1
  end
  
  def current_item_enabled?
    return true
  end
  
  def include?(item)
    case @category
    when :item
      item.is_a?(RPG::Item) && !item.key_item?
    when :weapon
      item.is_a?(RPG::Weapon)
    when :armor
      item.is_a?(RPG::Armor)
    when :all
      item.is_a?(RPG::Armor) || item.is_a?(RPG::Weapon) || item.is_a?(RPG::Item)
    else
      false
    end
  end
  
  def draw_item(index)
    item = @data[index]
    if item
      rect = item_rect(index)
      rect.width -= 4
      draw_item_name(item, rect.x, rect.y, true,contents.width)
      draw_item_number(rect, item)
    end
  end
  
  def item_number(item = @data[index])
    $game_party.item_number(item)
  end
  
  def process_ok
    return if Input.press?(THEO::CHEST::TRIGGER_GAIN_ALL)
    super
  end
  
end

class Window_Stash < Window_ItemList
  attr_reader :data
  
  def initialize(x, y, width, height, key)
    @key = key
    super(x,y,width,height)
    @category = :none
    @data = []
  end
  
  def col_max
    return 1
  end
  
  def current_item_enabled?
    return true
  end
  
  def include?(item)
    case @category
    when :item
      item.is_a?(RPG::Item) && !item.key_item?
    when :weapon
      item.is_a?(RPG::Weapon)
    when :armor
      item.is_a?(RPG::Armor)
    when :all
      item.is_a?(RPG::Armor) || item.is_a?(RPG::Weapon) || item.is_a?(RPG::Item)
    else
      false
    end
  end
  
  def make_item_list
    @data = $game_chests[@key].all_items.select {|item| include?(item) }
    @data.push(nil) if include?(nil)
  end
  
  def draw_item(index)
    item = @data[index]
    if item
      rect = item_rect(index)
      rect.width -= 4
      draw_item_name(item, rect.x, rect.y, true,contents.width)
      draw_item_number(rect, item)
    end
  end
  
  def draw_item_number(rect, item)
    draw_text(rect, sprintf(":%2d", $game_chests[@key].item_number(item)), 2)
  end
  
  def item_number(item = @data[index])
    $game_chests[@key].item_number(item)
  end
  
  def process_ok
    return if Input.press?(THEO::CHEST::TRIGGER_GAIN_ALL)
    super
  end
  
end

class Window_ChestAmount < Window_Base  
  attr_accessor :item_window
  attr_reader   :amount
  
  def initialize
    super(0,0,window_width,window_height)
    self.openness = 0
    reset_amount
    update_position
    refresh
  end
  
  def reset_amount
    @amount = 0
    refresh
  end
  
  def open
    super
    reset_amount
  end
  
  def update_position
    self.x = (Graphics.width / 2) - (self.width / 2)
    self.y = (Graphics.height / 2) - (self.height / 2)
  end
  
  def refresh
    contents.clear
    draw_text(0,0,contents.width,24,THEO::CHEST::AMOUNT_VOCAB,)
    draw_text(0,0,contents.width,24,@amount,2)
  end
  
  def window_width
    return 200
  end
  
  def window_height
    return 24+24
  end
  
  def update
    super
    if open?
      increment if Input.repeat?(:RIGHT)
      decrement if Input.repeat?(:LEFT)
      ten_increment if Input.repeat?(:UP)
      ten_decrement if Input.repeat?(:DOWN)
    end
  end
  
  def increment
    change_amount(1)
  end
  
  def decrement
    change_amount(-1)
  end
  
  def ten_increment
    change_amount(10)
  end
  
  def ten_decrement
    change_amount(-10)
  end
  
  def change_amount(modifier)
    @amount = [[@amount+modifier,0].max,max_amount].min
    refresh
  end
  
  def show
    super
    reset_amount
  end
  
  def max_amount
    @item_window.item_number rescue 0
  end
  
end

class Window_ChestFooter < Window_Base
  
  include THEO::CHEST
  
  def initialize(vocab,object,x)
    w = Graphics.width/2
    h = fitting_height(1)
    y = Graphics.height - h
    x = (Graphics.width/2) * x
    @vocab = vocab
    super(x,y,w,h)
    @object = object
    refresh
  end
  
  def refresh
    contents.clear
    cx = text_size(@vocab).width
    draw_text(0,0,contents.width,line_height,@vocab,1)
    #draw_text(cx,0,contents.width-cx,line_height,@object.all_items.size,2)
  end
  
end

module DataManager
  
  class << self
    alias pre_create_chest create_game_objects
    alias pre_chest_save_contents make_save_contents
    alias pre_extract_chests extract_save_contents
  end
  
  def self.create_game_objects
    pre_create_chest
    create_chest_object
  end
  
  def self.create_chest_object
    $game_chests = Game_Chest.new
  end
  
  def self.make_save_contents
    contents = pre_chest_save_contents
    contents[:chest] = $game_chests
    contents
  end
  
  def extract_save_contents(contents)
    pre_extract_chests(contents)
    $game_chests = contents[:chest]
  end
  
end

class Game_Chest
  
  def initialize
    @data = {}
    @explored = {}
  end
  
  def[](key)
    (@data[key] ||= Game_Stash.new)
  end
  
  def explored
    @explored
  end
  
end

class Game_Stash
  attr_accessor :items_stash
  attr_accessor :weapons_stash
  attr_accessor :armors_stash
  
  def initialize
    @items_stash = {}
    @weapons_stash = {}
    @armors_stash = {}
  end
  
  def refresh
    evaluate(@items_stash)
    evaluate(@weapons_stash)
    evaluate(@armors_stash)
  end
  
  def evaluate(stash)
    stash.keys.each do |key|
      stash.delete(key) if stash[key] <= 0
    end
  end
  
  def items
    @items_stash.keys.collect {|id| $data_items[id] }
  end
  
  def weapons
    @weapons_stash.keys.collect {|id| $data_weapons[id] }
  end
  
  def armors
    @armors_stash.keys.collect {|id| $data_armors[id] }
  end
  
  def all_items
    items + weapons + armors
  end
  
  def item_number(item)
    if item.is_a?(RPG::Item)
      return @items_stash[item.id] ||= 0
    elsif item.is_a?(RPG::Weapon)
      return @weapons_stash[item.id] ||= 0
    elsif item.is_a?(RPG::Armor)
      return @armors_stash[item.id] ||= 0
    end
    refresh
  end
  
  def gain_item(item, amount)
    return unless item
    stash = pick_stash(item)
    stash[item.id] = 0 if stash[item.id].nil?
    stash[item.id] += amount
    refresh
  end
  
  def lose_item(item,amount)
    gain_item(item,-amount)
  end
  
  def pick_stash(item)
    if item.is_a?(RPG::Item)
      return @items_stash
    elsif item.is_a?(RPG::Weapon)
      return @weapons_stash
    elsif item.is_a?(RPG::Armor)
      return @armors_stash
    end
  end
  
end

class Game_Party
  attr_accessor :last_inv
  attr_accessor :last_st
  
  alias pre_chest_init initialize
  def initialize
    pre_chest_init
    init_chest_cursors
  end
  
  def init_chest_cursors
    @last_inv   = 0
    @last_st = 0
  end
  
end

class Game_Interpreter
  
  def open_chest(st_vocab = THEO::CHEST::ST_VOCAB,key = [@map_id,@event_id])
    if st_vocab.is_a?(Numeric)
      key = st_vocab 
      st_vocab = THEO::CHEST::ST_VOCAB
    end
    SceneManager.call_chest(key,st_vocab)
  end
  
  alias pre_chest_command_108 command_108
  def command_108
    pre_chest_command_108
    read_chest_comments
  end
  
  def read_chest_comments
    map = @map_id
    event = @event_id
    key = [map,event]
    return if $game_chests.explored[key]
    @comments.each do |comment|
      case comment
      when THEO::CHEST::REGEXP::ITEM_REGEX
        x = $1.scan(/\d+/)
        $game_chests[key].items_stash[x[0].to_i] = x[1].to_i
      when THEO::CHEST::REGEXP::WEAPON_REGEX
        x = $1.scan(/\d+/)
        $game_chests[key].weapons_stash[x[0].to_i] = x[1].to_i
      when THEO::CHEST::REGEXP::ARMOR_REGEX
        x = $1.scan(/\d+/)
        $game_chests[key].armors_stash[x[0].to_i] = x[1].to_i
      end
    end
    $game_chests.explored[key] = next_event_code != 108
  end
  
end

module SceneManager
  
  def self.call_chest(key,st_vocab = THEO::CHEST::ST_VOCAB)
    @stack.push(@scene)
    @scene = Scene_Chest.new(key,st_vocab)
  end
  
end

Espero que les sea de utilidad el script, la verdad es que esta sencillo pero bueno. Creo que todo esta bien explicado en el script, asi que no necesita una demo, por mi parte creo que esta muy bueno.
Eso es todo por hoy.

¡UN GRAN SALUDO A TODOS!
SAMAKER2103
SAMAKER2103
PJ de Relleno
PJ de Relleno

Masculino
Venezuela
RPG Maker : Ace
Mensajes : 17
Monedas : 159
Reputación : 2
Edad : 20

Volver arriba Ir abajo

Volver arriba


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