¡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, conéctate 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.]

#1KMapData Empty KMapData el Jue Jul 02, 2020 5:17 am

kyonides

kyonides
KMapData
versión 0.4.0

por Kyonides Arkanthes


Introducción

Es muy simple, te ofrece tres cosas. Puedes darle seguimiento a cofres hallados, a trampas activadas y al orden en que activas los interruptores como parte de una misión o prueba de algún anciano maestro o un locazo como Orochii. Ópalo Sonrisa Grande

Corre en cualquier Maker que utilice Ruby.

Ahora pueden cambiar el número de pasos del mapa actual de forma directa o hacer que los pasos para toparse a los monstruos sean por un valor fijo. Sin importar si es un valor fijo o aleatorio, ¡lo pueden dividir cuando gusten! Ópalo Sorprendido


El Script Principal de KMapData

Código:
# * KMapData
#  Scripter : Kyonides Arkanthes
#  2020-07-06 - v0.4.0

# Este script les permite dar seguimiento a cofres que hayas encontrado en el
# mapa y a todas las trampas que hayas activado hasta entonces.

# Supongo que lo segundo es útil para diseñar un sistema en el que registres
# los cofres y las trampas sin gastar variables del juego. Puedes limpiar los
# datos del mapa en cualquier momento de ser necesario.

# Es posible rastrear los interruptores que el jugador active o desactive.

# Aún debes configurar los valores iniciales de unas cuantas CONSTANTES listadas
# en el módulo KMap! Algunas te permiten modificar el comportamiento por defecto
# de los pasos requeridos para toparte con los monstruos.

# * Llamados a Script *

# Para obtener el ID de Mapa Actual - Solo en casillas de Llamado a Script
#  @map_id

# Para (des)activar el Número Fijo de Pasos para cualquier Mapa
#  $game_system.fixed_steps = true or false

# Para dividir el Número de Pasos
#  $game_system.steps_reducer = 1 -> Sin División - Valor por Defecto
#  $game_system.steps_reducer = 2 o mayor -> Pasos / Reducción de Pasos
#  $game_system.steps_reducer = 0 -> ¡Dañas el Juego! Pides lo Imposible.

# Para incrementar el Número Total de Cofres Hallados en algún mapa
#  $game_party.chests_found[IDMapa] += 1

# Para incrementar el Número Total de Trampas Activadas en algún mapa
#  $game_party.traps_triggered[IDMapa] += 1

# Para limpiar datos de algún mapa - Opciones: Ver constante CLEAR_DATA_OPTIONS
#  $game_party.clear_data(Opcion)        - Mapa Actual
#  $game_party.clear_data(Opcion, IDMapa) - Cualquier Mapa

# Para verificar si el jugador ha hallado suficientes cofres y no ha activado
# demasiadas trampas en un mapa específico
#  KMap.pass_chest_trap_test?        - Mapa Actual
#  KMap.pass_chest_trap_test?(IDMapa) - Cualquier Mapa

# Para verificar si el jugador ha activado interruptores en el orden correcto
#  KMap.pass_switch_order?        - Mapa Actual
#  KMap.pass_switch_order?(IDMapa) - Cualquier Mapa

# Para configurar el Orden de Interruptores de algún Mapa
# -> Orden Predefinido
#  KMap.map_switch_order[IDMapa] = [1, 3, 5, etc.]
# -> Acciones del Jugador
#  Asigna un valor a Variable de Juego definida en constante SWITCH_ORDER_VAR
#  para cada interruptor al hacer clic en Control de Variables.
#  Da igual si el jugador los enciende o apaga en algún momento.

# Para limpiar todo lo relacionado con el Orden de Interruptores
#  KMap.clear_switch_order

# * Ejemplos de Condiciones de Script
#  Allí @map_id sería lo mismo que el Mapa Actual.
#  Script [ $game_party.chests_found[@map_id] >= 20  ]
#  Script [ $game_party.traps_triggered[@map_id] < 6 ]
#  Script [ KMap.pass_switch_order?                  ]

module KMap
  CHESTS_SWITCH = 1
  TRAPS_SWITCH = 2
  SWITCH_ORDER_VAR = 1
  MAP_SWITCH_ORDER = "Orden Óptimo"
  ALT_SWITCH_ORDER = "Orden Alternativo"
  SWITCH_ORDER = "Orden del Jugador"
  FIXED_STEPS = true # Fijar Número de Pasos de Encuentro con Monstruos?
  DIVIDE_STEPS_BY = 1 # 1 : Sin División, 2+ : Divide Pasos entre ese valor
  # Orden de Opciones como :símbolos : [ Cofre, Trampa, todos ]
  CLEAR_DATA_OPTIONS = [:cofre, :trampa, :todos]
  MIN_CHESTS_FOUND = {}
  MIN_CHESTS_FOUND.default = 0 # Para aquellos mapas no incluidos
  MAX_TRAPS_FOUND = {}
  MAX_TRAPS_FOUND.default = 0
  # Ejemplos de Cofres para Mapa #1:  MIN_CHESTS_FOUND[1] = 20
  # Ejemplos de Trampas para Mapa #1: MIN_TRAPS_FOUND[1] = 5
  class << self
    def pass_chest_trap_test?(mid=$game_map.map_id)
      return false if $game_party.chests_found[mid] < MIN_CHESTS_FOUND[mid]
      $game_party.traps_triggered[mid] <= MIN_TRAPS_FOUND[mid]
    end

    def pass_switch_order?(mid=$game_map.map_id)
      @map_switch_order == @switch_order
    end

    def select_order(n)
      (n == 0 ? @map_switch_order : n == 1 ? @alt_switch_order : @switch_order)
    end

    def select_label(n)
      (n == 0 ? MAP_SWITCH_ORDER : n == 1 ? ALT_SWITCH_ORDER : SWITCH_ORDER)
    end

    def clear_switch_order
      @map_switch_order = []
      @alt_switch_order = []
      @switch_order = []
    end

    def retrieve_version
      lines = File.readlines('Game.ini')
      lines.each do |line|
        value = line =~ /rgss\d/i
        next if value == nil
        return line.scan(/\d/)[0].to_i
      end
    end
    attr_accessor :map_switch_order, :alt_switch_order
    attr_reader :switch_order
  end
  MAKER_VERSION = retrieve_version
  clear_switch_order
  Manager = MAKER_VERSION == 1 ? Interpreter : Game_Interpreter
end

module SwitchOrder
  def make_windows(y1, y2, y3)
    @order_windows = [SwitchOrderWindow.new(y1, 0)]
    @order_windows << SwitchOrderWindow.new(y2, 1)
    @order_windows << SwitchOrderWindow.new(y3, 2)
  end

  def update_scene
    Graphics.update
    Input.update
    update
  end

  def terminate
    Graphics.freeze
    @order_windows.each{|win| win.dispose }
  end
end

class Game_System
  alias :kyon_mdx_gm_sys_init :initialize
  def initialize
    kyon_mdx_gm_sys_init
    @fixed_steps = KMap::FIXED_STEPS
    @steps_reducer = KMap::DIVIDE_STEPS_BY
  end
  attr_accessor :fixed_steps, :steps_reducer
end

class Game_Party
  alias :kyon_md_gm_party_init initialize
  def initialize
    kyon_md_gm_party_init
    @chests_found = {}
    @chests_found.default = 0
    @traps_triggered = {}
    @traps_triggered.default = 0
  end

  def clear_data(data_sym, map_id=$game_map.map_id)
    chest, traps, all = KMap::CLEAR_DATA_OPTIONS
    @chests_found[map_id] = 0 if [all, chest].include?(data_sym)
    @traps_triggered[map_id] = 0 if [all, traps].include?(data_sym)
  end
  attr_reader :chests_found, :traps_triggered
end

class Game_Player
  def make_encounter_count
    return if $game_map.map_id == 0
    m = $game_system.steps_reducer
    if $game_system.fixed_steps
      @encounter_count = $game_map.encounter_step / m if @encounter_count == 0
    else
      n = $game_map.encounter_step / m
      @encounter_count = rand(n) + rand(n) + 1
    end
  end
end

class KMap::Manager
  alias :kyon_md_int_switches :command_121
  alias :kyon_md_int_variables :command_122
  def command_121
    kyon_int_switches
    cs = KMap::CHESTS_SWITCH
    ts = KMap::TRAPS_SWITCH
    if $game_switches[cs]
      $game_switches[cs] = false
      $game_party.chests_found[@map_id] += 1
    end
    if $game_switches[ts]
      $game_switches[ts] = false
      $game_party.traps_triggered[@map_id] += 1
    end
    return true
  end

  def command_122
    sov = KMap::SWITCH_ORDER_VAR
    if sov == @parameters[4] and $game_variables[sov] > 0
      KMap.switch_order << $game_variables[sov]
      $game_variables[sov] = 0
      return true
    end
    kyon_md_int_variables
  end
end

class SwitchOrderWindow < Window_Selectable
  def initialize(wy, pos)
    @switches = KMap.select_order(pos)
    @label = KMap.select_label(pos)
    @lh = KMap::MAKER_VERSION == 3 ? 24 : 32
    @lj, h = KMap::MAKER_VERSION == 1 ? [28, 96] : [24, 88]
    super(0, wy, Graphics.width, h)
    create_contents
    refresh
  end

  def refresh
    bitmap = self.contents
    bitmap.draw_text(0, 0, width - @lh, @lj, @label, 1)
    lw = 0
    @switches.size.times do |n|
      label = @switches[n].to_s
      lx = contents.text_size(label).width
      bitmap.draw_text(lw, @lh, lx, @lj, label)
      lw += lx + 8
    end
  end
