Escola Universitària d’Enginyeria Tècnica de Telecomunicació La Salle

Treball Final de Grau

Grau en Enginyeria Multimèdia

Desarrollo de una librería para cargar mapas interactivos en videojuegos

Alumne Professor Ponent

Gerard Parareda Gallifa Alba Llauró Moliner

ACTA DE L'EXAMEN DEL TREBALL FI DE CARRERA

Reunit el Tribunal qualificador en el dia de la data, l'alumne

D. va exposar el seu Treball de Fi de Carrera, el qual va tractar sobre el tema següent:

Desarrollo de una librería para cargar mapas interactivos en videojuegos

Acabada l'exposició i contestades per part de l'alumne les objeccions formulades pels Srs. membres del tribunal, aquest valorà l'esmentat Treball amb la qualificació de

Barcelona,

VOCAL DEL TRIBUNAL VOCAL DEL TRIBUNAL

PRESIDENT DEL TRIBUNAL

Abstract Castellano

En este proyecto se pretende investigar sobre el desarrollo de los mapas interactivos que aparecen en los juegos de estrategia. Con ello, se busca dar un poco de luz a todas las técnicas que se usan para la creación de mapas, ya que prácticamente no hay documentación alguna de cómo se realizan. Además, se implementa una nueva técnica a partir de archivos topológicos TopoJSON, para conseguir un resultado parecido a los videojuegos profesionales con muchos menos recursos.

El objetivo de dicha implementación es observar y documentar las posibilidades, ventajas y desventajas de usar un archivo TopoJSON como base para crear videojuegos o para saldar algunas necesidades que puedan tener los desarrolladores.

Para dar respuesta a estas cuestiones, se ha comparado la implementación y los resultados entre diferentes metodologías para resolver el mismo problema: cómo crear un mapa dinámico, interactivo y modificable, concluye con la validación de que es posible hacer un videojuego usando mapas TopoJSON. Según los resultados, esto es posible si se buscan ciertas características, ya que responde sólidamente a unas necesidades concretas de creación de videojuegos.

En definitiva, con este estudio se constata que se podría abstraer mucho más el concepto de mapa dinámico para diseñar e implementar una solución que pueda servir en multitud de juegos y softwares; y así dar paso a un género, de momento poco accesible, pero que busca reinventarse constantemente: la gran estrategia.

v Desarrollo de una librería para cargar mapas interactivos en videojuegos Abstract Catalán

En aquest projecte es pretén investigar sobre el desenvolupament dels mapes interactius que apareixen en els jocs d’estratègia. Amb això, es busca donar una mica de llum a totes les tècniques que s’empren per la creació de mapes, ja que pràcticament no hi ha cap documentació de com es fan. A més, s’implementa una nova tècnica a partir d’arxius topològics TopoJSON, per aconseguir un resultat semblant als videojocs professionals amb molts menys recursos.

L’objectiu d’aquesta implementació és observar i documentar les possibilitats, avantatges i desavantatges d’usar un arxiu TopoJSON com a base per crear videojocs o per complir algunes necessitats que puguin tenir els desenvolupadors.

Per poder respondre a aquestes qüestions, s’ha comparat la implementació i els resultats entre diferents metodologies per resoldre el mateix problema: com crear un mapa dinàmic, interactiu i modificable, arribant a la conclusió de que és possible fer un videojoc usant mapes TopoJSON. Segons els resultats, això és possible si es busquen certes característiques, ja que responen sòlidament a unes necessitats concretes de la creació de videojocs.

En definitiva, amb aquest estudi es constata que es podria abstreure molt més el concepte de mapa dinàmic per dissenyar i implementar una solució que pugui servir en multitud de jocs i software; i així donar pas a un gènere, de moment poc accessible, però que busca reinventar- se constantment: la gran estratègia.

vi

Abstract

Inglés

This project aims to investigate the development of interactive maps that appear in strategy games. With this, it is intended to shed some light on all the techniques used to create maps, since there is practically no documentation of how they are done. In addition, a new technique is implemented using topological TopoJSON files, to achieve a result similar to professional videogames with much less resources.

The objective of this implementation is to observe and document the possibilities, advantages, and disadvantages of using a TopoJSON file as a basis for creating videogames or to meet some needs that developers may have.

To answer these questions, different methodologies implementation and results have been compared whilst trying to solve the same problem: how to create a dynamic, interactive and modifiable map, which concludes with the validation that it is possible to make a videogame using TopoJSON maps. According to the results, this is possible if certain characteristics are sought since it responds solidly to specific needs for videogames creation.

In short, this study shows that the concept of dynamic maps could be much more abstracted in order to design and implement a solution that can be used in a multitude of games and software; thus giving way to a genre, which is not very accessible at the moment, but which constantly seeks to reinvent itself: the grand strategy.

vii Desarrollo de una librería para cargar mapas interactivos en videojuegos Agradecimientos

A Alun Evans, por el tiempo que me dio en la beca, de donde salió la idea de TopoMap.

A Roger Cecília, Pol Muñoz y Álex Cordon por la paciencia y ayuda proporcionada.

viii

ix Desarrollo de una librería para cargar mapas interactivos en videojuegos Contenido

1 Introducción ...... 1 1.1 Marco teórico ...... 1 1.2 Problema inicial ...... 14 1.3 Estado del arte ...... 15 1.3.1 Herramientas de modding ...... 15 1.3.2 Generadores de mapas con bitmaps ...... 17 1.3.3 Generadores de mapas poligonales ...... 21 1.3.4 Librerías de mapas dinámicos ...... 24 1.4 Solución propuesta...... 26 2 Parte teórica ...... 27 2.1 JSON ...... 27 2.1.1 GeoJSON ...... 28 2.1.2 TopoJSON ...... 29 2.2 Unity ...... 30 2.2.1 JsonUtility ...... 30 2.3 Triangulator ...... 30 2.4 Regex ...... 31 2.5 Mapa TopoJSON ...... 32 3 Parte práctica ...... 33 3.1 Lectura de TopoJSON ...... 33 3.1.1 Lectura de arrays multidimensionales con JsonUtility ...... 33 3.1.2 Elementos clave de las especificaciones ...... 34 3.1.3 Transforms ...... 36 3.1.4 Arcs ...... 36 3.2 Índices de Arcs ...... 37 3.3 Representación de un TopoJSON ...... 39 3.3.1 Distinguir provincias ...... 41 3.3.2 Seleccionar distintas provincias ...... 43 3.3.3 Modificar las provincias...... 44 4 Costes del proyecto ...... 46 5 Conclusiones...... 47

x

6 Líneas de futuro ...... 48 7 Referencias ...... 49

xi

Acrónimos

API: Application Programming Interface.

RGB: Red Green Blue.

REST: Representational State Transfer.

xiii

1 Introducción

1.1 Marco teórico Casi todos los videojuegos de estrategia tienen un aspecto en común con implementaciones ingeniosas y distintas: los mapas. Ya sean del mundo, de un continente, de una provincia, islas, reales o ficticios; los mapas son esenciales para el desarrollo de las mecánicas que se incluyen en los videojuegos de estrategia. Estos suelen tener también características iguales o semejantes como seleccionar distintas partes del mapa, obtener datos de la región que tocamos, obtener información de esta o ver acciones que podemos efectuar.

Los primeros videojuegos a usar gráficos interpretando un mapa datan aproximadamente de 1981,[44] con Utopía siendo el precursor de los juegos de construcción de ciudades y simulación de dios, en la consola Intellivision. Con elementos de estrategia a tiempo real y por turnos, usa casillas de 4x4 píxeles para representar la información al jugador.

Ilustración 1. Captura de pantalla del videojuego Utopía con el emulador Intellivision Lives. [1]

Escasos meses más tarde sale a la venta Eastern Front (1941) para Atari.[2] Este juego de guerra de solo 8 bits se caracteriza por ser un simulador de lucha que usa 18 colores enseñando 1/9 parte de todo el mapa en la pantalla. Se controla con un joystick, moviéndolo hacia los bordes de la pantalla para desplazar la cámara. Se pueden mover tropas alemanas posicionando el cursor encima de ellas y moviéndola, una vez cerca de los enemigos se simula la batalla. Se jacta de ser el primer juego con movimiento de pantalla fluido y alabado por sus gráficos y la avanzada inteligencia artificial. Su desarrollador, Chris Crawford, hizo público el código fuente del juego y lanzó un editor de escenarios para el juego.[3]

1 Desarrollo de una librería para cargar mapas interactivos en videojuegos

Ilustración 2. Captura de pantalla de la imagen inicial del juego original Eastern Front, enseñando la región alrededor de Leningrad, representado por el bloque blanco en el centro medio de la pantalla. Dos unidades de infantería finlandesas (blancas) y dos soviéticas (rojas) aparecen cerca da la ciudad. El jugador alemán ya ha obtenido los 12 puntos de victoria, como se ve abajo a la izquierda, y el asterisco indica que las fuerzas alemanas han entrado el mapa en este turno. [4]

Crawford se hizo famoso por sus juegos de Atari y por culpa de los efectos de la Crisis del videojuego de 1983, dónde varias empresas estadounidenses dedicadas a la producción de ordenadores y videojuegos quebraron, despidieron a la mayoría de los desarrolladores, incluido Crawford. Pero sus conocimientos y popularidad le permitieron seguir haciendo juegos de forma autónoma. [5] Así, después de Eastern Front, desarrolló Balance of Power. Se lanzó en 1985, principalmente para Macintosh. Se puede tomar el rol del presidente de los Estados Unidos de América o del general secretario del Partido Comunista de la URSS y conducir, a partir de varias decisiones, el rumbo de la guerra fría, con el objetivo de evitar una guerra nuclear. Todo esto pasa con un mapa político de la época y una barra de menú donde se pueden consultar todos los datos necesarios para satisfactoriamente terminar una partida.

2

Ilustración 3. Captura de pantalla del videojuego Balance of Power. [6]

En 1986 se publica Annals of Rome,[7] el primer juego con un mapa dinámico, pero no del todo interactivo. Este sitúa el jugador en la posición de centurión romano y le hace decidir cómo se gestionarán los distintos eventos aleatorios que permiten al jugador luchar contra distintas naciones. Tales batallas son simuladas y los resultados comentados por texto. Una vez se gana o pierde un territorio el mapa se pinta acorde a los cambios.

Ilustración 4. Captura de pantalla del videojuego Annals of Rome en el emulador DosBox. [8]

3 Desarrollo de una librería para cargar mapas interactivos en videojuegos También hizo aparición un juego que usó un mapa estático, útil e interactivo; llamado Centurion: Defender of Rome, del año 1990. Los ejércitos de distintos países se movían por las distintas casillas de los territorios europeos y africanos. Ahí el jugador decide con quién luchar y con qué tropas. Aunque contenga un mapa para decidir cómo seguirá el juego, lo que le hizo brillar era su sistema de lucha, con unos buenos gráficos “cinemáticos”, animaciones y efectos sonoros.

Ilustración 5. Captura de pantalla de Centurion: Defender of Rome. Con un muy buen uso del pixel art el mapa resulta muy agradable a la vista provisto del año en el que se publicó este juego. [9]

Un año más tarde y para la plataforma DOS se publica Medieval Lords: Soldier Kings of Europe, el primer juego que representar un mapa parecido al nuestro conteniendo varios países de Europa con distintas provincias, ejércitos, religiones, castillos, etc. Este juego destaca por el uso geográfico de las distintas provincias en el desarrollo del juego más allá de las posiciones estratégicas de las unidades con las qué luchar. Las distintas provincias dan ventajas distintas, pueden ser alteradas y conquistadas. Esto permite crear un nuevo estilo de juego de estrategia, mecánicas distintas a los predecesores y dinámicas interrelacionadas con el diseño del mapa.

4

Ilustración 6. Captura de pantalla de Medieval Lords: Soldiers Kings of Europe. [10]

A nivel geopolítico mundial existe Crisis in the Kremlin que delimita distintos países para usar las mecánicas de influencia de unos países a otros con el objetivo de ganar la Guerra fría.[11] Este se centra mucho más en los mecanismos de interacción entre países que en la propia lucha entre zonas. Este innovador nivel de gestión se ve hoy aún en muchos juegos de estrategia.

Ilustración 7. Captura de pantalla de Crisis in the Kremlin. [12]

Al mismo tiempo hace aparición el famoso Sid Meier’s Civilization,[13] estrategia a gran escala por turnos, usa casillas de forma hexagonal para representar el mapa. Esta característica

5 Desarrollo de una librería para cargar mapas interactivos en videojuegos solución ha perdurado en el tiempo y es ahora una técnica muy común de hacer juegos de estrategia para gente con todo rango de experiencia.

Ilustración 8. Captura de pantalla del primer juego de la saga Civilization. [14]

Otro juego que también usó hexágonos es Imperialism,[15] simulador político-estratégico del año 1997 con distintos escenarios de la historia europea del siglo XIX. Con innovadoras mecánicas de diplomacia, economía y conquista por turnos que dieron muy buenas críticas al juego pese a no llegar a ser muy conocido.

Ilustración 9. Captura de pantalla de Imperialism. [16]

6

Volviendo a las provincias con formas irregulares está Liberty or Death del año 1993 para la Super Nintendo.[17] Este simulador de la revolución americana tenía las provincias de las principales colonias desde donde el jugador podía decidir cuál sería el siguiente escenario para conquistar. Una vez seleccionado el lugar, se elige el comandante, las tropas y los recursos. El juego evoluciona a un juego de estrategia por turnos para decidir quién gana la batalla.

Ilustración 10. Captura de pantalla de Liberty or Death. [18]

Eventualmente muchos juegos de estrategia implementaron mapas de distintas formas y usando técnicas distintas, tal y como se ha visto en algunas entregas de entre 1981 y 1993. Muchos de estos limitados por la tecnología de la que disponían, hicieron juegos memorables que sirvieron de base para explorar ideas y desarrollar mecánicas de juego nuevos. El entretenimiento interactivo siguió evolucionando, ideando todo tipo de nuevas categorías de juegos, muchos de los cuales hicieron uso de mapas interactivos para muchos usos distintos. Estos mapas, a veces vistos a la ligera por los jugadores cómo simples herramientas para guiarse, también han sido la piedra angular de otros títulos. En algunas ocasiones sirvieron para añadir un poco más de profundidad y jugabilidad a los propios juegos, como es el caso de las batallas de bandas en Grand Theft Auto: San Andreas (2004).[19]

7 Desarrollo de una librería para cargar mapas interactivos en videojuegos

Ilustración 11. Captura de pantalla del mapa del menú principal del Grand Theft Auto: San Andreas. Los distintos colores representan las distintas bandas rivales del mapa. Cuando el jugador ganaba una batalla de bandas en el mapa se cambiaba de color acorde. Para completar el juego era necesario que el jugador las ganara todas. [20]

Ilustración 12. Mapa completo con todas las regiones disponibles donde tener las batallas de bandas del videojuego Grand Theft Auto: San Andreas.

8

A partir del año 2000 cambió la tendencia de los mapas de los videojuegos de estrategia. Muchos de estos usaban píxeles para representar el mapa y para decidir qué en provincias clicaban, evidentemente ostros usaron otras técnicas. Los nuevos juegos de estrategia empezaron a usar los mapas en tres dimensiones para representar los escenarios de los juegos, y así añadir una capa de profundidad en los juegos. Añadir una dimensión a los mapas viene con todas sus complejidades. En los primeros juegos como Shogun: Total War solo se añadió la cámara, modelos en tres dimensiones y el mapa en un plano.[21] Concretamente Shogun: Total War empezó su desarrollo como un juego en dos dimensiones, pero con la proliferación de las tarjetas de vídeo 3D se hizo la transición.

Ilustración 13. Captura de pantalla de SHOGUN: Total War. El primer juego de la saga Total War ya con un mapa en tres dimensiones. Este es el primer mapa que no presenta características de pixel art para representar la geografía, intentado así tener un aspecto más realista y estilizado. [22]

Los juegos de la saga Total War tienen dos dimensiones de juego: Una parte de estrategia por turnos en el mapa de campaña, donde el jugador mueve sus ejércitos, hace diplomacia, construye la infraestructura de sus provincias y realiza otras tareas necesarias para su facción. La otra parte del juego consiste en luchas tácticas a tiempo real donde el jugador asume el comando de uno de sus ejércitos para dirigir de forma personal el curso de cualquier batalla.

Solo dos años más tarde los mismos desarrolladores realizan Medieval II: Total War Kingdoms.[23] Este es el primer juego que contiene mapas con profundidad, consiguiendo así un grado más de realismo para sus videojuegos.

9 Desarrollo de una librería para cargar mapas interactivos en videojuegos

Ilustración 14. Captura de pantalla de pantalla de Medieval II: Total War. Los juegos de la saga Total War han hecho costumbre de tener dos mapas dinámicos con provincias en la pantalla. Este es el mapa de campaña, el primer de la saga Total War en usar tres dimensiones de forma claramente visible. [24]

Por las mismas fechas, Paradox Development Studio realiza su primer juego de estrategia en tiempo real, que no por turnos, en base a un juego de mesa francés llamado .[25] Desarrollado en un motor de software propio llamado Europa Engine, el juego permite controlar una de siete naciones europeas desde 1492 a 1792 expandiéndolas con el uso de ejércitos, diplomacia y riqueza. Pero a diferencia de los mapas de Total War, Europa Universalis tiene un mapa con 3,633 provincias con características únicas para tener partidas únicas, elevándolo a categoría de juego de próxima generación. [26]

10

Ilustración 15. Captura de pantalla de Europa Universalis, el primer juego considerado del género de videojuegos Gran estrategia. [27]

Aún en dos dimensiones, los juegos de Paradox buscan profundizar en las mecánicas internas que gestionan las economías, las relaciones diplomáticas, simular los eventos y las decisiones de cada país, etc. Todo ello influenciado por las distintas provincias que forman estos países. El mapa como primer recurso para el jugador, todo lo demás basado en su interfaz dinámica. Todas las decisiones y movimientos de la inteligencia artificial se calculan por un sistema de ticks. Cada tick se calcula cada acción respecto a lo que ha decidido el jugador, y estos suceden cada día que transcurre. Para un ordenador del año 2000 eran muchos cálculos que se centraban únicamente en el procesador. Por otro lado, la GPU tiene que pintar el mapa del mundo entero con todos los detalles (ciudades, catedrales, tropas, movimientos, puertos, etc.) y la interfaz.

Al paso de los años ambos tipos de juegos de estrategia avanzaron y crearon sus propias técnicas para la creación de mapas.

11 Desarrollo de una librería para cargar mapas interactivos en videojuegos

Ilustración 16. Captura de pantalla de Total War: Three Kingdoms. [28]

Todos estos videojuegos de estrategia tienen fuertes comunidades de modding. Grupos o individuos de gente que se dedican a modificar archivos originales del juego para crear más contenido distinto al original del juego o para arreglar fallos que los desarrolladores no solucionan. Investigando en estos archivos es una tarea ardua de ingeniería inversa para descubrir cómo funcionan los motores que sustentan estos videojuegos. Algunos juegos, como los de Paradox, han empezado a dar soporte a los mods de forma directa, abriendo el juego al mundo evitando ocultar el esqueleto del juego, es decir, todas las carpetas y archivos de contenido del juego; incluso implementando un sistema de pseudo-scripting para hacer todo tipo de aventuras. Esto evidentemente hace que sus juegos puedan ser cambiados casi enteramente por sus jugadores, pero para ello tienen que investigar cómo funciona el motor. Es aquí donde nos encontramos la pieza clave de su juego: el motor Clausewitz.[29] Este motor lee todos los archivos de contenido, genera el terreno en tres dimensiones, carga la interfaz, crea las naciones, simula todas las provincias, prepara los eventos; y luego gestiona todos los aspectos de la partida. Es aquí dónde sale la pregunta: ¿cómo lo hace?

12

Ilustración 17. Captura de pantalla de IV. [30]

Esta pregunta no sólo ocurre con juegos de estrategia puesto que de mapas orientativos o protagonistas hay en otros géneros. Cualquier juego de mundo abierto tiene un mapa, y muy posiblemente tiene también distintas interacciones que actualizan el mapa y lo convierten en un mapa dinámico. Por ejemplo, el título Middle Earth: Shadow of Mordor tiene un mapa en dos dimensiones para orientar al jugador.

Ilustración 18. Captura de pantalla del mapa del menú principal de Middle Earth: Shadow of Mordor. Este mapa usa las distintas provincias para componer las distintas misiones y objetos coleccionables de forma que el jugador tenga que completarlas todas para terminar el juego. [31]

Y la pregunta sigue siendo la misma: ¿con qué técnica han creado un mapa en dos o tres dimensiones con distintas casillas y buen nivel de detalle?

