Tutti i case study
// case-study / rpg-idle-game-engine

RPG IDLE Game Engine

Engine backend personale in Python e FastAPI per Idle RPG: 9 domini di gioco, 15 endpoint, 25 tabelle PostgreSQL — progressioni offline calcolate dai timestamp, architettura N-Tier asincrona con transazioni atomiche, deploy su VPS.

PythonFastAPIREST APIPostgreSQLSQLAlchemyDocker
// contesto e sfida

Il problema

In un Idle RPG il gioco non si ferma quando il giocatore chiude l'app: combattimenti, viaggi e raccolta risorse proseguono in background. Al rientro, l'engine deve calcolare tutto ciò che è accaduto in base al tempo trascorso e restituire uno stato coerente — non approssimato, non mancante, ma esatto. Questo è il cuore del progetto.

Ogni personaggio ha statistiche, inventario, equipaggiamento e progressi che dipendono dagli eventi elaborati durante l'assenza. Le meccaniche sono nove: combattimenti, viaggi, livelli/XP, inventario, mercato con oggetti procedurali e sistema di affix, spedizioni, attributi personaggio, equipaggiamento. Ogni meccanica ha le sue regole, le sue formule, le sue tabelle.

L'engine è un progetto personale sviluppato come v1 completa: 15 endpoint REST, 25 tabelle PostgreSQL, deploy su VPS. Lo stack — Python con FastAPI — è stato scelto per le prestazioni e la gestione asincrona nativa, con driver PostgreSQL configurato in modalità async per tutta la catena di chiamate.

L'architettura segue il pattern N-Tier — API, Service, Repository, Database — con un Service per ogni feature. Le operazioni di scrittura usano il pattern Unit of Work: una richiesta, una transazione atomica. I dati critici — creazione personaggio, aggiornamento stato, combattimenti — sono protetti da transazioni PostgreSQL: tutto o niente.

// soluzione

Come l'ho affrontato

L'architettura N-Tier separa chiaramente le responsabilità: routing e validazione nelle API, logica di gioco nei Service, accesso dati nei Repository. Ogni feature — combattimenti, inventario, mercato — ha il suo Service dedicato. Le scritture critiche usano il pattern Unit of Work: 1 richiesta = 1 transazione atomica su PostgreSQL con driver async. Se un passaggio fallisce, nulla viene persistito — coerenza ACID garantita sui dati di gioco.

La progressione offline è il cuore del sistema: al rientro del giocatore, l'engine calcola in un'unica operazione tutto il tempo trascorso — combattimenti, viaggi, risorse — e applica le conseguenze allo stato del personaggio. Nessuna simulazione continua in background, solo calcolo basato sui timestamp. La strategia è top-down: il Service principale orchestra i Service figli con una singola sessione DB, garantendo che creazione personaggio, inventario ed energia siano coerenti al 100%.

Il bilanciamento è basato su formule: progressione XP con curva esponenziale tipica degli idle game; statistiche totali additive (base + equipaggiamento); HP ed energia derivati da livello e attributi; nemici scalati dinamicamente al momento del combattimento in base a livello del personaggio e moltiplicatore di difficoltà (boss/elite); rarity tiers pesati dal comune (~50%) al leggendario (~1,5%); oggetti generati proceduralmente nel mercato con affix a curve ibride — logaritmica per i bonus, power curve per il valore base; prezzi di mercato calcolati da valore base, fattore livello, moltiplicatore rarità e margine.

Le API sono documentate con Scalar — scelto al posto della Swagger UI default di FastAPI per l'interfaccia più chiara — e testate con una suite di circa 20 test pytest, ancora in crescita. L'autenticazione avviene via API key. L'engine è deployato su VPS con Docker, con SQLAlchemy come ORM e Alembic per le migrazioni.

Documentazione Scalar con elenco degli endpoint per gestione personaggi, combattimenti e progressioni
// Documentazione Scalar: elenco degli endpoint REST — gestione personaggi, combattimenti, inventario, mercato e progressioni offline.
// progettazione

Progettazione

La progettazione è partita dal modello dati: lo schema del database — le tabelle che coprono i nove domini di gioco — definisce esplicitamente le relazioni tra personaggi, inventario, equipaggiamento, mercato ed eventi. Il secondo schema documenta la progettazione del sistema di affix: la generazione procedurale degli oggetti con curve ibride (logaritmica per i bonus affix, power curve per il valore base) e i rarity tiers pesati, il cuore del contenuto auto-generante del gioco.

Schema del database con le relazioni tra le tabelle dell'engine
// Schema del database: le tabelle con relazioni esplicite tra personaggi, inventario, equipaggiamento, mercato ed eventi di gioco.
Schema di progettazione del sistema di affix per la generazione procedurale degli oggetti
// Sistema di affix: come gli oggetti procedurali vengono generati e bilanciati tramite curve ibride e rarity tiers pesati.
// architettura

Architettura & Tecnologie

Architettura N-Tier in Python con FastAPI asincrono e persistenza PostgreSQL via SQLAlchemy. Ogni richiesta API passa per Service e Repository prima di raggiungere il database. Le operazioni di scrittura sono transazioni atomiche con Unit of Work: PostgreSQL con driver async garantisce coerenza ACID su ogni aggiornamento di stato. La progressione offline è calcolata al rientro del giocatore con una strategia top-down: un Service orchestra i Service figli con una singola sessione DB, garantendo che creazione personaggio, inventario ed energia siano coerenti. Eventi asincroni usati solo per effetti trasversali — log, notifiche, statistiche, pulizia cache — mai per dati critici. Autenticazione via API key. 15 endpoint, 25 tabelle, deploy su VPS con Docker.

Python
Linguaggio principale: logica di gioco, bilanciamento a formule, calcolo progressioni
FastAPI
Framework asincrono nativo: routing, validazione e orchestrazione dei service
PostgreSQL
Persistenza con driver async: 25 tabelle, transazioni atomiche Unit of Work
SQLAlchemy
ORM con Alembic per migrazioni: mapping tabelle, repository pattern, sessioni async
REST API
15 endpoint documentati con Scalar, autenticati via API key, testati con pytest
Docker
Containerizzazione e deploy su VPS
// highlights

Caratteristiche principali

9 domini di gioco implementati: combattimenti, viaggi, livelli/XP, inventario, mercato con oggetti procedurali e sistema di affix, spedizioni, attributi, equipaggiamento

Architettura N-Tier con Unit of Work: 1 richiesta = 1 transazione atomica su PostgreSQL, dati critici protetti da coerenza ACID — eventi usati solo per effetti trasversali

Bilanciamento a formule: XP a curva esponenziale, nemici scalati dinamicamente, rarity tiers pesati (~50% comune, ~1,5% leggendario), mercato con affix a curve ibride

Progressione offline: al rientro, un'unica operazione top-down ricostruisce combattimenti, viaggi e risorse con precisione temporale — nessuna simulazione continua in background

Python/FastAPI scelti per prestazioni e async nativo end-to-end con driver PostgreSQL async — unico progetto Python nel portfolio, scelta motivata tecnicamente

Documentazione Scalar con GUI di test per l'esecuzione diretta degli endpoint
// GUI di test Scalar: esecuzione diretta degli endpoint dalla documentazione, con parametri e risposte visualizzate.
// risultati

Risultati

V1 completa e deployata: 15 endpoint REST, 25 tabelle PostgreSQL, 9 domini di gioco con bilanciamento a formule — engine funzionante su VPS con suite di test pytest in crescita.

Dati critici protetti da Unit of Work: creazione personaggio, combattimenti e aggiornamenti stato sono transazioni atomiche — se un passaggio fallisce, nulla viene persistito. Coerenza ACID garantita.

Stack scelto con consapevolezza: Python/FastAPI per l'async nativo con driver PostgreSQL async — motivazione tecnica documentata e giustificata, documentazione Scalar sempre aggiornata.

Un problema simile al tuo?

Parliamone: costruiamo qualcosa che regga al primo colpo e per gli anni a venire.

Parliamone