Sigildream Tech Blog

Il medico del bilanciamento

Una macchina che gioca a Sigilwake contro se stessa, migliaia di volte a notte, ausculta il gioco, misura dove sta male e propone la cura. Questa è la storia di come abbiamo smesso di bilanciare a mano — e di come lo stesso cervello che oggi impara a combattere, un giorno terrà in equilibrio l'intero roster.

Cos'è Sigilwake. Un gioco di combattimento di ruolo a turni, in arte manga in bianco e nero, mobile-first, multipiattaforma (Web, Android, iOS, macOS, Windows), oggi in fase di validazione. Duelli uno contro uno: due combattenti, quattro abilità a testa, animazioni cinematiche, partite giocabili, guardabili in diretta e rivedibili come replay. Il roster conta 24 personaggi, nessuno copia di un altro.
#GameAI   #GameBalance   #DevLog

Atto primoIl giorno in cui abbiamo smesso di bilanciare a mano

C'è un momento preciso in cui un gioco di combattimento smette di essere un'idea e diventa un problema di matematica.

Per noi è arrivato un martedì. Un personaggio vinceva troppo. La correzione sembrava banale: abbassa di poco il danno della sua mossa più forte, e sei a posto. Poi ti fermi. Perché quel personaggio non gioca da solo: gioca contro tutti gli altri. Abbassare quel numero lo indebolisce contro chi già lo batteva, e lo lascia comunque forte contro chi già perdeva. Sposti un tassello e ne tremano ventitré. Rifai il conto. E ti accorgi che a mano non ne esci più.

Da quel martedì abbiamo iniziato a costruire una cosa che chiamiamo, con una battuta interna, il medico del bilanciamento: un sistema che ausculta il gioco, misura dove sta male e propone la cura. Questo è il primo capitolo della sua storia.

Il cuore artistico che genera il grattacapo tecnico

Ognuno dei 24 personaggi ha un suo kit: mosse, passiva, statistiche, un'identità di combattimento distinta. Uno assorbe il gelo e lo restituisce a chi lo colpisce. Uno brucia lentamente l'avversario nel tempo. Uno controlla la mente. Sono personalità, non skin. Ed è proprio questa varietà — il cuore artistico del gioco — a generare il grattacapo tecnico.

Il problema: un incubo combinatorio

Un gioco competitivo è "bilanciato" quando nessun personaggio è una scelta obbligata e nessuno è inutile. Detto in numeri: ognuno, sul lungo periodo, dovrebbe vincere più o meno la metà delle volte. Cinquanta e cinquanta. È il punto di equilibrio in cui la partita la decide la bravura di chi gioca, non la sfortuna di aver pescato il personaggio sbagliato.

Il guaio è quante coppie bisogna tenere a bada contemporaneamente. Con 24 personaggi, gli accoppiamenti possibili sono 552 (ogni personaggio contro gli altri 23). Ogni singola modifica — un danno, un costo, una durata — non tocca un duello: ne ridisegna a cascata decine. È come registrare un'orchestra dove ogni volta che accordi uno strumento ne stoni altri venti. Un designer umano, davanti a questa griglia, procede a intuito e a tentativi: cambia, gioca qualche partita, spera. Ma qualche partita non basta a distinguere il vero squilibrio dal caso. Servono migliaia di duelli per ogni coppia prima che il numero diventi affidabile — e nessuno ha il tempo di giocarli a mano.

Griglia 24×24 dei winrate testa a testa fra tutti i personaggi, celle colorate dal rosso (sconfitta) al verde (vittoria).
La griglia 24×24 di "chi batte chi". Ogni riga un personaggio all'attacco, ogni colonna il suo avversario, ogni casella la percentuale di vittorie testa a testa. Verde = vince, rosso = perde; la diagonale nera è il personaggio contro se stesso. La riga di glacius è una striscia di verde acceso — fino a 100 contro mezzo roster; quella di umbral, all'opposto, è punteggiata di zeri. Quelle 552 caselle, tutte insieme, sono il problema reso visibile.

Questa griglia è la fotografia dell'incubo. Cinquecentocinquantadue caselle, ciascuna un verdetto. Un occhio umano ci si perde. Il verde troppo intenso è un personaggio che schiaccia; il rosso pieno è uno che viene schiacciato. L'obiettivo è portare l'intera tabella verso una tinta uniforme — né dominatori né vittime — sapendo che ogni pennellata ne sposta molte altre. A mano, è ingovernabile.

La tesi: e se giocasse la macchina?

A quel punto la domanda si capovolge da sola. Se il problema è che servono troppe partite e troppi conti, perché farli fare a un essere umano?

E se fosse una macchina a giocare il gioco contro se stessa, migliaia di volte a notte, a misurare da sola dove pende la bilancia e a proporre le correzioni?

È l'idea che gli scacchisti conoscono da anni: un programma che gioca milioni di partite contro se stesso impara cosa funziona meglio di qualunque maestro umano. Noi l'abbiamo girata verso un fine diverso. Non vogliamo un'IA che vinca: vogliamo un'IA che, giocando bene tutti i 24 personaggi contro tutti, faccia emergere gli squilibri reali — quelli che si vedono solo quando entrambe le parti giocano al meglio — e poi suggerisca la ricetta per correggerli.