13 Desarrollo de una librería para cargar mapas interactivos en videojuegos 1.2 Problema inicial Existen varios tipos de herramientas que facilitan la creación de videojuegos, las más comunes son los motores de videojuegos. Estos motores se encargan de muchos aspectos en lo que el desarrollador no “debería molestarse” en programar, y a dedicar todos sus esfuerzos en hacer el mejor juego posible. Algunas de las herramientas que proporcionan estos motores de juegos son de gestión de imágenes, modelos en tres dimensiones, animación, partículas, cuadrículas para juegos en dos dimensiones, gestión de audio, niveles, etc. A pesar de hacer muy fácil la implementación de algunos géneros de videojuegos (plataformas, por ejemplo) hay otros que no tienen ningún recurso disponible, como es el caso de los mapas. Abundan muchos ejemplos de juegos de estrategia publicados, y la abundancia hace posible ver un patrón y/o descifrar a grandes rasgos cómo funcionan los juegos de Paradox o Creative Assembly (de la saga Total War). Aun así, puede resultar muy difícil replicar lo que ellos han conseguido para sus videojuegos si no se tiene experiencia en el desarrollo de videojuegos o no se ha trabajado nunca en este campo.

No existe una herramienta fácil que permita a los desarrolladores hacer juegos de estrategia con profundidad en ningún motor de videojuegos. No hay ningún sistema de gestión de mapas para videojuegos a pesar de todos los juegos que los utilizan, y tampoco hay muchas indicaciones de ni siquiera por dónde empezar. Además, hay que distinguir los mapas que sirven de forma orientativa al jugador y los que sirven de base para todo el juego, puesto que las funciones de ambos mapas y sus funciones son distintas.

14

1.3 Estado del arte De herramientas para crear juegos con mapas interactivos de principio a final no hay, pero sí existen algunos programas o especificaciones que pueden proporcionar una experiencia o recurso para acercarse a la creación completa de un juego.

1.3.1 Herramientas de modding Los juegos de , la saga Civilizations, la saga Total War o la saga Mount&Blade (por nombrar algunos) han empezado a abrir sus juegos a los modders en vista de la atracción que reciben por parte de posibles nuevos jugadores y por el mantenimiento del número de jugadores en sus comunidades.[32] Estos modders cambian desde trocitos pequeños del juego hasta absolutamente cada parte, y evidentemente es más fácil de hacer cambios más significativos si se proporciona acceso a las herramientas que los desarrolladores han empleado en sus videojuegos.

Ilustración 19. A la izquierda una captura de pantalla del juego base Hearts of Iron IV, y a la derecha una captura de pantalla del mismo juego con la modificación de The New Order: The Last Days of Europe [33]. Esta modificación hecha enteramente por la cuatro modders de la comunidad de jugadores de Hearts of Iron IV cambia casi totalmente el juego. Desde la interfaz hasta el propio mapa, los eventos, las ideologías, países y hasta mecánicas bases del juego, son modificadas para dar a los jugadores nuevas experiencias que pueden incluso superar en contenido los juegos originales.

Muchos de los desarrolladores de videojuegos con grandes y longevos títulos que tienen actualizaciones o expansiones al largo de los años crean utilidades que les facilita la creación de contenido, y recientemente las han hecho públicas a todos sus jugadores para potenciar el modding en sus comunidades. Este soporte oficial que se proporciona asegura una buena base de comunicación con sus jugadores y además facilita la vida a los modders, quién en el pasado tenían que hacer ingeniería inversa en los juegos para resolver los conflictos que aparecían después de cada actualización con sus modificaciones.

15 Desarrollo de una librería para cargar mapas interactivos en videojuegos

Ilustración 20. Herramienta de desarrollo creadas específicamente para el videojuego Mount&Blade II: Bannerlord. Este avanzado editor de terreno responde a todas las necesidades que presenta el juego. [34]

El uso de estos programas y juegos ya existentes proporcionan dos escenarios útiles para la creación de narrativas y mecánicas, aunque está limitado al juego. El primer escenario es para hacer todas esas narrativas que los publicadores no pueden hacer, ya sea por derechos o por falta de interés.

Ilustración 21. Captura de pantalla de Crusader Kings II: A Game Of Thrones. [35] Esta modificación trae mucho sentido al juego teniendo de base un simulador de dinastías con el que se puede emular las distintas tramas de la famosa serie de G. R. R. Martin.

El segundo escenario posible es para probar nuevas mecánicas en juegos ya existentes, tanto para mejorar como expandir lo que la pieza de entretenimiento ya proporciona por sí sola.

16

Ilustración 22. Comparación de la interfaz que desarrollaron los modders de la comunidad de The Elder Scrolls V: Skyrim para mejorar la experiencia de juego. [36]

Usar un juego ya existente como motor con fines de producir una nueva experiencia viene limitado por lo que los desarrolladores originales programaron e intencionaron. Se puede expandir lo que un juego puede hacer a base de más modificaciones, pero resultará extremadamente difícil e ineficaz reprogramar casi todo un juego solo para usar sus herramientas de modding.

1.3.2 Generadores de mapas con bitmaps Los juegos de Paradox usan esta técnica para crear sus mapas.[37] Consiste en usar un seguido de imágenes con distinta información que se usa para generar una gran malla con color, altura y otras propiedades. Estas imágenes o mapas de bits son la clave del Clausewitz Engine hasta día de hoy, aplicándolos a un mapa creado así el relieve, la iluminación, ríos, provincias, etc. Aquí hay una breve lista de algunos de estos mapas:

Archivo Utilidad Formato Provincias Delimitar provincias RGB Color (24 bits) Normales Normales para hacer iluminación Ríos Designar ríos Colores Indexados (8 bits) Terreno Designar el tipo de terreno (montaña, llanura, bosque, etc.) Árboles Designar tipos de árboles y su densidad Topología Mapa de altura del terreno Escala de grises (8 bits) (Height map)

17 Desarrollo de una librería para cargar mapas interactivos en videojuegos Este mapa de provincias sirve dos propósitos. El primero para saber qué provincias son de qué país cuando se está generando el mapa. Tienen una lista que asocia cada provincia (con un color único) a una subregión y luego componen los países añadiéndole subregiones. Para hacer esto probablemente tienen su propio Shader que transforma este mapa de provincias de colores a un mapa con países de colores. La otra utilidad es cuando el jugador hace clic en el mapa se lanza un rayo desde la cámara en la dirección del ratón, colisionando con el mapa y devolviendo una posición en coordenadas de tres dimensiones. De las coordenadas en tres dimensiones de vuelve en dos dimensiones y se escala a este mapa para poder saber el color RGB del punto en el que el jugador ha hecho clic.

Ilustración 23. Mapa de provincias usado en el Hearts of Iron IV. Cada provincia es de un color RGB distinto. [38]

Para poder renderizar cuando se ha clicado en un país o provincia de puede crear una máscara de alpha dinámica que permite pintar por encima de la región que se desee. Aplicando varios mapas (provincias, normales, ríos, etc.) el resultado puede llegar a ser espectacular.

Ilustración 24. Mapa de altura del juego Hearts of Iron IV. Con una escala de grises es muy fácil crear el relieve del mundo haciendo de color blanco los picos más elevados y tonos más gríseos para lo demás. Hay que tener en cuenta que hecho esto los personajes que se muevan por encima del mapa han de hacerlo por encima de la geometría desplazada por este mapa de altura, ya que este mapa no es un efecto de luz, sino que mueve la posición de cada vértice. [38]

Esta técnica viene con la ventaja de que algunas funciones son muy fáciles de implementar, como por ejemplo saber en qué provincia se ha clicado. También hace muy fácil de distribuir herramientas de modificación para los jugadores ya que solo tienen que editar imágenes y el código que lo junta todo es la pieza de tecnología que lo hace todo posible y que venden.

18

Ilustración 25. Captura de pantalla de Risk. Este juego es original para dispositivos portátiles y por tanto el mapa está adaptado para ello. Para renderizarlo probablemente usaron la misma técnica de las capas de alpha que usa Hearts of Iron IV y una capa solo para el efecto del movimiento del agua. [39]

Las desventajas son que crear el renderizador/creador de mapas puede ser una tarea colosal dependiendo del resultado que se desee. Es por este motivo que muchos juegos que usan esta técnica tardan un tiempo en hacer sus mapas. En Paradox tienen artistas que se dedican a recrear estos mapas y tienen que modificar los mapas uno a uno, y luego abrir el juego y esperar que se genere para saber si los cambios han ido bien. Muy inteligentemente estos últimos años han estado contratando programadores que les faciliten herramientas de desarrollo de estos mapas, para poder seguir haciendo uso de esta técnica, pero a tiempo real y de una forma más dinámica.

19 Desarrollo de una librería para cargar mapas interactivos en videojuegos

Ilustración 26. Tres capturas de pantallas del mismo juego, Crusader Kings III, a distintos niveles de zoom. Arriba a la izquierda enseña las provincias en el nivel de zoom más grande y más cerca de la tierra, donde se mueven las tropas. A su derecha, el menor zoom posible enseña un mapa estilizado como un pergamino. Debajo de todo un tercer mapa que enseña los contados en un zoom intermedio. [40]

20

1.3.3 Generadores de mapas poligonales Para crear nuevas experiencias en base a otras piezas de tecnología de mapas se encuentran los generadores aleatorios de mapas como Azgaar’s Fantasy Map Generator.[41] Es una pieza tecnológica opensource con el objetivo de crear mapas de fantasía aleatorios y coherentes, usando distintas capas de simulación (primero se genera el terreno, luego se aleatoriza la elevación, después se calculan los ríos, etc.). La generación se basa en un algoritmo poligonal a partir de una implementación variante de Voronoi. Voronoi es una construcción geométrica que permite particionar un plano euclidiano, basado en la distancia euclidiana entre puntos aleatorios.[42]

Ilustración 27. Visualización de un diagrama de Voronoi una vez se ha hecho el proceso de expansión de las regiones hasta encontrarse en el punto más extremo entre punto y punto. [43]

Estos polígonos pueden tener formas y midas irregulares, por lo que se puede aplicar una relajación de los bordes llamado algoritmo de Lloyd. Este se dedica a buscar el centroide de los polígonos y a mover los puntos originales que se usaban para definir los bordes de los polígonos.[44]

Ilustración 28. Progresión del algoritmo de relajación de Lloyd. Se aprecia cómo se mueve la posición de los puntos al centroide, desde donde se recalcula el Voronoi. [45]

Una vez se tienen los polígonos deseados, se usa el algoritmo de triangulación de Delaunay para poder definir nodos y sus fronteras. Delaunay es un algoritmo en el que a partir de unos puntos se crean lo que se llaman triángulos Delaunay. Los triángulos Delaunay son aquellos que a partir de tres puntos no tienen ningún otro punto dentro de la circunferencia que estos tres generan.

21 Desarrollo de una librería para cargar mapas interactivos en videojuegos

Ilustración 29. Un ejemplo de un triángulo que no cumple Delaunay. El punto D está dentro de la circunferencia que se crea entre los vértices A-B-C por lo que se tiene que romper este triángulo y hacer otros más pequeños hasta que sean todos Delaunay. [46]

Usando propiedades de Delaunay, es seguro afirmar que, entre tres centroides de tres distintos polígonos hay un triángulo Delaunay, y por tanto se puede definir los polígonos adyacentes usando las arestas de dicho triangulo. Así, una vez se ha generado el mapa de forma aleatoria se tiene acceso a todos los polígonos y a todos sus vecinos. Este paso es para más adelante poder simular altura, caminos, ríos, etc.

Ilustración 30. Los puntos A-B, A-C y B-C son vecinos, por lo que el centro del triángulo formado por estos será uno de los vértices del borde. Haciendo el mismo procedimiento iterando todos los vértices se encuentran todos los bordes. [47]

Con esta base poligonal se termina de generar todos los aspectos aleatorios y simulados del mapa de fantasía. Aplicando una variedad de filtros, nombres aleatorios y aumentando el número de polígonos se obtiene un mapa con mucho detalle que se puede usar en muchísimos escenarios de un posible videojuego.

22

Ilustración 31. Usando varias iteraciones encima del mapa poligonal resultante del procedimiento anterior, se puede generar información coherente de distintos tipos, como las masas de agua, las direcciones de los ríos, las temperaturas de la zona, los climas, la vegetación, etc. Toda esta información se puede usar más adelante para ciertas mecánicas de juego. [47]

Si no se desea implementar todo este algoritmo, se puede usar la versión online de Github para descargar los distintitos mapas tanto en .png como en .svg. Las desventajas de esta profunda aproximación son que no se pueden manipular los mapas hasta el último detalle tal y como lo pueden hacer los mapas en las herramientas de desarrollador de videojuegos. Azgaar’s Fantasy Map Generator y otros generadores aleatorios están enfocados en crear herramientas para generar narrativas en ámbitos como juegos de rol (por ejemplo, Dungeons & Dragons) o novelas. Pese a poder usarse para hacer videojuegos, no resulta muy intuitivo usarlo con este fin si se quiere poder modificar el mapa a mano.

23 Desarrollo de una librería para cargar mapas interactivos en videojuegos 1.3.4 Librerías de mapas dinámicos Otra posible vía para hacer mapas a explorar es usando archivos de mapas preexistentes con librerías que las gestionen. OpenStreetMaps, Google, Amazon y otros proveedores de servicios tienen una API que cubre muchas necesidades de generación y visualización de mapas en todo tipo de plataformas. El famoso juego Pokémon Go hizo uso de Google Maps hasta 2017 [48] para fabricar su base de datos espacial de mundo completo, y hace relativamente poco, Google ha lanzado Google Maps Platform. Google Maps Platform ofrece la misma tecnología que tiene Pokémon Go parar realizar videojuegos a escala mundial con un significante nivel de detalle para crear mecánicas alrededor del mapa. [49]

Ilustración 32. Un desarrollador de Pokémon Go trabajando con Google Maps Platform en Unity3D. [50]

Esta solución, con todos los recursos con los que viene, es de pago y no resulta muy accesible a los estudiantes y desarrolladores indie para hacer sus juegos. Además, está enfocado para grandes títulos con estudios de juegos triple A. A más pequeña escala, existe OpenStreetMap API y varias librerías que añaden capas encima de mapas con la posibilidad de hacer juegos, aunque no esté pensado para ello.

La API de OpenStreetMaps permite hacer peticiones REST para acceder y recibir información de su base de datos. [51] Combinando esto con por ejemplo la librería LeafletJS, se pueden crear mapas interactivos. [52]

24

Ilustración 33. Ejemplo de mapa TopoJSON con la librería Leaflet de la densidad de población por estado en los Estados Unidos de América. Leaflet y otras librerías se usan muy frecuentemente dada la facilidad de uso en representación gráfica de información en mapas. [53]

El problema más evidente de esta tecnología es la necesidad de usar web como plataforma base para el desarrollo de la aplicación. La intencionalidad nunca estuvo en hacer juegos de gran escala dinámicos, y esta pieza no resulta cómoda para trabajar en ello. Sí resulta cómoda para hacer representaciones dinámicas a tiempo real de información encima de mapas cartográficos, pero no para renderizar elementos en tres dimensiones o complejas interfaces con total libertad.

25 Desarrollo de una librería para cargar mapas interactivos en videojuegos 1.4 Solución propuesta Una herramienta práctica para leer y renderizar mapas dentro de un motor de videojuegos, pensado para crear juegos con mapas interactivos.

Usando archivos GeoJSON el programa en cuestión dejaría preparado el mapa gestionando todo el apartado de parseado (lectura y asimilación a nivel de programación) del JSON, creación de un objeto en tres dimensiones y otros detalles necesarios. El objetivo es que el desarrollador solo tenga que usar su propio sistema de datos con información adicional del mapa puesto que los archivos GeoJSON solo contienen información geométrica. Usar GeoJSON tiene la ventaja de que ya tiene una especificación definida de cómo representar el mapa a partir de los datos. Existen muchos mapas que se pueden usar y muchas herramientas para cartografiar mapas nuevos sin mucha dificultad.

Ilustración 34. Esquema de funcionamiento de la solución TopoMap. El desarrollador solo se tendría que encargar de la gestión de la información del juego y del Game Manager.

El mapa solo contiene la mínima información topológica y seria la tarea del desarrollador obtener los datos adicionales relevantes para usar con el mapa a través de un gestor de información, imprescindible en cualquier juego.

Con esta propuesta de solución se espera dar una buena base a los desarrolladores que usen mapas para sus juegos, y minimizar el tiempo dedicado a la creación de un mapa interactivo y dinámico.

26

2 Parte teórica

2.1 JSON JavaScript Object Notation (o JSON) es un formato ligero de intercambio de datos pensado para ser fácil de leer y escribir. Basado en un subestándar del lenguaje de programación JavaScript, el formato JSON es completamente lenguaje independiente, se puede escribir usando un lenguaje y leerlo con otro. [54]

Se basa en dos estructuras:

- Una colección de parejas nombre/valor. En muchos lenguajes esto se traduce como un objeto, estructura, diccionario, hash table, lista indexada o array asociativo. - Una lista ordenada de valores. Traducido en arrays, vectores, listas o secuencias.

Se trata de estructuras de datos universales entre diferentes lenguajes de programación a los que virtualmente todos los lenguajes de programación dan soporte.

Un objeto JSON empieza siempre con un ‘{‘, y termina en ‘}’. Cada nombre de un elemento es seguido por ‘:’ y luego del valor asociado. Para separar distintos elementos se separa con comas.

Ilustración 35. Esquema guía de la creación de un archivo de tipo Javascript Object Notation. [55]

Ilustración 36. Ejemplo de archivo Javascript Object Notation. [55]

27 Desarrollo de una librería para cargar mapas interactivos en videojuegos 2.1.1 GeoJSON Con el uso de estos archivos se puede organizar y almacenar muchos tipos de datos, y entre ellos están los topográficos. Este es el caso de los GeoJSONs, un formato para contener estructuras de información geográfica. En el año 2015 la Internet Engineering Task Force y los autores originales de la especificación hicieron un estándar que permitiera guardar distintos tipos de geometría: puntos, líneas, polígonos, multipuntos, multilíneas y multipolígonos. Usando una mezcla de todos estos recursos, se pudo hacer representaciones con puntos de unidades topográficas del mundo real en ordenadores de forma muy fácil. [56]

Ilustración 37. Tabla con representación gráfica de los distintos tipos de geometrías que existen en GeoJSON.

Para crear estas formas, GeoJSON almacena en un archivo JSON los puntos exactos dónde hay los vértices de estas formas.

Ilustración 38. Ejemplo de objeto topográfico “Polygon” y su definición de posiciones en coordenadas x e y.

Esto implica que si se quiere digitalizar una frontera muy irregular el archivo fácilmente tendrá muchos puntos. A efectos prácticos el impacto es poco notable ya que en el siglo XXI el espacio físico disponible, la gestión de memoria y de recursos computacionales no supone ningún problema para manipular este tipo de archivos. Otro beneficio de este tipo de archivos que al ser tan sencillos no resulta difícil implementar un editor para alterar y representar la información.

28

Ilustración 39. Ejemplo de uso de archivos GeoJSON con la librería Leaflet. Se puede apreciar los distintos tipos de geometrías representados de formas y colores distintos. [57] 2.1.2 TopoJSON TopoJSON es una extensión de GeoJSON con el fin de codificar topología, es decir, en vez de representar la geometría de forma discreta, las geometrías en los archivos TopoJSON se unen a partir de segmentos separados llamados arcos. Los arcos son secuencias de puntos, y las líneas y polígonos una secuencia de arcos. Cada arco solo se define una vez, y por tanto se puede referenciar múltiples veces en la construcción de distintas formas. [58]

Ilustración 40. Ejemplo de aplicación creada por un usuario de un mapa del mundo cargado de un archivo TopoJSON en el que ningún país comparte el mismo color con otro país vecino. [59]

En comparación con GeoJSON, TopoJSON decrementa el espacio que ocupa eliminando la redundancia y permite simplificar las formas preservando la topología.

29 Desarrollo de una librería para cargar mapas interactivos en videojuegos 2.2 Unity Unity es un motor de videojuegos multiplataforma creado por Unity Techonologies. [60] Está disponible para Microsoft Windows, Mac OS y Linux. El objetivo de este motor es saldar las necesidades de los desarrolladores independientes que no pueden crear ni su propio motor de juego ni las herramientas necesarias o adquirir licencias solo disponibles a grandes estudios.

Este motor da a los creadores la posibilidad de hacer juegos en 2D y en 3D, programando los varios scripts que controlan el comportamiento de las entidades del juego en C#. Dichos scripts aparecen en el editor y juntamente con muchos otros elementos se pueden usar en la interfaz con el uso de drag and drop (coger y arrastrar) como funcionalidad básica. También tiene un avanzado sistema de Shaders con un editor basado en nodos y un editor de materiales para adecuar las texturas de los objetos. Casi todo lo que se puede construir dentro del editor se puede distribuir fácilmente en muchas plataformas distintas e incluso compartirlo para otros desarrolladores en la Unity Asset Store.

En la Asset Store se pueden encontrar todo tipo de recursos para facilitar el desarrollo videojuegos creados por otros usuarios de forma gratuita o pagando por ellos. Es aquí donde el cargador de mapas estará disponible para que otros usuarios lo usen.

2.2.1 JsonUtility Para cargar JSONs se utiliza una clase llamada JsonUtility que está implementada en el módulo JSONSerializeModule de Unity. Esta clase permite leer un archivo de texto y convertir todos los elementos de dentro del JSON en información dentro del juego. [61] 2.3 Triangulator Triangulator.cs es una librería gratuita que proporciona la wiki no oficial de Unity3D. [62] Esta librería se encarga de transformar una nube de puntos en una malla creando triángulos. Este triangulador no es una versión ni la misma implementación que un Delaunay, pero aun así tiene en cuenta las concavidades a la hora de triangular un polígono. Como limitación solo puede hacer un polígono a la vez y sin agujeros.

Ilustración 41. Ejemplo de triangulación a partir de una nube de puntos. [63]

30

2.4 Regex Para leer cierta información del JSON se ha hecho uso de Expresiones Regulares (Regex) que son secuencias de caracteres para definir patrones de búsqueda. [64] Unity tiene un sistema implementado de expresiones regulares aplicado en búsqueda dentro de texto. Esto permite encontrar fácilmente información escrita con un patrón concreto, como es el caso de los arcos en TopoJSON.

Ilustración 42. Ejemplo básico de captura de grupo de palabras con letras de la a-z, separando “hola” y “mundo” en dos objetos distintos.

Para hacer las expresiones regulares y que funcionen se ha hecho uso de una página web llamada RegExr. Esta página tiene información bien clasificada y accesible de los distintos componentes disponibles para capturar los distintos patrones que se encuentren. La comprobación a tiempo real de las expresiones con cualquier texto hace muy fácil el aprendizaje de esta gran herramienta.

Ilustración 43. Cada elemento de una cadena de caracteres de búsqueda de un patrón concreto. RegExr desglosa cada grupo y subgrupo para entender y arreglar cada detalle de la captura. En la imagen se intenta capturar un grupo con el carácter “[“, seguido un espacio que puede o no estar y terminado por otro “[“. [65]

31 Desarrollo de una librería para cargar mapas interactivos en videojuegos 2.5 Mapa TopoJSON Hay muchos mapas en formato GeoJSON y TopoJSON por la web hechos por distintas personas qué sirven a muchos propósitos. Por ejemplo, muchos de estos mapas se usan cuando hay recuento de votos después de unas elecciones y se quiere disponer de un mapa de localidades que se actualice a tiempo real.

Para el caso concreto en el que se ha trabajado la información topológica corresponde a un mapa de las distintas comarcas de Cataluña. Este mapa es de hace 6 años y por tanto no contiene algunas de las comarcas que han surgido desde entonces. [66]

Ilustración 44. Mapa comarcal de Cataluña de hace seis años, hecho público en Github. Se puede ver como no tiene el Moianès. El nivel de detalle del TopoJSON es suficiente para hacer un juego en base a el mapa.

32

3 Parte práctica

3.1 Lectura de TopoJSON Para poder leer el TopoJSON se ha de obtener la información clave que comparten todos los archivos de tipo TopoJSON. No se ha usado todos los campos ya que no todos son necesarios.

3.1.1 Lectura de arrays multidimensionales con JsonUtility La JsonUtility que ofrece el motor Unity tiene unas restricciones que imposibilitan algunas funciones imprescindibles para poder leer correctamente un archivo TopoJSON. Concretamente, los arcos de los TopoJSON no pueden ser parseados por JsonUtility ya que son de tipo array de un array, también conocido como arrays multidimensionales. Por suerte, JsonUtility sí puede leer arrays de una dimensión y con esto puede leer varia información que resulta útil para poder obtener todo el resto del TopoJSON.

Usando Regex se busca los arcos que no pueden ser parseados por JsonUtility y se obtienen aparte. Para conseguir separar los arcos primero se busca donde empiezan con los caracteres clave “arcs:[[“. Una vez allí se cuenta y se separa usando los caracteres “[[“. Cabe notar que la búsqueda secuencial en un archivo TopoJSON puede dar problemas dado el hecho que en los archivos JSON la posición de los objetos puede variar si estos mantienen la validez de la especificación. Este es el caso de algunos mapas que tienen los arcos al final en vez del principio y esto resultaba en errores al parsear. Para arreglar este error se empieza buscando la palabra clave “geometries” y luego “arcs:[[“. No se puede buscar directamente “[[[“porque no todos los mapas tienen tres o más capas.

Ilustración 45. Visualización en RegExr de la búsqueda de “[[“ en los arcos del TopoJSON.

Una vez se ha separado los sets de arcos, se busca los diferentes arcos uno por uno y se unen en un objeto array multidimensional.

33 Desarrollo de una librería para cargar mapas interactivos en videojuegos

Ilustración 46. Visualización en RegExr de la búsqueda de números x e y con posibles valores negativos y separados por comas.

Con los dos números x e y obtenidos solo es cuestión de usar la librería JsonUtility para leer un array unidimensional y convertirlo en un objeto, aunque también sería posible el uso de la clase Convert de C#. Esto se añade a la resta de información y se envía al gestor de mapas para ser interpretado y renderizado.

3.1.2 Elementos clave de las especificaciones Un archivo TopoJSON siempre consiste en un único objeto topológico. [67] Este objeto puede contener cualquier número de geometrías u objetos de geometría. Para que se considere válido debe contentar:

- Que haya un miembro con el nombre “type” y con su valor determinar el tipo de objeto TopoJSON. Esto se usa para asegurar que se trata de un TopoJSON.

"type": "푇표푝표푙표푔푦"

- El valor del campo tipo debe ser uno de los siguientes: “Topology”, “Point”, “MultiPoint”, “LineString”, “MultiLineString”, “Polygon”, “MultiPolygon” o “GeometryCollection”. Esto se lee, pero solo se usa “GeometryCollection”, “Polygon” y “MultiPolygon” con fines prácticos del proyecto. - Puede contener un objeto “bbox” con el valor en un array de una caja cuyos valores sean el tamaño del objeto topológico. Conocido como bounding box.

"bbox": [−5.3850910844452, 35.29072290500663, 3.317081952046861, 42.86148110021024]

- La topología debe tener un miembro llamado “objects” cuyo valor sea otro objeto. Dicho objeto tendrá otros objetos con geometrías. Estos objetos definen las distintas geometrías. Aquí se usa el campo “type” para filtrar “Polygon” y “MultiPolygon” de la resta en la implementación.

34

Ilustración 47. Explicación de una colección de geometrías en TopoJSON derivado del objeto “objects”.

- Cada topología debe contener un miembro llamado “arcs” con un array de arcs de valor. Este no se debe confundir con el campo “arcs” que existe en las definiciones de los objetos geométricos, pues los arcos que se definen en las definiciones geométricas referencian a estos arcos con significado espacial.

Ilustración 48. Ejemplo de los arcos con posiciones espaciales que son referenciados en los arcos índices de las definiciones de los objetos geométricos.

- La topología debe tener un miembro llamado “transform”, cuyo valor sea un transform.

Ilustración 49. Ejemplo de transform. La escala se multiplicará a los valores del arco de posiciones espaciales para volver a obtener la posición real. Se podría considerar una capa de compresión.

35 Desarrollo de una librería para cargar mapas interactivos en videojuegos 3.1.3 Transforms Los transforms se usan para cuantificar posiciones con el objetivo de serializar la información de forma más eficiente, representando las posiciones de los arcos con enteros en vez de decimales. Para que su formato sea válido debe tener:

- Un miembro con escala llamado “scale” con dos elementos de información x e y. - Un miembro con traslación llamado “translate” con dos elementos de información x e y.

En esta implementación “translate” queda inutilizado puesto que contiene información relevante para el uso de otras librerías que tienen en común proyecciones encima de mapas cómo los de OpenStreetMaps. En el caso de los videojuegos, la posición relativa del objeto topológico se considera al origen de coordenadas.

La escala sí se usa para poder representar correctamente la geometría.

3.1.4 Arcs Los arcos se usan consecutivamente con codificación de deltas, es decir, la primera posición del arco se mantiene y la siguiente posición es la suma del primero más la segunda delta.

푥2 = 푥1 + ∆푥2

푦2 = 푦1 + ∆푦2

Ilustración 50. Gráfico de recreación de puntos a partir de arcos. Esto se repite por todos los arcos de un set.

36

3.2 Índices de Arcs Los arcos definidos en los objetos geométricos hacen referencia a los arcos con posiciones espaciales.

Ilustración 51. Diferencia entre los arcos índice de los arcos con posiciones espaciales. Todos los objetos geométricos tienen arcos con índices que hacen referencia a los arcos con posiciones espaciales, que son utilizados por todos los objetos geométricos. Los arcos con posiciones espaciales se pueden usar en reverso cuando el índice es negativo, y si se diera el caso que un set no fuera el primero y en reverso se ignoraría la última posición espacial y seguiría con las otras deltas. [68]

Ilustración 52. Primera iteración del set de arcos índices con el índice 0, el primer arco con posiciones espaciales. Este se mueve dos posiciones hacia arriba (y positiva) y una a la derecha (x positiva) a partir del origen de coordenadas. Las siguientes deltas no mueven en horizontal, pero sí hacia abajo en vertical (y negativa). [68]

Según la definición, el primer arco del siguiente set se puede ignorar.

37 Desarrollo de una librería para cargar mapas interactivos en videojuegos

Ilustración 53. Segunda iteración del set de arcos índices con el índice 1, el segundo arco con posiciones espaciales. Se ignoran las primeras deltas ya que estas no son del primer índice. Luego el siguiente set mueve una posición hacia la izquierda (x negativa) y ninguna en vertical. El siguiente hacía arriba y el último hacia la derecha para cerrar. [68]

El primer arco del primer set del segundo objeto de la misma colección también se puede obviar. Para una mayor optimización de la información, se reutilizan los arcos en negativo si entre dos objetos se comparte un borde o bordes. Además, se pueden usar los arcos en negativo, iterando el set de arcos al revés y restando las deltas en vez de sumando.

En la implementación los arcos en reverso se tienen que iterar al revés, lo cual era incompatible con la actual implementación de los arcos. Para solucionar esto se hizo una lista a parte que guarda las posiciones de los arcos y una vez se ha terminado el set se gira toda la lista y se incluye a la lista original de posiciones.

Cuando se cambia de objeto dentro de una colección geográfica también se obvia el primer elemento del set de arcos.

Probablemente por el hecho de que TopoJSON esté pensado para la proyección encima de mapas, la bouding box que viene con el mapa no es correcto. Por esta razón a cada iteración de cada arco se mira si la bounding box se hace más grande para poder centrar la cámara en el mapa.

38

3.3 Representación de un TopoJSON Para poder representar un objeto en tres dimensiones en Unity se tiene que crear un objeto con el componente Mesh, y llenarlo con los vértices necesarios y los triángulos que se crearán a partir de estos. Para facilitar el acceso y fácil uso de varios objetos tridimensionales se ha hecho un objeto prefabricado (o ‘Prefab’) con el nombre de Node que tiene, entre otras cosas, un componente Mesh y MeshRenderer. [69][70]

Para los vértices del Mesh solo se tiene que cargar los puntos que se han creado siguiendo los arcos de un objeto geométrico en concreto. Luego, para unirlos hay más de una forma. Inicialmente se implementó Delaunay para triangular la nube de puntos, pero rápidamente apareció un problema: Delaunay rellenaba las concavidades.

Ilustración 54. Ejemplo de triangulación de puntos con Delaunay que no tiene en cuenta las concavidades y termina creando una pieza con el área más grande de la necesaria. Arriba de todo se ve el objeto que se quiere generar. En el medio aparecen los triángulos a partir de los vértices del objeto original. Abajo la figura final a partir de triángulos que no es como la figura del principio y por tanto la triangulación no tuvo éxito. [71]

Hay formas existentes para solucionar este problema, aun así, se decidió usar la librería gratuita Triangulator.cs que también genera polígonos en dos dimensiones de una forma peor distribuida pero que tiene en cuenta las concavidades. Una vez se ha generado los triángulos se envían a la Mesh del Node. Con esta información, se puede automáticamente calcular las normales y las tangentes.

39 Desarrollo de una librería para cargar mapas interactivos en videojuegos No todos los triángulos seguían la misma dirección y esto causa que algunas caras se rendericen y otras no, por culpa de usar Backface Culling. Backface Culling es una técnica en Shaders que solo renderiza una de las caras para optimizar los fotogramas por segundo en tiempo real a partir de la dirección de los vértices del triángulo. [72]

Ilustración 55. Problema con el TopoMap en Unity porqué el Triangulator.cs estaba haciendo algunos triángulos en alguna dirección distinta a los demás.

Para solucionar este problema solo hay que decidir una dirección y comprar las normales, ya que estas se generan siguiendo una dirección. Una vez se encuentra una normal que esté al revés, se giran todos los vértices y se recalculan las normales y tangentes.

Ilustración 56. El mapa de comarcas de Cataluña correctamente renderizado sin usar un shader que inutilice la optimización de Backface Culling.

40

3.3.1 Distinguir provincias Los archivos GeoJSON y TopoJSON permiten que sus objetos tengan nombres en su campo “properties”. Sería ideal el uso de estos campos para obtener información relevante a usar para representar el mapa y dentro del videojuego. Desafortunadamente, el lector JsonUtility necesita que la forma de estos campos sean constantes y si se busca en distintas páginas web, los .geojson y .topojson no cumplen esta característica. Se ha comprometido esta herramienta a usar este campo “properties” solo para obtener el nombre de la provincia. Con el nombre de la provincia se ha implementado un gestor de mapas que crea un objeto de tipo provincia y lo asocia al Node con la provincia geométrica igual a ese nombre. Con el objeto tipo provincia se puede cargar o generar toda la información necesaria para poder gestionar el mapa, y así se mantiene separada la información topológica del mapa de la información de juego.

Apareció un problema evidente y es que un mismo objeto con dos topologías pertenecientes a un enclave (una parte de un territorio de una entidad completamente rodeada por el territorio de otra entidad).

Ilustración 57. Ejemplo de enclave dónde C y B son la misma entidad política, pero C está rodeada por otra entidad, A. [73]

Esto era considerado como dos distintas provincias cuando en realidad son la misma. Para solventarlo de forma rápida se buscaron los Nodes con el mismo nombre y se creó un Node padre con dos Nodes hijos. Para saber si una provincia es un enclave o forma parte de un enclave solo hay que mirar su padre en la jerarquía es el propio mapa o un Node.

Ilustración 58. Jerarquía de objetos de la escena de la interfaz de Unity dónde se puede ver cuando un objeto tiene uno o varios hijos. Si tiene hijos es porqué esa comarca tiene enclaves.

Para poder ver las distintas provincias con un borde se intentó usar un efecto muy común: un shader outline. Estos shaders usan las normales y tangentes para saber dónde tienen que pintar el outline. En el caso del mapa o cualquier objeto sin profundidad no puede usar esta técnica. Hay formas de hacer funcionar esta técnica para cubos que tienen superficies lisas usando un truco con el Depth buffer, [74] pero con esta implementación se ha encontrado una forma más sencilla.

41 Desarrollo de una librería para cargar mapas interactivos en videojuegos Unity tiene una herramienta muy útil llamada Line Renderer. Con el Line Renderer se puede pasar una serie de puntos y Unity automáticamente crea una línea que los une de principio a final. Se puede modificar a tiempo real aspectos como el grosor, color y tipo de línea. Esto resulta ideal porqué por cada Mesh que tenemos solo hay que enviarle sus vértices como puntos y ajustar el grosor de la línea para obtener los bordes. [75]

Ilustración 59. Las comarcas de Cataluña con la nueva implementación de las líneas en los puntos vértices de cada comarca. Ajustando el grosor de estas líneas da un efecto distinto.

Esta técnica funciona para todos los objetos de dos dimensiones que necesiten un borde. Un problema que puede presentar es la presencia de Z-Fighting. Esto ocurre cuando dos elementos están en la misma altura y no se renderizan correctamente. [76]

Ilustración 60. Ejemplo de Z-Fighting con dos planos a la misma altura. [77]

42

Los bordes negros del mapa están en constante Z-Fighting pero como son del mismo color no se distinguen los colores no hay problema. Sí hay problema cuando se selecciona o sobrevuela una región con el ratón ya que hay un cambio de color. Esto ya no ocurre si se cambia ligeramente la altura del borde que tiene el cambio de color.

Otra posible forma más difícil sería comprobar qué provincias comparten qué arcos para saber cuáles son sus fronteras. Si se guardan estos puntos y se pintan las distintas fronteras de la provincia una a una se podría hacer por ejemplo dos regiones con varias provincias distintas y que estas fueran separadas por los bordes de las provincias adyacentes.

3.3.2 Seleccionar distintas provincias De forma muy similar a cómo funcionan los mapas de Paradox con su técnica de lanzar un rayo al mapa y usar el punto 3D en su imagen de provincias 2D, aquí se ha lanzado un rayo en usando Raycasting. Para que el objeto sea colisionable con el Raycast, este debe tener un colisionador de tipo Mesh Collider usando la Mesh que se ha generado antes para calcular las colisiones.

Ilustración 61. La comarca del Berguedà seleccionada. Se nota el cambio de color del borde, pero aún destaca algunos píxeles de Z-Fighting con los demás bordes. No se nota a otros niveles de zoom, aunque otra implementación que arreglase este problema sería deseable.

43 Desarrollo de una librería para cargar mapas interactivos en videojuegos 3.3.3 Modificar las provincias Cada Nodo permite cambiar independientemente el color de su Mesh cambiándolo en el material.

Ilustración 62. Comarcas de Cataluña representando información a partir de una generación aleatoria asignada a cada comarca y cambiando el color de dicha provincia acorde a la información.

Además, sería posible hacer varios Shaders para estos materiales que incorporasen características útiles para el desarrollo del juego, como por ejemplo unas tiras que podrían significar asedio de provincia en algunos juegos. [78]

Ilustración 63. Ejemplo de shader que se buscaría para los materiales de las provincias para simular el asedio u otros eventos.

44

Ilustración 64. Ejemplo de una provincia en el Europa Universalis IV dónde se ve este patrón de rallas en una provincia asediada. Los colores de las franjas corresponden a los colores de los países, por lo que se tiene que enviar esta información al shader. [79]

Otra pequeña y posible adición sería poner los nombres de las provincias encima de dichas provincias. Pero con el fin de aumentar la accesibilidad para el jugador ya se ha añadido una cajita Tooltip con el nombre de la provincia.

Finalmente, para buscar un toque más parecido al Shading que presenta Hearts of Iron 4 con sus provincias se puede usar una implementación de Voronoi que permita crear un efecto de difuminado entre la distancia del borde al centro de las provincias. [80]

Ilustración 65. Correcta representación de Voronoi donde se aprecian las isolíneas más visibles al centro del polígono que del borde. [81]

45 Desarrollo de una librería para cargar mapas interactivos en videojuegos 4 Costes del proyecto El proyecto se ha desarrollado con un plazo de alrededor de 420 horas. Esto se puede desglosar cronológicamente por:

- Investigación de técnicas de mapas en videojuegos: 54 horas desde el noviembre de 2019 hasta aproximadamente febrero de 2020. - Lectura de los arcos con Regex y parseado de TopoJSON: 66 horas desde febrero hasta marzo de 2020. - Implementación de TopoJSON: 164 horas desde marzo hasta principios de julio de 2020. - Triangulación: 40 horas desde junio hasta julio de 2020. - Embellecimiento e interactividad del mapa: 40 horas desde julio hasta agosto de 2020. - Redacción de la memoria: 55 horas desde agosto hasta setiembre de 2020.

Redacció memòria Investigación de TFG; 55h; 13% técnicas de mapas en videojuegos; 54h; 13%

Embellecimiento e interactividad del Lectura de los arcos mapa; 40h; 10% con Regex y parseado de TopoJSON; 66h; 16%

Triangulación; 40h; 9% Implementación de TopoJSON; 164h; 39%

46

5 Conclusiones La investigación de este proyecto concluye que una vez se ha terminado la implementación de TopoMap en Unity y se ha podido comparar con otras formas de obtener resultados similares, se denotan ciertos puntos que favorecen esta técnica y otros que se pueden intentar mejorar o incorporar de otras técnicas.

El principal punto a favor del funcionamiento de los TopoJSONs, es que estos son increíblemente sencillos. Aunque GeoJSON sea quizás aún más fácil de implementar, el tamaño reducido de los TopoJSONs los hace mucho más relevantes pensando en dispositivos con menor capacidad (móviles, por ejemplo). De este modo, se abre la posibilidad de tener muchísimos mapas o descargarlos rápidamente de una nube. Dado que se ha implementado con Unity, el soporte de los JSON ha requerido mucho tiempo y recursos que se podrían haber destinado a embellecer mucho más el mapa. Pues resulta bastante difícil hacer un parseador genérico de un archivo TopoJSON con la multitud de cambios que puede tener.

El nivel de conocimiento de programación C#, junto con la escasa documentación de la implementación de TopoJSON y de cómo hacer mapas dinámicos, ha hecho que los avances en este campo sean escasos. Aun así, esto permite determinar, sin duda alguna, que es absolutamente posible hacer videojuegos usando TopoJSONs como base. Una nueva vía de investigación y desarrollo en el futuro, podría ser el uso de otro motor o herramienta que evitase el problema de los arrays multidimensionales.

Pese a poder hacer juegos con mapas con esta base, se ha observado que la información que proporcionan es limitada. No hay altura u otros parámetros con los que modificar los meshes, pero esto no significa que no se pueda. Por ejemplo, si se combinan con mapas de altura reales, se pueden proyectar fácilmente encima de estos y viceversa, ya que la estructura de los TopoJSONs lo permite.

También es importante tener en cuenta que cargar mapas de esta forma evita tener que manipular o crear nuevos mapas. Es por ello, que este es el coste de no poder modificar los mapas sin el uso de más herramientas propias o externas. Cabe considerar hacer una sola herramienta que permita cargar, modificar y añadir información que luego sea automáticamente representada en el motor, y así solamente tener que construir mecánicas de juego con ello.

Finalmente, se ha buscado un estilo concreto para el mapa, que se puede cambiar, pero resulta difícil su desarrollo con el nivel actual de conocimiento de Shaders. De todas formas, el acabado actual no resulta disruptivo y funcionaría bien en un videojuego.

47 Desarrollo de una librería para cargar mapas interactivos en videojuegos

6 Líneas de futuro Sería muy interesante desarrollar una pieza de software externa en la que usando un TopoJSON o GeoJSON, se dejase preparada una mesh. Cómo referencia, se puede tomar un programa del estilo Blender con sus herramientas de exportación, para importar el mapa directamente al motor. Así, se podría manipular el mapa de forma gráfica y luego cargarlo el a más de un motor de juego. Si fuera posible, se podría crear una librería o dejar el código abierto para que se pudiera cargar el mapa en otros frameworks o motores personales. Con un programa de estas características se debería dar el máximo de herramientas de manipulación a los desarrolladores del mapa. Debería ser semejante a las herramientas específicas que los grandes estudios están creando para poder hacer sus juegos, pero sin llegar a ser específico de un solo juego, sino que cumpla cualquier necesidad.

También sería interesante hacer una herramienta parecida a la descrita anteriormente, pero usando la técnica de los mapas de bits como base. De esta forma, otras personas podrían hacer sus plugins adicionales modificando directamente los mapas de bits con técnicas de procesado de imagen.

Otra idea que valdría la pena investigar sería la de crear mapas usando la técnica de la generación poligonal, pero con geografía real. Para ello, se podría usar una imagen de máscara que limitara y forzara la generación poligonal dentro de ella. Esta idea podría dar buenos resultados, si se quisiera generar de forma aleatoria subdivisiones en una zona.

Finalmente, muchas de las características que hacen espectaculares los mapas vienen de la forma en que se usan los shaders y se renderizan los mapas. Hay webs dedicadas enteramente a compartir shaders que son un verdadero tesoro, y allí se ven muchas nuevas características que podrían ir bien a una herramienta como TopoMap.

48

7 Referencias [1] Cryptic. (2005, Octubre 7). Utopía (videojuego). Recuperado el 21 de Agosto, 2020, de https://en.wikipedia.org/wiki/File:Utopia_(Intellivision).png [2] Blank. G. (1982, Enero). “Eastern Front / The Atari Goes To War”. Recuperado el 21 de Agosto, 2020, de https://archive.org/stream/creativecomputing-1982- 01/Creative_Computing_v08_n01_1982_January#page/n45/mode/2up [3] APX Product Catalog. (1983). “Eastern Front Scenario Editor”. Recuperado el 21 de Agosto, 2020, de https://archive.org/stream/Atari_Program_Exchange_catalog_Fall_1983#page/n59/mode/ 2up [4] McLoaf. (2009, Abril 8). Eastern Front (videojuego). Recuperado el 26 de Agosto, 2020, de https://en.wikipedia.org/wiki/File:Ef1941scr.png [5] Crawford. C. (2019). The Atari Years. Recuperado el 26 de Agosto, 2020, de http://www.erasmatazz.com/library/the-journal-of-computer/jcgd-volume-5/the-atari- years.html [6] Ethan. (2015, Agosto 13). Balance of Power (videojuego). Recuperado el 26 de Agosto, 2020, de https://funmines.com/balance-of-power/ [7] Your Sinclair. (1987, Febrero). “Annals of Rome”. Recuperado el 26 de Agosto, 2020, de https://web.archive.org/web/20161006002232/http://www.ysrnry.co.uk/articles/annalsof rome.htm [8] Software Library. (2014, Diciembre 23). Annals of Rome (videojuego). Recuperado el 26 de Agosto, 2020, de https://archive.org/details/msdos_Annals_of_Rome_1988 [9] Jaimixx. (2012, Marzo 3). Centurion: Defender of Rome (gameplay, videojuego). Recuperado el 21 de Agosto, 2020 de https://www.youtube.com/watch?v=Qpn2lSw-GbM [10] Dosvideogames. (2016, Marzo 31). Medieval Lords – Soldier Kings of Europe (videojuego). Recuperado el 21 de Agosto, 2020, de http://www.dosvideogames.com/play/medieval-lords-soldier-kings-of-europe [11] GameFAQS. (2019). Crisis in the Kremlin – Release Details. Recuperado el 21 de Agosto, 2020, de https://gamefaqs.gamespot.com/pc/565093-crisis-in-the-kremlin/data [12] Theo’s Little Bot. (2013, Setiembre 8). Crisis in the Kremlin (videojuego). Recuperado el 21 de Agosto, 2020, de https://en.wikipedia.org/wiki/File:CrisisintheKremlinFoodShortageScreenShot.png [13] Edwards. Benj. (2020). The History of Civilization. Recuperado el 21 de Agosto, 2020, de https://www.gamasutra.com/view/feature/1523/the_history_of_civilization.php?print =1 [14] CivAmigaImage. (2007, Diciembre 21). Civilization (videojuego). Recuperado el 21 de Agosto, 2020, de https://en.wikipedia.org/wiki/File:CivilizationAmigaAGA.png [15] GOG Store. (2020). Imperialism. Recuperado el 21 de Agosto, 2020, de https://www.gog.com/game/imperialism [16] Aleskey. (2008, Agosto 2008). Imperialism (videojuego). Recuperado el 21 de Agosto, 2020, de https://forums.civfanatics.com/threads/classic-really-old-computer-strategy- games.498964/page-2

49 Desarrollo de una librería para cargar mapas interactivos en videojuegos [17] GameFAQS. (2019). Liberty or Death. Recuperado el 21 de Agosto, 2020, de https://gamefaqs.gamespot.com/snes/588443-liberty-or-death [18] Tenmin Gameplay. (2016, Agosto 28). Liberty or Death (videojuego). Recuperado el 21 de Agosto, 2020, de https://www.youtube.com/watch?v=7mn5Xu27kP8 [19] GTA Fandom. (2020). Gang Warfare in GTA San Andreas. Recuperado el 26 de Agosto, 2020, de https://gta.fandom.com/wiki/Gang_Warfare_in_GTA_San_Andreas [20] Daynan. (2020, Abril 18). Gang Warfare in Grand Theft Auto: San Andreas (videojuego). Recuperado el 26 de Agosto, 2020, de https://gta.fandom.com/wiki/Gang_Warfare_in_GTA_San_Andreas?file=GangTerritory- GTASA-Map.jpg [21] Gillen. K. (2007, Agosto 24). The Making of: Shogun: Total War. Recuperado el 27 de Agosto, 2020, de https://www.rockpapershotgun.com/2007/08/24/the-making-of- shogun-total-war/ [22] Creative Assembly. (2000, Junio 13). SHOGUN: Total War (videojuego). Recuperado el 27 de Agosto, 2020, de https://store.steampowered.com/app/345240/SHOGUN_Total_War__Collection/ [23] Metacritic. (2006, Noviembre 13). Medieval II: Total War. Recuperado el 27 de Agosto, 2020, de https://www.metacritic.com/game/pc/medieval-ii-total-war [24] Creative Assembly. (2006, Noviembre 15). Total war: Medieval II (videojuego). Recuperado el 27 de Agosto, 2020, de https://www.g4less.com/es/comprar-medieval-ii- total-war-kingdoms-cd-key-comparar-precios.html [25] BoardGameGeek. (2019). Europa Universalis Boardgame. Recuperado el 27 de Agosto, 2020, de https://boardgamegeek.com/boardgame/4102/europa-universalis [26] Butts. S. (2018, Diciembre 13). Europa Universalis. Recuperado el 27 de Agosto, 2020, de https://www.ign.com/articles/2001/03/21/europa-universalis [27] Raphael. (2001, Diciembre 9). Europa Universalis (videojuego). Recuperado el 27 de Agosto, 2020, de https://www.mobygames.com/game/windows/europa- universalis/screenshots/gameShotId,21304/ [28] Eric. (2019, Mayo). Total War: Three kingdoms (videojuego). Recuperado el 28 de Agosto, 2020, de https://forums.totalwar.com/discussion/243093/lets-compare-our-3- kingdoms-maps [29] Brown. F. (2018, Octubre 14). The engine behind Paradox Development Studio’s future games. Recuperado el 27 de Agosto, 2020, de https://venturebeat.com/2018/10/14/the-engine-behind-paradox-development- studios-future-games/ [30] Paradox Interactive. (2016, Junio 6). Hearts of Iron IV (videojuego). Recuperado el 28 de Agosto, 2020, de https://store.steampowered.com/app/394360/Hearts_of_Iron_IV/ [31] Mat. (2015, Febrero 5). Middle Earth: Shadow of Mordor (videojuego). Recuperado el 28 de Agosto, 2020, de https://www.mobygames.com/game/playstation-4/middle-earth- shadow-of-mordor/screenshots/gameShotId,759298/ [32] TaleWorlds. (2017, Setiembre 21). Dev Blog Modding Mount&Blade II: Bannerlord. Recuperado el 27 de Agosto, 2020, de https://venturebeat.com/2018/10/14/the- engine-behind-paradox-development-studios-future-games/

50

[33] The New Order. (2020, Julio 22). Hearts of Iron IV The New Order: Last Days of Europe Mod (modificación de videojuego). Recuperado el 31 de Agosto, 2020, de https://steamcommunity.com/sharedfiles/filedetails/?id=2173766180 [34] Taleworlds. (2020, Agosto 15). Mount&Blade II: Bannerlord (videojuego). Recuperado el 31 de Agosto, 2020, de https://www.moddb.com/games/mount-blade-ii- bannerlord/news/development-update-2-modding-tools-and-more [35] Storm. E. (2012, Noviembre 8). Crusader Kings II: A Game of Thrones (modificación de videojuego). Recuperado el 31 de Agosto, 2020, de https://www.moddb.com/mods/crusader-kings-2-a-game-of-thrones-ck2agot [36] Schlangster. (2011, Diciembre 17). SkyUI (modificación de videojuego). Recuperado el 31 de Agosto, 2020, de https://www.nexusmods.com/skyrim/mods/3863 [37] Denny. (2017, Agosto 30). How to make a grand strategy like interactive map. Recuperado el 27 de Agosto, 2020, de https://answers.unrealengine.com/questions/699283/how-to-make-a-grand-strategy- like-interactive-map.html [38] Paradox Interactive. (2016, Junio 6). Hearts of Iron IV (videojuego) mapas de províncias y altura. Recuperado el 28 de Agosto, 2020, de los archivos locales del Hearts of Iron IV. [39] SMG Studio. (2020, Febrero 19). RISK: Global Domination (videojuego). Recuperado el 8 de Setiembre, 2020, https://store.steampowered.com/app/1128810/RISK_Global_Domination/ [40] Paradox Interactive. (2020, Setiembre 1). Crusader Kings III (videojuego). Recuperado el 8 de Setiembre, 2020, https://store.steampowered.com/app/1158310/Crusader_Kings_III/ [41] RedBlobGames. (2010, Setiembre 4). Generación de mapas poligonales para videojuegos. Recuperado el 31 de Agosto, 2020, http://www-cs- students.stanford.edu/~amitp/game-programming/polygon-map-generation/ [42] Burrough, P.; McDonnell, R.; McDonnell, A.; Christopher D. (2015). “8.11 Nearest neighbours: Thiessen (Dirichlet/Voronoi) polygons”. Principles of Geographical Information Systems. Oxford University Press. Recuperado el 31 de Agosto, 2020, de https://books.google.es/books?id=kvoJCAAAQBAJ&pg=PA160&redir_esc=y#v=onepag e&q&f=false [43] Fisiotronica. (2019, Mayo 26). Robótica y aplicación de Diagramas de Voronoi. Recuperado el 31 de Agosto, 2020, de http://fisicotronica.com/robotica-aplicacion- diagramas-voronoi/ [44] Du, Q.; Faber, V.; Gunzburger, M. (1999). "Centroidal Voronoi tessellations: applications and algorithms". Recuperado el 31 de Agosto, 2020. [45] Moritz. D. (2013, Junio 1). Método de relajación de Lloyd. Recuperado el 31 de Agosto, 2020, de https://en.wikipedia.org/wiki/Lloyd's_algorithm#/media/File:LloydsMethod1.svg [46] Jespa. (2017, Febrero 27). Triangulo de Delaunay. Recuperado el 31 de Agosto de 2020, de https://commons.wikimedia.org/wiki/File:Point_inside_circle_- _Delaunay_condition_broken_-_Labelled.svg [47] RedBlobGames. (2010, Setiembre 4). Generación de mapas poligonales para videojuegos. Recuperado el 31 de Agosto, 2020, http://www-cs- students.stanford.edu/~amitp/game-programming/polygon-map-generation/

51 Desarrollo de una librería para cargar mapas interactivos en videojuegos [48] Spatineo. (2017, Diciembre). The mystery of Pokemon Go maps is solved and it’s not just about the street maps. Recuperado el 31 de Agosto, 2020, de https://www.spatineo.com/mystery-pokemon-go-maps-solved-not-just-street-maps/ [49] Google Cloud. (2020). Google Maps Platform. Recuperado el 31 de Agosto, 2020, de https://cloud.google.com/maps-platform [50] GoogleMapsPlatform. (2020, Marzo 6). Ludia’s Journey with Google Maps Platform. Recuperado el 31 de Agosto, 2020, de https://www.youtube.com/watch?v=Vmj5ntr7mXg [51] OpenStreetMap API. (2020, Juliol 27). API utilization. Recuperado el 31 de Agosto, 2020, de https://wiki.openstreetmap.org/wiki/API [52] LeafletJS. (2020). LeafletJS Home page. Recuperado el 31 de Agosto, 2020, de https://leafletjs.com/ [53] GTA Fandom. (2020). Gang Warfare in GTA San Andreas. Recuperado el 26 de Agosto, 2020, de https://gta.fandom.com/wiki/Gang_Warfare_in_GTA_San_Andreas [54] JSON Organization. (2019). Introducing JSON. Recuperado el 18 de Agosto, 2020, de https://www.json.org/json-en.html [55] JSON Organization. (2020, Enero 28). Especificación Javascript Object Notation. Recuperado el 18 de Agosto, 2020, de https://www.json.org/json-en.html [56] GeoJSON. (2016, Agosto). The GeoJSON Format – RFC 7946. Recuperado el 8 de Setiembre, 2020, de https://tools.ietf.org/html/rfc7946 [57] Leaflet. (2019). Using GeoJSON with Leaflet. Recuperado el 31 de Agosto, 2020, de https://leafletjs.com/examples/geojson/ [58] TopoJSON. (2017, Setiembre 20). Introduction to TopoJSON. Recuperado el 8 de Setiembre, 2020, de https://github.com/topojson/topojson/wiki/Introduction [59] Mathworks. (2020). Working with Delaunay Triangulations (imágenes). Recuperado el 8 de Setiembre, 2020, de https://www.mathworks.com/help/matlab/math/delaunay- triangulation.html [60] Brodkin. J. (2013, Junio 3). How Unity3D became a game-development beast. Recueperado el 8 de Setiembre, 2020, de https://insights.dice.com/2013/06/03/how- unity3d-become-a-game-development-beast/ [61] Unity Documentation. (2020, Setiembre 8). JsonUtility Reference. Recuperado el 8 de Setiembre, 2020, de https://docs.unity3d.com/ScriptReference/JsonUtility.html [62] Runevision. (2016, Agosto 23). Triangulator. Recuperado el 8 de Setiembre, 2020, de http://wiki.unity3d.com/index.php/Triangulator [63] Jcreer. (2016, Mayo 11). SMS: Mesh Node Triangulation. Recuperado el 13 de Setiembre, 2020, de https://www.xmswiki.com/wiki/File:TriangulateExample.png [64] Regular expressions. (2019, Noviembre 22). Regular Expressions Tutorial. Recuperado el 10 de Setiembre, 2020, de https://www.regular-expressions.info/tutorial.html [65] RegExer. (2020). RexExer tool. Recuperado el 10 de Setiembre, 2020, de https://regexr.com/ [66] Ariste. A. (2014, Mayo 29). Mapas GeoJSON, comarques. Recuperado el 24 de Abril, 2020, de https://github.com/aariste/GeoJSON-Mapas/blob/master/comarques- compressed.geojson [67] TopoJSON. (2018, Noviembre 17). The TopoJSON Format Specification. Recuperado el 10 de Setiembre, 2020, de https://github.com/topojson/topojson- specification/blob/master/README.md

52

[68] Yug. (2013, Agosto 28). Creación de formas con TopoJSON (imagen). Recuperado el 8 de Setiembre, 2020, de https://commons.wikimedia.org/wiki/File:Topojson_shapes-en.svg [69] Unity Documentation. (2020, Setiembre 8). Mesh Reference. Recuperado el 8 de Setiembre, 2020, de https://docs.unity3d.com/ScriptReference/Mesh.html [70] Unity Documentation. (2020, Setiembre 8). MeshRenderer Reference. Recuperado el 8 de Setiembre, 2020, de https://docs.unity3d.com/ScriptReference/MeshRenderer.html [71] Mathworks. (2020). Working with Delaunay Triangulations (imágenes). Recuperado el 8 de Setiembre, 2020, de https://www.mathworks.com/help/matlab/math/delaunay- triangulation.html [72] Eberly, D. (2006). 3D Game Engine Design: A Practical Approach to Real-Time Computer Graphics. Recuperado el 8 de Setiembre, 2020, de https://play.google.com/books/reader?id=TnwZBwAAQBAJ&hl=ca&pg=GBS.PA67 [73] Serethia. (2010, Septiembre 9). Enclave (imagen). Recuperado el 8 de Setiembre, 2020, de https://es.wikipedia.org/wiki/Enclave [74] Roystan. (2018). Outline Shader tutorial. Recuperado el 8 de Setiembre, 2020, de https://roystan.net/articles/outline-shader.html [75] Unity Documentation. (2020, Setiembre 8). Line Renderer Reference. Recuperado el 8 de Setiembre, 2020, de https://docs.unity3d.com/Manual/class-LineRenderer.html [76] Wikipedia. (2020, Enero 8). Z-Fighting. Recuperado el 8 de Setiembre, 2020, de https://en.wikipedia.org/wiki/Z-fighting [77] Manske. M. (2008, Julio 24). Z-fighting (imagen). Recuperado el 8 de Setiembre, 2020, de https://en.wikipedia.org/wiki/Z-fighting [78] Hackel. A. (2017, Octubre 3). How to write a Stripes Shader, Part 1: UVs, Rotation, Warping. Recuperado el 8 de Setiembre, 2020, de https://andreashackel.de/tech- art/stripes-shader-1/ [79] Robinson. J. (2016, Octubre 25). The evolution of warfare in Europa Universalis IV. Recuperado el 12 de Setiembre, 2020, de https://www.wargamer.com/articles/the- evolution-of-warfare-in-europa-universalis-iv/ [80] Quilez. I. (2013, Mayo 22). Voroni Edges. Recuperado el 8 de Setiembre, 2020, de https://www.iquilezles.org/www/articles/voronoilines/voronoilines.htm [81] Quilez. I. (2012) Voronoi edges. Recuperado el 11 de Setiembre, 2020, de https://www.iquilezles.org/www/articles/voronoilines/voronoilines.htm

53