FunctionLanguage 1.1.0
Documentación oficial completa de la 1.1.0: docs/README.md — guía, gramática, 474 FunctionComponents oficiales, 10 FunctionTags, Commands, CLI, VS Code y ejemplos.
Lenguaje de mods y FunctionPacks de CreativeImagination, creado por Andromeral Systems. El creador escribe un archivo .cif; el CLI o la extensión de VS Code producen un único .cipak. El jugador sólo copia ese archivo a la carpeta mods junto al ejecutable y entra al mundo.
Qué permite
- Declarar FunctionComponents y adjuntarlos a bloques nuevos.
- Modificar cualquier id de FunctionComponent registrado, oficial o de otro mod: propiedades públicas escalares que el motor consume, datos extensibles y hooks a eventos del juego. El cargador aplica los parches después de registrar todos los paquetes, con orden estable.
- Definir bloques con textura, solidez, gravedad, brillo y transparencia.
- Modificar cualquier FunctionTag registrado, oficial o de otro mod: descripción, ámbitos, rango, valor por defecto, completions, obligatoriedad, deprecación, política de merge y schema anidado. Los cambios afectan la validación, lectura y autocomplete del juego.
- Registrar FunctionTags de
item, block, world, player y structure, incluidos list y compound con schemas recursivos.
- Agregar música, funciones, comandos propios con argumentos tipados y eventos
worldOpening, worldReady, worldSaving, worldClosing.
- Ejecutar los comandos oficiales del juego desde funciones. FunctionTags pueden usarse mediante
/data, /give, /setblock y otros Commands que ya los admiten.
Los scripts invocan el sistema oficial Commands; los hooks usan EventBus y tienen límites de recursión/instrucciones. Los mods pueden modificar registros de cualquier componente, pero un dato nuevo no cambia automáticamente una mecánica que nunca lo lee. Para esos casos se usa una propiedad funcional existente, un hook de evento o se conecta un consumidor del motor. Por seguridad no se exponen métodos arbitrarios, WPF, campos privados, rutas de archivos, ni diccionarios de chunks. Esta versión no ofrece IA de mobs ni un runtime JavaScript arbitrario.
Ejemplo
pack stellar
name "Stellar Pack"
version 1.1.0
component crystal_data object
description "Datos del cristal"
data energy = 75
end
block crystal
title "Cristal estelar"
texture "textures/crystal.png"
glow 75
use crystal_data energy=75
end
modify component creativeimagination:time
set Scale = 1.25
end
modify component creativeimagination:physics
data walkSpeed = 6
data jumpVelocity = 9
end
modify component creativeimagination:health
set MaxHealth = 24
end
modify tag creativeimagination:custom_name
scopes item,block,player
description "Nombre visible para ítems, bloques y jugadores"
end
tag machinery block compound
child state compound
child state/charge integer
end
function dawn
/time set dawn
end
command morning
/function run stellar:dawn
end
La textura debe estar en textures/crystal.png, junto a main.cif. El proyecto completo está en examples/first-pack.
Parches y efectos reales
modify component <namespace:id> admite set Propiedad = valor para propiedades públicas escalares de objetos reales y data clave = valor para su configuración extensible. Las propiedades de sólo lectura, Id, FilePath, miembros privados y objetos de UI se rechazan. Los datos tienen efecto cuando el consumidor los utiliza: en 1.1 el juego conecta explícitamente physics (walkSpeed, gravity, jumpVelocity, crouchMultiplier, sprintMultiplier), flight.speed, fall_damage (threshold, perBlock) y void_damage.thresholdY. Los objetos reales como bloques, biomas, música, tiempo, salud y energía se modifican por sus propiedades públicas compatibles.
modify tag <namespace:id> admite description, scopes, min, max, default, completion, required, deprecated, merge replace|preserve, child ruta tipo y element tipo. No cambia el id ni el tipo base de un tag existente: hacerlo rompería datos persistidos. Un default se devuelve al leer un tag aún no asignado. Los schemas anidados se validan también al escribir.
Un parche puede ejecutar una función cuando ocurre un evento del juego:
modify component creativeimagination:health
on creativeimagination:health_changed run stellar:reaction
end
modify tag creativeimagination:custom_name
on change run stellar:reaction
end
Los hooks se conectan tras cargar las funciones de todos los paquetes, por lo que pueden referenciar funciones de otros mods. Sólo se activan eventos que el juego publique. No ejecutan JavaScript arbitrario.
CLI
Desde esta carpeta:
npm install
npm test
pwsh -File test/game-integration.ps1
pwsh -File test/default-mods.ps1
pwsh -File tools/export-game-schema.ps1
node bin/ci-function.js check examples/first-pack/main.cif
node bin/ci-function.js build examples/first-pack/main.cif -o stellar.cipak
node bin/ci-function.js build examples/first-pack/main.cif -o stellar-closed.cipak --closed
node bin/ci-function.js inspect stellar.cipak
La extensión ofrece Compilar .cipak, Compilar .cipak protegido y Validar archivo, además de colores, diagnósticos, ayuda y autocompletado de los registros oficiales exportados del juego. tools/export-game-schema.ps1 refresca schema/registries.json después de cambios al motor. Se empaqueta como VSIX con npm run package:vsix; no está publicada en Marketplace.
Protección de código
--closed cifra el manifiesto y los scripts con AES-256-GCM; los assets siguen visibles para que el juego los cargue. No es DRM ni secreto absoluto: para abrir el .cipak sin pedir configuración al jugador, el cliente contiene la clave de descifrado. Sirve para dificultar la lectura casual, no para impedir ingeniería inversa. La autenticación del cifrado detecta corrupción, pero no convierte a un pack de terceros en confiable.
Distribución
Colocar stellar.cipak directamente en CreativeImagination.exe → mods/. No hay que instalar Node, npm ni la extensión de VS Code en la máquina del jugador. Se mantienen los mods antiguos basados en carpetas y los FunctionPacks antiguos de cada mundo para no romper contenido existente.