Referência de campos para a definição de módulos e campos adicionais
Referência de campos para a definição de módulos e campos adicionais
Tanto a definição de módulo quanto as extensões para templates integrados são implementadas através da escrita de uma declaração de campos editáveis em module.json
. Uma declaração é um array de objetos, com cada objeto sendo um campo editável. Vamos olhar o módulo ct.place
e o seu módulo module.json
(veja o array de fields
):
{
"main": {
"name": "ct.place",
"version": "3.1.0",
"authors": [{
"name": "Cosmo Myzrail Gorynych",
"mail": "admin@nersta.ru"
}]
},
"fields": [{
"name": "Partitioning",
"type": "h2"
}, {
"name": "Grid size X",
"help": "Tells ct.place how to spacially group copies. This should be at least as large as the horizontal side of the biggest colliding sprite of your game.",
"key": "gridX",
"default": 512,
"type": "number"
}, {
"name": "Grid size Y",
"help": "Tells ct.place how to spacially group copies. This should be at least as large as the vertical size of the biggest colliding sprite of your game.",
"key": "gridY",
"default": 512,
"type": "number"
}, {
"name": "Debug mode",
"type": "h2"
}, {
"name": "Enable",
"help": "Displays collision shapes, collision groups and partitions. It will also write additional keys to most colliding objects. Doesn't work on hidden objects.",
"key": "debugMode",
"default": false,
"type": "checkbox"
}, {
"name": "Debug text size",
"key": "debugText",
"default": 16,
"type": "number"
}]
/* ... */
}
Então um campo é um objeto com essa interface:
declare interface IExtensionField {
name: string, // O nome exibido.
type: string, // O tipo do campo
key?: string, // O nome de uma chave JSON a ser escrita em`opts.entity`. Não é necessário para os tipos hN, como por exemplo, h1, h2, h3 e por aí vai, mas caso contrário é obrigatório
default?: any, // O valor padrão; não é escrito para o `opts.entity`, mas é mostrado nas entradas.
help?: string, // Uma descrição sobre o propósito do campo
options?: Array<{ // Usado com type === 'radio' e type === 'select'.
value: any,
name: string,
help?: string
}>,
if?: string, // Diz para mostrar este campo apenas se um outro campo neste módulo estiver definido (ou true-ish)
fields?: Array<IExtensionField>, // São para type === 'table'
arrayType?: string, // O tipo de campo usado para o editor de array (quando `type` é um 'array').
// Ele suporta um subconjunto de campos midfificáveis,
// excluindo headers, groups, tables, icons, radio, select, and arrays.
// Esses três são usados com type === 'number', 'slider', ou 'sliderAndNumber'
min?: number,
max?: number,
step?: number
// Esses são usados com type === 'group'
openedByDefault: boolean,
lsKey: string,
items: Array<IExtensionField>
}
Aqui nós marcamos um campo opcional na forma de key?: type
. Os campos obrigatórios são name
e type
. O primeiro é um rótulo de texto que é mostrado antes de um campo de entrada; o último é uma string que define o método de entrada exibida para um usuário. It can be one of these strings:
input
— uma entrada de texto simples para strings curtas;textfield
— uma grande área de texto para uma entrada longa;code
— semelhante aotextfield
, mas com uma fonte monospace e normalmente mais larga quetextfield
;number
— um campo de entrada para inteiros;slider
— um slider (também conhecido como range) para campos de entrada que são melhores inseridas com o mouse;sliderAndNumber
— mostra um slider e um número em uma linha;checkbox
— um checkbox para variáveis deslizantes;radio
— uma lista de valores predefinidos para escolha. Esse tipo também requer que um array deoptions
seja definido;select
— um dropdown (lista suspensa) com uma lista de valores predefinidos. Requer que um array deoptions
seja definido. Se qualquer opção tem um valor igual à''
(uma string vazia), então essa opção ficará em branco e não será selecionável, atuando com um separador;texture
,template
,room
,sound
,tandem
— um link para um asset em um projeto;point2D
— mostra um par de entradas numéricas com os rótulos X e Y. Armazena os valores como um array de dois números;h1
,h2
,h3
andh4
. Eles realmente não são para qualquer entrada, mas exibem um cabeçalho para categorizar campos na aba catmod's settings. Esses campos requerem apenastype
ename
;array
— série editável de valores simples. Requer quearrayType
seja definido;table
— série editável de objetos complexos em forma de tabela. Requer quefields
seja definido.
Para configurações, a key
do campo deve ser única para um módulo. Para campos estendidos de templates e outros assets, ele deve ser único em toda a base de código do usuário, então, nomear uma chave na forma de mymodMyfieldname
é uma boa ideia.
Ajustes adicionais para entrandas numéricas e de range (intervalo)
number
, slider
, sliderAndNumber
são tipos de entrada que aceitam campos adicionais para definir restrições na entrada:
min
— o valor mínimo permitido;max
— o valor máximo permitido;step
— o tamanho do passo para as entradas numéricas e de slider. Os usuários ainda podem inserir valores arbitrários nos campos de entrada numérica.
Adicionando entradas de radio
Você pode apresentar várias opções de entrada para os seus usuários em um grupo e permitir que ele escolha apenas uma. Isso pode ser feito com o tipo de entrada radio
e requer um array de options
que descreve os valores possíveis e os seus rótulos:
{
"main": {
...
},
"fields": [{
"name": "List name",
"type": "radio",
"key": "variable",
"id": "variable",
"default": "value1",
"options": [{
"value": "value1",
"name": "First value",
"help": "A little hint that will go right after the first variant"
}, {
"value": "value2",
"name": "Second value",
"help": "A little hint that will go right after the second variant"
}, {
...
}]
}]
}
Tabelas
As tabelas permitem que os usuários descrevam um array de entidades de uma estrutura específica. Os usuários podem adicionar/remover linhas e reorderná-las. A tabelas aninhadas são suportadas, embora a aparência seja terrível.
Um campo de tabela é definido simplesmente definindo o tipo de campo para table
. Esses campos são descritos em um array de fields
, da mesma forma que você define campos para todo o módulo.
Exemplo: Definições iniciais do catmod ct.splashscreen
{
"main": {
/* … */
},
/* Dois campos regulares vêm primeiro*/
"fields": [{
"name": "Slide duration, ms",
"key": "slideDuration",
"default": 3000,
"type": "number",
"min": 0
}, {
"name": "Transition duration, ms",
"key": "transitionDuration",
"default": 1000,
"type": "number",
"min": 0
}, {
"name": "Slides",
"key": "slides",
/* um campo com o "type": "table" define uma tabela de controle */
"type": "table",
"default": [],
/* Os campos das tabelas são descritos aqui */
"fields": [{
"name": "Logo texture",
"key": "texture@@texture",
"default": -1,
"type": "texture"
}, {
"name": "Effect",
"key": "effect",
"type": "select",
"default": "none",
"options": [{
"value": "none",
"name": "None"
}, {
"value": "zoomIn",
"name": "Zoom in"
}, {
"value": "zoomOut",
"name": "Zoom out"
}]
}]
}]
}
Valores padrão para as tabelas
Para a prṕria tabela, a chave default
deve ser um array de elementos padrão nele. Cada elemento é um objeto com entradas "key": "value"
. Você pode pôr um array vazio []
se você não precisa definir elementos padrão.
Para campos das tabelas, a chave default
define os valores padrão para as linhas recém-adicionadas.
Unwrapping UIDs de templates e texturas
Quando você dfine um campo com o tipo texture
ou template
e um usuário escolhe um asset para esse campo, um UID de recurso é armazenado. Para dizer ao ct.js para transformar esse UID em um nome de um asset específico, você deve adicionar o sufixo @@assetType
, escrevendo o tipo correto de asset:
yourVarName@@template
para templates;yourVarName@@texture
para texturas.
Valor exportado será então o nome de um asset, como é mostrado na e IDE e é normalmente usado no código.
Isso funciona para injeções e para extensões de assets. Para injeções, se você tem uma key
na forma de yourVarName@@assetType
, as correspondências com /*%yourVarName%*/
ou %yourVarName%
serão substituídas.
Campos de grupos
Você pode criar um grupo recolhível de campos definido o parâmetro type
de um campo para group
. Isso ajuda a economizar espaço nos editores de tipo e de room ou simplesmente ocultar campos menos usados.
O tipo group
requer três propriedades adicionais para serem definidas:
openedByDefault
— se ou não o painel deve ser aberto por padrão.lsKey
— uma chave no armazenamento local para armazenar se um usuário deixou este grupo aberto ou não. Deve ser único, e é recomendado que contenha o nome do seu módulo para evitar colisões com outros módulos.items
— o array de campos dentro de um grupo. Esses são os mesmos campos que você definiria fora.
Exemplo: criando um campo regular e um grupo de campos para templates ct.js
// ...
"templateExtends": [
{
"name": "Create a hoverboard",
"type": "checkbox",
"key": "createHoverboard",
"default": false
}, {
"name": "Hoverboard properties",
"type": "group",
"openedByDefault": false,
"lsKey": "hoverboards.advancedProperties",
"items": [{
"name": "Speed, mps",
"type": "number",
"key": "hoverboardSpeed",
"default": 100
}, {
// Um outro campo pode ser definido aqui
}, {
// E qualquer quantidade de outros mais
}]
}
]
// ...