Moduli di configurazione

Il modulo che uno script dichiara prima dell'esecuzione: campi numero, testo, casella, selezione, colore, pennello e palette.

Uno script può dichiarare un piccolo modulo che viene mostrato prima della sua esecuzione. Ciò che l'utente compila arriva come tabella app.config, indicizzata per l'id di ciascun campo. I campi sono semplici dati (uno script non descrive mai l'interfaccia) e l'editor li mostra e li convalida. Colori, pennelli e palette sono il modo in cui uno script chiede qualcosa dalle cose dell'utente: il motore non legge mai le sue librerie, quindi lo script riceve esattamente ciò che l'utente sceglie.

  • number — Un campo numerico. In Lua: number. Opzioni: default (Il valore iniziale.); min (Il valore minimo consentito.); max (Il valore massimo consentito.); optional (Consente di lasciarlo vuoto.); randomMin / randomMax (L'intervallo da cui pesca Casuale, dentro min..max (predefinito min..max; senza entrambi i limiti Casuale lo lascia stare). Numeri interi quando lo sono i limiti e il valore predefinito.); randomize (false mantiene il valore quando l'utente rende casuale il modulo.).
  • text — Una riga di testo. In Lua: string. Opzioni: default (Il testo iniziale.); optional (Consente di lasciarlo vuoto.).
  • checkbox — Un interruttore acceso/spento. In Lua: boolean. Opzioni: default (Se parte selezionato.); randomize (false mantiene il valore quando l'utente rende casuale il modulo.).
  • select — Una scelta da un elenco fisso. In Lua: string (il valore dell'opzione scelta). Opzioni: options (Le scelte, ciascuna { value, label }.); default (Il valore selezionato all'inizio.); randomize (false mantiene la scelta quando l'utente rende casuale il modulo.).
  • color — Un colore, scelto con il selettore colori dell'editor, con la palette dello sprite e i colori recenti a portata di clic. Dai a ogni ruolo il suo campo (foglia chiara, foglia scura, corteccia...) e l'utente li sceglie tutti. In Lua: string, "#rrggbb" (o "#rrggbbaa" con alfa), accettata direttamente ovunque serva un colore. Opzioni: default (Il colore iniziale, "#rrggbb" o "#rrggbbaa" (nero se omesso).); randomize (true permette a Casuale di scegliere anche un colore (mantiene l'alfa). Disattivato di default: i colori della maggior parte degli script sono calibrati.).
  • brush — Uno dei pennelli salvati dell'utente, scelto dalla sua libreria di pennelli. In Lua: table { name, width, height, mask }: passala ad app.defineBrush; assente se opzionale e lasciata vuota. Opzioni: optional (Consente di lasciarlo vuoto (allora app.config.<id> è nil).).
  • palette — Una delle palette salvate dell'utente, scelta dalla sua libreria di palette. In Lua: lista di stringhe "#rrggbb" (o "#rrggbbaa"): passala ad app.setPalette, oppure scegli al suo interno con la matematica dei colori; assente se opzionale e lasciata vuota. Opzioni: optional (Consente di lasciarla vuota (allora app.config.<id> è nil).).

Modulo di esempio (JSON) e lo script che lo usa:

{
  "fields": [
    {
      "id": "leafLight",
      "type": "color",
      "label": "Leaf (light)",
      "default": "#6cc24a"
    },
    {
      "id": "leafMid",
      "type": "color",
      "label": "Leaf (mid)",
      "default": "#3a8f4a"
    },
    {
      "id": "leafDark",
      "type": "color",
      "label": "Leaf (dark)",
      "default": "#23603a"
    },
    {
      "id": "barkLight",
      "type": "color",
      "label": "Bark (light)",
      "default": "#8a5a35"
    },
    {
      "id": "barkDark",
      "type": "color",
      "label": "Bark (dark)",
      "default": "#5a3a22"
    },
    {
      "id": "stamp",
      "type": "brush",
      "label": "Leaf brush",
      "optional": true
    }
  ]
}
local layer, frame = app.getActiveLayerId(), app.getActiveFrameId()
local c = app.config

-- trunk: two bark colors the user chose
app.drawRectangle(layer, frame, 14, 20, 17, 31, { color = c.barkDark, fill = "filled" })
app.drawRectangle(layer, frame, 14, 20, 15, 31, { color = c.barkLight, fill = "filled" })

-- canopy: three leaf colors, with the user's own brush if they picked one
if c.stamp then app.defineBrush("leaf", c.stamp) end
for i, color in ipairs({ c.leafDark, c.leafMid, c.leafLight }) do
  app.drawStroke(layer, frame, { { 8, 18 - i * 4 }, { 24, 18 - i * 4 } },
    { color = color, brush = c.stamp and "leaf" or nil, brushSize = 4 })
end

Ramificazione

Qualsiasi campo può avere un when — { "<earlier field id>": [values] } — e allora viene mostrato solo finché ogni select indicato ha uno di quei valori di opzione (o ogni checkbox è true/false) ed è a sua volta mostrato. Le condizioni guardano solo select e checkbox precedenti, quindi si concatenano a qualsiasi profondità: cambia la radice e tutto il suo ramo si nasconde. Un campo nascosto non compare in app.config, quindi lo script ripiega sul proprio valore predefinito: leggi ogni campo come opzionale.

{
  "fields": [
    {
      "id": "kind",
      "type": "select",
      "label": "Kind",
      "options": [
        {
          "value": "broadleaf",
          "label": "Broadleaf"
        },
        {
          "value": "conifer",
          "label": "Conifer"
        }
      ],
      "default": "broadleaf"
    },
    {
      "id": "crown",
      "type": "select",
      "label": "Crown",
      "options": [
        {
          "value": "round",
          "label": "Round"
        },
        {
          "value": "weeping",
          "label": "Weeping"
        }
      ],
      "when": {
        "kind": [
          "broadleaf"
        ]
      }
    },
    {
      "id": "droop",
      "type": "number",
      "label": "Droop",
      "min": 0,
      "max": 100,
      "randomMin": 20,
      "randomMax": 80,
      "when": {
        "crown": [
          "weeping"
        ]
      }
    },
    {
      "id": "tiers",
      "type": "number",
      "label": "Tiers",
      "min": 2,
      "max": 12,
      "when": {
        "kind": [
          "conifer"
        ]
      }
    },
    {
      "id": "newLayer",
      "type": "checkbox",
      "label": "Draw on a new layer",
      "randomize": false
    }
  ]
}

Casuale

Ogni modulo ha un pulsante Casuale. Estrae ogni numero entro randomMin..randomMax (predefinito min..max; un numero senza entrambi i limiti resta com'è), sceglie un'opzione qualsiasi dei select e inverte i checkbox; i colori vengono estratti solo con randomize: true, mentre testo, pennelli e palette non vengono mai toccati. Imposta randomMin/randomMax sull'intervallo che continua a funzionare bene e randomize: false sulle impostazioni che non riguardano l'arte (nuovo livello, rispetta selezione...).

In Markdown: config-forms.md.