Wednesday, June 12, 2019

Mientras tanto, en Plutón...

Al finalizar la entrada anterior habíamos comentado que hoy aprenderíamos a matar a un personaje.
Por desgracia para los más truculentos no será esto un festival de tripas virtuales.

Pro ludo mori

Para empezar, hay que diferenciar entre los dos tipos posibles de personajes que podemos mandar al otro barrio: los personajes no jugadores (o PNJ) y el personaje que maneja el jugador.

Para "matar" a un PNJ tendremos que activar el efecto EFFECT_DESTROY_NPC. A efectos prácticos lo que se hará es asignar al atributo location del personaje el valor 0. Como ninguna localización debe tener el identificador 0 esto sitúa al personaje fuera del alcance del jugador eliminándolo del juego.
La definición del efecto que llevaría a cabo la tarea sería como sigue:

{
    "id":1,
    "type":8,
    "passiveGameItems":null,
    "passiveGameLocations":null,
    "passiveGameNPCs":[1],
    "passiveGameTriggers":null,
    "passiveGameFlags":null,
    "newIntegerValue":null,
    "newBooleanValue":null,
    "newStringValue":null,
    "message":null
}

Siendo el valor 8 del atributo type el correspondiente al efecto EFFECT_DESTROY_NPC y el valor 1 de passiveGameNPCs el identificador del personaje que queremos eliminar.

Por si se lo preguntaban, sí, este mismo resultado puede conseguirse mediante un efecto que cambie la localización del PNJ especificando el valor 0 como valor de la nueva localización. Este efecto se definiría así:

{
    "id":1,
    "type":12,
    "passiveGameItems":null,
    "passiveGameLocations":null,
    "passiveGameNPCs":[1],
    "passiveGameTriggers":null,
    "passiveGameFlags":null,
    "newIntegerValue":0,
    "newBooleanValue":null,
    "newStringValue":null,
    "message":null
}

Siendo 12 el valor del efecto EFFECT_TELEPORT_NPC. Aunque, por supuesto, mi recomendación personal es utilizar el efecto correcto para cada situación conviene tener en cuenta que este método puede utilizarse para devolver a un PNJ al mundo de los vivos.

Por su lado, matar al personaje jugador requiere, previsiblemente,  algo más de preparación.

Para empezar se debe tener en cuenta que en Enki, morir y ganar son la misma cosa. El resultado de matar al personaje y llegar al final del juego es el mismo: mostrar la pantalla definida en la actividad DeathScreen.java. Sí, probablemente debería haber usado un nombre más neutro pero a estas alturas ya me da pereza cambiarlo.

La pantalla DeathScreen.java mostrará la información correspondiente a la muerte -o victoria- del personaje de acuerdo al contenido del archivo death_infos.json.

[
  {
    "id":-1,
    "headerText":"La has palmado",
    "bodyText":"La has palmado finamente por bajar donde no debías.",
    "image":"death_001.png"
  }
]


El contenido de este archivo se cargan en un array de objetos DeathInfo.java, cuyos atributos son los siguientes.
  • id. Identificador numérico único de la pantalla.
  • headerText. Texto que se mostrará en la cabecera de la pantalla.
  • bodyText. Texto principal que se mostrará en la pantalla.
  • image. Nombre del archivo de imagen que se mostrará en la pantalla.
Al realizar la llamada a DeathScreen.java se le pasará el objeto DeathInfo correspondiente y se mostrará la información adecuada.


El primer y más simple método para llegar a esta pantalla es mediante una orden de movimiento que desemboque en la muerte del personaje. Como ya habíamos mencionado al hablar del movimiento, si la dirección hacia la que se mueve tiene un valor destination menor que cero, dicho movimiento provocará la muerte del personaje. El motor buscará en el array de objetos DeathInfo aquel que tenga un id igual al valor de destination y llamará a DeathScreen, pasándole la información adecuada.

El segundo método para matar al personaje jugador es mediante un efecto, concretamente el efecto EFFECT_DEATH.

{
    "id":1,
    "type":1003,
    "passiveGameItems":null,
    "passiveGameLocations":null,
    "passiveGameNPCs":null,
    "passiveGameTriggers":null,
    "passiveGameFlags":null,
    "newIntegerValue":-2,
    "newBooleanValue":null,
    "newStringValue":null,
    "message":null
}


Siendo 1003 el valor de EFFECT_DEATH. Al ejecutar este efecto, se buscará el objeto DeathInfo con el valor de id especificado en newIntegerValue y se pasará como argumento a DeathScreen del mismo modo que con la muerte por movimiento.

Y esto ha sido todo por hoy, permanezcan atentos porque con la próxima entrada terminaremos con los archivos de configuración y podremos pasar a otras cosas.
¡Ale, a matar no, que está feo!

No comments: