Jump to content

Capí­tulo V - Los states


ElRaulxX

Mensajes recomendados

Buenas foreros de Metin2 Zone!
Os vengo a traer la quinta entrega de nuestro fantástico curso de quests. En este capítulo trataremos los states, algo básico que tenéis que tener en cuenta a la hora de crear una quest. La verdad es que esto formaría parte del capítulo II, pues los states estructuran las quests, pero hemos aplazado este capítulo para que lo podáis entender mejor ahora que ya habéis avanzado un poco.

Supongo que habréis visto ya en todas las quests la estructura state start begin. Efectivamente, eso es un state. Pero antes de todo debemos entender qué es realmente un state.


1 - ¿Qué es un state?

Podríamos decir que un state es la "división" de una quest. Las acciones de cada quest se dividen en bloques independientes: los states.
Cuando el usuario inicia la quest empezará en el state inicial (start). A partir de entonces el creador de la quest puede ir cambiando de states a su conveniencia. De esta manera podemos hacer que el usuario sufra diferentes acciones en cada uno de los states.

Algo importante a saber es que los states son totalmente independientes los unos de los otros. Las acciones que ocurren dentro de un state sólo ocurrirán en este state, es decir, cuando el usuario se encuentre dentro de este state.

Un ejemplo, para que lo entendáis, son las misiones de búsqueda de un npc o de matar un determinado mob, las misiones de toda la vida que utiliza ymir. Cuando empieza la quest aparece un determinado pergamino. Conforme vamos avanzando la quest, este pergamino irá cambiando; en un state podemos abrir un determinado texto en un npc, en otro no. Esto no lo podríamos hacer sin nuestros states.

 

Podemos entender mejor los states si los comparamos con un conjunto de habitaciones unidas a través de puertas.

Empezamos entrando a la primera habitación (state start - inicio de la quest). En ella nos encontramos una alfombra y una silla. Por lo tanto podemos caminar sobre la alfombra y sentarnos en la silla. Ahora decidimos ir a una segunda habitación.

En esta segunda habitación nos encontramos un sillón y una mesa. En esta habitación podemos sentarnos en el sillón y poner una baso sobre la mesa, pero no podemos caminar sobre la alfombra ni sentarnos en la silla ya que eso pertenece a la habitación anterior.

De esta manera podemos entender los states. Cada state es independiente de los otros; podemos realizar las acciones que se encuentran dentro de un state independientemente de los otros. Para cambiar de state deberemos atravesar una puerta que, en términos de quest, correspondería a una función para cambiar el state en que se encuentra el usuario.

Una quest puede tener un número indeterminado de states. Eso, como ya dije, va a conveniencia del creador de la quest.
Cuando compilemos la quest (implementamos en el servidor) aparecerá en object la quest dividida/fragmentada. Esa división será en función de los states. Por ejemplo, si implementamos la quest tutorial.quest que contiene los states start, run y final, en object nos aparecerán los archivos tutorial.start, tutorial.run y tutorial.final (todo dividido en mobs, timers..., claro está). Esto lo trataremos a fondo en otro capítulo.


2 - ¿Cómo cambiamos de state?

 

El state del jugador puede cambiarse a partir de funciones creadas para ello.

Los states se almacenan en la db y permanecerán hasta que sea modificado con cualquiera de las funciones creadas para ello.

Existen dos maneras de cambiar un state: internamente o remotamente.

 

Internamente:
La función de cambio de state principal es la función set_state() o setstate(). Su uso es muy sencillo: tan solo debemos introducir como único argumento el nombre del state al que queremos cambiar cuando queramos realizar el cambio de state interno de la quest (por si no se entiende, entre paréntesis tenemos que poner el nombre del state al que queremos ir).

set_state(string $state)

Ejemplo:

quest tutorial begin	state start begin		when 9012.chat."Aprendamos los states 1" begin			say("Actualmente te encuentras en el state start")			say("¿Quieres cambiar de state?")			local s = select("Si","No")			if s == 1 then				say("Has cambiado de state correctamente")				set_state("run")			end		end	end	state run begin		when 9012.chat."Aprendamos los states 2" begin			say("Actualmente te encuentras en el state run")			say("¿Quieres cambiar de state?")			local s = select("Si","No")			if s == 1 then				say("Has cambiado de state correctamente")				set_state("start")			end		end	endend

