For the complete documentation index, see llms.txt. This page is also available as Markdown.

Conceptos básicos del lenguaje

Primitivas de CSL, enums, structs, clases, referencias y polimorfismo.

Esta página es el lado de “modelado de datos” de CSL: primitivas, structs/clases y los patrones que usarás para representar el estado del juego de forma limpia.

Si eres nuevo, empieza con Primeros pasos con CSL. Esta página asume que ya sabes declarar variables y escribir proc/método.

Tipos primitivos

Números y booleanos

  • Enteros con signo: s8, s16, s32, s64 (alias: int == s64)

  • Enteros sin signo: u8, u16, u32, u64 (alias: uint == u64)

  • Flotantes: f32 (alias: float), f64

  • Booleanos: bool

health: int = 100;
speed: float = 6.5;
is_dead: bool = false;

CSL amplía los números cuando es seguro: los enteros con signo más pequeños pueden convertirse en enteros con signo más amplios, los enteros sin signo más pequeños pueden convertirse en enteros sin signo más amplios, los enteros sin signo pueden convertirse en enteros con signo más amplios cuando el destino puede contener todo el rango, y f32 pueden convertirse en f64.

Cadenas

string se usa constantemente para IDs, nombres y formato.

item_id := "sword";
log_info("picked up %", {item_id});

Vectores

v2, v3, v4 son tipos matemáticos/de datos integrados:

Enumeraciones

Las enumeraciones son geniales para campos legibles de “modo/estado”:

Los valores de las enumeraciones suelen referenciarse con la abreviatura .VALUE cuando el compilador puede inferir el tipo de enumeración.

Structs (tipos por valor)

Usa structs para “datos simples” que quieras copiar fácilmente (configuración, pequeños blobs de estado, descriptores).

Los structs pueden heredar de otros structs. Los literales compuestos incluyen primero los campos heredados:

Cuándo usar un struct

  • Un objeto descriptor/configuración (*_Desc)

  • Estado pequeño e independiente que quieres copiar por valor

  • Datos que quieres incrustar dentro de otro tipo

Cuándo no usar un struct

  • Estado mutable grande compartido entre varios sistemas (usa una clase)

  • Objetos de “identidad” (jugadores, objetos, objetos de larga duración) (usa una clase)

Clases (tipos por referencia)

Las clases son tipos por referencia. Crea instancias con new(...).

Herencia

Puedes heredar de otros structs/clases:

Las clases derivadas heredan los valores predeterminados de los campos. Pueden sobrescribir los valores predeterminados heredados con field = value en el cuerpo de la clase:

Arreglos, slices y arreglos dinámicos

Verás tres formas comunes:

  • Arreglos fijos: [N]T (tamaño en tiempo de compilación)

  • Slices / arreglos administrados: []T (una vista de un arreglo)

  • Arreglos dinámicos: [..]T (lista redimensionable)

Ejemplo:

Para una guía completa, consulta Arreglos y colecciones.

Paso por referencia (ref)

Si un procedimiento necesita modificar un valor, usa ref:

Esto es especialmente útil para APIs de estilo “layout” que recortan/reducen progresivamente un rect:

Conversión de tipos

Usa expr.(T) o cast(T)expr:

Cuando el tipo de destino ya se conoce, expr.() y cast expr infieren el tipo de destino.

Polimorfismo de tipos (procs de estilo genérico)

CSL admite procedimientos polimórficos usando $ para deducir tipos en el sitio de llamada:

Tipos como valores (typeid)

typeid es un valor que representa un tipo en tiempo de ejecución y/o para llamadas polimórficas:

value.#type devuelve el tipo en tiempo de ejecución de un valor de clase. Úsalo antes de hacer downcasting desde una clase base cuando el tipo derivado exacto importe.

Directrices prácticas de modelado

  • El estado por jugador vive en Player. Si debe diferir entre jugadores, no debería ser global.

  • Prefiere structs pequeños para descriptores y almacena el estado en tiempo de ejecución en clases/componentes.

  • Ejecuta la jugabilidad en la ruta predicha compartida. No calcules el estado de jugabilidad solo bajo is_local() o protégelo con Game.is_server().

Para patrones específicos de jugador, consulta Añadir lógica de jugador. Para la parte ECS del mundo, consulta Entidades y componentes.

Última actualización