-- Estructura del Script de LuaJ para MiniComputer -- -- Utiliza LuaJ (compatible con Lua 5.2) -- Notas: - Los colores son números enteros, generalmente en hexadecimal (ejemplo: 0xFF0000 para rojo). - Se recomienda un tamaño de texto minimo de 9.0 para drawText para que sea legible en la escala mas pequeña de la pantalla 128x128. ------------------------- -- Constantes ------------------------- screen.width() -- Devuelve el ancho de la pantalla en píxeles screen.height() -- Devuelve la altura de la pantalla en píxeles computer.pos() -- Devuelve una tabla con {x, y, z, dim} computer.time() -- Devuelve el tiempo actual del mundo en segundos como un número decimal (ticks / 20.0) ------------------------- -- Operaciones Bitwise (bit) ------------------------- bit.lshift(a, b) -- Desplazamiento a la izquierda bit.rshift(a, b) -- Desplazamiento a la derecha bit.band(a, b) -- AND bit a bit bit.bor(a, b) -- OR bit a bit bit.bxor(a, b) -- XOR bit a bit bit.bnot(a) -- NOT bit a bit ------------------------- -- Estructura General del Script ------------------------- -- Headers opcionales utilizados por los ítems de disquete para mostrar un titulo y un color unico del floppy disk --TITLE Floppy Disk --COLOR 0x000000 -- Punto de entrada function main() -- Se ejecuta una vez al iniciar end function update() -- Se ejecuta cada "tick" (20 ticks por segundo) end function touch(x, y) -- Se activa cuando el jugador toca la pantalla en (x, y) end function keyEvent(character, keycode, eventType) -- Se activa cuando se presiona o suelta una tecla -- character: carácter escrito (no se recomienda para analizar texto, ya que incluye cualquier cosa que se haya escrito, incluso caracteres de control) -- keycode: código de la tecla (usa esto en su lugar, es más seguro) -- eventType: puede ser: 0: keypress, 1: keydown (presionado), 2: keyup (soltado) end Códigos de teclas comunes: w:17 a:30 s:31 d:32 flecha derecha: 205 flecha izquierda: 203 flecha arriba: 200 flecha abajo: 208 backspace: 14 enter: 28 barra espaciadora: 57 ctrl: 29 shift: 42 function onEvent(eventName, eventData) -- Listener de eventos de uso general, se activa cuando el script se suscribe con subscribeEvent(eventName) y recibe algo. -- eventName el nombre del evento, actualmente puede ser: "entityNearby" "entitySpawn" "blockPlaced" "blockRemoved" -- eventData lo que sea que reciba el evento como una tabla end ------------------------- -- Eventos ------------------------- subscribeEvent(eventName, options) -- se suscribe a un evento, los eventos disponibles actualmente son: * entityNearby - detecta entidades cercanas en el radio especificado en las opciones, ejemplo: subscribeEvent("entityNearby", {radius = 32}) devuelve una tabla con: {x, y, z, entityType} * entitySpawn - detecta cuando una entidad aparece en el radio devuelve una tabla con: {x, y, z, entityType} * blockPlaced - detecta cuando se coloca un bloque en un radio devuelve una tabla con: {x, y, z, block, player, dimension} * blockRemoved - detecta cuando se elimina un bloque en un radio devuelve una tabla con: {x, y, z, block} * redstoneInput - detecta una señal de redstone en un bloque vecino devuelve una tabla con: {side, oldPower, newPower} todos estos eventos se reciben en la función onEvent(eventName, eventData) removeEvent(eventName) -- se da de baja del evento especificado, onEvent deja de recibir llamadas para el evento especificado. ------------------------- -- Gráficos ------------------------- clearScreen(color) drawRect(x, y, w, h, color, strokeWidth) fillRect(x, y, w, h, color) drawOval(x, y, w, h, color, strokeWidth) fillOval(x, y, w, h, color) drawLine(x1, y1, x2, y2, color, strokeWidth) drawPixel(x, y, color) drawText(x, y, size, color, text) measureText(text, size) -- devuelve un número de la medida de una cadena dada con un tamaño dado measureTextBounds(text, size) -- este devuelve una tabla con {x, y, width, height} drawPolygon({x...}, {y...}, points, color, strokeWidth) fillPolygon({x...}, {y...}, points, color) drawArc(x, y, w, h, startAngle, arcAngle, color, strokeWidth) fillArc(x, y, w, h, startAngle, arcAngle, color) drawSprite(x, y, sprite, scale) -- sprite es una tabla 2D de colores enteros. -- Usa -1 para píxeles transparentes. -- escala de números enteros, a partir de 1 -- Ejemplo: -- local sprite = { -- {0xFF0000, 0x00FF00, -1}, -- {0x0000FF, -1, 0xFF00FF}, -- } -- drawSprite(10, 10, sprite, 1) ------------------------- -- Gráficos Avanzados ------------------------- loadPicture(id, base64str) -- carga un archivo de imagen codificado en base64, la imagen también puede estar comprimida con zlib drawPicture(id, x, y, w, h) -- dibuja la imagen base64 cargada previamente en la posición y tamaño especificados pictureData(id) -- devuelve {width, height} de la imagen base64 cargada previamente drawImage(x, y, w, h, uuid) -- instrucción especial que usa el mod CustomFrames -- uuid: ID que hace referencia a una imagen precargada a través del mod CustomFrames exportSprite(sprite, scale) -- instrucción especial que usa el mod CustomFrames genera una imagen png, almacenada como un archivo y cargada por el mod CustomFrames con la referencia como un string uuid. -- sprite es una tabla 2D de colores int, la misma que la entrada de drawSprite -- la escala de zoom del sprite, en int, a partir de 1 que seria el tamaño normal, se refleja en la imagen png de salida devuelve la referencia uuid de CustomFrames de la imagen de sprite exportada. ------------------------- -- Sonido / Redstone ------------------------- redstone(side, power) -- side: "north" (norte), "south" (sur), "east" (este), "west" (oeste), "up" (arriba), "down" (abajo) -- power: 0–15 beep(frequency, durationMillis) playTone(freq, duration, waveform) -- freq: frecuencia en Hz -- duration: milisegundos -- waveform: "sine", "square", "triangle", "sawtooth", "pulse", "noise", "organ", "phaser", "piano" ------------------------- -- SFX Avanzado: ------------------------- playSFX(pattern, bpm), donde pattern es una lista de strings que usan la siguiente sintaxis: * Sintaxis Cada línea sigue este formato: NOTA(S):DURACIÓN:MODIFICADORES - NOTA(S): Nota individual, frecuencia o acorde (ejemplo: C4, C4+E4+G4, 420, 420+350, o rest) - DURACIÓN: En beats (ej. 0.25, 1.0) - MODIFICADORES: Efectos o parámetros separados por comas * Etiquetas y Control - label:name — Marca una posición para saltar - jump=label,loop=n — Salta de vuelta a la etiqueta 'n' veces (loop=n es opcional, jump puede repetirse para siempre sin él, loop también puede tener un valor -1 para un bucle infinito) * Notas y Frecuencias - Soportado: C0–B8 o valor de frecuencia - Sostenidos: C#4, F#3, etc. - Silencios: "rest" * Efectos / Modificadores * Formas de Onda (wave=...) sine — Onda senoidal tri — Onda triangular square — Onda cuadrada saw — Diente de sierra noi — Ruido blanco tsaw — Diente de sierra inclinado org — Órgano pha — Phaser piano — Piano (simil) * Efectos de Frecuencia vib / vibrato — Añade modulación de vibrato vibspeed=5 — Velocidad de vibrato (Hz) [por defecto: 5.0] vibdepth=4 — Profundidad de vibrato (Hz) [por defecto: 5.0] slide — Desliza desde 50% de frecuencia al objetivo drop — El tono cae un 50% durante la duración de la nota detune — Desafina ligeramente el tono detamount=10 — desafinación en centésimas [por defecto: 10] * Efectos de Amplitud fade / fadein — Ataque de entrada suave (fade-in) trem / tremolo — Modulación de amplitud (trémolo) trespeed=8 — Velocidad de trémolo (Hz) [por defecto: 8.0] tredepth=0.5 — Profundidad de trémolo [0–1] [por defecto: 0.5] attack=50 — Attack del envolvente en ms [por defecto: 100] release=80 — Release del envolvente en ms [por defecto: 100] * FX Destructivos bit / bitcrush — Reduce la resolución de bits crushrate=8000 — Tasa de muestreo de bitcrush (Hz) crushbits=4 — Convierte a bits (ej. audio de 4 bits) * FX de Eco / Espacio del / delay — Añade un eco de retardo de un solo toque delayms=200 — Tiempo de retardo en ms [por defecto: 150] delaygain=0.5 — Volumen del eco [0–1] [por defecto: 0.5] rev / reverb — Añade una cola de reverberación corta y básica reverbamount=0.3 — Nivel de mezcla de reverberación [0–1] * Parámetros de Modulación Avanzados pulsewidth=0.2 — Ciclo de trabajo de la onda cuadrada (para pulso) Ejemplo: playSFX({ "label:intro", "C4+E4+G4:0.3:wave=sine,vib", "rest:0.05", "E4+G4+B4:0.3:wave=square,fade", "rest:0.05", "D4+F#4+A4:0.3:wave=tri,trem", "rest:0.05", "C5:0.2:wave=saw,bitcrush", "rest:0.1", "jump=intro,loop=3", "label:glitchy", "G3:0.1:wave=noi", "rest:0.05", "F3:0.05:wave=noi", "rest:0.05", "E3:0.1:wave=noi", "rest:0.05", "jump=glitchy,loop=2", "label:chordblast", "C3+E3+G3:0.5:wave=square,vib,trem", "rest:0.1", "A3+C4+E4:0.5:wave=saw,bitcrush=5", "rest:0.1", "F3+A3+C4:0.5:wave=tri", "rest:0.1", "label:ending", "C5:0.2:wave=sine,vib", "rest:0.2", "G4:0.2:wave=square", "rest:0.2", "C4:1.0:wave=tri,fade", "jump=0" --salta de vuelta a la primera línea }, 120) ------------------------- -- Otras Herramientas de Audio ------------------------- playMML(mmlstring, options) -- reproduce una melodia MML (Music Macro Language), las opciones pueden ser {loop = true/false} para repetir la canción midi. stopMML() -- detiene todas las canciones mml note(pitch) note(pitch, instrument) -- reproduce un sonido de bloque musical de Minecraft -- pitch: valor entero (12 = medio) -- instrument: cadena opcional ("pling", "bass", "hat", etc. instrumentos de 1.7.10) ------------------------- -- Sistema de Archivos/Almacenamiento ------------------------- storage.read(device, key) -- devuelve una tabla de los datos almacenados dentro de la clave especificada storage.write(device, key, data) --guarda una tabla en la unidad y la clave especificada storage.list(device) -- obtiene una tabla con toda la información almacenada dentro de un dispositivo. storage.remove(device, key) -- device: número id del disquete, 0 es la ranura principal, 1 es la ranura secundaria, solo hay dos. -- key: una clave que hace referencia a los datos almacenados -- data: una tabla que contiene los datos/conjunto de datos que se almacenan en la clave especificada. Notas: -- por definición, los datos del disquete se almacenan con un par clave-valor, donde el valor es una tabla que puede tener su propio esquema de datos. ------------------------- -- Interfaz con Minecraft ------------------------- Items.createItem("id:metadata", {nbt}) -- genera un ítem en la posición de la computadora, con el id, metadata y valores nbt especificados. - id:metadata string: el id del ítem y la metadata especificada, separados por ":", el id del ítem está definido por el registry de forge, se puede ver en el juego usando F3+H - nbt: son datos nbt pero en formato de tabla de Lua, el parser es capaz de transformarlos a formato nbt para el ítem en el juego. ------------------------- -- API de la interfaz grafica de MiniComputer ------------------------- Estos componentes se pueden definir en la función main(), y controlar usando el objeto devuelto, ejemplo: local button1 = Button("btn1", 10, 10, 30, 10) button1.onPress = function() print("presionado") end se recomienda que el método update() limpie la pantalla * componentes: Button(id, x, y, w, h) -- dibuja un botón, cuando se hace clic llama a la función de retorno de llamada onPress parámetros: { id = id, x = x, y = y, w = w, h = h, label = label, onPress = nil, hidden = false, isClicked = false, defaultColor = 0x8888CC, clickColor = 0x6666AA, textColor = 0xFFFFFF, zIndex = 0 } TextField(id, x, y, w, h) -- dibuja un campo de texto que recibe entrada de texto, el texto se almacena en el valor text parámetros: { id = id, x = x, y = y, w = w, h = h, text = "", focused = false, hidden = false, onChange = nil, heldChar = nil, heldKey = nil, repeatDelay = 0, repeatInterval = 1, focusedColor = 0xAAAAFF, unfocusedColor = 0xCCCCCC, textColor = 0x000000, cursorColor = 0x000000, blinkTimer = 0, blinkVisible = false, zIndex = 0 } TextArea(id, x, y, w, h) -- dibuja un campo de texto de varias líneas que recibe entrada de texto que puede ser de varias líneas y con desplazamiento, el texto se almacena en el valor text parámetros: { id = id, x = x, y = y, w = w, h = h, text = "", focused = false, hidden = false, onChange = nil, heldChar = nil, heldKey = nil, repeatDelay = 0, repeatInterval = 1, scrollOffset = 0, cursorIndex = 0, desiredColumn = nil, blinkTimer = 0, blinkVisible = true, focusedColor = 0xAAAAFF, unfocusedColor = 0xCCCCCC, textColor = 0x000000, cursorColor = 0x000000, lineColor = 0x000000, zIndex = 0 } ListBox(id, x, y, w, h, items) -- dibuja una lista de elementos, definidos en la tabla de ítems, se puede navegar por los elementos con las teclas de direccion, el elemento seleccionado se almacena en el campo selectedIndex. parámetros: { id = id, x = x, y = y, w = w, h = h, items = items or {}, selectedIndex = 1, scrollOffset = 0, itemHeight = 14, focused = false, onSelectionChange = nil, onDoubleClick = nil, lastClickTime = 0, hidden = false, zIndex = 0 } ProgressBar(id, x, y, w, h) parámetros: { id = id, x = x, y = y, w = w, h = h, value = 0.0, bgColor = 0xCCCCCC, fillColor = 0x00FF00, hidden = false, zIndex = 0 } CheckBox(id, x, y, size, label) parámetros: { id = id, x = x, y = y, w = size, h = size, label = label, checked = false, onToggle = nil, hidden = false, zIndex = 0 } Slider(id, x, y, w, h, min, max) parámetros: { id = id, x = x, y = y, w = w, h = h, min = min or 0, max = max or 100, value = min or 0, onValueChange = nil, dragging = false, hidden = false, zIndex = 0 } Modal(id, x, y, w, h) parámetros: { id = id, x = x, y = y, w = w, h = h, hidden = true, bgColor = 0xcbcbcb, overlayColor = nil, borderColor = 0x000000, zIndex = 100, children = {} } modal:show() modal:hide() modal:addChild(component) Label(id, text, x, y, size, color) parámetros: { id = id, text = text or "", x = x or 0, y = y or 0, size = size or 9.0, color = color or 0xFFFFFF, hidden = false, zIndex = 0 } Picture(id, x, y, w, h, data) parámetros: { id = id, x = x, y = y, w = w, h = h, data = data, hidden = false, zIndex = 0, isBase64 = false, pictureID = nil, spriteData = nil }