World of Warcraft

El taller del ingeniero: el diseño de la aplicación WoW Companion

El taller del ingeniero: el diseño de la aplicación WoW Companion

Una de las mejoras técnicas más importantes que hemos llevado a cabo en la aplicación WoW Companion para Shadowlands es su compatibilidad con distintas expansiones. Sabemos que es una característica que han pedido muchos jugadores y hoy queremos hablar de los desafíos y decisiones que implica realizar este tipo de cambios tecnológicos a gran escala.

Un poco de historia

La aplicación WoW Companion se diseñó inicialmente para una expansión concreta: Legion. De cara a Battle for Azeroth, tomamos la decisión de dar prioridad a varias mejoras importantes de backend, como la posibilidad de que la aplicación pudiera compartir código con el cliente de PC, lo que nos permitía aprovechar muchas de las características y herramientas que están disponibles en la interfaz de usuario (IU) del juego principal a las que la aplicación antes no tenía acceso. La desventaja era que no podíamos construir la infraestructura necesaria para que fuera compatible con más de una expansión al mismo tiempo, por lo que la aplicación dejó de ser compatible con Legion y pasó a funcionar solo con la última expansión, Battle for Azeroth.

Sabemos que los jugadores se sintieron decepcionados al dejar de tener acceso al contenido de Legion tras el cambio, así que con Shadowlands nos comprometimos a que fuera compatible con más de una expansión al mismo tiempo. Además, el equipo de móviles tenía muchas ganas de darle a la comunidad lo que quería y de recuperar el contenido de Legion.

Barajamos durante algún tiempo la opción de ofrecer solo una funcionalidad parcial de expansiones anteriores para dedicarnos por completo al contenido de Shadowlands, pero pronto decidimos que lo que queríamos era recuperar todas las funcionalidades posibles. También sabíamos que, con la llegada de Shadowlands, los jugadores tendrían la opción de subir de nivel con sus personajes alternativos por Legion a través de las Campañas de Paseo en el tiempo, y queríamos asegurarnos de que esos jugadores contaran con una compatibilidad completa en móvil mientras subían de nivel.

Elección de la expansión
La aplicación WoW Companion permitirá que los jugadores elijan entre Legion y Battle for Azeroth desde el parche preliminar de Shadowlands, y el contenido de Shadowlands estará disponible con el lanzamiento de la expansión.

En lo que resultó ser más o menos una ventaja, la mayor parte del código de Legion seguía presente en la aplicación, y todavía teníamos los archivos originales de Legion en el control del código fuente, por lo que la reincorporación del contenido de Legion fue la prueba perfecta para nuestra nueva infraestructura multiexpansión. Aunque no quedaba mucho que implementar, hubo que trabajar para separar Legion y Battle for Azeroth.

Para la creación de una infraestructura multiexpansión se necesitaron tres elementos principales:

  1. La aplicación debía borrar los datos del contenido de la expansión activa y solicitar datos de una nueva expansión desde el servidor.
  2. Había que separar el código de la IU de cada una de las expansiones para aislar la funcionalidad.
  3. Había que separar los archivos de cada una de las expansiones para minimizar el uso de los recursos de la aplicación.

Datos de expansiones

Cuando se desarrolló inicialmente la aplicación Legion Companion, la mayor parte del código de servidor que se encargaba de las solicitudes de la aplicación se diseñó para que devolviese solo datos de Legion. Al llegar el momento de pasar a Battle for Azeroth, cambiamos esas funciones para que devolvieran datos de Battle for Azeroth. Esta vez, en cambio, teníamos que recuperar datos de cualquier expansión seleccionada, lo que implicaba revisar todas las funciones del servidor que responden a las solicitudes de móvil y cambiarlas para que aceptasen los parámetros que especifican la expansión de la que hay que recuperar datos. Por ejemplo, la solicitud de datos de seguidores necesaria para especificar un tipo de seguidor (un seguidor de Legion o un seguidor de Battle for Azeroth) y la solicitud de misiones del mundo necesaria para incluir las zonas de las que quería datos de misiones.

La aplicación en sí misma contenía también unas cuantas cosas que se ampliaron expresamente para ser compatible con Battle for Azeroth. En Legion, la aplicación solicitaba los recursos de la sede; en Battle for Azeroth, no tuvimos más que añadir recursos de guerra a ese mensaje. En lugar de seguir añadiendo más monedas al mismo mensaje en Shadowlands, optamos por transferir todo el sistema de monedas del cliente de PC a la nueva infraestructura de código compartido que se desarrolló para Battle for Azeroth. De este modo, ahora todas las expansiones pueden solicitar de manera automática sus monedas en lugar de tener que especificar de forma manual cuáles queremos.

Consulta de antes de los datos de monedas
Antes: la aplicación solicitaba monedas concretas al servidor.
alternate-image-name
Después: cada expansión puede solicitar sus propias monedas. Este código puede resultaros familiar si os fijáis en los addons que emplean el sistema de monedas en Shadowlands. Esto se debe a la infraestructura de código compartido que permite que la aplicación WoW Companion comparta características con el juego principal.

Código de IU

Gran parte del código creado para la compatibilidad con Battle for Azeroth se hizo sobre el código existente de Legion, lo que complicaba la tarea de discernir qué código que estaba activo. Por ejemplo, el listado de seguidores de Battle for Azeroth todavía podía mostrar armamentos; sin embargo, el botón de armamentos estaba oculto, por lo que nunca se necesitaba ese código. La funcionalidad en Legion y en Battle for Azeroth era lo bastante similar como para que esto no supusiera un gran problema, pero sabíamos que, con las nuevas características de Shadowlands, no iba a ser viable mantener ese tipo de arquitectura. Si, de repente, el código compartido por Legion y Battle for Azeroth tenía que ser compatible con cosas como los nexos de almas y las curias, las cosas se iban a poner más difíciles aún.

Así que revisamos cada script para averiguar qué funcionalidad era compartida y cuál era específica de una expansión. Separamos el código específico de cada expansión en subclases o en componentes completamente nuevos, dejando solo la funcionalidad base compartida en las clases superiores, e hicimos nuevos objetos de juego para cada expansión usando esas subclases nuevas. Ahora, aunque están respaldados por el mismo sistema y comparten la mayoría de su funcionalidad, el listado de misiones de Legion es el único que necesita un botón de «Aliado de combate», y el listado de aventuras de Shadowlands puede hacer cosas como deshacerse del diseño de dos pestañas que empleaban Legion y Battle for Azeroth y mostrar los retratos enemigos en lugar de los iconos del tipo de misión.

Comparación entre el listado de misiones de Legion y el listado de aventuras de Shadowlands
Comparación entre el listado de misiones de Legion y el listado de aventuras de Shadowlands.

Otro cambio importante entre bastidores que implementamos en la aplicación para Shadowlands es el modo en que generamos archivos de bases de datos; ahora WoW Companion construye su código de bases de datos y los archivos de datos empleando el mismo proceso que en PC. Un sitio donde esto resultó útil es el código que determina en qué mapa se muestra cada misión del mundo. Inicialmente, la aplicación tomaba esa decisión utilizando la lógica manual de cada ID de mapa, lo cual no era un problema cuando solo tenía que funcionar con Argus y las Islas Abruptas. Sin embargo, a medida que fuimos incorporando más zonas para Battle for Azeroth, todo se volvió más engorroso. En lugar de seguir manteniendo este código para Shadowlands, pudimos implementar las tablas de bases de datos de mapas de la IU que necesitábamos para que el sistema fuera completamente dinámico, convirtiendo una buena parte del código que usábamos para las zonas de las tres expansiones en una sola función que se encarga automáticamente de cualquier misión del mundo sin seguir la lógica específica de cada una de las expansiones.

Archivos de recursos

Una diferencia importante entre el desarrollo para móvil y el desarrollo para PC es que, en móvil, debemos tener presente que los jugadores pueden acceder a la aplicación con una conexión con datos limitados o una conexión débil. Tenemos que procurar que los jugadores se lo pasen bien y no se frustren al usar la aplicación, con independencia de su conexión a internet, y una de las maneras de lograrlo es limitar la cantidad de datos que deben descargar para usar la aplicación.

Cada expansión tiene un montón de archivos de recursos que pueden acumularse con mucha rapidez, y pasar de tener una expansión en la aplicación durante Legion y Battle for Azeroth a tres expansiones durante Shadowlands implicaba que la aplicación necesitaría el triple de datos. Sin embargo, muchos archivos los utiliza solo una expansión, como las texturas de los mapas del mundo en alta resolución, los fondos de la ubicación de las misiones o los retratos de los seguidores y los enemigos, así que nos decantamos por separar esos archivos en distintos paquetes para cada expansión. De este modo, la aplicación solo necesita cargar en la memoria los archivos que utiliza la expansión activa, reduciendo así la que usa la aplicación.

También decidimos desde el principio dividir cada expansión en función de lo que necesitan sus jugadores, lo que nos permitió mantener una clara separación entre las funcionalidades de las expansiones. Los jugadores de Legion no necesitan la página de convocatorias de curias y los de Shadowlands no tienen una ventana de envíos de tropas. Al igual que los cambios que aplicamos al código, esto hace mucho más fácil saber qué es lo que ocurre en la aplicación en un momento dado. Separar así tanto los archivos como las comunidades implica que cada expansión es autónoma, lo que ha allanado el camino para incluir más opciones descriptivas de descarga.

Queríamos ofrecer a los jugadores más control a la hora de descargar archivos para la aplicación. Podéis elegir entre descargarlo todo a la vez cuando disponéis de una conexión estable o descargar los archivos del resto de expansiones más tarde para que podáis usar la aplicación antes. Y si no queréis interactuar con una expansión en concreto, no tenéis la obligación de descargar sus archivos. Cada expansión ocupa unos 30 o 40 MB, ¡así que podéis omitir la descarga de una cantidad de datos considerable!

Descarga selectiva de cada expansión
Al separar cada expansión, se obtiene un menor tiempo de descarga, ¡por lo que se puede empezar a jugar antes!

Cambios en el proceso

Separar los archivos de cada expansión requería cambios en dos elementos del proceso: la herramienta de conservación de archivos tenía que saber qué archivos pertenecían a cada expansión, y nuestra herramienta de creación de paquetes de archivos tenía que agrupar estos archivos al formar los paquetes finales. La herramienta de conservación de archivos fue otro aspecto que diseñamos de forma específica para Legion y, posteriormente, para Battle for Azeroth, así que tuvimos que reescribirla para que funcionara con otras expansiones. La nueva versión de la herramienta revisa el listado de expansiones con contenido que pueden interesar a WoW Companion (al iterar sobre la enumeración GarrisonType) y genera archivos para cada expansión en carpetas diferentes. La modificación de la herramienta de conservación para que utilice el listado completo de expansiones también implica que utilizará de forma automática los valores añadidos en el futuro a ese listado, facilitando la implementación de nuevo contenido a la aplicación sin necesidad de actualizar las herramientas.

La creación de archivos de recursos y la carga del tiempo de ejecución hacen un uso intensivo de las variantes AssetBundle de Unity, que permite que la aplicación trate distintas versiones de un archivo de paquete como si fueran un mismo paquete. El proceso de creación de paquetes genera una variante distinta de cada paquete para cada expansión, en función de las carpetas específicas de cada expansión generadas por la herramienta de conservación. Esos paquetes de archivos se intercambian durante el tiempo de ejecución cuando cambiáis de expansión en la aplicación. Como todas las variantes de un paquete se pueden tratar de la misma manera, el código que se usa para recuperar los retratos de los seguidores, por ejemplo, puede hacerlo sin preocuparse por el conjunto específico de retratos de seguidores que esté cargado en ese momento. De este modo, el código no presta atención a los elementos básicos de la carga y descarga de archivos; cada expansión puede funcionar como si fuera la única expansión de la aplicación.

Hacia las Tierras Sombrías

Tanto si jugáis a las nuevas aventuras de Shadowlands como si subís de nivel a un personaje alternativo a través de Legion, estamos muy contentos de poner a vuestra disposición más contenido móvil de World of Warcraft. Esperamos que esta pequeña disertación os haya enseñado un poco más sobre el trabajo que realizamos y algunas de las decisiones que tomamos a la hora de diseñar infraestructuras que puedan ser compatibles no solo con el contenido actual, sino también con el que se implemente en el futuro en World of Warcraft.

Siguiente artículo

Noticias destacadas