Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 3766 miembros registrados.
El último usuario registrado es stranger2525.

Nuestros miembros han publicado un total de 85800 mensajes en 12217 argumentos.

[XP] Elecciones de mensaje con restricción

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Elecciones de mensaje con restricción

Mensaje por Wecoc el 2017-10-19, 16:13

Con este script se pueden hacer elecciones de mensaje que solo puedan seleccionarse bajo cierta restricción.
Hay muchas opciones disponibles, así que pondré varios ejemplos.

Ponedlo encima de main, no pido créditos.

Código:
#==============================================================================
# ** [XP] Choice Restrictions v1.2
#------------------------------------------------------------------------------
#  Autor: Wecoc (no requiere créditos)
#==============================================================================

class Game_System
  #--------------------------------------------------------------------------
  attr_accessor :choice_conditions      # Condición para que aparezca
  attr_accessor :choice_restrictions    # Condición necesaria para seleccionarla
  attr_accessor :choice_alt            # Texto alternativo si no se cumple
  attr_accessor :choice_alt_process    # Proceso de evento alternativo
  attr_accessor :choice_timer          # Act./Desact. opción temporizador
  attr_accessor :choice_timer_process  # Proceso de evento al terminar tiempo
  #--------------------------------------------------------------------------
  alias choice_res_ini initialize unless $@
  def initialize
    choice_res_ini
    @choice_conditions = {}
    @choice_conditions.default = ""
    @choice_restrictions = {}
    @choice_restrictions.default = ""
    @choice_alt = {}
    @choice_alt.default = ""
    @choice_alt_process = {}
    @choice_alt_process.default = ""
    @choice_timer = false
    @choice_timer_process = ""
  end
  #--------------------------------------------------------------------------
end

#==============================================================================
# ** Window_Message
#==============================================================================

class Window_Message
  #--------------------------------------------------------------------------
  # * [Reescrito] Update
  #--------------------------------------------------------------------------
  def update
    super
    #------------------------------------------------------------------------
    # Abortar elecciones si hay límite de tiempo asignado
    #------------------------------------------------------------------------
    if $game_system.choice_timer == true
      if $game_system.timer_working && $game_system.timer == 0
        $game_system.choice_timer = false
        proc = $game_system.choice_timer_process
        $game_system.timer_working = false
        $game_system.map_interpreter.instance_eval(proc)
        terminate_message
        return
      end
    end
    #------------------------------------------------------------------------
    if @fade_in
      self.contents_opacity += 24
      if @input_number_window != nil
        @input_number_window.contents_opacity += 24
      end
      if self.contents_opacity == 255
        @fade_in = false
      end
      return
    end
    if @input_number_window != nil
      @input_number_window.update
      if Input.trigger?(Input::C)
        $game_system.se_play($data_system.decision_se)
        $game_variables[$game_temp.num_input_variable_id] =
          @input_number_window.number
        $game_map.need_refresh = true
        @input_number_window.dispose
        @input_number_window = nil
        terminate_message
      end
      return
    end
    if @contents_showing
      if $game_temp.choice_max == 0
        self.pause = true
      end
      if Input.trigger?(Input::B)
        if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0
          $game_system.se_play($data_system.cancel_se)
          $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)
          terminate_message
        end
      end
      if Input.trigger?(Input::C)
        if $game_temp.choice_max > 0
          #------------------------------------------------------------------
          # Si hay alguna restricción
          if $game_system.choice_restrictions[self.index] != ""
            # Obtener intérprete actual
            interpreter = [$game_system.map_interpreter,
            $game_system.battle_interpreter].select { |i| i.running? }[0]
            # Si la restricción no se cumple
            restriction = $game_system.choice_restrictions[self.index]
            unless interpreter.instance_eval(restriction)
              # Si no hay proceso alternativo, suena error
              if $game_system.choice_alt_process[self.index] == ""
                $game_system.se_play($data_system.buzzer_se)
                return
              end
              # Si hay proceso alternativo, se cumple
              $game_system.se_play($data_system.decision_se)
              process = $game_system.choice_alt_process[self.index]
              interpreter.instance_eval(process)
              terminate_message
              # Borrar datos de límite de tiempo al terminar elección
              if $game_system.choice_timer
                $game_system.choice_timer = false
                $game_system.choice_timer_process = ""
              end
              return
            end
          end
          # Si no hay restricción o bien se cumple, ocurre lo predeterminado
          $game_system.se_play($data_system.decision_se)
          $game_temp.choice_proc.call(self.index)
          terminate_message
          # Borrar datos de límite de tiempo al terminar elección
          if $game_system.choice_timer
            $game_system.choice_timer = false
            $game_system.choice_timer_process = ""
          end
          return
          #------------------------------------------------------------------
        end
        terminate_message
      end
      return
    end
    if @fade_out == false and $game_temp.message_text != nil
      @contents_showing = true
      $game_temp.message_window_showing = true
      reset_window
      refresh
      Graphics.frame_reset
      self.visible = true
      self.contents_opacity = 0
      if @input_number_window != nil
        @input_number_window.contents_opacity = 0
      end
      @fade_in = true
      return
    end
    if self.visible
      @fade_out = true
      self.opacity -= 48
      if self.opacity == 0
        self.visible = false
        @fade_out = false
        $game_temp.message_window_showing = false
      end
      return
    end
  end
end

#==============================================================================
# ** Interpreter
#==============================================================================

class Interpreter
  #--------------------------------------------------------------------------
  # * Definir condición (aparecer en la lista)
  #--------------------------------------------------------------------------
  def set_choice_condition(index, condition)
    $game_system.choice_conditions[index] = condition
  end
  #--------------------------------------------------------------------------
  # * Vaciar condiciones
  #--------------------------------------------------------------------------
  def reset_choice_conditions
    $game_system.choice_conditions.clear
  end
  #--------------------------------------------------------------------------
  # * Definir restricción (seleccionar)
  #--------------------------------------------------------------------------
  def set_choice_restriction(index, restriction, alt="", alt_p="")
    $game_system.choice_restrictions[index] = restriction
    $game_system.choice_alt[index] = alt
    $game_system.choice_alt_process[index] = alt_p
  end
  #--------------------------------------------------------------------------
  # * Vaciar restricciones
  #--------------------------------------------------------------------------
  def reset_choice_restrictions
    $game_system.choice_restrictions.clear
    $game_system.choice_alt.clear
    $game_system.choice_alt_process.clear
  end
  #--------------------------------------------------------------------------
  # * Definir temporizador
  #--------------------------------------------------------------------------
  def set_choice_timer(end_process)
    $game_system.choice_timer = true
    $game_system.choice_timer_process = end_process
  end
  #--------------------------------------------------------------------------
  # * Vaciar datos de temporizador
  #--------------------------------------------------------------------------
  def reset_choice_timer
    $game_system.choice_timer = false
    $game_system.choice_timer_process = ""
  end
  #--------------------------------------------------------------------------
  # * [Reescrito] Obtener elecciones
  #--------------------------------------------------------------------------
  def setup_choices(parameters)
    # Ocultar elecciones que no cumplan las condiciones
    choices = []
    for i in 0...parameters[0].size
      choices.push(parameters[0][i].clone)
    end
    indent = [0, 1, 2, 3][0...choices.size]
    for i in 0...choices.size
      parameter = parameters[0][i]
      if $game_system.choice_conditions[i] != ""
        unless instance_eval($game_system.choice_conditions[i])
          choices.delete(parameter)
          indent.delete(i)
        end
      end
    end
    # Definir las restricciones de condiciones
    $game_temp.choice_max = choices.size
    for i in 0...choices.size
      text = choices[i]
      # Si hay alguna restricción
      if $game_system.choice_restrictions[i] != ""
        # Si la restricción no se cumple
        unless instance_eval($game_system.choice_restrictions[i])
          if $game_system.choice_alt[i] != ""
            # Si hay texto alternativo se asigna aquí
            text = $game_system.choice_alt[i]
          else
            # Si no hay texto alternativo se usa el mismo pero desactivado
            text = "\\c[7]" + text + "\\c[0]"
          end
        end
      end
      $game_temp.message_text += text + "\n"
    end
    $game_temp.choice_cancel_type = parameters[1]
    if parameters[1] != 0 && parameters[1] != 5
      if !indent.include?(parameters[1] - 1)
        # Invalidar cancelar si la opción de cancelar está oculta
        $game_temp.choice_cancel_type = 0
      end
    end
    current_indent = @list[@index].indent
    $game_temp.choice_proc = Proc.new {|n| @branch[current_indent] = indent[n]}
    $game_system.choice_conditions.clear
  end
  #--------------------------------------------------------------------------
  # * Ir a Etiqueta
  #--------------------------------------------------------------------------
  def jump_to_label(label_name)
    temp_index = 0
    loop do
      return true if temp_index >= @list.size-1
      if @list[temp_index].code == 118 and
        @list[temp_index].parameters[0] == label_name
        @index = temp_index
        return true
      end
      temp_index += 1
    end
  end
end

A continuación pondré otro post con las instrucciones de uso, a modo de tutorial.


Última edición por Wecoc el 2017-11-06, 16:24, editado 2 veces
avatar
Wecoc
Administrador
Administrador



Créditos 9371

Gracias : 517

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Elecciones de mensaje con restricción

Mensaje por Wecoc el 2017-10-19, 16:53

Instrucciones generales

Para usarlo hay que usar esta llamada de script antes del comando de elecciones:

set_choice_restriction(index, restriction)

index se refiere al índice de las elecciones, de 0 a 3.

restriction es un texto (por defecto vale "") que define qué tiene que ocurrir para poder seleccionar esa elección.

Por ejemplo, si queremos que la elección solo sea posible si el actor de ID 3 esté en el grupo usaremos como restriction lo siguiente, entre comillas:
$game_party.actors.include?($game_actors[3])

Ese código a evaluar puede ser cualquier cosa, y mientras quede entre comillas puede tener varias líneas, por ejemplo así.

actor = $game_actors[3]
$game_party.actors.include?(actor)


Una vez defenido ese código, detrás del comando de elecciones hay que usar lo siguiente en un llamar script para vaciar las restricciones
de cara a elecciones futuras.

reset_choice_restrictions

Ejemplo:

Evento:



Instrucciones avanzadas

Al comando de definir restricción se le pueden añadir otros parámetros opcionales.

set_choice_restriction(index, restriction, alt text, alt proc)

alt text es el texto de la elección alternativo, cuando la restricción no se cumple.
Por defecto simplemente aparece el mismo texto en gris, pero con esta opción podemos poner cualquier otro texto.
Su valor por defecto es "".

Ejemplo:

Evento:



alt proc es el proceso que ocurre cuando seleccionas una elección y su restricción no se cumple.
Por defecto no te deja y suena error, pero puedes poner otras opciones como ir a una etiqueta de evento o llamar un evento común...
También puedes por ejemplo activar un interruptor y luego dentro de esa misma elección hacer distintas cosas según el estado de ese interruptor.
Su valor por defecto es "".

Ejemplo:

Evento:

Elecciones con porcentaje de acierto

Con una pequeña astucia el script puede servir para hacer elecciones con porcentaje, de modo que si se cumple ocurra una cosa y si no otra (estilo Fallout). Dejo el evento entero aquí para que veáis cómo se haría.

Evento:



Capturas de evento hechas con Screen EX.

________________________________

Sé que puede parecer difícil en un principio pero en realidad no lo es tanto, con una mínima base de RGSS puede hacerse todo lo descrito y más opciones personalizadas. Además el script es solo para casos especiales, las elecciones normales sin restricción seguirán funcionando como siempre sin tener que añadirles nada nuevo.

Si tenéis algunas dudas comentadlas en este topic.


Última edición por Wecoc el 2017-10-19, 17:03, editado 1 vez
avatar
Wecoc
Administrador
Administrador



Créditos 9371

Gracias : 517

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Elecciones de mensaje con restricción

Mensaje por xXIsrael0499Xx el 2017-10-19, 16:58

