¡Hola! He creado la versión v1.1 de mi juego 4X, que añade un breve mensaje de ayuda. La verdad es que era un poco tosco si nunca antes habías jugado a Ascendancy.
Participación en código y lógica
Híbrido (rutinas clave generadas por IA; ensambladas/editadas por humanos)
Participación en recursos y pipeline
Historia, diálogos o texto del manual
Notas del proyecto y prompts
Claude Code + Arkos Tracker + RASM + algunas herramientas personalizadas escritas en Go para editar recursos, hacer fuzzing y compilar el juego.
Este juego hace un uso intensivo de split-rasters para mostrar una gran cantidad de colores en el modo 1. Se requiere un CPC real o un emulador preciso.
El DSK se genera directamente mediante una librería de Go que escribí hace unos años. Permite colocar datos binarios directamente en cualquier sector. El cargador |cpm tiene una tabla que contiene la ubicación de los datos y su destino en la RAM del CPC (bancos, desplazamiento). Esto evita el uso del catálogo, que hace que el cabezal vuelva al principio del disco.
Los split rasters se apoyan en una librería de emulación de CPC escrita por Claude, usando GitHub - koron-go/z80: Z80 emulator written in Go · GitHub . Una vez calibrados los NOP en un CPC real, permite realizar pruebas unitarias automáticas de los split rasters.
La música y el teclado se gestionan antes del área de dibujado, donde se producen los rasters. Se ejecutan en tiempo constante, utilizando el reproductor FAP para la música.
Cuando la pantalla se oculta (blanking) para el cálculo del turno enemigo, la música se vuelve a conectar a las interrupciones normales del CPC para evitar tirones.
Puede mostrar los 27 colores simultáneamente en una sola pantalla. Cada línea tiene una paleta de 6 colores. Bueno, 5. El negro es fijo. Se configuran 3 «pens» (tinteros) durante el hsync (alrededor de 30 NOP), y luego el pen 1 y el pen 3 se vuelven a configurar durante el dibujado de la línea. Esto permite hacer parpadear un color tanto en la columna izquierda como en la derecha. El icono de la izquierda no se ve afectado por el ocultamiento.
Creo que esto podría usarse en cualquier juego tipo hoja de cálculo. Permite hacer parpadear una línea cambiando solo 8 valores en cada ciclo.
El juego se puede completar en unas 2 o 3 horas. O en unos pocos minutos si simplemente dejas pasar el tiempo hasta que el oponente gane…
He usado AceDL para ver cómo se hizo en el juego Le Fugitif. La idea básica es crear una lista larga de plumas (pens), apuntarla con HL, y luego tener algo como:
; establecer color de fondo
ld e, 0x54
out (c), 0
out (c), e
ld c, 0x01
ld d, 0x02
ld e, 0x03
display_loop:
out (c), c
outi
inc b
out (c), d
outi
inc b
out (c), e
outi
nop
...
nop
dec a
jp nz, display_loop
Cada outi asignará el color apuntado por HL a la pluma seleccionada y luego lo incrementará. Es muy importante hacer inc b después, porque outi decrementa B.
Y, por supuesto, antes de eso, hay que esperar al VBL para sincronizarse.
; esperar VBL
ei ; habilita las interrupciones (las necesitamos para el HALT)
ld b,0xF5
novbl:
in a,(c)
rra
jr nc,novbl
halt ; estamos sincronizados 16 líneas antes de la pantalla
di ; y ahora deshabilitamos las interrupciones hasta el final
; aquí puede ir cualquier código con temporización exacta como el reproductor FAP. O un montón de nops y bucles para consumir tiempo.
Y, por supuesto, puedes hacer outi;inc b varias veces para cambiar la misma pluma varias veces durante la línea, de ahí la división (split).
¿En el juego? Usa las flechas y Enter (Return) para seleccionar un elemento en el menú. Luego, usa las letras resaltadas en rojo en los verbos para [Siguiente]. O [Pasar] para saltar al siguiente evento (fin de construcción, crecimiento de población, investigación completada…).\n\nQuizás debería añadir una pantalla de ayuda sobre los controles.