Wednesday, May 29, 2019

Mientras tanto, en Plutón...

Qué ¿Ya pensaban que había abandonado esto? Pues no, lo que pasa es que he estado entretenido trabajando en el editor de árboles de conversación y, claro, no se puede estar en misa y repicando.

Y, hablando de árboles de conversación, deberíamos echarle un vistazo a los mismos. Pero por una vez vamos a ir por orden...

¿Es a mí?

Como resulta evidente, empezar a hablar de los árboles de conversación no tendría mucho sentido sin hablar antes acerca de los personajes a los que están asociados.

Los personajes son probablemente el aspecto que más ha evolucionado desde la versión primitiva del motor, en la que se consideraban objetos con un comportamiento un poco diferente. Los personajes ahora se definen en el archivo npcs.json, que tiene este aspecto -usaremos de nuevo Pluto Crash como ejemplo-:

[
  {
    "id":1,
    "names":["K128"],
    "location":3,
    "onLocationDescription":"El asistente robótico K128 te observa desde el techo, una señal de peligro parpadea en la pantalla que le sirve de cara.",
    "examineDescription":"Un asistente robótico modelo K128, no es mucho más que una cabeza enganchada a un brazo que se mueve por raíles. Hace un tiempo estaban por todas partes, ahora es casi una pieza de museo.",
    "characterListDescription":"K128 es el asistente robótico de la base. En teoría su cometido es ayudarte con el mantenimiento pero siendo poco más que una cabeza parlante no hace mucho más que dar conversación.\nPeor sería estar completamente solo, eso sí.",
    "onMeetTriggers":null,
    "onLeaveTriggers":null,
    "onActionTriggers":null,
    "onExamineTriggers":null,
    "behavior":0,
    "movementLocations":null,
    "mood":1,
    "conversationTrees":[1],
    "singleStringConversation":"El puerto de comunicaciones de K128 está conectado a la antena para enviar el mensaje de auxilio, no es buena idea desconectarlo ahora.",
    "visibility":1,
    "met":"false",
    "allowedOnCharacterList":"true",
    "fast":"false",
    "smallImage":"k128_s.png",
    "bigImage":"k128.png",
    "showOnScene":"true"
  },
  ...
]


Los diferentes atributos de la clase GameNPC.java cumplen las siguientes funciones:
  • id. El identificador numérico único del personaje.
  • names. Los posibles nombres que el jugador puede usar a la hora de interactuar con el personaje a través de la introducción de instrucciones. Funcionan de manera similar a los nombres de los objetos, siendo el primero que aparece el nombre por defecto.
  • location.Localización en la que se encuentra el personaje.
  • onLocationDescription. Texto que se añadirá a la descripción de la localización cuando el personaje se encuentre en la misma.
  • examineDescription, characterListDescription. El primer valor se muestra al examinar el personaje, el segundo valor es opcional y muestra una descripción más detallada si se está usando la opción de mostrar los personajes examinados desde el panel de objetos a pantalla completa.
  • onMeetTriggers, onLeaveTriggers, onActionTriggers, onExamineTriggers. Disparadores que se activarán al realizar determinadas acciones relacionadas con el personaje. Pendiente de implementación.
  • behavior. Comportamiento del personaje. En el ejemplo mostrado el valor 0 indica que el personaje es estático y no se moverá de la localización en la que se encuentra. Otros valores harán que el personaje siga al jugador, patrulle una serie de localizaciones, se mueva a una localización específica siguiendo un camino determinado o aparezca en localizaciones aleatorias dentro de un conjunto determinado.
  • movementLocations. Localizaciones por las que se moverá el personaje. En el ejemplo mostrado, al ser un personaje estático no se especifican localizaciones de movimiento; si el personaje tuviese un comportamiento diferente se debería indicar aquí un array con los identificadores de las localizaciones por las que se movería el personaje.
  • mood. Actitud del personaje hacia el jugador. Si la actitud del personaje es lo suficientemente hostil, atacará al jugador si tiene oportunidad.
  • conversationTrees. Árboles de conversación asignados al personaje. Cuando el jugador introduzca la orden de hablar con el personaje el árbol de conversación adecuado se escogerá de entre los árboles referenciados en este array.
  • singleStringConversation. Si el jugador introduce la orden de hablar con un personaje que no tiene árboles de conversación definidos en su lugar se mostrará sólo el texto que se especifique en este atributo.
  • visibility. Condiciones de luz necesarias para poder ver -e interactuar- con el personaje. Funciona de la misma manera que la visibilidad de objetos.
  • met. Indica si el jugador ha hablado ya con el personaje. Este atributo se usará principalmente para construir la lista de personajes que aparecerán en la lista de personajes conocidos en el panel de personajes.
  • allowedOnCharacterList. Valor booleano que indica si se puede mostrar al personaje en la lista del panel de personajes.
  • fast. Valor booleano que indica si el personaje es más rápido que el jugador. Los personajes rápidos actúan antes que el jugador cuando éste lleva a cabo una acción.
  • smallImage. Imagen que se mostrará en el listado de personajes en el panel correspondiente.
  • bigImage. Imagen que se mostrará sobre la imagen de la localización cuando el jugador y el personaje se encuentren en la misma ubicación.
  • showOnScene. Valor booleano que indica si la imagen del personaje se debe mostrar cuando éste y el jugador se encuentren en la misma localización.
A la hora de interactuar con los personajes, éstos se comportan de una manera similar a los objetos, siendo posible realizar acciones que tengan a los mismos como objetos pasivos y habiendo efectos que modifican el valor de sus atributos.
Por supuesto, la gran diferencia entre los objetos y los personajes es que con éstos se puede hablar, pero ya entraremos en ese berenjenal en la próxima entrada.

Ale, a personajear.

No comments: