Musica, vecchietti con sprite, nuove scene del paese e generatore degli sfondi
Lavoro della sessione precedente: colonna sonora (titolo, paese, ricordi) con muto e volume, vecchietta e vecchietto sulla panchina, scene di Pieve, oratorio, Via de' Medici, Villa Adami, salita, campeggio, Bosco ai Frati e viale dei cipressi, panorama dell'introduzione, tools/genera.py per gli sfondi dalle foto. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UdeKd62opy9PKgpQXtVctF
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# LA LEGGENDA DEL REGOLO — comandi di sviluppo, verifica e Docker.
|
||||
# LA LEGGENDA DEL REGOLO — comandi di sviluppo, verifica, grafica e Docker.
|
||||
# `make` o `make help` elenca i target.
|
||||
|
||||
SHELL := /bin/bash
|
||||
@@ -6,27 +6,80 @@ SHELL := /bin/bash
|
||||
|
||||
PORT ?= 8000
|
||||
DOCKER_PORT ?= 8080
|
||||
IMAGE ?= leggenda-regolo
|
||||
TAG ?= latest
|
||||
COMPOSE ?= DOCKER_PORT=$(DOCKER_PORT) docker compose
|
||||
PYTHON ?= python3
|
||||
NODE ?= node
|
||||
# Personaggio da ritagliare: make character NAME=andrea (foglio in assets/raw/$(NAME)-sheet.png, 4x2)
|
||||
NAME ?= andrea
|
||||
SHEET ?= assets/raw/$(NAME)-sheet.png
|
||||
HEIGHT ?= 120
|
||||
FRAMES ?= walk_1,walk_2,walk_3,walk_4,stand,talk,take,back
|
||||
REF ?= stand
|
||||
# Sfondo da preparare: make background SRC=assets/generated/pieve-dalla-salita.png (CROP=x,y,w,h facoltativo)
|
||||
SRC ?=
|
||||
DST ?= assets/scenes/$(notdir $(SRC))
|
||||
CROP ?=
|
||||
COLORS ?= 64
|
||||
|
||||
.PHONY: help serve test browser verify up down restart logs ps
|
||||
.PHONY: help serve open test browser verify sfondi sfondi-genera sfondi-confronto background character \
|
||||
build up down restart logs ps shell image-size clean distclean
|
||||
|
||||
## ------------------------------------------------------------ sviluppo
|
||||
|
||||
help: ## Mostra questo aiuto
|
||||
@echo "LA LEGGENDA DEL REGOLO — target disponibili:"; echo
|
||||
@grep -hE '^[a-zA-Z0-9_-]+:.*?## ' $(MAKEFILE_LIST) | \
|
||||
awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-10s\033[0m %s\n", $$1, $$2}'
|
||||
awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-16s\033[0m %s\n", $$1, $$2}'
|
||||
@echo; echo "Variabili: PORT=$(PORT) DOCKER_PORT=$(DOCKER_PORT) IMAGE=$(IMAGE):$(TAG)"
|
||||
|
||||
serve: ## Avvia il server statico locale (PORT=8000)
|
||||
@echo "→ http://localhost:$(PORT)"
|
||||
python3 -m http.server $(PORT) --bind 0.0.0.0
|
||||
$(PYTHON) -m http.server $(PORT) --bind 0.0.0.0
|
||||
|
||||
test: ## Test della logica, della storia e della soluzione completa
|
||||
node --test tests/*.test.mjs
|
||||
open: ## Apre il gioco nel browser predefinito (serve già avviato)
|
||||
@xdg-open "http://localhost:$(PORT)" >/dev/null 2>&1 || open "http://localhost:$(PORT)"
|
||||
|
||||
## ------------------------------------------------------------ verifica
|
||||
|
||||
test: ## Test della logica, della storia, della soluzione completa e del generatore
|
||||
$(NODE) --test tests/*.test.mjs
|
||||
$(PYTHON) -m unittest discover -s tests -p "test_*.py" -q
|
||||
|
||||
browser: ## Partita completa nel browser con Playwright
|
||||
node tests/browser.mjs
|
||||
$(NODE) tests/browser.mjs
|
||||
|
||||
verify: test browser ## Tutti i controlli
|
||||
|
||||
## ------------------------------------------------------------ grafica
|
||||
|
||||
sfondi: ## Prova a secco del generatore: quali foto di assets/raw/foto/ genererebbe (nessuna API)
|
||||
$(PYTHON) tools/genera.py --dry-run
|
||||
|
||||
sfondi-genera: ## Genera davvero gli sfondi con l'API (serve OPENAI_API_KEY; ogni immagine si paga)
|
||||
@test -n "$$OPENAI_API_KEY" || { echo "manca OPENAI_API_KEY nell'ambiente"; exit 2; }
|
||||
$(PYTHON) tools/genera.py
|
||||
|
||||
sfondi-confronto: ## Rifà il confronto foto/immagini in assets/generated/index.html e lo apre
|
||||
$(PYTHON) tools/genera.py --gallery-only
|
||||
@xdg-open assets/generated/index.html >/dev/null 2>&1 || open assets/generated/index.html
|
||||
|
||||
background: ## Porta uno sfondo a 640x360 nel gioco (SRC=..., DST=..., CROP=x,y,w,h, COLORS=64)
|
||||
@test -n "$(SRC)" || { echo "uso: make background SRC=assets/generated/nome.png [CROP=x,y,w,h]"; exit 2; }
|
||||
$(PYTHON) tools/prepare_background.py $(SRC) $(DST) $(if $(CROP),--crop $(CROP)) --colors $(COLORS)
|
||||
|
||||
character: ## Ritaglia un foglio sprite 4x2 e prepara il personaggio (NAME=andrea, SHEET=..., HEIGHT=120, FRAMES=..., REF=stand)
|
||||
$(PYTHON) tools/slice_sprites.py --sheet $(SHEET) --out /tmp/regolo-$(NAME) --cols 4 --rows 2 \
|
||||
--despill --names $(FRAMES) --prefix $(NAME)_
|
||||
$(PYTHON) tools/prepare_character.py /tmp/regolo-$(NAME) $(NAME) assets/characters --height $(HEIGHT) \
|
||||
--frames $(FRAMES) --ref $(REF)
|
||||
|
||||
## ------------------------------------------------------------ docker
|
||||
|
||||
build: ## Costruisce l'immagine Docker
|
||||
docker build -t $(IMAGE):$(TAG) .
|
||||
|
||||
up: ## Avvia il container (DOCKER_PORT=8080)
|
||||
$(COMPOSE) up -d --build
|
||||
@echo "→ http://localhost:$(DOCKER_PORT)"
|
||||
@@ -41,3 +94,17 @@ logs: ## Segue i log del container
|
||||
|
||||
ps: ## Stato del container
|
||||
$(COMPOSE) ps
|
||||
|
||||
shell: ## Shell dentro il container
|
||||
$(COMPOSE) exec leggenda-regolo sh
|
||||
|
||||
image-size: ## Dimensione dell'immagine
|
||||
@docker image ls $(IMAGE):$(TAG) --format '{{.Repository}}:{{.Tag}} {{.Size}}'
|
||||
|
||||
## ------------------------------------------------------------ pulizia
|
||||
|
||||
clean: ## Rimuove file temporanei
|
||||
find . -name '__pycache__' -type d -prune -exec rm -rf {} +
|
||||
|
||||
distclean: clean down ## clean + container + immagine Docker
|
||||
-docker image rm $(IMAGE):$(TAG)
|
||||
|
||||
Reference in New Issue
Block a user