Monday, June 10, 2019

Mientras tanto, en Plutón...

En la entrada de hoy veremos la definición de contadores, una herramienta que nos permitirá simular, entre otras cosas, el paso del tiempo durante la partida.
Ánimo, que ya queda menos.

Cuenta conmigo

Los contadores se definen el en archivo counters.json y son implementados en la clase Counter.java.

Usaremos de nuevo Pluto Crash como ejemplo. Si no lo han jugado o no han llegado al final... ¡ALERTA SPOILERS!

Si lo han terminado entonces sabrán que para llegar al final es necesario poner una bomba casera en el motor de plasma de la nave invasora y escapar de la base antes de que explote. Esta cuenta atrás se lleva a cabo mediante un contador definido como sigue.

[
  {
    "id":1,
    "name":"bomb counter",
    "counterType":2,
    "initialValue":14,
    "currentValue":14,
    "limitValue":0,
    "onStartTriggers":null,
    "onCancelTriggers":null,
    "onLimitReachedTriggers":[
      {
        "id":1,
        "triggerType":0,
        "triggerSubType":2,
        "beenTriggered":"false",
        "actionId":null,
        "locationId":null,
        "itemId":null,
        "characterId":null,
        "enabled":"true",
        "effects":[
          {
            "id":1,
            "type":1003,
            "passiveGameItems":null,
            "passiveGameLocations":null,
            "passiveGameNPCs":null,
            "passiveGameTriggers":null,
            "passiveGameFlags":null,
            "newIntegerValue":-5,
            "newBooleanValue":null,
            "newStringValue":null,
            "message":null
          }
        ],
        "conditionalFlags":[
          {
            "id":6,
            "name":"Fuera base",
            "type":1,
            "booleanValue":"true",
            "integerValue":null
          },
          {
            "id":7,
            "name":"K128 conectado",
            "type":1,
            "booleanValue":"true",
            "integerValue":null
          }
        ],
        "activeItemConditions":null,
        "passiveItemConditions":null
      },
      {
        "id":2,
        "triggerType":0,
        "triggerSubType":2,
        "beenTriggered":"false",
        "actionId":null,
        "locationId":null,
        "itemId":null,
        "characterId":null,
        "enabled":"true",
        "effects":[
          {
            "id":1,
            "type":1003,
            "passiveGameItems":null,
            "passiveGameLocations":null,
            "passiveGameNPCs":null,
            "passiveGameTriggers":null,
            "passiveGameFlags":null,
            "newIntegerValue":-6,
            "newBooleanValue":null,
            "newStringValue":null,
            "message":null
          }
        ],
        "conditionalFlags":[
          {
            "id":6,
            "name":"Fuera base",
            "type":1,
            "booleanValue":"true",
            "integerValue":null
          },
          {
            "id":7,
            "name":"K128 conectado",
            "type":1,
            "booleanValue":"false",
            "integerValue":null
          }
        ],
        "activeItemConditions":null,
        "passiveItemConditions":null
      },
      {
        "id":3,
        "triggerType":0,
        "triggerSubType":2,
        "beenTriggered":"false",
        "actionId":null,
        "locationId":null,
        "itemId":null,
        "characterId":null,
        "enabled":"true",
        "effects":[
          {
            "id":1,
            "type":1003,
            "passiveGameItems":null,
            "passiveGameLocations":null,
            "passiveGameNPCs":null,
            "passiveGameTriggers":null,
            "passiveGameFlags":null,
            "newIntegerValue":-7,
            "newBooleanValue":null,
            "newStringValue":null,
            "message":null
          }
        ],
        "conditionalFlags":[
          {
            "id":6,
            "name":"Fuera base",
            "type":1,
            "booleanValue":"false",
            "integerValue":null
          },
          {
            "id":7,
            "name":"K128 conectado",
            "type":1,
            "booleanValue":"true",
            "integerValue":null
          }
        ],
        "activeItemConditions":null,
        "passiveItemConditions":null
      },
      {
        "id":4,
        "triggerType":0,
        "triggerSubType":2,
        "beenTriggered":"false",
        "actionId":null,
        "locationId":null,
        "itemId":null,
        "characterId":null,
        "enabled":"true",
        "effects":[
          {
            "id":1,
            "type":1003,
            "passiveGameItems":null,
            "passiveGameLocations":null,
            "passiveGameNPCs":null,
            "passiveGameTriggers":null,
            "passiveGameFlags":null,
            "newIntegerValue":-8,
            "newBooleanValue":null,
            "newStringValue":null,
            "message":null
          }
        ],
        "conditionalFlags":[
          {
            "id":6,
            "name":"Fuera base",
            "type":1,
            "booleanValue":"false",
            "integerValue":null
          },
          {
            "id":7,
            "name":"K128 conectado",
            "type":1,
            "booleanValue":"false",
            "integerValue":null
          }
        ],
        "activeItemConditions":null,
        "passiveItemConditions":null
      }
    ],
    "automaticCounter":true,
    "enabled":false
  },
  ...
]


Los atributos de los que se compone la clase son los siguientes.
  • id. Identificador numérico único del contador. 
  • name. Nombre del contador, usado sólo para mejorar la legibilidad de la definición de los contadores. 
  • counterType. Tipo de contador. Los contadores pueden pertenecer a uno de los cuatro tipos definidos -COUNTER_REGULAR_INCREASE, COUNTER_REGULAR_DECREASE, COUNTER_INDEFINITE_INCREASE y COUNTER_INDEFINITE_DECREASE- en función de su aumentan o disminuyen su valor y si tienen un valor límite definido. 
  • initialValue. Valor inicial del contador. 
  • currentValue. Valor actual del contador. 
  • limitValue. Valor límite al que puede llegar el contador en caso de ser de tipo COUNTER_REGULAR_INCREASE o COUNTER_REGULAR_DECREASE. Al llegar a este valor se activarán los disparadores definidos en el atributo correspondiente. 
  • onStartTriggers, onCancelTriggers.Pendientes de implementación, contendrán los disparadores que se activarán al iniciar o cancelar el contador. 
  • onLimitReachedTriggers. Array de disparadores que se activarán cuando currentValue tenga el mismo valor que limitValue.
  • automaticCounter. Atributo booleano que indica si el contador debe actualizarse de manera automática durante la secuencia de ejecución del turno. Un contador no automático deberá actualizarse mediante efectos.
  • enabled. Atributo booleano que indica si el contador está habilitado.
El funcionamiento de un contador automático está relacionado con el proceso de ejecución del turno.

Cuando el jugador solicita la ejecución de una acción -como moverse o usar un objeto- se inicia la secuencia de ejecución del turno. El segundo paso de este proceso es la actualización de los contadores automáticos -siendo la primera el análisis de la orden introducida por el jugador, por ahora no profundizaremos en esto- mediante la llamada al método pingCounter( ) definido en la clase Counter.java.
Este método actualizará el atributo currentValue del contador y lo comparará con el valor de limitValue. Si son iguales, devolverá el valor true, de modo que desde el proceso de ejecución del turno se sabrá que se deben activar los disparadores definidos en onLimitReachedTriggers.

Hay que tener en cuenta, sin embargo , que cierto tipo de acciones consideradas "rápidas" -examinar un objeto o personaje, solicitar el listado de salidas e inventario y la acción "mirar"- harán que el proceso de ejecución del turno se salte este paso, por lo que no actualizarán los contadores automáticos.

Y esto es todo por hoy, en la próxima entrada aprenderemos a matar a un personaje.
Ale, a contar.

No comments: