Nell’ultimo periodo ci siamo concentrati molto sul testing del motore di gioco e di tutte le sue funzioni.

Una cosa che è saltata subito all’occhio da parte dei nuovi utenti è stato proprio il grinding estremo per ottenere oggetti di comune utilità come le Pokéball.  Così abbiamo deciso di implementare i famosi Pokéstop.

Pokéstop

Per quanto se ne voglia, sono un’idea carina e permettono di avere gli oggetti di base per andare avanti nel gioco senza sforzo estremo! In questo modo non è necessario fare grinding estremo per ottenere il denaro per acquistare le Pokéball per iniziare a formare la propria squadra.

Ogni Pokéstop dropperà ogni 5 minuti una Pokéball omaggio o una Pozione omaggio al giocatore. Potrebbe droppare anche oggetti più rari eh! 😉
Perchè oggetti “omaggio”? Perchè non è possibile rivenderli. O meglio, è possibile farlo, ma è inutile perchè costano 5$ e quindi non si ricava abbastanza.

Ma dove li piazziamo? E’ un bel dilemma! Io non sono la Niantic, non ho Ingress e la sua banca dati.
Così, dopo un paio di giorni di discussione e analisi della situazione con il team di consulenza, siamo riusciti a tirar fuori una situazione davvero carina!

Generazione dell’area di gioco

Partiamo dal principio e dalla generazione dell’area di gioco:

  • Un giocatore si connette e invia la sua posizione
  • Il server di gioco marca quella zona di gioco come “da controllare” e posticipa l’esecuzione di questo controllo
  • … succedono altre cose qui (altri giocatori fanno cose, si accede al database, si scambiano messaggi ecc… )
  • Il server decide di effettuare un update sul mondo di gioco e inizia con lo scansionare le aree marcate “da controllare”
  • … succedono cose qui ….

La procedura che viene effettuata durante il controllo della zona è la seguente:

  1. Si acquisisce un blocco esclusivo sulla zona (nessun altro server può leggere/scrivere dati in quella zona del mondo)
  2. Vengono enumerate tutte le entità in quella zona e vengono fatte le seguenti scelte:
    1. Se non c’è uno spawn point => crea uno Spawn Point (che ricopre tutta l’area, ovviamente!)
    2. Se non c’è un entità AutoWorld => crea un’entità AutoWorld per questa zona
  3. Rilascia il blocco sulla zona.

Questo permette di creare una zona del mondo di gioco solo quando viene “esplorata” da qualcuno. Ma cos’è quell’entità AutoWorld menzionata? E’ semplice! Un’entità AutoWorld è un tipo di entità astratta che una volta inserita effettua delle chiamate alle varie data sources per ottenere i negozi, i dungeon e gli ospedali sul territorio. Possiamo vederla come un’entità che effettua un solo compito: scaricare la lista degli edifici e crearli. Al momento vengono usate 2 principali data sources: Google Maps (tramite Google Places) e Open Street Map.  Il risultato è ovviamente molto accurato: per ogni negozio c’è il corrispettivo Market in gioco e per altri tipi di dati ci sono i dungeon.

Adesso abbiamo la nostra bella zona, appena creata! Piena di negozi, dungeon e ospedali!

Ma ci servono davvero tutti? Servono davvero tutti quei negozi sulla mappa? Tutti a vendermi le stesse cose … e servono davvero tutti quei dungeon molto simili tra di loro? La risposta è stata ovviamente NO.

In un primo momento c’era sembrata un’idea fantastica ma alla fine dei conti è troppo dispersiva e aggiunge poco al gioco. Così abbiamo deciso di seguire un’altra strada: ogni elemento del mondo reale ha un corrispettivo elemento nel mondo di gioco che può essere un dungeon, un market, un pokéstop o altro (qualcuno ha detto RAID?).

E così abbiamo continuato con l’analisi: ma ci serve davvero Google Places? E’ davvero così necessario avere TUTTI i negozi? o ne bastano anche solo un paio per zona? Così man mano ci siamo allontanati dall’idea di usarlo ed è stato rimosso dalle fonte di dati a nostra disposizione. Al momento usiamo solo i dati statici di Open Street Map. E ragionando su OSM ci siamo chiesti: ma dobbiamo per forza usarli as as service? Il mondo è veramente così “variabile”? Diciamoci la verità, le mappe non vengono aggiornate ogni giorno e le differenze sostanziali si ottengono solo nel tempo e questo ci porta al download delle mappe dell’Italia (recuperate qui www.geofabrik.de) e allo scrivere un piccolo programma di analisi per tirar fuori quello che ci interessa (negozi, punti di interesse e altro .. ). Il tutto è precomputato: il server di gioco conosce a priori la mappa di gioco ed è in grado di caricare le zone direttamente da questi dati. Questi dati ottenuti dalla mappa di OSM quindi vengono processati secondo un semplice algoritmo:

  • Crea un file .map vuoto
  • Per ogni elemento di interesse su questa mappa:
    • x = ID dell’elemento
    • Se x % 3 == 0 allora crea un market alle coordinate di quell’elemento
    • Se x % 3 == 1 allora crea un pokéstop
    • Se x % 3 == 2 allora crea un dungeon
  • Aggiungi l’elemento appena generato al file .map

x % 3 è l’operazione modulo, in breve: è il resto della divisione x / 3. In questo caso 3 è un esempio, all’interno del gioco è un valore più alto perchè ci sono molti più tipi di entità.

L’output di questa procedura è un file .map che contiene tutte le entità (come potete intuire, il mondo è pregenerato) e un file .install che contiene uno script di “installazione” per ogni entità inserita nel mondo. Ogni file di installazione viene letto poi dal server all’avvio e le entità vengono inserite nel mondo di gioco (in breve: viene creato uno stub che contiene le istruzioni per caricare l’entità reale dal file .map quando qualche giocatore “lo vede” sulla mappa)

Così la procedura diventa questa:

  1. Si acquisisce un blocco esclusivo sulla zona (nessun altro server può leggere/scrivere dati in quella zona del mondo)
  2. Vengono enumerate tutte le entità in quella zona e vengono fatte le seguenti scelte:
    1. Se non c’è uno spawn point => crea uno Spawn Point (che ricopre tutta l’area, ovviamente!)
  3. Rilascia il blocco sulla zona.

La procedura effettua un solo controllo che viene eseguito in pochissimo tempo, gli edifici non devono essere “scaricati” da Google Places ma sono già presenti nel mondo e quindi vengono passati immediatamente al giocatore.

Risultato

Il mondo è un sacco più vario! Ci sono meno elementi, certo, ma non così pochi da “vedere la mappa vuota”.
Siamo molto soddisfatti dei risultati ottenuti!

Categories:

Tags:

No responses yet

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

To the official owners of Pokemon

To the official owners of Pokemon: If you wish me to take down this game/page, feel free to contact me and I will respectfully oblige.