Esto es hermoso... muy pero que muy bien, te la luciste con esto, mis respetos señor Wecoc.
Así que bueno gracias y eso. Luego lo pruebo con mas detenimiento para ver si no hay bug raros.
avatar
xXIsrael0499Xx
Principiante
Principiante

0/3

Créditos 1095

Gracias : 56

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Elecciones de mensaje con restricción

Mensaje por orochii el 2017-10-19, 19:42

Está muy útil, especialmente para hacer engines un poco más complejos, y reducir por ejemplo la necesidad de andar poniendo "no tienes suficiente dinero" y eso.

No sé si se podrán poner partes de texto que sólo aparezcan si se cumplen esas condiciones. Por ejemplo, que salga un "No tienes suficiente dinero" en rojo junto al Comprar. Es como una versión condensada del engine normal que tira un texto tras escoger Comprar. No sé si me logro explicar xD.

En fin, saludos.
avatar
orochii
Reportero

0/3

Créditos 6810

Gracias : 359

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Elecciones de mensaje con restricción

Mensaje por Wecoc el 2017-10-19, 22:41

Isra: Ya me dirás si encuentras algo. Yo lo testeé por encima y no encontré errores pero siempre se me puede escapar algo Sweat

Orochii: Sep, eso que dices viene a ser lo mismo que en el segundo ejemplo que puse.





Estoy seguro que hay otras opciones de uso que no contemplé, y al fin y al cabo el script no es muy complicado y puede ampliarse.

Antes me preguntaron también si es compatible con otros scripts de mensaje. Si son scripts de mensaje simples seguramente sí.
El script es compatible con todo excepto por el método Window_Message :update, en el que ya intenté marcar la parte que hay diferente.
En scripts de mensajería avanzada como el UMS o el AMS habría que editar su método update para que soporte los cambios. Relacionado con eso también puedo asegurar que el script no está limitado a 4 opciones, sirve con tantas como soporte el sistema de mensajería usado.

____________________________________

UPDATE - Nueva versión disponible 1.1

He cambiado una cosa del script. Todo el tutorial y todo va exactamente igual, lo que he puesto es una nueva opción: Restricción de temporizador.
Lo que hace es poner un límite de tiempo al jugador para que conteste una de las elecciones. Si no lo hace, ocurre un proceso de evento alternativo.

Funciona de la siguiente manera:

Primero activas un temporizador. Se verá como siempre, si queréis otras opciones (como no mostrarlo) recomiendo usar el script Wecoc's Timer Upgrade o similares.

Luego se usa la llamada de script

set_choice_timer(alt proc)

Ya expliqué antes qué es el alt proc.

Finalmente se ponen las elecciones. No hace falta nada más en ese caso. Se pueden combinar la restricción de tiempo con las otras.

Evento:
avatar
Wecoc
Administrador
Administrador



Créditos 9371

Gracias : 517

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Elecciones de mensaje con restricción

Mensaje por Wecoc el 2017-11-06, 16:33

UPDATE - Nueva versión disponible 1.2

Vuelvo a actualizar el script. Todo lo que había funciona igual pero he añadido una opción extra: Condiciones de aparición.
Ahora puedes hacer que una determinada elección solo aparezca en la lista dada una condición concreta. Va muy similar a las restricciones, antes de las elecciones tienes que usar:

set_choice_condition(index, condition)

y al final de las elecciones debes usar:

reset_choice_conditions

Pongo un ejemplo: set_choice_condition(0, "$game_switches[1] == true")
Con eso la primera condición solo saldrá si el interruptor 1 está activado.

Puedes usar ambas cosas a la vez y tal...
Las restricciones sería por ejemplo si solo quieres que aparezca cierta condición una vez hayas superado una misión, y si no salga ???? y no se pueda seleccionar.
Las condiciones en cambio sería por ejemplo si un evento te da la lista de misiones, y cada vez que completas una ya no vuelve a salir en esa lista.
Supongo que se entiende la diferencia en los usos de ambos.

En fin, si tenéis dudas lo decís.
avatar
Wecoc
Administrador
Administrador



Créditos 9371

Gracias : 517

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Elecciones de mensaje con restricción

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.