Cruscotto del sistema di finetuning: configurazione, comandi del ciclo e tessere di stato con NashGap 0.0066.
Il cruscotto del sistema. A sinistra la configurazione: livello dell'avversario simulato (tier5, il più forte) e quante partite per ogni coppia (10, cioè oltre 5.500 duelli a ogni giro). Al centro i comandi — "Stop auto-tuning" in rosso, "Regenerate sandbox" in ambra, "Promote to data/live" spento e protetto dal lucchetto "Force apply". A destra lo stato: iterazione 4, ciclo vivo (pid 92233), e il NashGap a 0.0066 — un unico numero che riassume quanto l'intero roster è ancora lontano dall'equilibrio 50 e 50. Più scende, più il gioco è giusto.

Il cruscotto qui sopra è la plancia di comando. A ogni giro il sistema fa disputare oltre cinquemila duelli — tutte le 552 coppie, ripetute — dentro un ambiente separato che non tocca il gioco vero. Poi condensa l'esito di quelle migliaia di partite in un solo numero, che noi chiamiamo NashGap e che potete leggere come "quanto siamo lontani dal 50 e 50 su tutto il roster". In questa istantanea vale 0.0066, a un soffio dalla soglia che consideriamo "bilanciato". È un termometro. Sale quando qualcosa peggiora, scende quando la cura funziona. Il medico non guarda più 552 caselle a occhio: guarda la febbre.

Il primo passo di un arco più grande

C'è un motivo se abbiamo investito in questo e non in una scorciatoia. Sigilwake sta costruendo, in parallelo, un'intelligenza artificiale di gioco di nuova generazione — una rete neurale in stile AlphaZero, la stessa famiglia di sistemi che ha imparato gli scacchi e il Go da zero, giocando contro se stessa. È la tecnologia di punta del progetto, quella che un giorno piloterà gli avversari a un livello che un giocatore umano fatica a raggiungere.

E qui le due strade si toccano. La stessa rete che oggi stiamo insegnando a combattere, una volta arrivata a livello professionistico, potrà bilanciare il roster da sola. Ma c'è un ordine da rispettare, e non è negoziabile: per addestrare quella rete su una fisica di gioco che sia davvero quella vera serve prima un roster pulito, senza dominatori e senza vittime. Un gioco bilanciato è il banco di prova su cui la rete impara. Se le mostri un mondo storto, imparerà a giocare storto. Ecco perché il medico del bilanciamento viene prima: non è un accessorio, è la fondamenta su cui poggerà tutto il resto. Torneremo su questo legame nell'ultimo atto — è più stretto di quanto sembri.

Il sistema che vedete oggi non usa ancora una rete neurale — usa un motore statistico più semplice e trasparente, ed è una scelta deliberata: prima si costruisce lo strumento affidabile, poi lo si potenzia. Ma la direzione è segnata. Il primo mattone è questo: una macchina che gioca contro se stessa e misura la febbre del gioco. Apriamo il cofano.

Atto secondoLa macchina che gioca contro se stessa

Un reparto sperimentale, isolato dal gioco vero

Il modo classico di scoprire se un roster è equo è farci giocare centinaia di persone per mesi e leggere le lamentele. Noi abbiamo costruito qualcosa di diverso: una macchina che gioca contro se stessa, migliaia di volte per ogni accoppiamento, dentro un reparto sperimentale sigillato che non tocca mai il gioco pubblicato.

Lo chiamiamo sandbox — una parola che qui significa esattamente "recinto di sabbia": un'area protetta dove si può rompere tutto senza conseguenze. Il gioco vero, quello che gireranno i giocatori, vive nei suoi file. Il reparto sperimentale lavora su una copia. Le due cose non si toccano mai, per costruzione. È la stessa disciplina di un laboratorio farmaceutico: il farmaco sperimentale non entra in corsia finché qualcuno con la firma non decide che è pronto. Qui la firma è di un umano, sempre. Torneremo su questo — è il punto che rende tutto il sistema sicuro invece che pericoloso.

Il cruscotto che avete visto nell'atto primo è la plancia di questo reparto. Si legge a colpo d'occhio, come il quadro strumenti di un'auto. A sinistra la configurazione — la bravura dell'avversario (tier5, quello che gioca senza pietà) e le dieci partite per ogni accoppiamento, che moltiplicate per 552 coppie fanno oltre undicimila duelli per ogni giro di giostra. Al centro i comandi, con un solo pulsante rosso: fermare la messa a punto, il grande stop di emergenza che chiude l'iterazione in modo pulito senza lasciare nulla a metà. E, in fondo, l'unico pulsante che tocca il prodotto pubblicato: promuovere al gioco vero, volutamente scomodo, protetto da un lucchetto (Force apply) che va tolto a mano. Non si promuove niente per sbaglio.

