World of Warcraft

Oficina do Engenheiro: o desenvolvimento do WoW Companion App

Oficina do Engenheiro: o desenvolvimento do WoW Companion App

Uma das maiores melhorias técnicas que implementamos no WoW Companion App em Shadowlands foi a extensão de compatibilidade para múltiplas expansões. É uma coisa que muitos jogadores vinham pedindo, e hoje queremos compartilhar alguns dos desafios e decisões envolvidas no desenvolvimento dessa alteração tecnológica de larga escala.

Era uma vez...

A princípio, o Companion App foi desenvolvido para funcionar em uma única expansão: Legion. Com o anúncio de Battle for Azeroth, nós decidimos priorizar uma série de melhorias no back-end, inclusive a possibilidade de o aplicativo compartilhar o código com o cliente do PC, o que nos permitiria aproveitar grande parte das funções e ferramentas disponíveis na IU (interface de usuário) do jogo, coisas a que o aplicativo até então não tinha acesso. Por outro lado, não seria possível montar a estrutura necessária para que o aplicativo tivesse compatibilidade com mais de uma expansão de cada vez, então resolvemos trocar a expansão exclusiva do aplicativo de Legion para a expansão mais recente: Battle for Azeroth.

Estamos cientes da decepção que os jogadores sofreram ao perder acesso ao conteúdo de Legion no aplicativo quando fizemos essa alteração, e por isso nós nos comprometemos a estender a compatibilidade para mais de uma expansão por vez em Shadowlands. Além disso, a equipe móvel queria fazer as vontades da comunidade e trazer de volta o conteúdo de Legion.

Nós discutimos brevemente a opção de uma compatibilidade parcial com as funções das expansões anteriores, de modo que pudéssemos focar no conteúdo de Shadowlands, porém não demorou para que decidíssemos restaurar o máximo de funcionalidade possível. Estávamos cientes de que, com a chegada de Shadowlands, os jogadores teriam a opção de evoluir seus alts em Legion por meio das Campanhas de Caminhada Temporal e queríamos que esses jogadores também tivessem uma experiência de progressão com integração plena aos dispositivos móveis.

Escolha sua expansão
O Companion App permitirá que os jogadores escolham entre Legion e Battle for Azeroth a partir do patch pré-Shadowlands. Já o conteúdo de Shadowlands ficará disponível assim que a expansão for lançada.

O que acabou sendo nossa bênção e maldição foi que a maior parte do código de Legion continuava presente no aplicativo e os recursos de Legion continuavam no código-fonte, o que fez com que a reinclusão do conteúdo de Legion fosse o teste ideal para a nova estrutura multiexpansão. Por um lado não sobrou muita coisa para implementar, por outro tivemos certo trabalho para criar uma distinção clara entre Legion e Battle for Azeroth.

A criação da estrutura multiexpansão se deu em três grandes passos:

  1. O aplicativo tinha que limpar todos os dados relativos ao conteúdo da expansão atual e solicitar os dados de outra expansão no servidor.
  2. Nós tivemos que separar o código de IU específico de cada expansão a fim de manter as funcionalidades independentes.
  3. Tivemos que fragmentar os recursos próprios de cada expansão para minimizar o uso de recursos do aplicativo.

Expansão dos dados

Quando o Companion App de Legion foi desenvolvido, o propósito da maior parte do código do servidor que lidava com as solicitações do aplicativo era devolver dados de Legion. Quando chegou a hora de mudar para Battle for Azeroth, nós alteramos essas funções de modo que retornassem dados de Battle for Azeroth. Dessa vez, no entanto, precisávamos que o aplicativo buscasse dados de qualquer que fosse a expansão escolhida, e para tanto tivemos que passar por todas as funções do servidor que respondem às solicitações do aplicativo móvel e alterá-las de modo que aceitassem parâmetros que especificassem a expansão em questão. Por exemplo, a solicitação de dados de Seguidor teria que especificar um tipo de Seguidor (ex. um Seguidor de Legion ou um Seguidor de Battle for Azeroth), já uma solicitação de Missão Mundial teria que trazer em si a área relativa à missão.

O aplicativo ganhou extensões em uma série de lugares para se tornar compatível com Battle for Azeroth. Em Legion, o aplicativo fazia uma busca específica pelos Recursos do Salão da Ordem; em Battle for Azeroth, nós nos limitamos a acrescentar Recursos de Guerra à mensagem. Em vez de continuar acrescentando mais moedas à mesma mensagem em Shadowlands, nós optamos por adaptar todo o sistema de moedas no cliente do PC para o novo código compartilhado da estrutura que foi desenvolvida para Battle for Azeroth. Ou seja, agora cada expansão poderá solicitar suas moedas automaticamente, sem a necessidade de se especificar à mão o tipo de moeda desejada.

Solicitação de dados relativos a moedas de antes
Antes: o aplicativo buscava moedas específicas no servidor.
alternate-image-name
Depois: cada expansão busca suas próprias moedas. O código pode lhe parecer familiar se você conferir os add-ons que empregam o sistema de moedas em Shadowlands — essa familiaridade vem da estrutura de código compartilhado, que permite que o WoW Companion App partilhe das funções do jogo.

Código de IU

Grande parte do código escrito para gerar compatibilidade com Battle for Azeroth foi escrito por cima do código de Legion, e entender quais partes desse código ainda estavam em uso foi um desafio. Por exemplo, a lista de Seguidores de Battle for Azeroth ainda podia habilitar a exibição de Armamentos, porém, como nós ocultamos o botão “Armamentos”, o código dele nunca era acionado. Como as funcionalidades das expansões de Legion e Battle for Azeroth eram muito parecidas, isso não era um grande problema, mas sabíamos que, com as novas funções de Shadowlands, não seria factível manter esse tipo de arquitetura. Se o código já compartilhado por Legion e Battle for Azeroth de repente tivesse que se estender a coisas como os Vínculos de Almas e os Pactos, isso só o tornaria mais complexo do que ele já era.

Então nós passamos por cada um dos scripts, decifrando quais funcionalidades eram compartilhadas e quais eram específicas de alguma expansão. Nós dividimos os códigos específicos em subclasses ou em componentes completamente novos, mantendo apenas a funcionalidade compartilhada básica nas classes-pai, e criamos novos objetos do jogo para cada expansão a partir dessas subclasses. Ainda que sejam sustentadas pelo mesmo sistema e compartilhem a maioria das funcionalidades, só a lista de Missões de Legion precisa ter um botão de Aliado de Combate, ao passo que a lista de Aventuras de Shadowlands pode abrir mão da diagramação em duas abas que funcionava direitinho em Legion e Battle for Azeroth, exibindo retratos dos inimigos em vez de ícones para indicar o tipo de missão.

Comparação entre a lista de Missões de Legion e a lista de Aventuras de Shadowlands
Lista de Missões de Legion e lista de Aventuras de Shadowlands lado a lado.

Outra mudança significativa por trás dos bastidores no aplicativo de Shadowlands foi a geração de arquivos de banco de dados. O Companion App vai criar os códigos de banco de dados e os arquivos de dados pela mesma via que o PC. Um lugar em que isso caiu como uma luva foi no código que determina em qual mapa cada Missão Mundial é exibida. O aplicativo original decidia isso a partir da ID de cada mapa, por meio de uma lógica manual, o que não era um problema quando ele só cobria Argus e as Ilhas Partidas. À medida que fomos acrescentando áreas em Battle for Azeroth, não demorou para que isso se tornasse um processo desajeitado. Em vez de manter esse código em Shadowlands, nós puxamos as tabelas do banco de dados dos Mapas da IU necessárias para deixar o sistema bem dinâmico, convertendo grande parte do código referente às áreas das três expansões em uma função simples e arrojada que lidaria com todas as Missões Mundiais sem precisar recorrer à lógica específica de qualquer uma das expansões.

Arquivos de Recursos

Uma grande diferença entre o desenvolvimento no PC e nos aparelhos móveis é manter em mente que os jogadores usando o aplicativo podem ter um pacote de dados limitado no celular. Temos que proporcionar aos jogadores uma experiência agradável, sem frustrações, independentemente da conexão que eles tenham, e uma das formas de fazer isso é limitando a quantidade de dados que eles terão que baixar para usar o aplicativo.

Cada expansão possui uma série de arquivos de recursos que ocupam bastante espaço, e, ao passar de um aplicativo com uma expansão, como foi em Legion e Battle for Azeroth, para a compatibilidade com três expansões de Shadowlands, isso implicaria em triplicar os dados usados pelo aplicativo. No entanto, muitos desses recursos só são usados por uma expansão, como as texturas em alta definição do mapa-múndi, os fundos de localização de missão e os retratos de seguidores e inimigos, então decidimos organizar esses recursos em pacotes separados por expansão. Assim, o aplicativo só precisa carregar na memória os recursos usados pela expansão em questão, reduzindo a memória gasta.

Logo no começo, resolvemos separar as expansões por cenas de jogo próprias, o que nos permitiu manter uma separação clara entre as funcionalidades de cada expansão. A cena de jogo de Legion não precisa de uma página de Chamados do Pacto, da mesma forma que a cena de jogo de Shadowlands não tem uma janela de Envio de Tropas. Assim como as alterações no código, isso facilita bastante a compreensão do que está acontecendo no aplicativo em determinado momento. Dividir os recursos e as cenas do jogo assim fez com que cada expansão ganhasse autonomia, o que pavimentou o caminho para opções de download mais vantajosas para o usuário.

Nossa intenção era dar aos jogadores mais controle sobre o download de recursos no aplicativo. Você pode optar por baixar tudo de uma vez só quando estiver em uma conexão estável ou baixar os recursos das outras expansões depois para entrar no aplicativo mais rápido. E se escolher não interagir com determinada expansão, você não será forçado a baixar os recursos dela. Com 30 a 40 MB por expansão, é um volume significativo de dados que você não vai precisar baixar!

Download seletivo para cada expansão
Ao separar as expansões, ficou rapidinho para fazer o download, entrar e começar a jogar!

Alterações na linha de produção

Ao dividir os recursos por expansão, precisamos alterar duas partes da linha de produção: a ferramenta de curadoria dos recursos precisava saber quais recursos pertenciam a qual expansão, e a ferramenta que criaria os pacotes de recursos precisava agrupar esses recursos para fechar o pacote. A ferramenta de curadoria foi outro aspecto desenvolvido especificamente para Legion e depois para Battle for Azeroth, então tivemos que reescrevê-la de modo que navegasse mais livremente entre as expansões. A nova versão da ferramenta passa pelo conteúdo das expansões que o Companion App pode vir a querer (iterando a enumeração de GarrisonType) e distribuindo os recursos de cada expansão em pastas separadas. Essa modificação na ferramenta de curadoria, de modo que passasse a usar todas as expansões, fez com que ela também passasse a pegar automaticamente os valores que viriam a ser acrescentados na lista no futuro, facilitando a inclusão de conteúdo novo no Companion App, sem a necessidade de atualizar as ferramentas o tempo todo.

A criação de arquivos de recursos e o carregamento de tempo de execução usa bastante a função de variantes de AssetBundle do Unity, o que permite que o aplicativo trate versões diferentes de um pacote como se fossem o mesmo pacote. A linha de produção de criação de pacotes cria uma variante diferente para cada pacote de cada expansão, baseando-se na distribuição de pastas por expansão da ferramenta de curadoria. Esses pacotes de recursos são trocados no tempo de execução toda vez que você troca de expansão no aplicativo. Como todas as variantes de um pacote são tratadas da mesma forma, um código que vá buscar retratos de Seguidor, por exemplo, não precisa se preocupar com qual conjunto de retratos de Seguidor foi carregado. Isso faz com que o código principal não precise se preocupar com os pormenores do carregamento e descarregamento de recursos. As expansões se passam umas pelas outras no aplicativo.

Rumo às Terras Sombrias

Esteja você jogando as novas Aventuras do conteúdo de Shadowlands ou evoluindo um alt em Legion, é com muito prazer que buscamos facilitar seu acesso ao conteúdo de World of Warcraft! Esperamos que esse texto tenha servido para mostrar um pouquinho do trabalho que fazemos e das decisões que tomamos ao desenvolver estruturas compatíveis não só com o conteúdo atual, mas com tudo que o World of Warcraft pode nos reservar no futuro.

Próximo artigo

  1. Relembrando os Portões de Ahn'Qiraj
    World of Warcraft
    2h

    Relembrando os Portões de Ahn'Qiraj

    Em 23 de janeiro de 2006, uma guerra sangrenta foi iniciada por um simples som: uma batida de gongo. Nada de troares épicos, nada de gritos sanguissedentos, só um temeroso silêncio. Aqueles longos segundos nervosos de medo. A calmaria que precede a tempestade.

Destaques