Como veis en el ejemplo, cada state es independiente de los otros.

También debo recordar que TODOS los states se cierran con un end.
Los states pueden tener cualquier nombre, el que queramos. Aún así, para evitar cualquier tipo de error, es aconsejable utilizar nombres sencillos sin caracteres especiales.

Remotamente:
Los states de una quest también podemos cambiarlos remotamente, es decir, desde otra quest ajena. ¿Cómo hacemos eso? Pues con la función: set_quest_state(). Esta función toma dos argumentos: el primer argumento debe ser el nombre de la quest a la que queramos cambiar el state (IMPORTANTE: el nombre de la quest es el definido en la primera línea quest x begin donde x es el nombre de la quest; no confundir con el nombre del archivo quest) y el segundo el nuevo state al que queremos ir.

set_quest_state(string $quest, string $state)

Ejemplo:

 

Quest1:

quest tutorial1 begin	state start begin		when 9012.chat."Aprendamos los states 1" begin			say("Actualmente te encuentras en el state start")		end	end	state run begin		when 9012.chat."Aprendamos los states 2" begin			say("Actualmente te encuentras en el state run")		end	endend

Quest2:

quest tutorial2 begin	state start begin		when 9012.chat."Aprendamos los states - cambiar state" begin			say("¿A que state quieres cambiar?")			local s = select("start","run")			if s == 1 then				say("Has cambiado de state correctamente")				set_quest_state("tutorial1", "start")			elseif s == 2 then				say("Has cambiado de state correctamente")				set_quest_state("tutorial1", "run")			end		end	endend

3 - States en los when - enter y leave

 

Existen dos maneras de activar un when a través de los states: enter y leave.

  • Enter: Se ejecutará el when cuando entremos en el state.
  • Leave: Se ejecutará el when cuando salgamos del state.

A través de estos dos whens podemos aumentar mucho la funcionalidad de una quest en las ocasiones en que podamos cambiar los states.

He visto programadores quest que utilizan mucho esta táctica para conseguir solucionar problemas que de otra manera serían mucho más difíciles de solucionar, ¡incluso lo utiliza nuestra madre ymir!

 

Aquí tenéis un ejemplo explicativo:

quest tutorial begin	state start begin		when 9012.chat."Aprendamos los states - 1" begin			say("¿Realmente quieres cambiar de state?")			local s = select("si","no")			if s == 1 then				say("Has cambiado de state correctamente")				set_state("run")			end		end	end		state run begin			when enter begin			chat("Has entrado al state.")		end				when leave begin			chat("Has salido del state.")		end				when 9012.chat."Aprendamos los states - 2" begin			say("¿Realmente quieres cambiar de state?")			local s = select("si","no")			if s == 1 then				say("Has cambiado de state correctamente")				set_state("start")			end		end			endend

Cuando entremos al state run se ejecutará chat("Has entrado al state.") y cuando salgamos del mismo chat("Has salido del state."). Este ejemplo es muy sencillo pero estoy seguro que de aquí os pueden salir grandes ideas que mejorarán mucho vuestro código.

 

 

 

Con todo esto podemos ir jugando con los states y hacer miles de cosas.
Algo muy útil es poner un state sin ninguna acción. Así podemos dar por finalizada la quest, ¡muy útil para quests con recorrido!

Recordar que los states es lo principal de las quest. Si sabéis utilizarlos serán buenos aliados, sino tan solo serán neutrales. Siempre es mejor tener aliados, ¿no creéis?
 

 

Changelog

  • 31/07/12 20:18 - Primera publicación oficial del capítulo.
  • 04/09/13 11:35 - Correcciones varias.
  • 04/09/13 14:33 - Correcciones varias.
  • 04/09/13 15:31 - Correcciones varias, Añadida sección 3 - States en los when - enter y leave
Enlace para comentar
Compartir en otros sitios

  • 1 year later...
  • Dilong locked this tema
Guest
Este tema está cerrado a otras respuestas.
  • Recientemente navegando por este tema   0 miembros

    • No hay usuarios registrados visitando esta página.
×
×
  • Crear nuevo...