NashGap: 0.0066 — la nostra misura di quanto il roster è lontano dall'equilibrio perfetto 50 e 50. Prendi ogni personaggio, guarda quanto si discosta dal vincere metà delle partite, eleva al quadrato ogni scarto (così gli sbilanci grossi pesano molto di più) e fanne una media. Più il numero è vicino a zero, più il gioco è giusto. A 0.0066 siamo vicini, ma non ancora dentro il bersaglio che ci siamo dati (0.005) — e pretendiamo tre iterazioni di fila tutte verdi prima di dichiarare vittoria, come un medico che non dimette il paziente al primo esame buono.

La vista d'insieme: guardare l'iterazione mentre respira

Il cruscotto dice come sta. La vista d'insieme dice cosa sta facendo, adesso.

Vista live della quarta iterazione: sei tessere di stato, riga di avanzamento e classifica di vittoria dei 24 personaggi.
La quarta iterazione, in diretta. In alto sei tessere: distanza dall'equilibrio 0.0066, scarto del personaggio peggiore 0.272 (il malato più grave in corsia), 42 minuti trascorsi, 5 proposte di modifica accumulate. Sotto, la riga viva: 3.165 / 11.040 partite, turno medio 19,9, insta-kill 0. E la classifica dei 24 aggiornata: glacius in testa con un imbarazzante 83,3%, cenere ultimo al 37,8%, il grosso del roster stretto tra 44% e 56%.

In cima, sei tessere riassumono la sessione. Poi la riga che si muove sotto gli occhi:

LIVE ITER 4 — 3.165 / 11.040 partite · 28,7% · trascorsi 23m · turni medi 19,9 · insta-kill 0

Undicimila duelli in coda, un terzo già combattuti. E dei numeri di qualità che sono musica per un designer: la partita media dura quasi venti turni — non troppo lampo, non eterna — e i colpi che uccidono al primo turno sono zero. Nessuno viene fulminato prima di poter giocare. Questo è ciò che vogliamo: duelli che si decidono con le mosse, non con la fortuna del sorteggio.

Istogramma della durata delle partite: quasi quattromila duelli distribuiti fra 7 e 51 turni, con il picco a 19 turni.
Quanto dura un duello. La distribuzione della lunghezza delle partite su 3.925 duelli campionati: si va da un minimo di 7 a un massimo di 51 turni, con la gobba che si addensa attorno ai 19 turni (429 partite, la durata più frequente). Né lampi né maratone — la forma della curva conferma quel turno medio 19,9: le partite si giocano, non si subiscono.

Sotto, la classifica di tutti e ventiquattro in diretta. E qui l'onestà del sistema si vede subito. In cima, in verde acceso, glacius all'83,3%. In fondo, cenere fermo al 37,8%. La stragrande maggioranza del roster è raccolta tra il 44% e il 56% — il grosso della squadra è già bilanciato — ma i due estremi urlano. Il sistema non li nasconde: li mette in prima pagina. Un cruscotto che mostrasse solo i numeri belli non servirebbe a niente.

Ventiquattro linee di winrate su quattro iterazioni: quasi tutte aggrappate al 50 per cento, una sola linea magenta isolata in alto attorno al 77-78 per cento e in lenta discesa.
Il roster che converge — e l'unico che resta indietro. La percentuale di vittoria dei 24 personaggi lungo quattro iterazioni (run 1run 4), con la banda sana 0,5 ± 0,07. Il grosso delle linee è ormai un fascio stretto attorno al 50%: la squadra si è assestata. La linea magenta isolata in alto è glacius, ancora fuori banda a circa 77% — l'ultimo malato che il sistema sta riportando giù, iterazione dopo iterazione.
Diagnostica fine: latenza dell'IA, accoppiamenti decisi in partenza, curva del NashGap in discesa e barre delle modifiche proposte.
La diagnostica fine. La velocità di pensiero dell'IA: su oltre tredicimila decisioni, tempo medio 3 ms, quasi mai sopra i 9. Gli accoppiamenti decisi in partenza — aurora 0% · 100% solaris, aeryn 0% · 100% glacius — dove un personaggio perde tutte le partite contro un altro. La curva della distanza dall'equilibrio che scende verso il bersaglio (0,0097 → 0,0066). E le barre verdi delle modifiche proposte: a questo stadio quasi tutti potenziamenti, non tagli.

Scorrendo più in basso arriva la diagnostica. L'avversario simulato ragiona in un battito di ciglia — è un giocatore forte e istantaneo, il che rende attendibile giocarci contro undicimila volte in un'ora. Poi la lista che fa male: gli accoppiamenti decisi in partenza, sfide dove un personaggio perde tutte le partite contro un altro. Zero su dodici. In gergo scacchistico è un hard counter: una posizione persa in apertura, qualunque cosa tu muova. Questi sono i casi più gravi, perché — come vedremo nell'atto dedicato al Doctor — non si sistemano ritoccando un numero. Vanno riprogettati.

Riga di latenza dell'IA di simulazione: su oltre quindicimila turni, minimo 1 ms, media 3 ms, 95esimo percentile 10 ms, massimo 279 ms.
La velocità di pensiero, misurata. Il tempo che l'avversario simulato impiega a decidere una mossa, su 15.338 turni: minimo 1 ms, media 3 ms, 95° percentile 10 ms, con una punta isolata a 279 ms. È questa istantaneità a rendere praticabile giocare undicimila duelli in un'ora — un avversario forte e immediato.

E infine la curva che dà speranza: la distanza dall'equilibrio scende iterazione dopo iterazione, puntando alla linea tratteggiata del bersaglio. È la temperatura del paziente che cala. Sotto, delle barre verdi contano le modifiche proposte a ogni giro — a questo stadio quasi tutte potenziamenti: il sistema sta cercando di tirare su i deboli prima di abbassare i forti.

Sparkline del NashGap che scende da circa 0,008, rompe sotto la linea tratteggiata del bersaglio a 0,005 e arriva a 0,0038 — circa il 51% in meno.
La febbre si spezza. Lo storico del NashGap, ridotto all'osso: prima un guizzo verso l'alto, poi si assesta in una discesa costante — da circa 0,008, dritto oltre il bersaglio tratteggiato a 0,005, giù fino a 0,0038: più che dimezzato. Un solo tratto in discesa dice tutto — la cura funziona, e la distanza dall'equilibrio continua ad assottigliarsi anche oltre l'obiettivo che ci eravamo dati.
Classifica degli sbilanci più gravi ordinati per severità e console di attività con gli orari degli eventi.
I malati gravi e il registro di bordo. In coda alla vista, la classifica ordinata per severità — non per vittorie — con glacius in testa (0.272), seguito da umbral, solaris, cenere, lyra. E una console che scorre gli eventi con l'ora esatta: loop_start, iter_end nash=0.0066. Ogni cosa che il sistema fa lascia una traccia leggibile. Niente magia, niente scatole nere.

La griglia: chi batte chi

La classifica dice quanto vince ciascuno. Ma nasconde una domanda più profonda: vince contro chi? Un personaggio al 50% potrebbe essere onestamente equilibrato — oppure potrebbe stritolare metà del roster e farsi stritolare dall'altra metà, con la media che maschera il disastro. Per vederlo serve la mappa completa: è la radiografia a corpo intero che avete incontrato in apertura, la griglia 24×24 di tutti gli accoppiamenti.

Un occhio esperto la legge come una lastra. La riga di glacius è una striscia di verde acceso — è lui il malato più forte, quello che rende il gioco ingiusto. La riga di umbral, all'opposto, è punteggiata di rossi e di zeri: perde ovunque. E poi le caselle estreme, quei 100 e 0 secchi sparsi qua e là: gli accoppiamenti decisi in partenza, le condanne d'apertura. La griglia le rende visibili tutte insieme, in una sola immagine. È esattamente ciò che un designer umano impiegherebbe settimane a compilare a mano — e qui si rigenera a ogni iterazione, da sola.

Il carattere di ciascuno: non solo se vince, ma come

C'è un'ultima domanda, la più sottile, e per un gioco è forse la più importante. Un personaggio può essere perfettamente bilanciato al 50% e ciononostante essere noioso: se vince sempre spammando la stessa identica mossa, i numeri sono a posto ma il divertimento è morto. L'equilibrio statistico non basta. Serve profondità.

Schede per personaggio con percentuale di vittoria, diversità delle scelte, concentrazione del colpo di grazia e abilità morte.
Una cartella clinica per personaggio, ordinata dal più sbilanciato al più equo. Accanto alla percentuale di vittorie, tre indicatori di qualità: la diversità delle scelte (H), la concentrazione del colpo di grazia (kb: oltre 0,7 scatta l'etichetta rossa 1-trick) e le abilità mai usate. In fondo, con la spunta verde, raiden: 50,0%, deviazione 0,000 — il personaggio perfettamente centrato. È lì che vogliamo portare tutti gli altri.

Ecco perché accanto alla percentuale di vittoria mettiamo tre indicatori che raccontano la qualità del gioco, non solo il risultato:

La diversità delle scelte (H) misura quanto un personaggio usa davvero tutto il suo arsenale. Un valore alto (verso 1,0) significa che alterna le sue quattro abilità come un pugile che varia i colpi; un valore basso tradisce un giocatore monocorde. Seraph e tessara brillano qui (0,95, 0,94): giocano ricco. Umbral, oltre a perdere, si appoggia a poche mosse, con una diversità appena 0,71.

La concentrazione del colpo di grazia (kb): quante vittorie vengono chiuse dalla stessa, identica mossa finale. Oltre il 70% scatta l'etichetta rossa 1-trick — il personaggio che ha imparato una sola sequenza vincente e la ripete. Il sistema la stampa in chiaro su theron, zephyr, seraph. Sono equilibrati sui numeri, ma vanno resi più vari.

Le abilità morte (dead ab): mosse che il personaggio, potendo, non sceglie mai. Un'abilità morta è codice sprecato e una promessa mancata al giocatore. Quasi tutte le schede ne segnalano una o due. In cima alla lista ritroviamo i soliti noti — glacius col suo 77,2% e il triangolino d'allarme, poi umbral, solaris; in fondo, centrato al millimetro, raiden.

Perché il recinto di sabbia è tutto

Fermiamoci un attimo sul punto che rende questo sistema difendibile e non pericoloso. Tutto ciò che avete visto — le migliaia di partite, la griglia che si riempie, le proposte di modifica che si accumulano — accade dentro il reparto sigillato, su una copia. Mentre la macchina macina undicimila duelli, il gioco pubblicato non cambia di una virgola. Il team può lavorare all'arte, ai menù, a una nuova modalità, e nessuno vede i numeri muoversi sotto i piedi.

E la porta tra il laboratorio e la corsia si apre solo con una firma umana. Quel pulsante promuovi al gioco vero, spento e protetto dal lucchetto, è l'unico varco. La macchina può proporre quanto vuole; applicare al prodotto reale è una decisione, non un automatismo. È la differenza tra un assistente che ti prepara la diagnosi e un robot che ti opera da solo. Noi abbiamo costruito il primo, di proposito.

Questa è la macchina che gioca contro se stessa: instancabile nel misurare, spietata nel mostrare i difetti, e per costruzione incapace di rompere il gioco vero senza che un umano lo decida. Misura dove è rotto l'equilibrio con quattro strumenti diversi. Ma su un caso — i personaggi condannati in apertura, i 0% che nessun ritocco numerico può salvare — anche la migliore delle misure si ferma. Lì non serve un termometro più preciso. Serve un medico che riprogetti il paziente.

Atto terzoBalance Doctor: dal farmacista al chirurgo

Abbiamo costruito un medico per il problema dell'equilibrio. Si chiama Balance Doctor, e vive dentro un cruscotto. Come un vero medico, lavora su due livelli. Il primo livello aggiusta il dosaggio. Il secondo — quello nuovo, la novità di questo capitolo — interviene quando la diagnosi è che l'anatomia del paziente è sbagliata, e nessun dosaggio la raddrizzerà.

Il cruscotto della diagnosi

Scheda Doctor: intestazione della diagnosi con 17 target, 5 nerf, 12 buff, e le prime schede personaggio con la cura proposta.
Il referto. In cima, tre numeri: 17 personaggi fuori banda, di cui 12 da rinforzare (badge verde BUFF) e 5 da limare (badge rosso NERF). Accanto, il NashGap 0.00662 e l'anomalia "medium". Poi una scheda per ogni malato: la più grave è umbral, che vince il 38,8% (11,2 punti sotto la linea di galleggiamento); all'estremo opposto eclisse, 58,2%, otto punti sopra. Ogni scheda propone già la cura e ne stima l'effetto.

Il Doctor apre con una diagnosi da referto. Poi, il corpo del referto: una scheda per ogni malato, con la cura già scelta ("chosen patch") e l'effetto atteso. Non è un elenco di opinioni. È una lista di interventi con un numero accanto a ciascuno, come un piano terapeutico:

  • umbral → costo di Artiglio Oscuro da 80 a 68 (renderla più economica): impatto stimato +5,3 punti.
  • eclisse → potenza di Freccia del Vuoto da 4.2 a 3.78: circa 3,5 punti di rientro verso la banda, dall'alto.
  • theron → durata dell'effetto di stato di Lama Biforcuta da 3 a 4 turni: +5,8 punti.
  • aurora → costo di Cura Maggiore da 100 a 85: +5,3 punti.
Scheda-personaggio del Doctor per glacius: winrate 78,8 per cento con scostamento di 28,8 punti sopra la banda, badge NERF, patch scelta sul costo di Morso di Gelo da 50 a 62, impatto stimato 8,4 punti.
L'unità di diagnosi, da vicino. Una singola scheda del referto: glacius, che vince il 78,8% (+28,8 punti sopra la linea), etichetta rossa NERF. La cura scelta è chirurgica e leggibile a colpo d'occhio: costo di Morso di Gelo da 50 a 62, impatto stimato +8,4 punti verso la banda. In fondo, 2 alternative pronte se questa non bastasse.

Livello uno: girare le manopole

Le 17 modifiche come tabella raggruppata per livello: tutte nella colonna Cards, zero su Passives, Stats e Global rules.
La medicina 1.0/2.0: tarare i numeri. Le 17 modifiche riorganizzate come tabella, raggruppate per livello: tutte nella colonna "Cards", zero su "Passives", zero su "Stats", zero su "Global rules". Ogni riga è un singolo parametro spostato di poco: costo 80→68, potenza 4.2→3.78, durata 3→4. In basso, il NashGap che scende: 0.00969 tre cicli fa, 0.00662 adesso — il roster si è avvicinato all'equilibrio del 31,6% in tre giri.

Il Doctor ha a disposizione un pannello di manopole — il costo di un'abilità, quanto il suo danno cresce con la statistica del personaggio, la durata di un congelamento, la probabilità che un colpo stordisca — e le gira una tacca alla volta. Nessuna abilità viene stravolta: si aggiusta la dose e si rimisura. E funziona, entro i suoi limiti: girando manopole, il medico porta la maggioranza dei personaggi dentro la banda sana.

Tabella dell'attività di tuning per iterazione: ogni riga con numero di patch totali, buff, nerf e NashGap di partenza.
Cosa cambia a ogni giro. Il registro delle iterazioni, riga per riga: quante modifiche totali, quanti buff e quanti nerf il sistema ha proposto, e il NashGap di partenza. Nei primi giri una modifica per volta, sempre un potenziamento (1 buff · 0 nerf): la strategia è tirare su i deboli prima di limare i forti, un parametro alla volta, rimisurando dopo ognuno.
Traiettorie di vittoria dei cinque personaggi più fuori norma su tre cicli, con la linea tratteggiata del 50%.
Dove le manopole mordono, e dove no. Le traiettorie dei cinque casi più ostinati, con la linea tratteggiata del 50%. cenere risale piano (39% → 40% → 41%) e lyra con lei: il paziente reagisce. solaris, invece, resta inchiodato (61% → 61% → 61%), immobile per tre cicli. E glacius scende con la lentezza di chi non vuole guarire (83% → 78% → 77%). Su alcuni personaggi puoi girare la manopola quanto vuoi: l'ago non si muove come dovrebbe.

Ma qui affiora il limite. Le traiettorie dei cinque casi più ostinati raccontano due storie diverse: alcuni reagiscono, altri restano piantati dove sono. Su certi personaggi la taratura non basta più.

Quando le manopole non bastano

C'è una categoria di pazienti su cui la taratura non solo non basta — peggiora le cose. Il caso che ci ha aperto gli occhi si chiama boreus, un custode del ghiaccio pensato per assorbire i colpi e restituirli. Sulla carta un concetto elegante. Nei fatti, cronicamente sotto la linea, e — questa è la parte perversa — ogni volta che lo rinforzavamo, vinceva di meno. Abbassi il costo delle sue abilità? Peggiora. Aumenti la potenza? Peggiora ancora.

Elenco degli accoppiamenti estremi in diretta: aurora perde 0 per cento contro prisma, solaris e raiden, aeryn 0 per cento contro glacius, aurora 100 per cento contro boreus.
Le condanne d'apertura, in chiaro. Gli accoppiamenti che finiscono 0% o 100% su tutte e quindici le partite: aurora perde ogni duello contro prisma, solaris e raiden; aeryn non vince mai contro glacius; e boreus viene spazzato via da aurora (0%). Non sono squilibri di pochi punti: sono hard counter, sfide perse in partenza. Nessuna manopola girata di una tacca li raddrizza — è il sintomo di un concetto sbagliato, non di una dose sbagliata.

Quando ogni cura fa ammalare di più, la diagnosi cambia natura. Il problema di boreus non è il dosaggio. È il concetto: il modo in cui le sue abilità, la sua passiva e la sua identità di combattimento si incastrano è internamente contraddittorio. Nessuna manopola raddrizza un'anatomia storta. Serve un chirurgo, non un farmacista.

Il pezzo verificabile: il diff

Prima di parlare del chirurgo, una prova di onestà. Tutto quello che il sistema propone finisce in un posto solo, e quel posto mostra codice vero, riga per riga, prima che qualcosa vada in produzione.

Scheda Diff: confronto stile-git fra i dati live e la copia di lavoro, con sei righe aggiunte su abilities.json.
Il diff pre-commit. Un confronto fianco a fianco tra i dati live, in produzione e la copia di lavoro con tutte le modifiche applicate. In testa la promessa: è l'esatto diff che "Applica + Commit" scriverebbe nei dati. Su abilities.json: sei righe aggiunte, zero rimosse — le "spine" della passiva di boreus. characters.json e game_config.json: "nessuna modifica", la copia è identica al live. Niente scatola nera.

E qui si vede il ridisegno di boreus, concreto. Alla sua passiva viene aggiunto un nuovo blocco:

data/abilities.json  vs  overlay/abilities.json      +6 · −0      "flatValue": 15,      "multiplier": 1,      "type": "counter"+    },+    {+      "affectsSelf": true,+      "flatValue": 8,+      "trigger": "cantAct",+      "type": "auraDamage"     }   ],   "element": "gel",

Tradotto: delle "spine" sempre attive. Chi colpisce boreus incassa un danno di ritorno costante, senza che lui debba far nulla — coerente con la sua identità di difensore che punisce chi lo attacca. L'intervento è chirurgico e circoscritto, leggibile da un umano in dieci secondi prima di toccare la produzione. Questa è la prova che l'output del sistema non è una slide: è codice reale e verificabile.

Il salto del 3.0: ridisegnare, non ritoccare

Le "spine" di boreus non sono una manopola girata di una tacca: sono un pezzo di kit ridisegnato. È questo il livello 3.0 del medico — smettere di tarare numeri e iniziare a ripensare la struttura del personaggio.

Il chirurgo ragiona su due basi di conoscenza che gli abbiamo dato in mano. La prima è la lore di ogni personaggio: chi è, di che elemento è fatto, che carattere ha, come combatte. La seconda è l'enciclopedia delle meccaniche del motore: tutti i mattoncini con cui un'abilità può essere costruita — danno d'aura, furto di vita, contrattacco, controllo, scudi. Con questi due libri aperti, il Doctor 3.0 può proporre interventi prima fuori portata: aggiungere o togliere un effetto, scambiare un'abilità, cambiare la condizione che la fa scattare, riprogettare la passiva da capo, cambiare l'archetipo, o forgiare una firma unica.

Sono operazioni potenti — e per questo pericolose. Un numero storto rovina un personaggio; un concetto storto ne rovina l'idea. Perciò il ridisegno viaggia con due garanzie non negoziabili:

  1. Cita la lore alla lettera. Ogni proposta deve agganciarsi a una frase testuale delle schede narrative del personaggio — non una parafrasi, la citazione esatta. È il nostro anticorpo contro l'invenzione: se il sistema non trova nella lore una giustificazione letterale, la proposta viene rifiutata dal controllore prima ancora di arrivare a noi.
  2. L'ultima parola è sempre di un essere umano. Nessun ridisegno strutturale si applica da solo, mai. La proposta compare nel cruscotto con due bottoni — Approva / Rigetta — e resta lì, in pausa, finché non è una persona a cliccare. Nessuna scorciatoia, nessuna modalità automatica. Il raggio d'azione è troppo ampio per delegarlo a una macchina.

Nulla di tutto questo è teorico. Ecco quel veto umano al lavoro — e la macchina che ne esce più affilata — su un personaggio di nome neve:

Scheda clinica: il Medico ha prima proposto di aggiungere una cura al personaggio troppo forte neve — un potenziamento travestito da indebolimento — il revisore umano l'ha rigettato, al progettista è stata insegnata la direzione, e ha riproposto di rimuovere l'auto-cura passiva di neve, la radice del suo dominio.
Il medico che si corregge da solo. Neve era troppo forte e insensibile alle regolazioni fini, così è stata promossa al chirurgo. Il suo primo taglio era rovesciato — proponeva di aggiungere sostentamento a un personaggio già troppo forte, un potenziamento travestito da indebolimento, e il revisore umano l'ha rigettato. Allora abbiamo insegnato al progettista la direzione — un personaggio sopra la banda va indebolito, mai nutrito — e ha riproposto l'opposto: rimuovere l'instancabile auto-cura passiva che era la radice del suo dominio, lasciando intatta la sua identità di controllo e −40% di mitigazione. L'essere umano ha colto l'errore; la macchina ha imparato la regola, proprio sul caso che l'aveva rivelato.

La lezione onesta: "progetta" contro "scegli"

Vale la pena raccontare un errore, perché è istruttivo. La prima versione del chirurgo era la più ambiziosa: dare all'intelligenza artificiale un foglio bianco e dirle "progetta tu il personaggio da zero". Elegante in teoria. In pratica, un disastro di lentezza: la generazione impiegava oltre quattro minuti e mezzo, e il più delle volte non partoriva alcuna proposta — andava in stallo. Un chirurgo che medita così a lungo davanti al paziente aperto non è un chirurgo utile.

La diagnosi è stata precisa: non era colpa della dimensione del problema né dell'ambiente. Era il compito a essere troppo pesante — "progetta da zero" è un atto di ragionamento aperto, senza appigli. La correzione ha ribaltato l'impostazione, e la chiamiamo "design → curate": adesso è il codice a generare un ventaglio di opzioni già valide — tutte agganciate alla lore, tutte compatibili col motore — e l'intelligenza artificiale si limita a scegliere la migliore e a spiegarla in italiano. Da inventore a curatore. Risultato misurato su boreus: da "oltre quattro minuti e quasi mai una risposta" a una proposta valida in circa 50 secondi, con una rete di sicurezza che garantisce che una proposta ci sia sempre. La lezione generale: quando chiedi a un'IA di ragionare nel vuoto paghi in tempo e affidabilità; quando le dai opzioni concrete tra cui scegliere, vola.

Le cinque fasi, in una frase

Sotto il cofano, il medico 3.0 è cinque tappe in fila: (1) raccogliere la lore di tutti i personaggi in un archivio ordinato; (2) catalogare ogni meccanica del motore in un'enciclopedia consultabile; (3) costruire gli attrezzi del chirurgo — le mosse di ridisegno più il controllore che le valida; (4) collegare l'intelligenza artificiale che sceglie e motiva; (5) cucire il tutto nel cruscotto, con i bottoni Approva / Rigetta e la pausa obbligatoria per la firma umana.

Atto quartoIl collegamento al cervello: perché questo medico allena il campione

C'è una domanda che, a questo punto, un investitore attento farebbe: e allora? Un roster equilibrato è bello, ma è il fine o il mezzo?

È il mezzo. Tutto quello che il medico del bilanciamento fa — misurare i winrate, disegnare la matrice di chi batte chi, calcolare quanto il roster è lontano dall'equilibrio, proporre le cure — non è un traguardo a sé. È il tavolo operatorio su cui costruiamo il vero paziente: una rete neurale di gioco.

Cosa stiamo costruendo davvero

Nel motore di Sigilwake l'avversario, oggi, è pilotato da un'intelligenza artificiale che pensa "a forza bruta": esamina molte mosse in avanti e sceglie la migliore. Solida, ma cieca alle strategie composte, quelle che si dipanano su dieci turni. Il passo successivo è una rete della stessa famiglia che ha battuto i campioni del mondo di Go e di scacchi: una parte che propone le mosse, una che stima chi sta vincendo, e un pianificatore che esplora tra le dodici e le venticinque mosse in avanti.

Cruscotto della rete neurale di Sigilwake: sei componenti, circa 454k parametri, inferenza sotto il millisecondo e la barra delle otto fasi.
La roadmap della rete neurale. Architettura in stile AlphaZero, ~454 mila parametri distribuiti su sei componenti — meno di un megabyte una volta compresso, inferenza sotto il millisecondo. La barra delle otto fasi: una in corso, sette già progettate. La fase di progettazione è chiusa: un audit incrociato fra due modelli AI indipendenti ha prodotto oltre trenta correzioni prima di scrivere una riga di training; la divergenza strutturale col motore reale è oggi all'11,64%, con l'obiettivo dichiarato di scendere sotto il 5% prima di dire "si parte".

Attorno a questo cuore, tre estensioni che pochissimi studi si permettono. Un modello del mondo appreso: la rete impara a immaginare come evolve la partita, mossa dopo mossa, senza ricalcolare ogni dettaglio dello scontro — sogna i rollout invece di simularli. Personalità diverse per i boss: lo stesso cervello, con un piccolo "codice di stile", gioca come un bruto aggressivo o come un tessitore paziente di controllo. Otto personalità da un solo modello, non otto modelli separati. E l'adattamento durante il match: un sottile strato che si mette a punto nel corso della singola partita, così il boss di fine gioco impara il tuo stile in due o tre turni e cambia passo.

Il pezzo di integrazione più rischioso — far girare la rete dentro il server di gioco invece che in un servizio a parte — è già stato provato e consegnato: venti milionesimi di secondo per decisione, latenza sotto il millesimo di secondo anche al 99° percentile.

Il legame preciso: due direzioni, un solo cervello

Ecco perché il bilanciamento non è un lavoro parallelo, ma il primo gradino della stessa scala. Il legame è a doppio senso.

Direzione uno — il roster equilibrato è il prerequisito per allenare la rete. Una rete neurale impara dai dati. Se le dai partite giocate su un roster rotto — dove un personaggio vince nel 5% dei casi per un difetto di progetto, non per scelte del giocatore — non impara a giocare bene: impara a sfruttare quel difetto. E anche dopo la correzione, ci vuole moltissimo riaddestramento per smaltire il vizio appreso. Nella nostra tabella di marcia interna questo è, alla lettera, il prerequisito numero uno. Vale lo stesso per la fisica del combattimento: la rete predice sulla base di un simulatore interno, e quel simulatore deve corrispondere al motore reale. Oggi lo misuriamo di continuo — la divergenza è scesa all'11,64%, l'obiettivo è portarla sotto il 5%. Un chirurgo non opera su una radiografia sfocata. Il medico del bilanciamento è ciò che mette a fuoco la lastra.

Direzione due — a regime, la stessa rete si bilancerà da sola. Una volta che la rete gioca a livello professionale, non serve più un medico esterno che tara i numeri a mano: la rete gioca contro se stessa, per ogni singolo accoppiamento, misura i winrate e propone le correzioni. Il designer firma, o rifiuta. Tutto il macchinario che avete visto negli atti precedenti — il cruscotto, la matrice testa-a-testa, le traiettorie per personaggio, il Doctor che diagnostica — è la versione artigianale di un processo che un giorno la rete svolgerà da sé. Due capacità nello stesso cervello: giocare a livello pro, e tenere in equilibrio il gioco che gioca.

Ed è qui il vantaggio competitivo difendibile, detto senza gonfiare: pochissimi studi indipendenti hanno un'intelligenza artificiale che gioca a livello da campione. Ancora meno ne hanno una che, per giunta, sa bilanciare il proprio gioco da sola. Le due cose insieme, in un prodotto costruito da uno studio piccolo, sono rare.

Non è una slide: gira su infrastruttura vera

Vale la pena chiudere con una nota di concretezza, perché nel settore è facile confondere una roadmap con un rendering. Tutto questo — il loop di bilanciamento, i server di combattimento, il cervello che verrà — vive sopra la stessa infrastruttura di produzione che regge il gioco.

Sala macchine in tempo reale: partite attive, connessioni aperte, zero errori, inventario dei servizi e infra snapshot per container.
La sala macchine in tempo reale. Partite attive, connessioni aperte, zero errori al minuto, e l'inventario dei servizi vivi (matchmaking, autenticazione, streaming dei replay). In basso l'istantanea dell'infrastruttura: il server di combattimento a 13,9 MiB di memoria e 0% di CPU a riposo, il cuore di rete a 81,7 MiB, il database a 55,6 MiB — i due data-center marcati "OK".

I numeri raccontano una macchina frugale. Decine di container, ciascuno che consuma una frazione della sua capacità, tutti con zero errori nell'ultima finestra di campionamento.

Dettaglio per singolo container: memoria, CPU ed errori degli ultimi dieci minuti, ogni servizio marcato CORE.
Il dettaglio, container per container. Memoria, CPU ed errori degli ultimi dieci minuti. Ogni servizio marcato "CORE" è un mattone dell'infrastruttura di produzione, non un simulatore da laboratorio. È lo stesso pavimento su cui poserà i piedi la rete neurale: nessun contenitore extra, nessuna rete fisica da attraversare a ogni decisione del boss — la rete girerà dentro il server, in un solo prodotto più solido.