Monday, March 18, 2019

Mientras tanto, en Plutón...

Si las localizaciones son la columna vertebral de una aventura los objetos son, no sé, el fluido linfático. Sí, por qué no.

Objetos orientados a objetos

Como ya hicimos con la definición de las localizaciones, vamos a comparar cómo se definían los objetos en la versión primitiva y actual del motor.

En tiempos remotos los objetos se definían en el archivo game_items.xml, que tenía este aspecto:

<items>
   <item>
      <itemId>1</itemId>
      <itemName>Pila</itemName>
      <itemDescription>Una pila eléctrica, un místico artefacto capaz de dar energía a ciertos objetos.</itemDescription>
      <itemLocationText> En el suelo puedes ver una pila.</itemLocationText>
      <itemType>0</itemType>
      <itemLocation>10</itemLocation>
      <characterDialog> </characterDialog>
   </item>
   <item>
      <itemId>2</itemId>
      <itemName>Linterna</itemName>
      <itemDescription>Una linterna, es capaz de dar luz en lugares oscuros... si dispusiese de una fuente de energía.</itemDescription>
      <itemLocationText> En el suelo puedes ver una linterna.</itemLocationText>
      <itemType>0</itemType>
      <itemLocation>0</itemLocation>
      <characterDialog> </characterDialog>
   </item>
...
</items>

Una definición bastante sencilla con un identificador único, un nombre, dos descripciones -una, itemDescription, para cuando el objeto se examina y otra, itemLocationText, para añadir al texto descriptivo de la localización en la que está el objeto-, un identificador de tipo de objeto -en este caso 0, correspondiente a los objetos que pueden ser añadidos al inventario-, el identificador de la localización en la que se encuentra el objeto y el diálogo que se mostrará cuando el jugador hable con el objeto porque de aquella los personajes se consideraban objetos y sólo tenían una línea de diálogo posible. Sí eran tiempos oscuros.

Ahora la definición de los objetos va en el archivo game_items.json y es considerablemente más densa. Los mismos objetos "pila" y "linterna" tienen ahora este aspecto:

[
  {
    "id":1,
    "names":["Linterna"],
    "description":"Una linterna, es capaz de dar luz en lugares oscuros... si dispusiese de una fuente de energía.",
    "onLocationDescription":"En el suelo puedes ver una linterna.",
    "itemListDescription":"Una linterna, es capaz de dar luz en lugares oscuros... si dispusiese de una fuente de energía.",
    "location":0,
    "inventariable":"true",
    "movable":null,
    "pushable":null,
    "pullable":null,
    "weight":1,
    "lightSource":0,
    "noisy":null,
    "noiseDescription":null,
    "onPickTriggers":null,
    "onDropTriggers":null,
    "onActionTriggers":[
        {
            "id":1,
            "triggerType":1,
            "triggerSubType":0,
            "beenTriggered":"false",
            "actionId":18,
            "locationId":null,
            "itemId":1,
            "characterId":null,
            "enabled":"true",
            "effects":[
              {
                "id":1,
                "type":1001,
                "passiveGameItems":null,
                "passiveGameLocations":null,
                "passiveGameNPCs":null,
                "passiveGameTriggers":null,
                "passiveGameFlags":null,
                "newIntegerValue":null,
                "newBooleanValue":null,
                "newStringValue":"Enciendes la linterna. Un haz de luz emerge de uno de sus extremos.",
                "message":null
              },
              {
                "id":2,
                "type":131,
                "passiveGameItems":[1],
                "passiveGameLocations":null,
                "passiveGameNPCs":null,
                "passiveGameTriggers":null,
                "passiveGameFlags":null,
                "newIntegerValue":2,
                "newBooleanValue":null,
                "newStringValue":null,
                "message":null
              }
            ],
            "conditionalFlags":[
              {
                "id":1,
                "name":"Pila en linterna",
                "type":1,
                "booleanValue":"true",
                "integerValue":null
              }
            ],
            "activeItemConditions":null,
            "passiveItemConditions":null
        },
        {
            "id":2,
            "triggerType":1,
            "triggerSubType":0,
            "beenTriggered":"false",
            "actionId":19,
            "locationId":null,
            "itemId":1,
            "characterId":null,
            "enabled":"true",
            "effects":[
              {
                "id":1,
                "type":1001,
                "passiveGameItems":null,
                "passiveGameLocations":null,
                "passiveGameNPCs":null,
                "passiveGameTriggers":null,
                "passiveGameFlags":null,
                "newIntegerValue":null,
                "newBooleanValue":null,
                "newStringValue":"Apagas la linterna.",
                "message":null
              },
              {
                "id":2,
                "type":131,
                "passiveGameItems":[1],
                "passiveGameLocations":null,
                "passiveGameNPCs":null,
                "passiveGameTriggers":null,
                "passiveGameFlags":null,
                "newIntegerValue":0,
                "newBooleanValue":null,
                "newStringValue":null,
                "message":null
              }
            ],
            "conditionalFlags":[
              {
                "id":1,
                "name":"Pila en linterna",
                "type":1,
                "booleanValue":"true",
                "integerValue":null
              }
            ],
            "activeItemConditions":null,
            "passiveItemConditions":null
        }
    ],
    "onExamineTriggers":null,
    "visibility":1,
    "image":"item.png",
    "largeImage":null,
    "implicit":false
  },
  {
    "id":2,
    "names":["Pila eléctrica","pila electrica","pila"],
    "description":"Una pila eléctrica.",
    "onLocationDescription":"Puedes ver una pila.",
    "itemListDescription":"Una pila eléctrica.",
    "location":10,
    "inventariable":"true",
    "movable":null,
    "pushable":null,
    "pullable":null,
    "weight":1,
    "lightSource":0,
    "noisy":null,
    "noiseDescription":null,
    "onPickTriggers":null,
    "onDropTriggers":null,
    "onActionTriggers":[
      {
        "id":1,
        "triggerType":1,
        "triggerSubType":0,
        "beenTriggered":"false",
        "actionId":16,
        "locationId":null,
        "itemId":1,
        "characterId":null,
        "enabled":"true",
        "effects":[
          {
            "id":1,
            "type":1001,
            "passiveGameItems":null,
            "passiveGameLocations":null,
            "passiveGameNPCs":null,
            "passiveGameTriggers":null,
            "passiveGameFlags":null,
            "newIntegerValue":null,
            "newBooleanValue":null,
            "newStringValue":"Metes la pila en la linterna",
            "message":null
          },{
            "id":2,
            "type":136,
            "passiveGameItems":[2],
            "passiveGameLocations":null,
            "passiveGameNPCs":null,
            "passiveGameTriggers":null,
            "passiveGameFlags":null,
            "newIntegerValue":null,
            "newBooleanValue":true,
            "newStringValue":null,
            "message":null
          },{
            "id":3,
            "type":401,
            "passiveGameItems":null,
            "passiveGameLocations":null,
            "passiveGameNPCs":null,
            "passiveGameTriggers":null,
            "passiveGameFlags":[1],
            "newIntegerValue":null,
            "newBooleanValue":true,
            "newStringValue":null,
            "message":null
          }
        ],
        "conditionalFlags":[
          {
            "id":1,
            "name":"Pila en linterna",
            "type":1,
            "booleanValue":"false",
            "integerValue":null
          }
        ],
        "activeItemConditions":null,
        "passiveItemConditions":null
      },
      {
        "id":2,
        "triggerType":1,
        "triggerSubType":0,
        "beenTriggered":"false",
        "actionId":17,
        "locationId":null,
        "itemId":1,
        "characterId":null,
        "enabled":"true",
        "effects":[
          {
            "id":1,
            "type":1001,
            "passiveGameItems":null,
            "passiveGameLocations":null,
            "passiveGameNPCs":null,
            "passiveGameTriggers":null,
            "passiveGameFlags":null,
            "newIntegerValue":null,
            "newBooleanValue":null,
            "newStringValue":"Sacas la pila de la linterna",
            "message":null
          },{/
            "id":2,
            "type":136,
            "passiveGameItems":[2],
            "passiveGameLocations":null,
            "passiveGameNPCs":null,
            "passiveGameTriggers":null,
            "passiveGameFlags":null,
            "newIntegerValue":null,
            "newBooleanValue":false,
            "newStringValue":null,
            "message":null
          },{
            "id":3,
            "type":401,
            "passiveGameItems":null,
            "passiveGameLocations":null,
            "passiveGameNPCs":null,
            "passiveGameTriggers":null,
            "passiveGameFlags":[1],
            "newIntegerValue":null,
            "newBooleanValue":false,
            "newStringValue":null,
            "message":null
          },{
            "id":4,
            "type":131,
            "passiveGameItems":[1],
            "passiveGameLocations":null,
            "passiveGameNPCs":null,
            "passiveGameTriggers":null,
            "passiveGameFlags":null,
            "newIntegerValue":0,
            "newBooleanValue":false,
            "newStringValue":null,
            "message":null
          }
        ],
        "conditionalFlags":[
          {
            "id":1,
            "name":"Pila en linterna",
            "type":1,
            "booleanValue":"true",
            "integerValue":null
          }
        ],
        "activeItemConditions":null,
        "passiveItemConditions":null
      }
    ],
    "onExamineTriggers":null,
    "visibility":1,
    "image":"item.png",
    "largeImage":null,
    "implicit":false
  },

...
]

Sí, explicar todo esto me va a llevar unas cuantas entradas. Pero no nos precipitemos y demos un repaso a los atributos que tienen en común.

  • id. Correspondería al itemId, el identificador único del objeto.
  • names. En lugar de un nombre único ahora se define una lista de nombres, de modo que el jugador pueda escribir uno de esos nombres cuando introduzca una instrucción para ser ejecutada. En el ejemplo actual el jugador podría escribir la instrucción "coger pila", "coger pila eléctrica" o "coger pila electrica" obteniendo el mismo resultado al ejecutarla.
  • description, itemListDescription. Se corresponden con itemDescription. El primer valor se muestra al examinar el objeto, el segundo valor es opcional y muestra una descripción más detallada si se está usando la opción de mostrar los objetos examinados desde el panel de objetos a pantalla completa.
  • onLocationDescription. Se corresponde a itemLocationText.
  • location. Correspondiente a itemLocation, la localización donde se encuentra el objeto. Si el valor de este atributo es 0 el objeto se encontrará en el inventario del jugador. Si es menor que 0, normalmente -1, el objeto no estará en ninguna localización ni en el inventario del jugador, no existiendo a efectos prácticos.

Como se puede ver ni el tipo de objeto ni el diálogo existen, debido a que la "inventariabilidad" -sí, me lo acabo de inventar- del objeto ahora se maneja de manera diferente y a que los personajes tienen ahora su propia definición y tratamiento.

Pero todo eso es otra historia...

No comments: