Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

KyoPrizePacks XP

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP KyoPrizePacks XP

Mensaje por kyonides-arkanthos el 2015-07-08, 22:57

KyoPrizePacks XP
v 1.0.2


por Kyonides-Arkanthos


Este script nace debido a la necedad de un usuario llamado Nyakuya. No bromeo, realmente así fue como surgió la idea de desarrollar este peculiar y no si innecesario script. Lo que tiene de bueno es que no hay que matarse configurando muchos eventos comunes complicados. Cada evento común solo lleva un comando, el llamado a script.

La razón de ser de este script es que Nyakuya deseaba que un objeto equis pudiera ser abierto y en su lugar apareciera inmediatamente otro objeto que haría las de premio para el jugador. El premio sería solo uno de varias posibilidades.

Si tienen más preguntas sobre por qué deberían utilizar este script, pregúntenle a Nyakuya en persona.


Código:
# * KyoPrizePacks XP
#  Scripter : Kyonides-Arkanthos
#  v 1.0.2 - 2015-07-09

#  Este Script les permite crear objetos que funcionen como Paquetes Sorpresa.
#  En vez de obtener algo simple como 1 Poción, reciben un Paquete o Regalo o
#  Cofre Especial. Al abrirlo en el Menú de Objetos o Bolsa, el Paquete por
#  fin revela su contenido, el cual es aleatorio.

#  Llamado a Script para ser utilizado desde un evento común

#    RandomPrize.set_prize(Número)

#    Con este llamado pueden elegir el Paquete de Premios del cual saldrá el
#    Premio definitivo que recibirá el jugador.

#  Como desarrolladores Uds. pueden definir qué premios otorgarán por cada
#  Paquete que el jugador reciba, pero solo obtendrá una de todas aquellas
#  posibilidades que Uds. hubieran configurado en el archivo de TXT. Revisen
#  la Constante PRIZE_FILENAME para saber cuál es el nombre del archivo.

#  Cada renglón en el TXT es un paquete de premios.

#  Obj indica que el premio es un Objeto de la Base de Datos.
#  Arm indica que el premio es una Arma de la Base de Datos.
#  Ard indica que el premio es una Armadura de la Base de Datos.
#  Hab indica que el premio es una Habilidad de la Base de Datos.

#  El Objeto que otorga estos premios no lo obligará salir del menú como es
#  usual en el RPG Maker.

#  Cada indicador irá seguido de 2 números, ID y Cantidad.

module RandomPrize
  # Archivo con la Configuración de los Premios
  PRIZE_FILENAME = 'regalos.txt'
  # Etiqueta de Objeto como Premio en el Archivo
  ITEM_PRIZE  = 'Obj'
  # Etiqueta de Arma como Premio en el Archivo
  WEAPON_PRIZE = 'Arm'
  # Etiqueta de Armadura como Premio en el Archivo
  ARMOR_PRIZE  = 'Ard'
  # Etiqueta de Habilidad o Skill como Premio en el Archivo
  SKILL_PRIZE  = 'Hab'
  # NO EDITAR LO SIGUIENTE
  # Array que guardará los valores del archivo de Configuración
  @prizes = []
  @skip_map = nil
  PRIZE_RXDATA = 'Data/ChestPrizes.rxdata'
  def self.skip_map=(bool) @skip_map = bool end
  def self.skip_map() @skip_map end
  def self.get_prize_data
    if $DEBUG and File.exist?(PRIZE_FILENAME)
      regex = /[a-zA-Z]+/
      lines = File.readlines(PRIZE_FILENAME)
      lines.size.times {|n| @prizes[n] = []
        packs = lines[n].scan(/#{regex}|\d+/)
        packs = packs.map {|ln| self.prize_kind(ln) }.compact
        (packs.size / 3).times {|m| @prizes[n] << packs[m*3,3]}  }
      save_data(@prizes, PRIZE_RXDATA)
      return
    end
    @prizes = load_data(PRIZE_RXDATA)
  end

  def self.prize_kind(kind)
    regexp = /\d+/
    prize = case kind
    when ITEM_PRIZE : :item
    when WEAPON_PRIZE : :weapon
    when ARMOR_PRIZE : :armor
    when SKILL_PRIZE : :skill
    when regexp : kind.to_i
    end
    return prize
  end

  def self.set_prize(index)
    @skip_map = true
    size = @prizes[index].size
    prize = @prizes[index][rand(size)]
    case prize[0]
    when :item : $game_party.gain_item(prize[1], prize[2])
    when :weapon : $game_party.gain_weapon(prize[1], prize[2])
    when :armor : $game_party.gain_armor(prize[1], prize[2])
    when :skill : $game_party.gain_skill(prize[1], prize[2])
    end
  end
  self.get_prize_data
end

class Scene_Item
  def update_item
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Menu.new(0)
      return
    elsif Input.trigger?(Input::C)
      @item = @item_window.item
      # If not a use item
      unless @item.is_a?(RPG::Item)
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # If it can't be used
      unless $game_party.item_can_use?(@item.id)
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      # If effect scope is an ally
      if @item.scope >= 3
        # Activate target window
        @item_window.active = false
        @target_window.x = (@item_window.index + 1) % 2 * 304
        @target_window.visible = true
        @target_window.active = true
        # Set cursor position to effect scope (single / all)
        if @item.scope == 4 || @item.scope == 6
          @target_window.index = -1
        else
          @target_window.index = 0
        end
      # If effect scope is other than an ally
      else
        # If command event ID is valid
        if @item.common_event_id > 0
          # Command event call reservation
          $game_temp.common_event_id = @item.common_event_id
          $game_system.se_play(@item.menu_se)
          # If consumable
          if @item.consumable
            # Decrease used items by 1
            $game_party.lose_item(@item.id, 1)
            $game_system.map_interpreter.update
            @item_window.draw_item(@item_window.index)
          end
          # Do not switch to map screen if Skip Map flag is set to true
          if RandomPrize.skip_map
            @item_window.refresh
            $game_temp.common_event_id = 0
            RandomPrize.skip_map = nil
            return
          end
          $scene = Scene_Map.new
        end
      end
      return
    end
  end

  def update_target
    # If B button was pressed
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      # If unable to use because items ran out
      unless $game_party.item_can_use?(@item.id)
        # Remake item window contents
        @item_window.refresh
      end
      # Erase target window
      @item_window.active = true
      @target_window.visible = false
      @target_window.active = false
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # If items are used up
      if $game_party.item_number(@item.id) == 0
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # If target is all
      if @target_window.index == -1
        # Apply item effects to entire party
        used = false
        for i in $game_party.actors
          used |= i.item_effect(@item)
        end
      end
      # If single target
      if @target_window.index >= 0
        # Apply item use effects to target actor
        target = $game_party.actors[@target_window.index]
        used = target.item_effect(@item)
      end
      # If an item was used
      if used
        $game_system.se_play(@item.menu_se)
        # If consumable
        if @item.consumable
          # Decrease used items by 1
          $game_party.lose_item(@item.id, 1)
          # Redraw item window item
          @item_window.draw_item(@item_window.index)
        end
        # Remake target window contents
        @target_window.refresh
        # If all party members are dead
        if $game_party.all_dead?
          # Switch to game over screen
          $scene = Scene_Gameover.new
          return
        end
        # If common event ID is valid
        if @item.common_event_id > 0
          # Common event call reservation
          $game_temp.common_event_id = @item.common_event_id
          # Do not switch to map screen if Skip Map flag is set to true
          $game_system.map_interpreter.update
          if RandomPrize.skip_map
            $game_temp.common_event_id = 0
            @item_window.refresh
            RandomPrize.skip_map = nil
            return
          end
          $scene = Scene_Map.new
          return
        end
      end
      # If item wasn't used
      $game_system.se_play($data_system.buzzer_se) unless used
      return
    end
  end
end

Ejemplo de Archivo TXT de Configuración

Código:
Arm 1 2u, Obj 1 5u, Ard 1 3u, Hab 1 2u
Arm 2 2u, Obj 2 4u, Hab 2 2u
Arm 5 1u, Obj 3 2u, Ard 4 2u, Hab 3 1u


Última edición por kyonides-arkanthos el 2015-07-09, 19:44, editado 1 vez
avatar
kyonides-arkanthos
Principiante
Principiante

0/3

Créditos 517

Gracias : 79

Volver arriba Ir abajo

RPG Maker XP Re: KyoPrizePacks XP

Mensaje por kyonides-arkanthos el 2015-07-09, 18:06

ACTUALIZACIÓN

Publiqué una versión de mantenimiento, la 1.0.2 para corregir dos aspectos menores de la versión 1.0.0. Recomiendo que reemplacen la versión anterior en cuanto tengan tiempo, realmente es muy conveniente que lo hagan.
avatar
kyonides-arkanthos
Principiante
Principiante

0/3

Créditos 517

Gracias : 79

Volver arriba Ir abajo

RPG Maker XP Re: KyoPrizePacks XP

Mensaje por Metalero el 2015-07-15, 01:47

Interesante script, lo probe y funciona muy bien, tal vez seria recomendable subir un demo, para que los mas nuevos entiendan bien como se usa, ya que puede llegar a resultar un tanto complicado. 

(Por cierto, por que complicarse haciendo que lea un TXT externo, cuando lo mas comun es tener la configuracion dentro del mismo script?)


LOGRO OBTENIDO POR EL CONTENIDO DE ESTE POST: +1 Scripter de Plata 

_________________
avatar
Metalero
Administrador
Administrador



Créditos 1710

Gracias : 100

Volver arriba Ir abajo

RPG Maker XP Re: KyoPrizePacks XP

Mensaje por kyonides-arkanthos el 2015-07-15, 02:04

Pues, no a todos o mejor dicho a la mayoría no les gusta hacerlo en arrays o hashes, me ha pasado eso ya no sé cuántas veces y por eso lo hice con txt por separado. Además el TXT es temporal, cuando el proyecto está listo, y al menos lo corrieron como prueba 1 vez, pueden mover el txt a otra carpeta antes de comprimir el demo para distribución.
avatar
kyonides-arkanthos
Principiante
Principiante

0/3

Créditos 517

Gracias : 79

Volver arriba Ir abajo

RPG Maker XP Re: KyoPrizePacks XP

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


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