# build8bp

🎮 Herramienta CLI profesional para compilar proyectos **8BP (8 Bits de Poder)** para Amstrad CPC usando ABASM.

[![Python](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
[![Poetry](https://img.shields.io/badge/poetry-1.0+-purple.svg)](https://python-poetry.org/)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)

## 📋 Características

- ✅ **5 niveles de compilación** con diferentes configuraciones de memoria
- 🎨 **Interfaz CLI moderna** con colores y formato Rich
- 🔧 **Corrección automática** de sintaxis para compatibilidad ABASM
- 📦 **Organización modular** con comandos separados
- 🌍 **Variables de entorno** para configuración global
- 💾 **Sistema de backups** automático antes de modificaciones
- 📁 **Directorio dist/** para organizar archivos generados

## 🚀 Instalación

### Con pipx (recomendado - instalación global)

```bash
cd build8bp
pipx install .
```

### Con Poetry (desarrollo)

```bash
cd build8bp
poetry install
```

## ⚙️ Configuración

Define las variables de entorno (opcional):

```bash
export BP8_ASM_PATH="/ruta/a/8BP_V43/ASM"
export ABASM_PATH="/ruta/a/abasm/src/abasm.py"
```

O usa los parámetros `--asm-path` y `--abasm-path` en cada comando.

## 📖 Uso

### Ver ayuda general

```bash
build8bp --help
```

Muestra:
```
Uso:
  build8bp [OPTIONS] COMMAND [ARGS]...

═══════════════════════════════════════════════════════════════
build8bp - Compilador para proyectos 8BP (8 Bits de Poder) en Amstrad CPC
═══════════════════════════════════════════════════════════════

Opciones:
  --version  Muestra la versión y sale.
  --help     Muestra este mensaje de ayuda y sale.

Comandos:
  compile    Compilar proyecto 8BP con nivel de build especificado.
  patch      Aplicar parches de sintaxis para ABASM a los archivos ASM.
  rollback   Restaurar archivos ASM desde los backups.
```

### 🔨 Comando: compile

Compila el proyecto 8BP con el nivel de build especificado.

```bash
build8bp compile --help
```

**Opciones:**
- `--build INTEGER`: Nivel de compilación (0-4) [requerido]
- `--asm-path PATH`: Ruta a los scripts ASM (o usa `$BP8_ASM_PATH`)
- `--abasm-path PATH`: Ruta a abasm.py (o usa `$ABASM_PATH`)

**Niveles de build:**

| Build | Descripción | MEMORY | Comandos disponibles |
|-------|-------------|--------|---------------------|
| 0 | Todas las funcionalidades | 23600 | \|LAYOUT, \|COLAY, \|MAP2SP, \|UMA, \|3D |
| 1 | Juegos de laberintos | 25000 | \|LAYOUT, \|COLAY |
| 2 | Juegos con scroll | 24800 | \|MAP2SP, \|UMA |
| 3 | Juegos pseudo-3D | 24000 | \|3D |
| 4 | Sin scroll/layout (+500 bytes) | 25500 | Básicos |

**Ejemplos:**

```bash
# Con variables de entorno configuradas
build8bp compile --build 0

# Build 1 con ruta explícita
build8bp compile --build 1 --asm-path ./8BP_V43/ASM

# Build 2 con ambas rutas explícitas
build8bp compile --build 2 \
  --asm-path "/Users/destroyer/Downloads/8BP-master 2/8BP_V43/ASM" \
  --abasm-path "/Users/destroyer/Downloads/8BP-master 2/abasm/src/abasm.py"
```

**Salida generada:**

El comando crea un directorio `dist/` dentro del directorio ASM con:
- `8BP{build}.bin` - Binario compilado
- `make_all_mygame.lst` - Listado de ensamblado
- `make_all_mygame.map` - Mapa de símbolos

### 🔧 Comando: patch

Aplica correcciones de sintaxis automáticas para compatibilidad con ABASM.

```bash
build8bp patch --help
```

**Opciones:**
- `--asm-path PATH`: Ruta a los scripts ASM (o usa `$BP8_ASM_PATH`)

**Correcciones aplicadas:**
- `and a,` → `and `
- `or a,` → `or `
- `xor a,` → `xor `
- `djnz,` → `djnz `
- `ifnot X = Y` → `if X != Y`

**Archivos modificados:**
- `8bitsDePoder_v043_001.asm`
- `make_graficos_mygame.asm`

**Ejemplos:**

```bash
# Con variable de entorno
export BP8_ASM_PATH=./8BP_V43/ASM
build8bp patch

# Con ruta explícita
build8bp patch --asm-path ./8BP_V43/ASM
```

**⚠️ Nota:** Crea archivos `.backup` automáticamente antes de modificar.

### ↩️ Comando: rollback

Restaura los archivos ASM desde los backups creados por `patch`.

```bash
build8bp rollback --help
```

**Opciones:**
- `--asm-path PATH`: Ruta a los scripts ASM (o usa `$BP8_ASM_PATH`)

**Ejemplos:**

```bash
# Restaurar todos los archivos modificados
build8bp rollback --asm-path ./8BP_V43/ASM
```

## 🎯 Flujo de trabajo completo

```bash
# 1. Configurar variables de entorno (opcional)
export BP8_ASM_PATH="./8BP_V43/ASM"
export ABASM_PATH="./abasm/src/abasm.py"

# 2. Aplicar parches (solo la primera vez)
build8bp patch

# 3. Compilar diferentes versiones
build8bp compile --build 0  # Versión completa
build8bp compile --build 1  # Solo laberintos
build8bp compile --build 2  # Solo scroll

# 4. Los binarios estarán en dist/
ls -lh ./8BP_V43/ASM/dist/

# 5. Si necesitas revertir cambios
build8bp rollback
```

## 🏗️ Estructura del proyecto

```
build8bp/
├── src/
│   └── build8bp/
│       ├── __init__.py          # Inicialización del paquete
│       ├── cli.py               # Punto de entrada principal (47 líneas)
│       ├── utils.py             # Utilidades compartidas
│       └── commands/            # Comandos modulares
│           ├── __init__.py
│           ├── compile.py       # Comando compile
│           ├── patch.py         # Comando patch
│           └── rollback.py      # Comando rollback
├── pyproject.toml               # Configuración Poetry
└── README.md                    # Esta documentación
```

## 👨‍💻 Desarrollo

### Ejecutar en modo desarrollo

```bash
poetry run build8bp --help
```

### Instalar localmente con pipx

```bash
# Instalar
pipx install .

# Reinstalar tras cambios
pipx install . --force

# Desinstalar
pipx uninstall build8bp
```

### Construir distribución

```bash
poetry build
```

Genera archivos en `dist/`:
- `build8bp-0.1.0.tar.gz` - Código fuente
- `build8bp-0.1.0-whl` - Wheel para instalación

### Publicar en PyPI

```bash
# Test PyPI (pruebas)
poetry config repositories.testpypi https://test.pypi.org/legacy/
poetry publish -r testpypi

# PyPI real
poetry publish
```

## 🛠️ Dependencias

- **Python**: 3.8+
- **click**: 8.1.7+ - Framework CLI
- **rich**: 13.7.0+ - Formato y colores en terminal

## 📝 Licencia

MIT License - Ver archivo LICENSE para más detalles.

## 🙏 Créditos

- **8BP (8 Bits de Poder)**: Framework original para desarrollo de juegos en Amstrad CPC
- **ABASM**: Cross-assembler Z80 en Python
- **Amstrad CPC**: Ordenador clásico de 8 bits

## 🐛 Solución de problemas

### Error: "No se especificó la ruta de los scripts ASM"

Configura la variable de entorno o usa el parámetro:
```bash
export BP8_ASM_PATH="./8BP_V43/ASM"
# o
build8bp compile --build 0 --asm-path ./8BP_V43/ASM
```

### Error de sintaxis en compilación

Ejecuta primero el comando `patch`:
```bash
build8bp patch --asm-path ./8BP_V43/ASM
```

### No se encuentra el binario generado

Verifica el directorio `dist/`:
```bash
ls -lh ./8BP_V43/ASM/dist/
```

## 📞 Soporte

Para problemas, sugerencias o contribuciones, abre un issue en el repositorio del proyecto.
