Programando em Zig
O Turian é escrito em Zig e seus scripts de jogo também são escritos em Zig — a mesma linguagem, o mesmo compilador, sem necessidade de aprender DSLs ou bindings.
Editores compatíveis
O Zig possui suporte para editores através do Zig Language Server (zls):
| Editor | Configuração |
|---|---|
| Zed | Suporte integrado ao Zig — instale o binário do Zig e o Zed o detectará automaticamente. |
| VS Code | Instale a extensão ziglang.vscode-zig. |
| Neovim | Use o zls com sua configuração LSP. |
| Helix | Suporte integrado ao Zig. |
| IntelliJ | O plugin do Zig oferece suporte à linguagem. |
O mesmo zls alimenta todos eles, oferecendo preenchimento automático (autocompletion), ir para definição (go-to-definition), visualização de tipos ao passar o mouse (hover types) e erros em linha (inline errors), independentemente de qual editor você escolher.
Conceitos básicos do Zig
O Zig é uma linguagem de programação de sistemas de uso geral, sem fluxo de controle oculto, sem alocações de memória ocultas e sem garbage collector. Conceitos fundamentais que você encontrará:
Structs como blocos de construção
Não existem classes. Um componente é uma struct simples:
pub const Health = struct {
pub const is_component = true;
max: f32 = 100.0,
current: f32 = 100.0,
};
O marcador pub const is_component = true; é o que diz à engine para considerar esta struct como um componente que pode ser anexado a nós de cena. Sem ele, a struct é apenas um tipo comum do Zig — útil para dados internos, mas invisível para o editor e para o sistema de componentes.
Comptime
O Zig remove a barreira entre o tempo de compilação (compile-time) e o tempo de execução (run-time). A palavra-chave comptime permite executar código arbitrário durante a compilação — o Turian a utiliza para descoberta de componentes, resolução de GUIDs e abstrações de custo zero.
Sem alocações ocultas
std.heap.GeneralPurposeAllocator, arenas, alocadores de pilha (stack allocators) — você escolhe. O engine fornece alocadores através do contexto de Frame para que os scripts possam realizar alocações de forma transparente e previsível.
Tratamento de erros
Erros são valores, não exceções. As funções retornam uniões marcadas (tagged unions):
const file = try std.fs.cwd().openFile("config.json", .{});
defer file.close();
Zig em scripts do Turian
O código do seu jogo reside em arquivos .zig na pasta assets/ do seu projeto. Cada arquivo pode exportar uma ou mais structs de componente. O editor analisa sintaticamente o seu código-fonte (e não por expressões regulares) para descobrir os marcadores pub const is_component = true — apenas structs com esse marcador são consideradas componentes.
O engine é importada como um único módulo:
const engine = @import("engine");
Isso concede a você acesso ao engine.Vec3, engine.Time, engine.Frame, engine.GameObjectRef e a todos os tipos integrados — exatamente a mesma API que o próprio engine utiliza. Não há uma camada de abstração entre o código do usuário e o código do engine.
Consulte o Tutorial para um passo a passo sobre como escrever seu primeiro componente.