codeComenzando con CSL

CSL es el lenguaje de programación personalizado de All Out diseñado para hacer que escribir juegos multijugador sea tan fácil como crear juegos para un solo jugador.

CSL es el lenguaje de scripts personalizado de All Out. Es tipado estáticamente y se siente más similar a Go/Odin — excepto el estado del juego se sincroniza automáticamente desde el servidor hacia los clientes.

circle-info

No necesitas escribir RPCs, SyncVars o replicación personalizada. Concéntrate en la lógica de juego; la plataforma maneja la red por ti.

Tu primer script (main.csl)

Cuando creas un nuevo proyecto, All Out genera un main.csl en el scripts/ carpeta de tu proyecto.

import "core:ao"

// ============================================================================
// Ciclo de vida global
// ============================================================================

ao_before_scene_load :: proc() {
    // Registrar definiciones de objetos, monedas, etc.
    // Se ejecuta antes de que la escena sea creada.
}

ao_start :: proc() {
    // Llamado una vez cuando la escena comienza.
}

ao_update :: proc(dt: float) {
    // Llamado cada frame.
}

ao_late_update :: proc(dt: float) {
    // Llamado cada frame después de ao_update.
}

// ============================================================================
// Ciclo de vida del jugador
// ============================================================================

Player :: class : Player_Base {
    ao_start :: method() {
    }

    ao_update :: method(dt: float) {
    }

    ao_late_update :: method(dt: float) {
    }

    ao_end :: method() {
    }
}

Por ejemplo, registra un mensaje cuando cada jugador se une:

Si quieres una explicación más profunda de cuándo se ejecutan estas funciones, consulta Ciclo de vida del juego/frame.

Importaciones

Tu main.csl debería importar core:ao y cualquier carpeta que crees (como ui/, abilities/, etc).

circle-exclamation

Declaraciones (variables y constantes)

Las declaraciones enlazan un nombre a un valor.

Variables

Se puede omitir <tipo> o <expresión> :

Constantes

Las constantes usan :: y deben ser constantes en tiempo de compilación:

Esto es inválido (porque un no es constante en tiempo de compilación):

Tipos

Tipos primitivos

  • Enteros con signo: s8, s16, s32, s64

  • Enteros sin signo: u8, u16, u32, u64

  • Booleanos: b8, b16, b32, b64

  • Flotantes: f32, f64

  • Aliases:

    • int == s64

    • uint == u64

    • bool == b8

    • float == f32

  • Vectores: v2, v3, v4

  • string

  • typeid

  • any

Tipos vectoriales

v2, v3, y v4 tienen .x, .y, .z, .w campos float:

Estructuras y clases

Las structs son tipos por valor (se copian al asignar). Las clases son tipos por referencia (las asignas con new).

Structs (tipos por valor)

Clases (tipos por referencia)

Herencia

Structs/clases pueden heredar de otras structs/clases:

Procedimientos y métodos

Procedimientos (proc)

Los procedimientos son valores normales y pueden asignarse/almacenarse como cualquier otro valor:

Métodos (method)

Usa method() dentro de una struct/clase. Los métodos tienen un this implícito como parámetro de referencia.

Acceso a campos vs llamadas a métodos

Usa . para campos, -> para métodos:

circle-info

Cualquier procedimiento puede llamarse como “método” si su primer parámetro coincide con el tipo receptor. Este es un patrón común en CSL.

Arrays

CSL tiene algunos tipos “similares a arrays” que usarás constantemente:

  • Arrays fijos: [4]int

  • Slices / arrays gestionados: []T (a menudo usados como “vista de solo lectura” dentro de un array)

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

Los arrays dinámicos exponen .data, .count, y .capacity, y usan la sintaxis de llamada a método para operaciones:

Para una guía completa (incluidos los patrones de eliminación), consulta Arrays y Colecciones.

Flujo de control

If / else

Switch

While / for / foreach

Casting

Usa expr.(T) para castear:

Pasar por referencia: ref (preferido)

Cuando necesitas modificar un parámetro, prefiere ref sobre punteros crudos.

Callbacks: punteros a función + userdata (sin closures)

CSL no tiene closures. Inline proc(...) { ... } no puede capturar variables circundantes.

Para transportar contexto, empareja callbacks con un userdata: Object campo:

Información de tipos (tipos como valores)

typeid valores pueden pasarse a proc polimórficos:

Buenas prácticas (CSL en All Out)

  • Evita el estado global de juego. Se conectan múltiples jugadores — almacena el estado por jugador en Jugador en su lugar.

  • Separa la lógica cosmética de la lógica de juego. Usa is_local() para UI/partículas solo locales, y is_local_or_server() para entradas de juego que deben ejecutarse en el servidor + cliente local.

  • Predeterminados con prioridad móvil. No dependas de la entrada de teclado/ratón a menos que tu juego sea explícitamente enfocado a PC.

  • Si no estás seguro sobre la sintaxis o las APIs, revisa la api_reference/ carpeta generada en tu proyecto (contiene la última core.csl superficie).

Última actualización