GDD
Game Data Description (GDD) é um módulo que permite que dados de um jogo descritos em arquivos *.gdd sejam carregados dinamicamente para o jogo a que pertencem. Esses arquivos seguem uma sintaxe que permite abstrações genéricas dos eventuais dados que um jogo pode ter.
Especificação de arquivos GDD
O arquivo GDD é lido linha a linha, em modo texto.
Cada item do arquivo começa em um começo de linha, com um caractere de controle identificador, seguido de uma tag identificadora (um nome ou tipo) na mesma linha, separada do caractere de controle por 0 ou mais espaços. Seguidos a essa tag, estão outras tags que representam argumentos ou entradas, separadas por espaços, e possivelmente agrupadas por chaves [ ]. Tags são strings utf-8 que não contém caracteres de final de linha. Tags que contêm espaços são escritas dentro de aspas duplas " " , dentro dessas tags, o caractere de escape é a barra invertida \ , por exemplo, a tag "abc\"def\\" representa abc"def\. Na versão 1.0 da especificação, os caracteres de controle são # $ @ + ou %
Itens que compõem um arquivo GDD
Comentários de Linha
#comentário
Comentários são descrições ignoradas por qualquer parser de GDD. O comentário dura até o final da linha.
Dados
$data_name
Uma descrição é composta de vários dados, todo outro item deve estar contido em um dado. Dados usam o caractere de controle $ para marcar seu início, e engloba os itens seguintes, até o começo de outro dado, ou o final do arquivo.
Dados devem ser identificadaos com um nome, e não podem conter outros dados. Dados podem conter uma (e no máximo uma) corrente.
futuramente, dados talvez possam receber parâmetros e condições de leitura
Propriedades
@prop_name prop_arg_1 prop_arg_2 .. prop_arg_n
Propriedades são componentes constantes no dado. Elas são identificadas pelo seu nome, e contém argumentos.
A Corrente (de anéis)
+ring_1_type [r1_entry_1_type r1_entry_1_arg_1 .. r1_entry_1_arg_n] .. [r1_entry_m_type r1_entry_m_arg_1 .. r1_entry_m_arg_n] +ring_2_type [r2_entry_1_type r2_entry_1_arg_1 .. r2_entry_1_arg_n] .. [r2_entry_m_type r2_entry_m_arg_1 .. r2_entry_m_arg_n] . . +ring_k_type [rk_entry_1_type r1=k_entry_1_arg_1 .. rk_entry_1_arg_n] .. [rk_entry_m_type rk_entry_m_arg_1 .. rk_entry_m_arg_n]
Correntes são sequências de anéis, cada dado pode conter uma corrente, localizada depois das propriedades, e que descreve a componente sequencial do dado ao qual ela pertence. A ordem dos anéis é importante em uma corrente.
Anéis
+ring_type [entry_1_type entry_1_arg_1 .. entry_1_arg_n] .. [entry_m_type entry_m_arg_1 .. entry_m_arg_n]
Anéis são "instantes" de uma corrente. Um anel contém várias entradas encapsuladas com chaves [ ], entradas têm a mesma seintaxe e semântica de propriedades, mas são aplicadas apenas ao anel ao qual elas pertencem. A ordem das entradas não importa em um anel.
Corrente Simples
%rings_type [header_entry_1_arg_1 ..] .. [header_entry_m_arg_1 ..] ring_1_entry ring_2_entry .. ring_k_entry
Correntes simples são um syntax sugar de correntes compostas principalmente de anéis simples. Uma corrente simples tem um header com várias entradas que serão aplicadas a cada anel desta corrente, e os anéis em si contém apenas uma entrada distinta cada.
Sintaxe Semi-formal
Segue uma especificação semi-formal da sintaxe GDD:
description ::= --empty-- | data description data ::= $ identifier property_list chain property_list ::= --empty-- | property property_list property ::= @ identifier arg_list chain ::= --empty-- | ring chain | simple_chain chain simple_chain ::= % identifier entry_list arg_list ring ::= + identifier entry_list entry_list ::= --empty-- | entry entry_list entry ::= [ identifier arg_list ] arg_list ::= --empty-- | value arg_list identifier ::= alnum+ value ::= token+ token ::= alnum | [_.-] alnum ::= [A-Za-z0-9]
Exemplos
hero_animation.gdd
$WALKING %frame 2 12 22 32 42 # n: frame number (int) # a: alpha (float) # c: color (hexadecimal) # p: position (float)(float) # m: mirror (boolean)(boolean) # s: size (float)(float) # r: rotation (float) $DANCING %frame [a 0.8] 5 15 25 35 45 $RANDOM @fps 75 @compose +frame [n 10] [a 1.0] [c 0x808080] [p 1.0 -1.0] [r 180] +effect [a 0.6] +frame [n 11] [a 1.0] [c 0x808080] [p 1.0 -1.0] [r 180] +effect [a 0.3] +frame [n 12] [a 1.0] [c 0x808080] [p 1.0 -1.0] [r 180] $HERO @animation_set "hero.gdd" @spritesheet "hero_"
Nota: esse próximo exemplo requer algumas mudanças na especificação, namely: mistura de chains e simple chains, anel do tipo "halt"
statue.gdd
$STANDING @hp 3 @spritesheet statue.png @default_image_index 0 $DESTROYED # Has 3 steps, depending on the statue's hp. At the end, it must become a floor tile. @variable_property hp +halt [lesser_than hp 3] %frame 1 2 3 4 5 6 7 8 9 10 +halt [lesser_than hp 2] %frame 11 12 13 14 15 16 17 18 19 20 +halt [lesser_than hp 1] %frame 21 22 23 24 25 +action "become floor_with_debris"