end

Menu para Despulgarlo en XP

Código:
# * KMapData - Switch Order Debug Menu XP
#   Scripter : Kyonides Arkanthes

class SwitchOrderWindow
  def create_contents
    self.contents = Bitmap.new(width - 32, height - 32)
  end
end

class SwitchOrderScene
  def main
    @order_windows = [SwitchOrderWindow.new(0, 0)]
    @order_windows << SwitchOrderWindow.new(96, 1)
    @order_windows << SwitchOrderWindow.new(192, 2)
    Graphics.transition
    until $scene != self
      Graphics.update
      Input.update
      update
    end
    Graphics.freeze
    @order_windows.each{|win| win.dispose }
  end

  def update
    return unless Input.trigger?(Input::B)
    $game_system.se_play($data_system.cancel_se)
    $scene = Scene_Map.new
  end
end

class Scene_Map
  alias :kyon_md_scn_map_up :update
  def update
    kyon_md_scn_map_up
    if Input.trigger?(Input::CTRL) and !$game_player.moving?
      $game_system.se_play($data_system.decision_se)
      $scene = SwitchOrderScene.new
    end
  end
end

Menu para Despulgarlo en VX o ACE

Código:
# * KMapData - Switch Order Debug Menu VX & ACE
#   Scripter : Kyonides Arkanthes

class SwitchOrderScene < Scene_Base
  def main
    @keep_open = true
    @order_windows = [SwitchOrderWindow.new(0, 0)]
    @order_windows << SwitchOrderWindow.new(88, 1)
    @order_windows << SwitchOrderWindow.new(176, 2)
    perform_transition
    while @keep_open
      Graphics.update
      Input.update
      update
    end
    Graphics.freeze
    @order_windows.each{|win| win.dispose }
  end

  def update
    return unless Input.trigger?(Input::B)
    Sound.play_cancel
    @keep_open = nil
    if KMap::MAKER_VERSION == 2
      $scene = Scene_Map.new
    else
      SceneManager.goto(Scene_Map)
    end
  end
end

class Scene_Map
  alias :kyon_md_scn_map_up_call_menu :update_call_menu
  def update_call_menu
    if Input.trigger?(Input::CTRL)
      if KMap::MAKER_VERSION == 2
        Sound.play_decision
        $scene = SwitchOrderScene.new
      else
        Sound.play_ok
        SceneManager.goto(SwitchOrderScene)
      end
      return
    end
    kyon_md_scn_map_up_call_menu
  end
end

Términos y Condiciones de Uso

Supongo que será libre y gratuito para proyectos no comerciales. Ópalo Aturdido



Última edición por kyonides el Mar Jul 07, 2020 1:14 am, editado 2 veces (Razón : Script Modificado)

#2KMapData Empty Re: KMapData el Dom Jul 05, 2020 9:56 am

kyonides

kyonides
Actualización

En esta nueva versión de mi script he agregado la opción de orden alternativo de interruptores. Ademaś encontrarán un menú para que lo despulguen si lo consideran necesario hasta que su orden de prueba coincida con alguno de los dos predefinidos.

El orden alternativo es opcional. Si no lo utilizan o tanto el obligatorio como el alternativo no se han definido, el juego no dará error. Supuse que era la mejor manera de avisarles que no lo habían predefinido. Ópalo Tuerto

#3KMapData Empty Re: KMapData el Mar Jul 07, 2020 1:27 am

kyonides

kyonides
Otra Actualización

Simplemente regresé para agregarle 2 características a mi script de KMapData.

El primero es la inclusión del método directo para fijar el número de pasos para toparse a los monstruos. Lo segundo sería una forma de fijar ese número de pasos para hacerlo más predecible. ¡Eso no es todo, amigos! Ópalo Sorprendido
También pueden dividir el número de pasos sin importar si usan el modo aleatorio por defecto o el número fijo! Ópalo Guiño

En serio creo que el método lo hace más interesante en un mapa específico para hacerlo más pesado al forzarte a rellenar tu mochila con cuanta poción y elíxir encuentres u obligarte a levear en otra parte.  Ópalo Contento Claro está que un repelente a lo Pokemon también podría funcionar allí.  Ópalo Tuerto
Solo digamos que se fuerza al jugador a pensar táctica o incluso estratétigicamente. Ópalo Lenguón
La cuestión es que tengan más opciones que las que se incluyen por defecto en los Makers.
Ópalo Sonrisa Grande Obviamente pueden cambiar el modo y el número de pasos en cualquier momento. Solo hagan un buen uso de los llamados a script correspondientes.

#4KMapData Empty Re: KMapData el Jue Jul 09, 2020 8:21 pm

Cerberos_diamond

Cerberos_diamond
excelente, sin duda lo voy a probar, aunque lo mas probable es que lo incluya de golpe en mi proyecto
Saludos Kyo Opalo Hola

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.